3 #include <utl/ErrorLogger.h>
4 #include <utl/AugerException.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>
21 #include <utl/Trace.h>
22 #include <utl/TimeStamp.h>
23 #include <utl/UTCDateTime.h>
24 #include <utl/LeapSeconds.h>
26 #include <det/Detector.h>
27 #include <rdet/RDetector.h>
28 #include <rdet/Station.h>
29 #include <rdet/Channel.h>
35 #include <RadioFileIO.h>
60 VROOTFile::Open(filename, mode, b);
63 fRadioFileIO =
new RadioFileIO();
65 if (!fFile->Get(
"AERAIOTree")) {
67 "Please check if the correct InputFileType is set or "
68 "if the file is corrupt or empty!");
71 fIOLibTree = (TTree*)fFile->Get(
"AERAIOTree");
72 fIObranch = fIOLibTree->GetBranch(
"AERAIO");
73 fIObranch->SetAddress(&fRadioFileIO);
78 fRadioFileIO =
new RadioFileIO();
96 RadioFileAERAroot::Close()
103 fHasFileOpen =
false;
105 fIOLibTree =
nullptr;
109 fRadioFileIO =
nullptr;
128 const REvent& revent =
event.GetREvent();
133 "did you use another file type than RadioAERAroot in the EventFileReader?");
165 if (fCountEvent == fIOLibTree->GetEntries()) {
166 fIsFirstevent =
true;
171 WARNING(
"Event not cleared - has REvent");
175 REvent& revent =
event.GetREvent();
181 fIOLibTree->GetEntry(fCountEvent);
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.");
194 if (fRadioFileIO->getAeraRadioFileEvent()->getAeraEventStatus() == 0) {
195 WARNING(
"Event skipped! Header length not correct or event corrupt.");
200 auto aEvent = *fRadioFileIO->getAeraRadioFileEvent();
202 const int run_id = aEvent.getAeraEventRunId();
203 const int event_id = aEvent.getAeraEventEventId();
213 id <<
"revt_" << run_id <<
"_" << event_id;
215 event.GetHeader().SetId(
id.str());
217 unsigned int ts_s = aEvent.getAeraEventSeconds();
218 const unsigned int ts_ns = aEvent.getAeraEventNanoSeconds();
224 WARNING(
"Event skipped! TimeStamp was not filled correctly.");
228 det::Detector::GetInstance().Update(ts);
229 event.GetHeader().SetTime(ts);
238 WARNING(
"Warning overwrites Event Trigger information");
242 if (aEvent.getAeraEventStatus() == 2) {
243 WARNING(
"Event skipped! Event does not have an active station.");
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;
261 for (
int i = 0; i < aEvent.getAeraEventLsCount(); ++i) {
262 auto aStation = *aEvent.getAeraEventStation(i);
263 if (aStation.getAeraStationTriggerIsAevb() != 1) {
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();
293 if (triggersourceIsSelf || triggersourceIsCalib || triggersourceIsScint || triggersourceIsSD ||
294 triggersourceIsGui || triggersourceIsFD || triggersourceIsHEAT || triggersourceIsAERAlet ||
295 triggersourceIsAIRPLANE || triggersourceIsPeriodic || triggersourceIsPassThrough)
296 triggersourceIsAevb = 0;
298 if (triggersourceIsSelf == 1) {
302 if (triggersourceIsCalib == 1) {
306 if (triggersourceIsScint == 1) {
310 if (triggersourceIsSD == 1) {
314 if (triggersourceIsGui == 1) {
318 if (triggersourceIsFD == 1) {
322 if (triggersourceIsHEAT == 1) {
326 if (triggersourceIsAERAlet == 1) {
330 if (triggersourceIsAIRPLANE == 1) {
334 if (triggersourceIsPeriodic == 1) {
338 if (triggersourceIsPassThrough == 1) {
340 WARNING(
"Event IsPassThrough");
342 if (triggersourceIsSD == 1 || triggersourceIsGui == 1 || triggersourceIsFD == 1 ||
343 triggersourceIsHEAT == 1 || triggersourceIsAERAlet == 1 || triggersourceIsAIRPLANE == 1) {
346 if (triggersourceIsAevb == 1) {
347 WARNING(
"Event skipped! No known trigger source found.");
353 for (
int i = 0; i < aEvent.getAeraEventLsCount(); ++i) {
355 auto aStation = *aEvent.getAeraEventStation(i);
357 const int station_id = aStation.getAeraStationLsID();
358 if (aStation.getAeraStationTriggerIsAevb() == 1 ||
359 aStation.getAeraStationTracelength() == 0)
362 ostringstream stationname;
364 if (station_id > 200 && station_id < 210)
365 stationname <<
'M' << (station_id - 200);
367 stationname <<
"AERA_" << station_id;
370 const string msg =
"Warning overwrites station information";
376 const rdet::Station& detstation = det::Detector::GetInstance().GetRDetector().GetStation(station);
378 string msg =
"Overwriting station trigger information";
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();
396 if (triggersourceIsScint)
398 else if (triggersourceIsSelf)
400 else if (triggersourceIsCalib)
402 else if (triggersourceIsSD)
404 else if (triggersourceIsGui)
406 else if (triggersourceIsFD)
408 else if (triggersourceIsHEAT)
410 else if (triggersourceIsAERAlet)
412 else if (triggersourceIsAIRPLANE)
414 else if (triggersourceIsPeriodic)
416 else if (triggersourceIsPassThrough)
418 else if (triggersourceIsSD || triggersourceIsGui || triggersourceIsFD || triggersourceIsHEAT ||
419 triggersourceIsAERAlet || triggersourceIsAIRPLANE)
421 else if (triggersourceIsAevb)
422 WARNING(
"Trigger source unknown on station level.");
426 WARNING(
"Warning overwrites station GPS information");
433 const string msg =
"Warning overwrites station header" ;
437 if (aStation.getAeraStationHWType() == 1)
439 else if (aStation.getAeraStationHWType() == 2)
441 else if (aStation.getAeraStationHWType() == 3)
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.";
454 const double samplingfreq =
456 ts_s = aStation.getAeraStationSeconds();
460 stationts.
SetGPSTime(ts_s, aStation.getAeraStationNanoseconds());
464 WARNING(
"Event skipped! TimeStamp was not filled correctly.");
467 double pretrigtime = 0;
469 if (aStation.getAeraStationHWType() == 1) {
470 if ((aStation.getAeraStationHWVersion() < 7 &&
471 aStation.getAeraStationHWVersion() > 0) ||
472 (aEvent.getAeraEventRunId() > 200000 &&
473 aEvent.getAeraEventRunId() < 200300)) {
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);
483 for (
unsigned int j = 0; j < 2; ++j)
484 uc[j] = aStation.getAeraStationMessageV2PPSWindows(j);
485 pretrigtime = (pre + coinc) / samplingfreq;
488 pretrigtime = double(aStation.getAeraStationTriggerPos()) / samplingfreq;
493 WARNING(
"Event skipped! TimeStamp was not filled correctly.");
498 if (aStation.getAeraStationHWType() == 1 &&
499 aStation.getAeraStationVersion() >= 3) {
504 for (
int k = 36; k < 40; ++k)
505 uc[k - 36] = aStation.getAeraStationMessageV2PPSGPS(k);
508 const float AddTempInt = aStation.getAeraStationGerTemperatureInt();
509 const float AddTempExt = aStation.getAeraStationGerTemperatureExt();
515 const int numberofsamples = aStation.getAeraStationTracelength();
517 unsigned int thresh = 0;
519 for (
int ch_id = 1; ch_id <= detstation.
GetNChannels(); ++ch_id) {
523 if ((aStation.getAeraStationChannelMask() & (1 << (ch_id - 1))) == 0) {
529 if (aStation.getAeraStationHWType() == 3 ||
530 aStation.getAeraStationHWType() == 1) {
534 if (aStation.getAeraStationTracelength() == 0) {
536 info <<
" No data in channel: " << ch_id <<
". "
537 "Channel will be marked as not active.";
544 if (thistrace.
GetSize() != 0) {
546 info <<
"Channel " << ch_id
547 <<
"already exsists, skipping.";
551 for (
int ii = 0; ii < numberofsamples; ++ii)
552 thistrace.
PushBack(aStation.getAeraStationADC(ch_id - 1)->GetADCValues(ii));
555 unsigned short scintHV = 0;
559 scintHV = aStation.getAeraStationMessageV2PPSCH1(8);
561 scintHV = aStation.getAeraStationMessageV2PPSCH2(8);
563 scintHV = aStation.getAeraStationMessageV2PPSCH3(8);
565 scintHV = aStation.getAeraStationMessageV2PPSCH4(8);
575 info <<
"Electronic readout is not implemented, Electronic type is "
576 << aStation.getAeraStationHWType()
577 <<
". Channel is Set has inactive.";
583 if (aStation.getAeraStationHWType() == 1) {
584 if ((aStation.getAeraStationHWVersion() < 7 &&
585 aStation.getAeraStationHWVersion() > 0) ||
586 (aEvent.getAeraEventRunId() > 200000 &&
587 aEvent.getAeraEventRunId() < 200300)) {
589 thresh = aStation.getAeraStationMessageSignalThresholdCH0();
591 thresh = aStation.getAeraStationMessageSignalThresholdCH1();
593 thresh = aStation.getAeraStationMessageSignalThresholdCH2();
595 thresh = aStation.getAeraStationMessageSignalThresholdCH3();
597 if (thresh != 0xFFFF)
600 thresh = aStation.getAeraStationMessageNoiseThresholdCH0();
602 thresh = aStation.getAeraStationMessageNoiseThresholdCH1();
604 thresh = aStation.getAeraStationMessageNoiseThresholdCH2();
606 thresh = aStation.getAeraStationMessageNoiseThresholdCH3();
607 if (thresh != 0xFFFF)
609 }
else if (aStation.getAeraStationHWVersion() >= 7) {
611 thresh = aStation.getAeraStationMessageV2Threshold1CH1();
613 thresh = aStation.getAeraStationMessageV2Threshold1CH2();
615 thresh = aStation.getAeraStationMessageV2Threshold1CH3();
617 thresh = aStation.getAeraStationMessageV2Threshold1CH4();
619 if (thresh != 0xFFFF)
622 thresh = aStation.getAeraStationMessageV2Threshold2CH1();
624 thresh = aStation.getAeraStationMessageV2Threshold2CH2();
626 thresh = aStation.getAeraStationMessageV2Threshold2CH3();
628 thresh = aStation.getAeraStationMessageV2Threshold2CH4();
629 if (thresh != 0xFFFF)
647 RadioFileAERAroot::FileStatus()
657 RadioFileAERAroot::FindEvent(
const unsigned int )
659 WARNING(
"RadioFileAERAroot::FindEvent not implemented!");
665 RadioFileAERAroot::GotoPosition(
const unsigned int )
667 WARNING(
"RadioFileAERAroot::GotoPosition not implemented!");
673 RadioFileAERAroot::GetNEvents()
675 WARNING(
"RadioFileAERAroot::GetNEvents not implemented!");
bool HasTrigger() const
check whether the central trigger object exists
void SetAERAletTrigger(const bool trig)
Set if Event comes from AERALET trigger.
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.
Interface class to access to the Radio part of an event.
Open file for write, fail if exists.
EventTrigger & GetTrigger()
Get the object with central trigger data, throw if n.a.
void SetCorrectedNanosecond(const unsigned int &ns)
Set corrected trigger nanosecond.
Mode
Available open modes.
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)
Base class for exceptions trying to access non-existing components.
Detector description interface for Channel-related data.
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.
void SetCalibrationTrigger(const bool trig)
Set if Event comes from calibration trigger.
double GetAERARootIoEventId() const
access to AERARootIO event id
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)
void SetExternalTrigger(const bool trig)
Set if Event was externally triggered.
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.
Status
Return code for seek operation.
class to hold data at the radio Station level.
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.
const std::string & GetAERARootIoSourceFileName() const
access to AERARootIO source file name
void MakeStationHeader()
Make Station Header object.
void MakeTrigger()
Create the central trigger object.
Header & GetHeader()
access to REvent Header
int GetNChannels() const
Number of channels in station.
constexpr double megahertz
void Print(ostream &os, const TimeDistribution< T > &td)
StationGPSData & GetGPSData()
Get GPS data for the station.
#define WARNING(message)
Macro for logging warning messages.
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 SetBinning(const double binning)
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.
void SetSignalThreshold(const unsigned int thresh)
void SetScintHighVoltage(const double scinthv)
From DAQ.
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 SetScintillatorTrigger(const bool trig)
Set if Event comes from scintillator trigger.
bool HasStation(const int stationId) const
Check whether station exists.
StationHeader & GetStationHeader()
Get the Station Header.
void SetNyquistZone(const unsigned int zone)
Set the Nyquist zone.
void PushBack(const T &value)
Insert a single value at the end.
#define ERROR(message)
Macro for logging error messages.
bool HasGPSData() const
Check whether GPS data object exists.
void MakeStation(const int stationId)
make a station with specifying Id, throw if invalid stationId
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