RadioFileAERAroot.cc
Go to the documentation of this file.
1 #include <io/RadioFileAERAroot.h>
2 
3 #include <utl/ErrorLogger.h>
4 #include <utl/AugerException.h>
5 
6 #include <config.h>
7 
8 #include <evt/Event.h>
9 #include <evt/Header.h>
10 #include <revt/REvent.h>
11 #include <revt/Station.h>
12 #include <revt/Channel.h>
13 #include <revt/ChannelRecData.h>
14 #include <revt/ChannelRRecDataQuantities.h>
15 #include <revt/Header.h>
16 #include <revt/StationTriggerData.h>
17 #include <revt/StationGPSData.h>
18 #include <revt/EventTrigger.h>
19 #include <revt/StationHeader.h>
20 
21 #include <utl/Trace.h>
22 #include <utl/TimeStamp.h>
23 #include <utl/UTCDateTime.h>
24 #include <utl/LeapSeconds.h>
25 
26 #include <det/Detector.h>
27 #include <rdet/RDetector.h>
28 #include <rdet/Station.h>
29 #include <rdet/Channel.h>
30 
31 #include <TKey.h>
32 #include <TFile.h>
33 #include <TTree.h>
34 
35 #include <RadioFileIO.h>
36 #include <TBranch.h>
37 #include <cstddef>
38 #include <cstdlib>
39 #include <iostream>
40 #include <sstream>
41 #include <map>
42 #include <vector>
43 
44 //#include <amsg.h>
45 //#include <llog.h>
46 
47 using namespace std;
48 using namespace utl;
49 using namespace io;
50 using namespace evt;
51 using namespace revt;
52 //using namespace aera;
53 
54 
55 void
56 RadioFileAERAroot::Open(const std::string& filename, const Mode mode, utl::Branch* const b)
57 {
58  Close();
59 
60  VROOTFile::Open(filename, mode, b);
61 
62  if (mode == eRead) {
63  fRadioFileIO = new RadioFileIO();
64 
65  if (!fFile->Get("AERAIOTree")) {
66  throw utl::IOFailureException("Could not find the AERAIOTree inside the input file. "
67  "Please check if the correct InputFileType is set or "
68  "if the file is corrupt or empty!");
69  }
70 
71  fIOLibTree = (TTree*)fFile->Get("AERAIOTree");
72  fIObranch = fIOLibTree->GetBranch("AERAIO");
73  fIObranch->SetAddress(&fRadioFileIO);
74  fSourceFileName = filename;
75  }
76 
77  if (mode == eNew)
78  fRadioFileIO = new RadioFileIO();
79 
80  /*VROOTFile::Open(filename, mode);
81 
82  if (!fFile)
83  throw utl::IOFailureException("Cannot open file for RadioFileAERAroot io");
84 
85  if (fFile->IsZombie())
86  throw utl::IOFailureException("Radio file in zombie io state");
87 
88  fCurrentEvent = 0;
89 
90  if (fMode == eWrite || fMode == eNew || fMode == eAppend)
91  fFile->SetCompressionLevel(io::kDefaultCompressionLevel);*/
92 }
93 
94 
95 void
96 RadioFileAERAroot::Close()
97 {
98  if (!fFile)
99  return;
100 
101  //closeAeraEventFile();
102  VROOTFile::Close();
103  fHasFileOpen = false;
104 
105  fIOLibTree = nullptr;
106  fIObranch = nullptr;
107 
108  delete fRadioFileIO;
109  fRadioFileIO = nullptr;
110 
111  delete fFile;
112  fFile = nullptr;
113 
114  fCurrentEvent = -1;
115 }
116 
117 
118 void
120 {
121  fFile->Print();
122 }
123 
124 
125 void
126 RadioFileAERAroot::Write(const evt::Event& event)
127 {
128  const REvent& revent = event.GetREvent();
129 
130  // check if there is actually an event we can export
131  if (revent.GetAERARootIoEventId() < 0) {
132  throw utl::IOFailureException("Could not export RadioAERAroot event, "
133  "did you use another file type than RadioAERAroot in the EventFileReader?");
134  }
135 
136  // fixme TH: This is a temporary solution. Write() method should have direct access to last-read event, e.g. via a static member variable.
137  fRadioFileIO->WriteSelectedEventsOffline(revent.GetAERARootIoSourceFileName(), fFile, revent.GetAERARootIoEventId());
138 
139  //std::map<short, std::map<short, std::vector<short> > > traces;
140  //for(REvent::ConstStationIterator iS = revent.StationsBegin(); iS != revent.StationsEnd(); ++iS) {
141  // std::map<short, std::vector<short> > tmpChannels;
142  // for(revt::Station::ConstChannelIterator iC = iS->ChannelsBegin(); iC != iS->ChannelsEnd(); ++iC) {
143  // std::vector<short> tmpTrace;
144  // const ChannelTimeSeries& trace = iC->GetChannelTimeSeries();
145  // tmpTrace.reserve(trace.GetSize());
146  // for(int i = 0; i < trace.GetSize(); ++i) {
147  // tmpTrace.push_back(trace[i]);
148  // }
149  // short channelId = iC->GetId();
150  // tmpChannels.insert(std::pair<short, std::vector<short> > (channelId - 1, tmpTrace));
151  // }
152  // short stationId = iS->GetId();
153  // traces.insert(std::pair<short, std::map<short, std::vector<short> > > (stationId, tmpChannels));
154  //}
155  //fRadioFileIO->WriteSelectedEventsOfflineWithTrace(revent.GetAERARootIoSourceFileName(),
156  // fFile, revent.GetAERARootIoEventId(), traces);
157 }
158 
159 
160 Status
161 RadioFileAERAroot::Read(evt::Event& event)
162 {
163  ++fCountEvent;
164 
165  if (fCountEvent == fIOLibTree->GetEntries()) { // reached end of file
166  fIsFirstevent = true;
167  return eEOF;
168  }
169 
170  if (event.HasREvent())
171  WARNING("Event not cleared - has REvent");
172  else
173  event.MakeREvent();
174 
175  REvent& revent = event.GetREvent();
176 
177  // save meta data for later event export
178  revent.SetAERARootIoSourceFileName(fSourceFileName);
179  revent.SetAERARootIoEventId(fCountEvent);
180 
181  fIOLibTree->GetEntry(fCountEvent);
182 
183  //if (fRadioFileIO->getAeraRadioFileIOStatus() == 0 || fRadioFileIO->getAeraRadioFileEvent()->getAeraEventStatus() == 0) {
184  // WARNING("Event skipped! Header length not correct or event corrupt.");
185  // return eSkipEvent;
186  //}
187 
188  if (fIOLibTree->GetEntry(fCountEvent) == 0) {
189  if (fRadioFileIO->getAeraRadioFileIOStatus() == 0 || fRadioFileIO->getAeraRadioFileEvent()->getAeraEventStatus() == 0) {
190  WARNING("Event skipped! Header length not correct or event corrupt.");
191  return eSkipEvent;
192  }
193  } else {
194  if (fRadioFileIO->getAeraRadioFileEvent()->getAeraEventStatus() == 0) {
195  WARNING("Event skipped! Header length not correct or event corrupt.");
196  return eSkipEvent;
197  }
198  }
199 
200  auto aEvent = *fRadioFileIO->getAeraRadioFileEvent();
201 
202  const int run_id = aEvent.getAeraEventRunId();
203  const int event_id = aEvent.getAeraEventEventId();
204 
205  revent.GetHeader().SetId(aEvent.getAeraEventEventId());
206  //~ revent.GetHeader().SetEventNumber( aEvent.getAeraEventRunningEventId() );
207  revent.GetHeader().SetFileId(aEvent.getAeraEventFileId());
208  revent.GetHeader().SetNumberOfStations(aEvent.getAeraEventLsCount());
209  revent.GetHeader().SetEventVersion(aEvent.getAeraEventEventVersion());
210 
211  revent.GetHeader().SetRunNumber(run_id);
212  ostringstream id;
213  id << "revt_" << run_id << "_" << event_id;
214 
215  event.GetHeader().SetId(id.str()); // string ID for Event
216 
217  unsigned int ts_s = aEvent.getAeraEventSeconds();
218  const unsigned int ts_ns = aEvent.getAeraEventNanoSeconds();
219 
220  utl::TimeStamp ts;
221  try {
222  ts.SetGPSTime(ts_s, ts_ns);
223  } catch (OutOfBoundException&) {
224  WARNING("Event skipped! TimeStamp was not filled correctly.");
225  return eSkipEvent;
226  }
227 
228  det::Detector::GetInstance().Update(ts);
229  event.GetHeader().SetTime(ts);
230  revent.GetHeader().SetTime(ts);
231  /* ///////////////////// Maybe station.status as additional check?
232  if (!getAeraEventFirstLsData()) {
233  WARNING("No Local station data found");
234  return eFail;
235  }
236  */
237  if (revent.HasTrigger())
238  WARNING("Warning overwrites Event Trigger information");
239  else
240  revent.MakeTrigger();
241 
242  if (aEvent.getAeraEventStatus() == 2) {
243  WARNING("Event skipped! Event does not have an active station.");
244  return eSkipEvent;
245  }
246 
247  //int triggersource =0;
248  int triggersourceIsAevb = 1;
249  int triggersourceIsSelf = 0;
250  int triggersourceIsCalib = 0;
251  int triggersourceIsScint = 0;
252  int triggersourceIsSD = 0;
253  int triggersourceIsGui = 0;
254  int triggersourceIsFD = 0;
255  int triggersourceIsHEAT = 0;
256  int triggersourceIsAERAlet = 0;
257  int triggersourceIsAIRPLANE = 0;
258  int triggersourceIsPeriodic = 0;
259  int triggersourceIsPassThrough = 0;
260 
261  for (int i = 0; i < aEvent.getAeraEventLsCount(); ++i) {
262  auto aStation = *aEvent.getAeraEventStation(i);
263  if (aStation.getAeraStationTriggerIsAevb() != 1) {
264  // triggersource is only set if not unknown (=0)
265  if (!triggersourceIsSelf)
266  triggersourceIsSelf = aStation.getAeraStationTriggerIsSelf();
267  if (!triggersourceIsCalib)
268  triggersourceIsCalib = aStation.getAeraStationTriggerIsCalibration();
269  if (!triggersourceIsScint)
270  triggersourceIsScint = aStation.getAeraStationTriggerIsScintillator();
271  if (!triggersourceIsSD)
272  triggersourceIsSD = aStation.getAeraStationTriggerIsSD();
273  if (!triggersourceIsGui)
274  triggersourceIsGui = aStation.getAeraStationTriggerIsGUI();
275  if (!triggersourceIsFD)
276  triggersourceIsFD = aStation.getAeraStationTriggerIsFD();
277  if (!triggersourceIsHEAT)
278  triggersourceIsHEAT = aStation.getAeraStationTriggerIsHEAT();
279  if (!triggersourceIsAERAlet)
280  triggersourceIsAERAlet = aStation.getAeraStationTriggerIsAERAlet();
281  if (!triggersourceIsAIRPLANE)
282  triggersourceIsAIRPLANE = aStation.getAeraStationTriggerIsAirplane();
283  if (!triggersourceIsPeriodic)
284  triggersourceIsPeriodic = aStation.getAeraStationTriggerIsPeriodic();
285  if (!triggersourceIsPassThrough)
286  triggersourceIsPassThrough = aStation.getAeraStationTriggerIsPassThrough();
287  revent.GetTrigger().SetBitPattern(aStation.getAeraStationTriggerFlag());
288  //triggersourceIsAevb = 0;
289  //break;
290  }
291  }
292 
293  if (triggersourceIsSelf || triggersourceIsCalib || triggersourceIsScint || triggersourceIsSD ||
294  triggersourceIsGui || triggersourceIsFD || triggersourceIsHEAT || triggersourceIsAERAlet ||
295  triggersourceIsAIRPLANE || triggersourceIsPeriodic || triggersourceIsPassThrough)
296  triggersourceIsAevb = 0;
297 
298  if (triggersourceIsSelf == 1) {
299  revent.GetTrigger().SetSelfTrigger(true);
300  WARNING("Event IsSelf");
301  }
302  if (triggersourceIsCalib == 1) {
303  revent.GetTrigger().SetCalibrationTrigger(true);
304  WARNING("Event IsCalib");
305  }
306  if (triggersourceIsScint == 1) {
307  revent.GetTrigger().SetScintillatorTrigger(true);
308  WARNING("Event IsScint");
309  }
310  if (triggersourceIsSD == 1) {
311  revent.GetTrigger().SetSDTrigger(true);
312  WARNING("Event IsSD");
313  }
314  if (triggersourceIsGui == 1) {
315  revent.GetTrigger().SetGUITrigger(true);
316  WARNING("Event IsGUI");
317  }
318  if (triggersourceIsFD == 1) {
319  revent.GetTrigger().SetFDTrigger(true);
320  WARNING("Event IsFD");
321  }
322  if (triggersourceIsHEAT == 1) {
323  revent.GetTrigger().SetHEATTrigger(true);
324  WARNING("Event IsHEAT");
325  }
326  if (triggersourceIsAERAlet == 1) {
327  revent.GetTrigger().SetAERAletTrigger(true);
328  WARNING("Event IsAERALET");
329  }
330  if (triggersourceIsAIRPLANE == 1) {
331  revent.GetTrigger().SetAIRPLANETrigger(true);
332  WARNING("Event IsAIRPLANE");
333  }
334  if (triggersourceIsPeriodic == 1) {
335  revent.GetTrigger().SetPeriodicTrigger(true);
336  WARNING("Event IsPeriodic");
337  }
338  if (triggersourceIsPassThrough == 1) {
339  revent.GetTrigger().SetPassThroughTrigger(true);
340  WARNING("Event IsPassThrough");
341  }
342  if (triggersourceIsSD == 1 || triggersourceIsGui == 1 || triggersourceIsFD == 1 ||
343  triggersourceIsHEAT == 1 || triggersourceIsAERAlet == 1 || triggersourceIsAIRPLANE == 1) {
344  revent.GetTrigger().SetExternalTrigger(true);
345  }
346  if (triggersourceIsAevb == 1) {
347  WARNING("Event skipped! No known trigger source found.");
348  return eSkipEvent;
349  }
350 
352 
353  for (int i = 0; i < aEvent.getAeraEventLsCount(); ++i) { //LS station loop
354 
355  auto aStation = *aEvent.getAeraEventStation(i);
356 
357  const int station_id = aStation.getAeraStationLsID();
358  if (aStation.getAeraStationTriggerIsAevb() == 1 ||
359  aStation.getAeraStationTracelength() == 0)
360  continue; // skip station if aevb Event or no channel data
361 
362  ostringstream stationname;
363 
364  if (station_id > 200 && station_id < 210)
365  stationname << 'M' << (station_id - 200);
366  else
367  stationname << "AERA_" << station_id;
368  try {
369  if (revent.HasStation(stationname.str())) {
370  const string msg = "Warning overwrites station information";
371  WARNING(msg);
372  } else
373  revent.MakeStation(stationname.str());
374 
375  revt::Station& station = revent.GetStationByName(stationname.str());
376  const rdet::Station& detstation = det::Detector::GetInstance().GetRDetector().GetStation(station); //Get the RDetector::Station from revt::Station
377  if (station.HasTriggerData()) {
378  string msg = "Overwriting station trigger information";
379  WARNING(msg);
380  } else
381  station.MakeTriggerData();
382 
383  triggersourceIsSelf = aStation.getAeraStationTriggerIsSelf();
384  triggersourceIsCalib = aStation.getAeraStationTriggerIsCalibration();
385  triggersourceIsScint = aStation.getAeraStationTriggerIsScintillator();
386  triggersourceIsSD = aStation.getAeraStationTriggerIsSD();
387  triggersourceIsGui = aStation.getAeraStationTriggerIsGUI();
388  triggersourceIsFD = aStation.getAeraStationTriggerIsFD();
389  triggersourceIsHEAT = aStation.getAeraStationTriggerIsHEAT();
390  triggersourceIsAERAlet = aStation.getAeraStationTriggerIsAERAlet();
391  triggersourceIsAIRPLANE = aStation.getAeraStationTriggerIsAirplane();
392  triggersourceIsPeriodic = aStation.getAeraStationTriggerIsPeriodic();
393  triggersourceIsPassThrough = aStation.getAeraStationTriggerIsPassThrough();
394  triggersourceIsAevb = aStation.getAeraStationTriggerIsAevb();
395 
396  if (triggersourceIsScint)
397  station.GetTriggerData().SetTriggerSource(StationTriggerData::eScint);
398  else if (triggersourceIsSelf)
399  station.GetTriggerData().SetTriggerSource(StationTriggerData::eSelf);
400  else if (triggersourceIsCalib)
401  station.GetTriggerData().SetTriggerSource(StationTriggerData::eCalib);
402  else if (triggersourceIsSD)
404  else if (triggersourceIsGui)
405  station.GetTriggerData().SetTriggerSource(StationTriggerData::eGUI);
406  else if (triggersourceIsFD)
408  else if (triggersourceIsHEAT)
409  station.GetTriggerData().SetTriggerSource(StationTriggerData::eHEAT);
410  else if (triggersourceIsAERAlet)
411  station.GetTriggerData().SetTriggerSource(StationTriggerData::eAERAlet);
412  else if (triggersourceIsAIRPLANE)
413  station.GetTriggerData().SetTriggerSource(StationTriggerData::eAIRPLANE);
414  else if (triggersourceIsPeriodic)
416  else if (triggersourceIsPassThrough)
417  station.GetTriggerData().SetTriggerSource(StationTriggerData::ePassThrough);
418  else if (triggersourceIsSD || triggersourceIsGui || triggersourceIsFD || triggersourceIsHEAT ||
419  triggersourceIsAERAlet || triggersourceIsAIRPLANE)
420  station.GetTriggerData().SetTriggerSource(StationTriggerData::eExternal);
421  else if (triggersourceIsAevb)
422  WARNING("Trigger source unknown on station level.");
423 
424  station.GetTriggerData().SetOffset(aStation.getAeraStationTriggerPos());
425  if (station.HasGPSData())
426  WARNING("Warning overwrites station GPS information");
427  else
428  station.MakeGPSData();
429 
430  StationGPSData& gps = station.GetGPSData();
431 
432  if (station.HasStationHeader()) {
433  const string msg ="Warning overwrites station header" ;
434  WARNING(msg);
435  } else
436  station.MakeStationHeader();
437  if (aStation.getAeraStationHWType() == 1)
438  station.GetStationHeader().SetHardwareType(StationHeader::eNL);
439  else if (aStation.getAeraStationHWType() == 2)
440  station.GetStationHeader().SetHardwareType(StationHeader::eFR);
441  else if (aStation.getAeraStationHWType() == 3)
442  station.GetStationHeader().SetHardwareType(StationHeader::eDE);
443  else {
444  ostringstream msg;
445  msg << " Unknown Hardware type :: getAeraEvbHardwareType() = "
446  << aStation.getAeraStationHWType() << "\n"
447  " Event ID is << " << id.str() << " File is " << fRadioFileIO->getAeraRadioFileIOFileId() << "\n"
448  " Skip to next event.";
449  ERROR(msg);
450  break;
451  }
452  station.GetStationHeader().SetHardwareVersion(aStation.getAeraStationHWVersion());
453 
454  const double samplingfreq =
455  double(aStation.getAeraStationSamplingFreq()) * utl::megahertz;
456  ts_s = aStation.getAeraStationSeconds();
457 
458  utl::TimeStamp stationts;
459  try {
460  stationts.SetGPSTime(ts_s, aStation.getAeraStationNanoseconds());
461  gps.SetSecond(ts_s); // ? Why was ts_gps_s
462  gps.SetCorrectedNanosecond(aStation.getAeraStationNanoseconds()); // corrected from what ?
463  } catch (utl::OutOfBoundException& e) {
464  WARNING("Event skipped! TimeStamp was not filled correctly.");
465  return eSkipEvent;
466  }
467  double pretrigtime = 0;
468 
469  if (aStation.getAeraStationHWType() == 1) {
470  if ((aStation.getAeraStationHWVersion() < 7 &&
471  aStation.getAeraStationHWVersion() > 0) ||
472  (aEvent.getAeraEventRunId() > 200000 &&
473  aEvent.getAeraEventRunId() < 200300)) { // New NL data
474  const unsigned int s = aStation.getAeraStationMessagePreTriggerWindow();
475  const unsigned int t = aStation.getAeraStationMessageCoincidenceWindow();
476  pretrigtime = (s + t) / samplingfreq;
477  } else if (aStation.getAeraStationHWVersion() >= 7) {
478  const unsigned short coinc = aStation.getAeraStationMessageV2PPSControl(6);
479  union {
480  unsigned char uc[2];
481  unsigned short pre;
482  };
483  for (unsigned int j = 0; j < 2; ++j)
484  uc[j] = aStation.getAeraStationMessageV2PPSWindows(j);
485  pretrigtime = (pre + coinc) / samplingfreq;
486  }
487  } else
488  pretrigtime = double(aStation.getAeraStationTriggerPos()) / samplingfreq;
489  utl::TimeInterval pretrig(pretrigtime);
490  try {
491  station.SetRawTraceStartTime(stationts-pretrig);
492  } catch (utl::OutOfBoundException&) {
493  WARNING("Event skipped! TimeStamp was not filled correctly.");
494  return eSkipEvent;
495  }
496 
497  // read temperature from additional station info, available for NL stations from LS version 3 (last 4 chars of additional info)
498  if (aStation.getAeraStationHWType() == 1 &&
499  aStation.getAeraStationVersion() >= 3) {
500  union {
501  unsigned char uc[4];
502  float addTemp;
503  };
504  for (int k = 36; k < 40; ++k)
505  uc[k - 36] = aStation.getAeraStationMessageV2PPSGPS(k);
506  station.SetHWTemperature(addTemp);
507  } else {
508  const float AddTempInt = aStation.getAeraStationGerTemperatureInt();
509  const float AddTempExt = aStation.getAeraStationGerTemperatureExt();
510  station.SetHWTemperatureInt(AddTempInt + 273.15);
511  station.SetHWTemperatureExt(AddTempExt + 273.15);
512  }
513 
514  // Need additional check for new NL HW type! e.g. sd200272 -> 676 ok, other events: (nl) /4?
515  const int numberofsamples = aStation.getAeraStationTracelength();
516 
517  unsigned int thresh = 0; // UINT16 in RadioFileAERA
518  ostringstream info;
519  for (int ch_id = 1; ch_id <= detstation.GetNChannels(); ++ch_id) {
520  info.str("");
521  revt::Channel& chan = station.GetChannel(ch_id);
522  // If Channel is not present in data, it will be set as inactive;
523  if ((aStation.getAeraStationChannelMask() & (1 << (ch_id - 1))) == 0) {
524  chan.SetNotActive();
525  continue;
526  }
527  chan.SetActive();
529  if (aStation.getAeraStationHWType() == 3 ||
530  aStation.getAeraStationHWType() == 1) {
531 
532  thistrace.SetBinning(1. / samplingfreq);
533 
534  if (aStation.getAeraStationTracelength() == 0) {
535  info.str("");
536  info << " No data in channel: " << ch_id << ". "
537  "Channel will be marked as not active.";
538  WARNING(info);
539  chan.SetNotActive();
540  continue;
541  }
542 
543  // Prevent stations with multiplicity greater than 1 to keep filling traces
544  if (thistrace.GetSize() != 0) {
545  info.str("");
546  info << "Channel " << ch_id
547  << "already exsists, skipping.";
548  WARNING(info);
549  continue;
550  }
551  for (int ii = 0; ii < numberofsamples; ++ii)
552  thistrace.PushBack(aStation.getAeraStationADC(ch_id - 1)->GetADCValues(ii));
553 
554  // Get scintillator high voltage from data
555  unsigned short scintHV = 0;
556  const rdet::Channel& detChannel = detstation.GetChannel(chan.GetId());
557  if (detChannel.GetChannelType() == "ScintillatorBottom" || detChannel.GetChannelType() == "ScintillatorTop") {
558  if (ch_id == 1)
559  scintHV = aStation.getAeraStationMessageV2PPSCH1(8);
560  if (ch_id == 2)
561  scintHV = aStation.getAeraStationMessageV2PPSCH2(8);
562  if (ch_id == 3)
563  scintHV = aStation.getAeraStationMessageV2PPSCH3(8);
564  if (ch_id == 4)
565  scintHV = aStation.getAeraStationMessageV2PPSCH4(8);
566  // Convert internal HV setting to HV on the PMT (in Volts).
567  // The internal voltage setting is driven from a 8 bit DAC (n=0...255) connected to
568  // an amplifier which gives 0.3V + (n/256) * 1.25V.
569  // The Phototube internally amplifies this voltage by a factor of 1000.
570  chan.SetScintHighVoltage((0.3 + scintHV/256.0*1.25)*1000.0);
571  }
572 
573  } else {
574  info.str("");
575  info << "Electronic readout is not implemented, Electronic type is "
576  << aStation.getAeraStationHWType()
577  << ". Channel is Set has inactive.";
578  chan.SetNotActive();
579  WARNING(info);
580  }
581  chan.SetNyquistZone(1);
582 
583  if (aStation.getAeraStationHWType() == 1) {
584  if ((aStation.getAeraStationHWVersion() < 7 &&
585  aStation.getAeraStationHWVersion() > 0) ||
586  (aEvent.getAeraEventRunId() > 200000 &&
587  aEvent.getAeraEventRunId() < 200300)) { // New NL data
588  if (ch_id == 1)
589  thresh = aStation.getAeraStationMessageSignalThresholdCH0();
590  if (ch_id == 2)
591  thresh = aStation.getAeraStationMessageSignalThresholdCH1();
592  if (ch_id == 3)
593  thresh = aStation.getAeraStationMessageSignalThresholdCH2();
594  if (ch_id == 4)
595  thresh = aStation.getAeraStationMessageSignalThresholdCH3();
596  // 0xFFFF is the Error code returned by the library in case no threshold is found
597  if (thresh != 0xFFFF)
598  chan.SetSignalThreshold(thresh);
599  if (ch_id == 1)
600  thresh = aStation.getAeraStationMessageNoiseThresholdCH0();
601  if (ch_id == 2)
602  thresh = aStation.getAeraStationMessageNoiseThresholdCH1();
603  if (ch_id == 3)
604  thresh = aStation.getAeraStationMessageNoiseThresholdCH2();
605  if (ch_id == 4)
606  thresh = aStation.getAeraStationMessageNoiseThresholdCH3();
607  if (thresh != 0xFFFF)
608  chan.SetNoiseThreshold(thresh);
609  } else if (aStation.getAeraStationHWVersion() >= 7) {
610  if (ch_id == 1)
611  thresh = aStation.getAeraStationMessageV2Threshold1CH1();
612  if (ch_id == 2)
613  thresh = aStation.getAeraStationMessageV2Threshold1CH2();
614  if (ch_id == 3)
615  thresh = aStation.getAeraStationMessageV2Threshold1CH3();
616  if (ch_id == 4)
617  thresh = aStation.getAeraStationMessageV2Threshold1CH4();
618  // 0xFFFF is the Error code returned by the library in case no threshold is found
619  if (thresh != 0xFFFF)
620  chan.SetSignalThreshold(thresh);
621  if (ch_id == 1)
622  thresh = aStation.getAeraStationMessageV2Threshold2CH1();
623  if (ch_id == 2)
624  thresh = aStation.getAeraStationMessageV2Threshold2CH2();
625  if (ch_id == 3)
626  thresh = aStation.getAeraStationMessageV2Threshold2CH3();
627  if (ch_id == 4)
628  thresh = aStation.getAeraStationMessageV2Threshold2CH4();
629  if (thresh != 0xFFFF)
630  chan.SetNoiseThreshold(thresh);
631  }
632  } else {
633  chan.SetSignalThreshold(thresh);
634  chan.SetNoiseThreshold(thresh);
635  }
636  } //for (channel) ...
638  ERROR(e.what());
639  }
640  } //for (station) ...
641  ++fCurrentEvent;
642  return eSuccess;
643 }
644 
645 
646 Status
647 RadioFileAERAroot::FileStatus()
648 {
649  if (!fHasFileOpen)
650  return eFail;
651  else
652  return eSuccess;
653 }
654 
655 
656 Status
657 RadioFileAERAroot::FindEvent(const unsigned int /*id*/)
658 {
659  WARNING("RadioFileAERAroot::FindEvent not implemented!");
660  return eEOF;
661 }
662 
663 
664 Status
665 RadioFileAERAroot::GotoPosition(const unsigned int /*position*/)
666 {
667  WARNING("RadioFileAERAroot::GotoPosition not implemented!");
668  return eEOF;
669 }
670 
671 
672 int
673 RadioFileAERAroot::GetNEvents()
674 {
675  WARNING("RadioFileAERAroot::GetNEvents not implemented!");
676  return 0;
677 }
bool HasTrigger() const
check whether the central trigger object exists
Definition: REvent.h:236
void SetAERAletTrigger(const bool trig)
Set if Event comes from AERALET trigger.
void SetHardwareType(const HardwareType t)
Set type of hardware used (should be provided by the DAQ)
Definition: StationHeader.h:28
int GetId() const
Return Id of the Channel.
StationTriggerData & GetTriggerData()
Get Trigger data for the station.
Detector description interface for Station-related data.
bool HasTriggerData() const
Check whether trigger data object exists.
void SetPeriodicTrigger(const bool trig)
Set if Event comes from PERIODIC trigger.
void SetOffset(const int offset)
Set postTrigger time in bins.
Station & GetStationByName(const std::string &name)
retrieve station by name, throw utl::NonExistentComponentException if n.a.
Definition: REvent.h:194
Interface class to access to the Radio part of an event.
Definition: REvent.h:42
Open file for write, fail if exists.
Definition: IoCodes.h:19
EventTrigger & GetTrigger()
Get the object with central trigger data, throw if n.a.
Definition: REvent.h:229
void SetCorrectedNanosecond(const unsigned int &ns)
Set corrected trigger nanosecond.
Mode
Available open modes.
Definition: IoCodes.h:16
void SetBitPattern(const uint16_t BitPattern)
Set the Trigger Bit Pattern.
void SetGUITrigger(const bool trig)
Set if Event comes from GUI trigger.
void SetAERARootIoEventId(const double parEventId)
Definition: REvent.h:270
Base class for exceptions trying to access non-existing components.
Detector description interface for Channel-related data.
bool HasREvent() const
void SetEventVersion(const int ver)
Definition: REvent/Header.h:33
void SetAIRPLANETrigger(const bool trig)
Set if Event comes from AIRPLANE trigger.
void SetHWTemperatureExt(const double temp)
void SetNoiseThreshold(const unsigned int thresh)
From DAQ.
A TimeStamp holds GPS second and nanosecond for some event.
Definition: TimeStamp.h:110
void SetCalibrationTrigger(const bool trig)
Set if Event comes from calibration trigger.
double GetAERARootIoEventId() const
access to AERARootIO event id
Definition: REvent.h:269
void SetTime(const utl::TimeStamp &time)
Version of the AERAEvent used by the DAQ software.
Definition: REvent/Header.h:27
Exception for reporting variable out of valid range.
void MakeGPSData()
Make GPS data object.
Base class to report exceptions in IO.
void MakeTriggerData()
Make trigger data object.
void SetAERARootIoSourceFileName(const std::string &parFileName)
Definition: REvent.h:266
void SetExternalTrigger(const bool trig)
Set if Event was externally triggered.
void SetHardwareVersion(const int v)
Set version of hardware is used (should be provided by the DAQ)
Definition: StationHeader.h:31
void SetSelfTrigger(const bool trig)
Set if Event was selftriggered.
void SetHEATTrigger(const bool trig)
Set if Event comes from HEAT trigger.
bool HasStationHeader() const
Check whether StationHeader exists.
const std::string & GetChannelType() const
Get description of Channel Type.
Class representing a document branch.
Definition: Branch.h:107
Status
Return code for seek operation.
Definition: IoCodes.h:24
class to hold data at the radio Station level.
constexpr double s
Definition: AugerUnits.h:163
void SetRawTraceStartTime(const utl::TimeStamp &time)
Set absolute start time of the station-level trace as originally provided in raw data, for reconstructions use eTraceStartTime in StationRecData!
void SetGPSTime(const unsigned long sec, const double nsec=0)
Set GPS second and (optionally) nanosecond.
Definition: TimeStamp.h:120
const std::string & GetAERARootIoSourceFileName() const
access to AERARootIO source file name
Definition: REvent.h:265
void MakeStationHeader()
Make Station Header object.
void MakeTrigger()
Create the central trigger object.
Definition: REvent.cc:174
Header & GetHeader()
access to REvent Header
Definition: REvent.h:239
int GetNChannels() const
Number of channels in station.
constexpr double megahertz
Definition: AugerUnits.h:155
void Print(ostream &os, const TimeDistribution< T > &td)
SizeType GetSize() const
Definition: Trace.h:156
StationGPSData & GetGPSData()
Get GPS data for the station.
#define WARNING(message)
Macro for logging warning messages.
Definition: ErrorLogger.h:163
void SetPassThroughTrigger(const bool trig)
Set if Event comes from PASSTHROUGH trigger.
void SetSDTrigger(const bool trig)
Set if Event comes from SD trigger.
const Channel & GetChannel(const int id) const
Get specified Channel by id.
void SetFileId(const int id)
Definition: REvent/Header.h:30
void SetBinning(const double binning)
Definition: Trace.h:139
Channel & GetChannel(const int pmtId)
Retrieve a Channel by Id.
void SetSecond(const unsigned int &sec)
Set end of traces raw time.
A TimeInterval is used to represent time elapsed between two events.
Definition: TimeInterval.h:43
void SetSignalThreshold(const unsigned int thresh)
void SetScintHighVoltage(const double scinthv)
From DAQ.
void SetNumberOfStations(const int nstat)
Definition: REvent/Header.h:31
void SetId(const int id)
Definition: REvent/Header.h:28
ChannelADCTimeSeries & GetChannelADCTimeSeries()
Get Channel ADC trace (write access, only use this if you intend to change the data) ...
Class that holds the data associated to an individual radio channel.
void SetRunNumber(const int run)
Definition: REvent/Header.h:32
void SetScintillatorTrigger(const bool trig)
Set if Event comes from scintillator trigger.
bool HasStation(const int stationId) const
Check whether station exists.
Definition: REvent.cc:132
StationHeader & GetStationHeader()
Get the Station Header.
char * filename
Definition: dump1090.h:266
void SetNyquistZone(const unsigned int zone)
Set the Nyquist zone.
void PushBack(const T &value)
Insert a single value at the end.
Definition: Trace.h:119
void SetNotActive()
#define ERROR(message)
Macro for logging error messages.
Definition: ErrorLogger.h:165
bool HasGPSData() const
Check whether GPS data object exists.
void MakeStation(const int stationId)
make a station with specifying Id, throw if invalid stationId
Definition: REvent.cc:94
void SetHWTemperatureInt(const double temp)
void SetActive()
Active means that it is used in reconstruction. By default this is true after read-in, but can be deactivated later.
void SetTriggerSource(const TriggerSource TrigSource)
Set the Trigger Source of the station, i.e. if it triggered itself or was triggered by the central st...
void SetHWTemperature(const double temp)
void SetFDTrigger(const bool trig)
Set if Event comes from FD trigger.
const char * what() const
std::exception will print this on crash

, generated on Tue Sep 26 2023.