NSCL DDAS  1.0
Support for XIA DDAS at the NSCL
 All Classes Files Functions Variables Macros Pages
CMyEventSegment.h
1 #ifndef __CMYEVENTSEGMENT_H
2 #define __CMYEVENTSEGMENT_H
3 
4 #include <CExperiment.h>
5 #include <CEventSegment.h>
6 #include <CRingItem.h>
7 #include <CRingBuffer.h>
8 #include <vector>
9 #include <deque>
10 #include <fstream>
11 // event segment for the control
12 // and readout of pixie16 modules
13 // 1 crate only readout, standard firmware
14 // snl - 1/20/10
15 using namespace std;
16 
17 #define MAXMOD 14
18 #define FILENAME_STR_MAXLEN 256
19 #define MAX_NUM_PIXIE16_MODULES 24
20 #define TOTAL_PIXIE16_VARIANTS 8
21 
22 class CMyTrigger;
23 
24 class channel
25 {
26 
27  public:
28  double time;
29  int chanid;
30  int channellength;
31  vector<uint32_t> data;
32 
33  channel();
34  ~channel();
35  double GetTime() const {return time;};
36  int SetTime();
37  double GetChannelLength() const {return channellength;};
38  int SetChannelLength();
39  int SetChannel();
40  int GetChannel() const {return chanid;};
41  int Validate(int);
42 };
43 
44 class CMyEventSegment : public CEventSegment
45 {
46 
47 private:
48  //any private variables
49  //CRingBuffer *ring;
50  std::ofstream ofile;
51 
52  int fragcount;
53  double globaltime;
54  double time_buffer;
55 
56  unsigned short CrateNum;
57  unsigned short NumModules;
58  unsigned short *PXISlotMap;
59  double *ModEventLen;
60  double StopTime;
61  char ComFPGAConfigFile[80];
62  char SPFPGAConfigFile[80];
63  char TrigFPGAConfigFile[80];
64  char DSPCodeFile[80];
65  char DSPParFile[80];
66  char DSPVarFile[80];
67 
68  char ComFPGAConfigFile_RevBCD[FILENAME_STR_MAXLEN];
69  char ComFPGAConfigFile_RevF_100MHz_14Bit[FILENAME_STR_MAXLEN];
70  char ComFPGAConfigFile_RevF_100MHz_16Bit[FILENAME_STR_MAXLEN];
71  char ComFPGAConfigFile_RevF_250MHz_12Bit[FILENAME_STR_MAXLEN];
72  char ComFPGAConfigFile_RevF_250MHz_14Bit[FILENAME_STR_MAXLEN];
73  char ComFPGAConfigFile_RevF_250MHz_16Bit[FILENAME_STR_MAXLEN];
74  char ComFPGAConfigFile_RevF_500MHz_12Bit[FILENAME_STR_MAXLEN];
75  char ComFPGAConfigFile_RevF_500MHz_14Bit[FILENAME_STR_MAXLEN];
76 
77  char SPFPGAConfigFile_RevBCD[FILENAME_STR_MAXLEN];
78  char SPFPGAConfigFile_RevF_100MHz_14Bit[FILENAME_STR_MAXLEN];
79  char SPFPGAConfigFile_RevF_100MHz_16Bit[FILENAME_STR_MAXLEN];
80  char SPFPGAConfigFile_RevF_250MHz_12Bit[FILENAME_STR_MAXLEN];
81  char SPFPGAConfigFile_RevF_250MHz_14Bit[FILENAME_STR_MAXLEN];
82  char SPFPGAConfigFile_RevF_250MHz_16Bit[FILENAME_STR_MAXLEN];
83  char SPFPGAConfigFile_RevF_500MHz_12Bit[FILENAME_STR_MAXLEN];
84  char SPFPGAConfigFile_RevF_500MHz_14Bit[FILENAME_STR_MAXLEN];
85 
86  char DSPCodeFile_RevBCD[FILENAME_STR_MAXLEN];
87  char DSPCodeFile_RevF_100MHz_14Bit[FILENAME_STR_MAXLEN];
88  char DSPCodeFile_RevF_100MHz_16Bit[FILENAME_STR_MAXLEN];
89  char DSPCodeFile_RevF_250MHz_12Bit[FILENAME_STR_MAXLEN];
90  char DSPCodeFile_RevF_250MHz_14Bit[FILENAME_STR_MAXLEN];
91  char DSPCodeFile_RevF_250MHz_16Bit[FILENAME_STR_MAXLEN];
92  char DSPCodeFile_RevF_500MHz_12Bit[FILENAME_STR_MAXLEN];
93  char DSPCodeFile_RevF_500MHz_14Bit[FILENAME_STR_MAXLEN];
94 
95  char DSPVarFile_RevBCD[FILENAME_STR_MAXLEN];
96  char DSPVarFile_RevF_100MHz_14Bit[FILENAME_STR_MAXLEN];
97  char DSPVarFile_RevF_100MHz_16Bit[FILENAME_STR_MAXLEN];
98  char DSPVarFile_RevF_250MHz_12Bit[FILENAME_STR_MAXLEN];
99  char DSPVarFile_RevF_250MHz_14Bit[FILENAME_STR_MAXLEN];
100  char DSPVarFile_RevF_250MHz_16Bit[FILENAME_STR_MAXLEN];
101  char DSPVarFile_RevF_500MHz_12Bit[FILENAME_STR_MAXLEN];
102  char DSPVarFile_RevF_500MHz_14Bit[FILENAME_STR_MAXLEN];
103 
104  unsigned short ModRev[MAX_NUM_PIXIE16_MODULES]; // module revision in hex format (NSCL had D and F modules
105  unsigned short ModADCBits[MAX_NUM_PIXIE16_MODULES]; // adc bits of a module
106  unsigned short ModADCMSPS[MAX_NUM_PIXIE16_MODULES]; // sampling rate of a module
107  unsigned int ModSerNum[MAX_NUM_PIXIE16_MODULES]; // module serial number
108  unsigned int ModuleRevBitMSPSWord[MAX_NUM_PIXIE16_MODULES]; //word to store rev, bit depth, and MSPS of module for insertion into the data stream.
109  unsigned int ModClockCal[MAX_NUM_PIXIE16_MODULES]; //word to calibration between clock ticks and nanoseconds.
110  char Pixie16_Com_FPGA_File[FILENAME_STR_MAXLEN];
111  char Pixie16_SP_FPGA_File[FILENAME_STR_MAXLEN];
112  char Pixie16_DSP_Code_File[FILENAME_STR_MAXLEN];
113  char Pixie16_DSP_Var_File[FILENAME_STR_MAXLEN];
114  char Pixie16_Trig_FPGA_File[FILENAME_STR_MAXLEN];
115 
116  int retval;
117  int count;
118  char filnam[80];
119  unsigned int nFIFOWords;
120  //unsigned long *lmdata;
121  //unsigned long mod_numwordsread;
122  unsigned short EndOfRunRead;
123 
124  unsigned int *CrateData;
125  unsigned int **PositionInCrateData;
126  unsigned long totwords;
127  vector<unsigned int *> ChannelList;
128  vector<unsigned int *>::iterator ChannelList_it;
129 
130  //deque<uint32_t> ModuleDeque[MAXMOD];
131  deque<channel *> ModuleDeque[MAXMOD];
132  deque<channel *> ModuleDequeTemp;
133  vector<uint32_t> ModuleData[MAXMOD];
134 
135  vector<uint32_t> DataToWorld;
136 
137  vector<uint32_t> nFIFOWordsinModuleCurrentRead;
138  vector<uint64_t> nFIFOWordsinModuleTotal;
139 
140 
141  vector<double> CurrentTimeinModuleRead;
142  vector<double> FirstTimeinModuleRead;
143 
144  unsigned long CurrentTime;
145  unsigned long lasttime;
146  unsigned long TimeWindow;
147 
148 
149  bool m_processing;
150  bool processdata;
151 
152  CMyTrigger *mytrigger;
153 
154  double m_tstampScaleFactor;
155 
156 public:
158  ~CMyEventSegment();
159 
160  virtual void initialize();
161  //virtual DAQWordBufferPtr& Read(DAQWordBufferPtr& rBuffer);
162  virtual size_t read(void* rBuffer, size_t maxwords);
163  virtual void disable();
164  virtual void clear();
165 
166  virtual void onEnd(CExperiment* pExperiment);
167  int GetNumberOfModules() {return (int)NumModules;}
168  unsigned short GetCrateID() {return CrateNum;}
169 
170  bool IsUniqueEvent(const channel* event);
171 
172  void synchronize();
173 
174  void setTimestampScaleFactor(double value);
175  double getTimestampScaleFactor() const;
176 
177 private:
178  size_t SelectivelyOutputData(void* rBuffer, size_t maxwords);
179  bool DataToRead();
180  void PushDataOntoQueue(std::deque<channel*>& deque, std::deque<channel*>& buffer);
181  uint64_t extractExternalTimestamp(const std::vector<uint32_t>& data);
182 
183 };
184 #endif