HARPO  5.1.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Pmm2Reader.cxx
Go to the documentation of this file.
1 //
2 // File Pmm2Reader.cxx
3 //
11 #include "Pmm2Reader.h"
12 #include "HarpoDetReader.h"
13 #include "Pmm2Event.h"
14 #include "Pmm2Mes.h"
15 #include "HarpoDet.h"
16 #include "BData.h"
17 
18 #include <TSystem.h>
19 
20 #include <climits>
21 #include <cstdio>
22 #include <arpa/inet.h>
23 #include <iostream>
24 #include <cassert>
25 #include <cstdlib>
26 
27 
28 using namespace Pmm2;
29 
30 ClassImp(Pmm2Reader)
31 
32 
38 {
39  // fRunNo = 0;
40  fDone = false;
41  fError = false;
42  fDet = PMM2;
43  fRVer = -1; // N/A
44 
45  // fInFile = (TString *) NULL;
46  fIn = (FILE *) NULL;
47  fNevts = 0;
48  fNbufs = 0;
49  fNdigs = 0;
50  fNstats = 0;
51 
52  fEvent = (Pmm2Event *) NULL;
53  fRunHeader = (HarpoDetHeader *) NULL;
54 
55  fRawAnalyse = (HarpoDetAnalyse *) NULL;
56  // fMaxEvents = LONG_MAX;
57  fPrevTimeStamp = 0;
58  fPrevTimeStamp2 = 0;
59  isEventSaved = false;
60 
61  fNreset = 1;
62  verbose = 0;
63 }
64 
66 
71 {
72  // Config Function
73  fDone = false;
74  fError = false;
75  fDet = PMM2;
76 
77 
78  // fRunNo = cfg->GetRunNo();
79  fInFile = cfg->GetInFile(0);
80  fRVer = pBIN; // Binary clientUDP mode
81  fIn = (FILE *) NULL;
82  fNevts = 0;
83  // fMaxEvents = cfg->GetMaxEvents();
84 
85  // TString *FileName = cfg->GetOutFile();
86  fNbufs = 0;
87  fNdigs = 0;
88  fNstats = 0;
89 
90  fNreset = 1;
91  verbose = cfg->GetVerbose();
92 
93  fEvent = (Pmm2Event *) NULL;
94  fRunHeader = (HarpoDetHeader *) NULL;
95 
96  fRawAnalyse = (HarpoDetAnalyse *) NULL;
97 
98  // if ( FileName != (TString *) NULL )
99  // SetRootFile(FileName);
100 
101  fPrevTimeStamp = 0;
102  fPrevTimeStamp2 = 0;
103  isEventSaved = false;
104  fRawDigi.Clear(); // size 0
105 }
106 
108 {
109  std::fclose(fIn);
110  //delete fRunHeader; deleted in ~DetReader
111 }
112 
113 // void Pmm2Reader::SetRootFile(TString *name)
114 // {
115 // fNewFileName = name;
116 // fNewFile = new TFile(name->Data(),"RECREATE","HARPO PMM2 Events");
117 // }
118 
120 {
121  fRawAnalyse = func;
122 }
123 
124 // Check if we have more digi for new event
126 {
127  if (fRawDigi.Empty() )
128  {
129  next:
130  // Empty List, trigiring Read Next Buffer
131  if (NextBuffer()) {
132  // ReadBuffer(); // <-- empty function
133  if (BuffType != 0) {
134  Info(__FUNCTION__,"Pmm2Status Type %d Len %d bytes",BuffType,lHeader.eventSize);
136  static_cast<Pmm2Header *>(fRunHeader)->setTemperature(s->getTemperature());
137  // Save only first status block
138  if (fNstats == 0 ) {
139  static_cast<Pmm2Header *>(fRunHeader)->setStatus(s);
140  } else {
141  delete s;
142  }
143  fNstats++;
144  goto next;
145  }
146 
147  } else {
148  return false; // no more Buffers and Digi
149  }
150  }
151  return (! fRawDigi.Empty()); // We can create new event
152 }
153 
155 {
156  if ( isEventSaved ) {
157  isEventSaved = false;
158  fEvent = fSaveEvent;
159  return true;
160  }
161 
162  Double_t eventTimeStamp = 0;
163  if (NextDigi()) {
164  // Will compare with TS from first mes in list
165  eventTimeStamp = fRawDigi.Front().getTimeStamp();
166  // fPrevTimeStamp = fRawDigi.Front().getTimeStamp();
167  fEvent = new Pmm2Event();
168 
169  fEvent->SetDet(fDet);
171  // we will emulate header for this mode
172  const size_t buffLen = (N_WORD_IN_BLOCK * 4) + sizeof(EventHeader_t);
173  fEvent->SetHeader(buffLen,fNevts);
174  } else {
175  fEvent = NULL;
176  return false;
177  }
178 
179  int n_mes = 0;
180 
181 
182  Double_t timestamp = 0.;
183  Int_t triggerold = -1000;
184  // Event Header and Digi
185  do {
187  Double_t ts = 0;
188  if( fRVer == pWIN2 || fRVer == pBIN ) {
189  ts = fRawDigi.Front().getTimeStamp() + 16777216*Double_t(fRawDigi.Front().getPPS());
190  }else{
191  ts = fRawDigi.Front().getTimeStamp();
192  }
193  // if ( std::abs(Long_t(fTimeStamp - fPrevTimeStamp)) < 2 ) {
194  if ( std::abs(Long_t(fTimeStamp - eventTimeStamp)) < 2 ) {
195  if(triggerold == -1000) triggerold = fRawDigi.Front().GetNU0();
196  Int_t trigger = fRawDigi.Front().GetNU0();
197  // Info("NextEvent","trigger: %d",trigger);
198 
199  if(trigger != triggerold) {
200  Warning("NextEvent","Trigger types don't match, %d != %d (%g s)",trigger,triggerold,ts*1e-7);
201  triggerold = -1;
202  }
203  Pmm2Mes mes = fRawDigi.GetNext();
204  fEvent->AddMes(mes);
205  n_mes++; // Counting Digi added to the event
206  timestamp += ts;
207  }
208  //Info("NextEvent","TimeStamp PMM2: %li",fTimeStamp);
209  // } while (( std::abs(Long_t(fTimeStamp - fPrevTimeStamp)) < 2 ) && NextDigi() );
210  } while (( std::abs(Long_t(fTimeStamp - eventTimeStamp)) < 2 ) && NextDigi() );
211  fEvent->SetHeader(n_mes,fNevts); // update header , put n_mes in size
212  fEvent->SetTriggerType(triggerold);
213  fNevts++;
214 
215  if(n_mes) timestamp /= n_mes;
216  if(fNevts>1 && timestamp<fPrevTimeStamp - 200 && timestamp<fPrevTimeStamp2 - 200 ){
217  // Time stamp type double, fPrevTimeStamp ULong_t
218  Info("NextEvent","Reset Time Stamp (%ld) %g < %ld - 200; < %ld - 200 (%d)",fNevts,timestamp,fPrevTimeStamp,fPrevTimeStamp2,fNreset);
219  fNreset--;
220  }
221  // if(fNevts%100 == 0) timestamp += 16777216; // FIXME
222  if(timestamp){
224  fPrevTimeStamp = timestamp;
225  }
226  if(fNreset > 0) timestamp = 0;
227  fEvent->SetTimeStamp(timestamp);
228 
230  return true;
231 }
234 {
235  if (fDone) return false; // EOF after last Event Data read
236 
237  // Read modes
238  if (fRVer == pTEXT ) {
239  // Mode not implemented
240  fDone = true;
241  fError= true;
242  return false;
243  } else if (fRVer == pWIN || fRVer == pWIN2) { // Bin mode without header
244 
245  // we will emulate local header for this mode
246  //const size_t buffLen = (N_WORD_IN_BLOCK * 4) + sizeof(EventHeader_t);
247  const size_t buffLen = (N_WORD_IN_BLOCK * 4);
248  // Full Header ( we just emulate it )
249  lHeader.eventSize = buffLen;
250  lHeader.eventNumb = fNbufs; // Buffer sequential number
251 
252  // Event Data
253  size_t dataLen = lHeader.eventSize;
254  //size_t dataLen = buffLen - sizeof(EventHeader_t);
255  if (std::fread(&lData,dataLen, 1, fIn) != 1)
256  {
257  if(std::feof(fIn)) // Read after EOF
258  {
259  fDone = true;
260  }
261  else
262  {
263  fError = true;
264  }
265  return false;
266  }
267  else
268  {
270  unPackRawDigi();
271  fNbufs++;
272  }
273  } else if (fRVer == pBIN) {
274 
275  // Read header
276  if (std::fread(&lHeader, sizeof(EventHeader_t), 1, fIn) != 1)
277  {
278  if(std::feof(fIn))
279  {
280  fDone = true;
281  }
282  else
283  {
284  fError = true;
285  }
286  return false;
287  }
288 
289  // Event Data
290  BuffType = ((lHeader.eventSize & 0xFF000000 ) >> 24);
291  lHeader.eventSize &= 0x00FFFFFF;
292  // lHeader.eventSize += 4; // FIXME
293  size_t dataLen = lHeader.eventSize;
294 
295 
296  // std::cout << std::hex << "Pmm2 Evt Header sz " << lHeader.eventSize
297  // << " enum " << lHeader.eventNumb
298  // << " dlen " << dataLen << std::dec << std::endl;
299 
300  if (std::fread(&lData,dataLen, 1, fIn) != 1)
301  {
302  if(std::feof(fIn)) // Read after EOF
303  {
304  fDone = true;
305  }
306  else
307  {
308  fError = true;
309  }
310  return false;
311  }
313  if (BuffType == 0) unPackRawDigi();
314  fNbufs++;
315  return true;
316  } else {
317  std::cout << "Wrong File Read Mode "<< fRVer << std::endl;
318  fDone = true;
319  fError= true;
320  return false;
321  }
322 
323  return true;
324 }
325 
328 {
329 
330  //size_t blen = (lHeader.eventSize-8)*8; //Read size in bits
331  size_t blen = (lHeader.eventSize)*8; //Read size in bits
332  //std::cout << "esz " << lHeader.eventSize << " blen " << blen << std::endl;
333  assert(blen == 11872);
334 
335  BData bits(blen,lData);
336  // bits.Print();
337 
338 
339 
340  for (size_t i = 0;i<blen;i += 56) {
341  Pmm2Mes udata;
342  if( fRVer == pWIN2 || fRVer == pBIN ) {
343  udata._ChannelNum=bits.asGray(i,i+3);
344  udata._TimeStamp=bits.asGray(i+26,i+49);
345  udata._TimeStampSign=0;
346  udata._Gain=0;
347  udata._FineTime=0;
348  udata._TdcRamp=0;
349  udata._Charge=bits.asGray(i+4,i+13);
350  udata._nu0=bits(i+50,i+55);
351  udata._PPSCounter=bits.asGray(i+14,i+25);
352  // store in list
353  // fRawDigi.Push(udata);
354  // fNdigs++;
355 
356  }else{
357  // Pmm2Mes udata;
358  udata._ChannelNum=bits.asGray(i,i+3);
359  udata._TimeStamp=bits.asGray(i+4,i+27);
360  udata._TimeStampSign=bits(i+28);
361  udata._Gain=bits(i+29);
362  udata._FineTime=bits.asGray(i+30,i+39);
363  udata._TdcRamp=bits(i+40);
364  udata._Charge=bits.asGray(i+41,i+50);
365  udata._nu0=bits(i+51);
366  udata._PPSCounter=bits.asGray(i+52,i+55);
367  // store in list
368  // fRawDigi.Push(udata);
369  // fNdigs++;
370  }
371  fRawDigi.Push(udata);
372  fNdigs++;
373  if(gHarpoDebug>1)
374  Info("unPackRawDigi","%d %d %d %d",udata._ChannelNum, udata._Charge, udata._PPSCounter, udata._TimeStamp);
375  }
376 
377  //DEBUG std::cout << " **Buff " << fNbufs << " Digi " << fNdigs << std::endl;
378  //fRawDigi.print();
379 }
380 
383 {
384  /* Empty Function, all done in NextBuffer */
385 }
386 
388 {
389  return fEvent;
390 }
391 
393 {
394  return static_cast<Pmm2Header *>(fRunHeader);
395 }
396 
398 
402 {
403  // fNreset = 1;
404  Long64_t nResets;
405  if ( ! gHConfig->Lookup("Pmm2.Nresets",nResets) )
406  Info("Constructor","Use default nResets %d",fNreset);
407  else{
408  fNreset = nResets;
409  Info("Constructor","Use nResets %d",fNreset);
410  }
411 
412  const char * fn = fInFile->Data();
413  if ( fInFile->BeginsWith("/" )) { // full path
414  if (verbose) std::cout << " Init " << fn << std::endl;
415  if ( gSystem->AccessPathName(fn,kReadPermission) ) {
416  perror("Raw File access");
417  return false;
418  }
419  } else {
420  if ( gSystem->AccessPathName(fn,kReadPermission) ) // file not exist
421  {
422  // TODO
423  // TString *DataDir = gHRawCfg->GetDataDir();
424  // Not a best way but i can't use config hire
425  TString DataDir(gSystem->Getenv("HARPO_DATA_DIR"));
426 
427  if ( ! DataDir.EndsWith("/") ) DataDir.Append("/");
428  fInFile->Prepend(DataDir);
429  fn = fInFile->Data();
430  if (verbose) std::cout << " Guessed " << fn << std::endl;
431  if ( gSystem->AccessPathName(fn,kReadPermission) ) {
432  perror("Raw File access");
433  return false;
434  }
435  }
436  }
437 
438  fIn = std::fopen(fn,"r");
439  if ( fIn != NULL )
440  {
441  if ( fRVer == pBIN ) {
442  fRunHeader = new Pmm2Header(fIn);
444  return (fRunHeader->check());
445  } else {
446  fRunHeader = new Pmm2Header(); // Empy for TEXT and WIN
448  return true;
449  }
450  }
451  else
452  {
453  perror("Raw File not open");
454  return false;
455  }
456 }
457 
458 
459 Long_t Pmm2Reader::Loop(Long_t maxevents)
460 {
461  Long_t cnt=0;
462  Pmm2Event *evt;
463 
464  fRawAnalyse->Init();
465 
466  while (NextEvent()) {
467  evt = GetEvent();
469  delete evt;
470  if (++cnt >= maxevents) break;
471  }
472  return cnt;
473 
474  fRawAnalyse->Save();
475 
476 }
477 
479 {
480  Long_t maxevents = fMaxEvents;
481  return Loop(maxevents);
482 }
483 
484 // Bool_t Pmm2Reader::Find(Long_t eventNo)
485 // {
486 // Long_t cnt=0;
487 // Long_t maxevents = fMaxEvents;
488 // Bool_t found = false;
489 
490 // while (NextEvent()) {
491 
492 // if ((fEvent->GetHeader())->eventNumb == eventNo) {
493 // found = true;
494 // break;
495 // }
496 // SkeepEvent();
497 // if (++cnt >= maxevents) break;
498 // }
499 // return found;
500 // }
501 // void Pmm2Reader::SkeepEvent()
502 // {
503 // //isEventSaved = false;
504 // Pmm2Event *evt = GetEvent(); // We need read event data
505 // if ( evt != NULL ) delete evt ; // We will not process this event,
506 // // return NULL on read arror
507 // }
508 
509 // void Pmm2Reader::PushBack()
510 // {
511 // HarpoDet dt(fPlane); //TODO do we need this ?
512 // fSaveEvent = fEvent;
513 // fEvent = NULL;
514 // isEventSaved = true;
515 // //DEBUG
516 // std::cout << "PushBack " << dt.GetDescription() << " Evt " << fNevts << std::endl;
517 // }
A class hold HARPO run iformation.
Pmm2Event * GetEvent()
Can Read next event from raw file.
Definition: Pmm2Reader.cxx:387
Dcc Plane Y.
Definition: HarpoDet.h:20
Pmm2MesList fRawDigi
Definition: Pmm2Reader.h:91
Container of bits stream as string.
Definition: BData.h:16
A class Pmm2Status is bits representation of pmm2 status register (0x400).
Definition: Pmm2Status.h:12
UInt_t _PPSCounter
FPGA data.
Definition: Pmm2Mes.h:79
ULong_t fTimeStamp
void SetRunHeader(HarpoDetHeader *rh)
Return pointer to decoded pmm2 data vector.
Definition: HarpoDetEvent.h:52
u_int32_t asGray(size_t i, size_t j) const
Slice as integer in Gray code.
Definition: BData.cxx:69
bin mode like mclientUDP feminis data
Definition: HarpoConfig.h:46
Pmm2Mes & Front()
Definition: Pmm2MesList.h:59
#define N_WORD_IN_BLOCK
n word := n mes * sizeof(OneChannelData) / sizeof(int)
Definition: Pmm2Reader.h:26
UInt_t eventSize
Raw Event size.
Definition: HarpoDetEvent.h:28
void SetDet(Int_t det)
Definition: HarpoDetEvent.h:43
void SetTriggerType(Int_t val)
Definition: Pmm2Event.h:28
void SetTimeStamp(Double_t val)
Definition: Pmm2Event.h:46
A class hold HARPO run information.
Definition: Pmm2Header.h:17
virtual void Init()
TString * GetInFile(Int_t idet)
Get Input file name for detector.
Definition: HarpoConfig.h:96
Pmm2Mes GetNext()
Definition: Pmm2MesList.h:61
Long_t fNbufs
Definition: Pmm2Reader.h:71
Pmm2Event * fSaveEvent
Definition: Pmm2Reader.h:77
void unPackRawDigi()
Unpack Raw Buffer and create Digi List.
Definition: Pmm2Reader.cxx:327
Long_t fNstats
Definition: Pmm2Reader.h:73
UInt_t _TdcRamp
10 bits(30..39) - Fine Time
Definition: Pmm2Mes.h:74
Bool_t NextDigi()
Definition: Pmm2Reader.cxx:125
ULong_t fPrevTimeStamp
HarpoDetAnalyse * fRawAnalyse
Definition: Pmm2Reader.h:79
void SetReaderType(int Id)
Set HaroReaderType.
Bool_t Empty()
Definition: Pmm2MesList.h:57
A virtual base class for all HARPO detectors readers.
Long_t fRVer
Read buffer from file.
Definition: Pmm2Reader.h:67
UInt_t _Charge
1 bit(40) - TDC Ramp
Definition: Pmm2Mes.h:75
Pmm2Event * fEvent
Definition: Pmm2Reader.h:76
Int_t fNreset
Definition: Pmm2Reader.h:85
ULong_t fPrevTimeStamp2
Definition: Pmm2Reader.h:88
UInt_t _nu0
Definition: Pmm2Mes.h:77
Bool_t Init()
Init method : Open in/out files and check run header signature.
Definition: Pmm2Reader.cxx:401
ULong_t GetTimeStamp(Int_t after=0)
Data Format.
Definition: Pmm2Event.cxx:92
UInt_t _TimeStamp
Definition: Pmm2Mes.h:70
Int_t GetNU0() const
Definition: Pmm2Mes.h:56
void SetAnalyseFunction(HarpoDetAnalyse *func)
Definition: Pmm2Reader.cxx:119
Long_t fNdigs
Definition: Pmm2Reader.h:72
FILE * fIn
Definition: Pmm2Reader.h:69
Bool_t NextEvent()
Definition: Pmm2Reader.cxx:154
HarpoDetHeader * fRunHeader
UInt_t _TimeStampSign
Definition: Pmm2Mes.h:71
UInt_t _FineTime
1 bit(29) - ADC Gain
Definition: Pmm2Mes.h:73
Long64_t gHarpoDebug
Definition: HarpoDebug.cxx:9
virtual void ProcessEvent(HarpoDetEvent *event)
virtual Bool_t check()=0
Harpo Event Header.
Definition: HarpoDetEvent.h:26
TString * fInFile
double getTemperature() const
Definition: Pmm2Status.cxx:133
UInt_t BuffType
Definition: Pmm2Reader.h:83
void Push(const Pmm2Mes &val)
Definition: Pmm2MesList.h:67
Bool_t Lookup(const char *path, Bool_t &val)
Lookup function for scalar values.
A class store HARPO raw PMM2 event buffer and header. End provide access metods to the row data...
Definition: Pmm2Event.h:19
A one channel mesurements for Pmm2v2 card The class is represent one channel data of Pmm2v2 card for ...
Definition: Pmm2Mes.h:16
A virtual class which define interface between HARPO Det Reader and Event Analysis code...
UInt_t _Gain
1 bit(28) - Time Stamp Counter
Definition: Pmm2Mes.h:72
void Clear()
Definition: Pmm2MesList.h:55
void AddMes(Pmm2Mes &m)
Ruturn pointer to decoded data vector.
Definition: Pmm2Event.cxx:71
void ReadBuffer()
Can Read next Buffer from raw file.
Definition: Pmm2Reader.cxx:382
A class which read HARPO raw file from PMM2 and create Raw Events objects.
Definition: Pmm2Reader.h:31
bin mode as written by Windows PMMv2_DAQ program
Definition: HarpoConfig.h:45
Int_t getTimeStamp() const
Definition: Pmm2Mes.h:32
Int_t getPPS() const
Definition: Pmm2Mes.h:60
Long_t Loop()
Read errors.
Definition: Pmm2Reader.cxx:478
void SetHeader(UShort_t *data)
Definition: Pmm2Event.cxx:48
HarpoConfig * gHConfig
virtual ~Pmm2Reader()
Definition: Pmm2Reader.cxx:107
Bool_t NextBuffer()
Have we more Digi to Process.
Definition: Pmm2Reader.cxx:233
EventHeader_t lHeader
Definition: Pmm2Reader.h:81
A class which keeps track of the entire configuration of the analysis.
Definition: HarpoConfig.h:50
TEXT mode (?? csv), UNIMPLEMENTED.
Definition: HarpoConfig.h:44
virtual void Save(char *=NULL)
UInt_t eventNumb
Event number in run.
Definition: HarpoDetEvent.h:29
Int_t verbose
Definition: Pmm2Reader.h:86
Pmm2Header * GetDetHeader()
Definition: Pmm2Reader.cxx:392
UInt_t lData[N_WORD_IN_BLOCK]
Definition: Pmm2Reader.h:82
Long64_t GetVerbose()
Get program verbosity level.
Definition: HarpoConfig.h:115
UInt_t _ChannelNum
Event can access to class varibales.
Definition: Pmm2Mes.h:69