Hall-D Software  alpha
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DEVIOWorkerThread.h
Go to the documentation of this file.
1 // $Id$
2 //
3 // File: DEVIOWorkerThread.h
4 // Created: Mon Mar 28 07:40:07 EDT 2016
5 // Creator: davidl (on Darwin harriet.jlab.org 13.4.0 i386)
6 //
7 
8 #ifndef _DEVIOWorkerThread_
9 #define _DEVIOWorkerThread_
10 
11 #include <stdint.h>
12 
13 #include <atomic>
14 #include <thread>
15 #include <mutex>
16 #include <condition_variable>
17 #include <list>
18 #include <iterator>
19 using namespace std;
20 
21 #include <JANA/jerror.h>
22 #include <DAQ/HDEVIO.h>
23 #include <DAQ/DParsedEvent.h>
24 #include <DAQ/DModuleType.h>
25 
27 
28 
30  public:
31 
32  enum JOBTYPE{
33  JOB_NONE = 0x0,
34  JOB_QUIT = 0x1,
35  JOB_SWAP = 0x2,
36  JOB_FULL_PARSE = 0x4,
37  JOB_ASSOCIATE = 0x8
38  };
39 
41  JEventSource_EVIOpp *event_source
42  ,list<DParsedEvent*> &parsed_events
43  ,uint32_t &MAX_PARSED_EVENTS
44  ,mutex &PARSED_EVENTS_MUTEX
45  ,condition_variable &PARSED_EVENTS_CV
46  ,set<uint32_t> &ROCIDS_TO_PARSE );
47  virtual ~DEVIOWorkerThread();
48 
49  // These are owned by JEventSource and
50  // are set in the constructor
52  list<DParsedEvent*> &parsed_events;
53  uint32_t &MAX_PARSED_EVENTS;
55  condition_variable &PARSED_EVENTS_CV;
56  set<uint32_t> &ROCIDS_TO_PARSE;
57 
58  // Pool of parsed events
59  vector<DParsedEvent*> parsed_event_pool;
60 
61  // List of parsed events we are currently filling
62  list<DParsedEvent*> current_parsed_events;
63 
64  int VERBOSE;
65  uint64_t Nrecycled; // Incremented in JEventSource_EVIOpp::Dispatcher()
68 
69  atomic<bool> in_use;
70  atomic<bool> done;
72  uint64_t istreamorder;
73  uint64_t run_number_seed;
74 
75  mutex mtx;
76  condition_variable cv;
77  thread thd;
78 
79  uint32_t buff_len;
80  uint32_t *buff;
81  streampos pos;
82 
83  bool PARSE_F250;
84  bool PARSE_F125;
88  bool PARSE_BOR;
92  bool PARSE_SSP;
93 
96 
97  void Run(void);
98  void Finish(bool wait_to_complete=true);
99  void Prune(void);
100  void MakeEvents(void);
101  void PublishEvents(void);
102  void ParseBank(void);
103 
104  void ParseEventTagBank(uint32_t* &iptr, uint32_t *iend);
105  void ParseEPICSbank(uint32_t* &iptr, uint32_t *iend);
106  void ParseBORbank(uint32_t* &iptr, uint32_t *iend);
107  void ParseTSscalerBank(uint32_t* &iptr, uint32_t *iend);
108  void Parsef250scalerBank(uint32_t rocid, uint32_t* &iptr, uint32_t *iend);
109  void ParseControlEvent(uint32_t* &iptr, uint32_t *iend);
110  void ParsePhysicsBank(uint32_t* &iptr, uint32_t *iend);
111  void ParseCDAQBank(uint32_t* &iptr, uint32_t *iend);
112  void ParseBuiltTriggerBank(uint32_t* &iptr, uint32_t *iend);
113  void ParseRawTriggerBank(uint32_t rocid, uint32_t* &iptr, uint32_t *iend);
114  void ParseDataBank(uint32_t* &iptr, uint32_t *iend);
115  void ParseDVertexBank(uint32_t* &iptr, uint32_t *iend);
116  void ParseDEventRFBunchBank(uint32_t* &iptr, uint32_t *iend);
117 
118  void ParseJLabModuleData(uint32_t rocid, uint32_t* &iptr, uint32_t *iend);
119  void ParseTIBank(uint32_t rocid, uint32_t* &iptr, uint32_t *iend);
120  void ParseCAEN1190(uint32_t rocid, uint32_t* &iptr, uint32_t *iend);
121  void ParseModuleConfiguration(uint32_t rocid, uint32_t* &iptr, uint32_t *iend);
122  void Parsef250Bank(uint32_t rocid, uint32_t* &iptr, uint32_t *iend);
123  void MakeDf250WindowRawData(DParsedEvent *pe, uint32_t rocid, uint32_t slot, uint32_t itrigger, uint32_t* &iptr);
124  void Parsef125Bank(uint32_t rocid, uint32_t* &iptr, uint32_t *iend);
125  void MakeDf125WindowRawData(DParsedEvent *pe, uint32_t rocid, uint32_t slot, uint32_t itrigger, uint32_t* &iptr);
126  void ParseF1TDCBank(uint32_t rocid, uint32_t* &iptr, uint32_t *iend);
127  void ParseSSPBank(uint32_t rocid, uint32_t* &iptr, uint32_t *iend);
128 
129  void LinkAllAssociations(void);
130 
131  inline uint32_t F1TDC_channel(uint32_t chip, uint32_t chan_on_chip, int modtype);
132 
133 
134  void DumpBinary(const uint32_t *iptr, const uint32_t *iend, uint32_t MaxWords=0, const uint32_t *imark=NULL);
135 
136  protected:
137 
138 
139  private:
140 
141 };
142 
143 //----------------
144 // F1TDC_channel
145 //----------------
146 inline uint32_t DEVIOWorkerThread::F1TDC_channel(uint32_t chip, uint32_t chan_on_chip, int modtype)
147 {
148  /// Convert a F1TDC chip number and channel on the chip to the
149  /// front panel channel number. This is based on "Input Channel Mapping"
150  /// section at the very bottom of the document F1TDC_V2_V3_4_29_14.pdf
151 
152  uint32_t channel_map[8] = {0, 0, 1, 1, 2, 2, 3, 3};
153  switch(modtype){
155  return (4 * chip) + channel_map[ chan_on_chip&0x7 ];
157  return (chip <<3) | chan_on_chip;
158  default:
159  _DBG_ << "Calling F1TDC_channel for module type: " << DModuleType::GetName((DModuleType::type_id_t)modtype) << endl;
160  throw JException("F1TDC_channel called for non-F1TDC module type");
161  }
162  return 1000000; // (should never get here)
163 }
164 
165 
166 #endif // _DEVIOWorkerThread_
167 
uint32_t F1TDC_channel(uint32_t chip, uint32_t chan_on_chip, int modtype)
atomic< bool > in_use
set< uint32_t > & ROCIDS_TO_PARSE
uint32_t & MAX_PARSED_EVENTS
condition_variable & PARSED_EVENTS_CV
list< DParsedEvent * > & parsed_events
JEventSource_EVIOpp * event_source
How this Event Source Works
#define _DBG_
Definition: HDEVIO.h:12
string GetName(void) const
Definition: DModuleType.h:143
vector< DParsedEvent * > parsed_event_pool
atomic< bool > done
set< uint32_t > ROCIDS_TO_PARSE
list< DParsedEvent * > current_parsed_events
condition_variable cv
uint64_t MAX_OBJECT_RECYCLES