1 #include <evt/Header.h>
4 #include <fevt/FEvent.h>
7 #include <sevt/SEvent.h>
8 #include <sevt/Header.h>
9 #include <sevt/EventTrigger.h>
11 #include <io/CDASToOfflineEventConverter.h>
12 #include <io/FDasToOfflineEventConverter.h>
13 #include <io/IoAugerEventFile.h>
15 #include <utl/ErrorLogger.h>
16 #include <utl/AugerException.h>
17 #include <utl/config.h>
20 #include <AugerEvent.h>
24 #include <mevt/MEvent.h>
26 #include <RadioFileIO.h>
27 #include <revt/REvent.h>
28 #include <revt/Station.h>
29 #include <revt/Channel.h>
30 #include <revt/Header.h>
31 #include <revt/StationTriggerData.h>
32 #include <revt/StationGPSData.h>
33 #include <revt/EventTrigger.h>
34 #include <revt/StationHeader.h>
35 #include <det/Detector.h>
36 #include <rdet/RDetector.h>
37 #include <rdet/Station.h>
49 IoAugerEventFile::IoAugerEventFile(
const std::string&
filename,
87 if (s == AugerFile::eFailure)
94 event.GetRawEvent() =
raw;
97 for (AugerEvent::EyeIterator eyeIter = raw.EyesBegin(), eyesEnd = raw.EyesEnd();
98 eyeIter != eyesEnd; ++eyeIter)
101 ostringstream id_str;
102 id_str <<
"auger_" << raw.Id();
111 const IoSdT3Trigger*
const rawTrigger = &raw.Sd().Trigger;
112 const unsigned int second = rawTrigger->Second;
113 const unsigned int microSecond =
115 const TimeStamp currentTime(second, microSecond);
123 sHeader.
SetId(raw.Sd().Id);
128 const md::Event mdRawEvt = raw.Md();
129 const md::Trigger mdTrg = mdRawEvt.GetTrigger();
130 const unsigned int t3Sec = mdTrg.GetT3Sec();
134 md::ID mdId = mdTrg.GetId();
155 const int run_id = raw.
REvent->getAeraEventRunId();
156 const int event_id = raw.REvent->getAeraEventEventId();
159 rHeader.
SetId(event_id);
161 rHeader.
SetFileId(raw.REvent->getAeraEventFileId());
166 #warning JN: this should probably better be done in the CDASToOfflineConverter as for SD, MD, etc.
167 id_str <<
"__rd_" << run_id <<
"." << event_id;
170 const unsigned int ts_s = raw.REvent->getAeraEventSeconds();
171 const unsigned int ts_ns = raw.REvent->getAeraEventNanoSeconds();
177 WARNING(
"Event skipped! TimeStamp was not filled correctly.");
181 det::Detector::GetInstance().Update(ts);
187 WARNING(
"Warning overwrites Event Trigger information");
191 if (raw.REvent->getAeraEventStatus() == 2) {
192 WARNING(
"Event skipped! Event does not have an active station.");
196 int triggersourceIsAevb = 1;
197 int triggersourceIsSelf = 0;
198 int triggersourceIsCalib = 0;
199 int triggersourceIsScint = 0;
200 int triggersourceIsSD = 0;
201 int triggersourceIsGui = 0;
202 int triggersourceIsFD = 0;
203 int triggersourceIsHEAT = 0;
204 int triggersourceIsAERAlet = 0;
205 int triggersourceIsAIRPLANE = 0;
206 int triggersourceIsPeriodic = 0;
207 int triggersourceIsPassThrough = 0;
209 for (
int i = 0; i < raw.REvent->getAeraEventLsCount(); ++i) {
210 const auto aStation = raw.REvent->getAeraEventStation(i);
211 if (aStation->getAeraStationTriggerIsAevb() != 1) {
213 if (!triggersourceIsSelf)
214 triggersourceIsSelf = aStation->getAeraStationTriggerIsSelf();
215 if (!triggersourceIsCalib)
216 triggersourceIsCalib = aStation->getAeraStationTriggerIsCalibration();
217 if (!triggersourceIsScint)
218 triggersourceIsScint = aStation->getAeraStationTriggerIsScintillator();
219 if (!triggersourceIsSD)
220 triggersourceIsSD = aStation->getAeraStationTriggerIsSD();
221 if (!triggersourceIsGui)
222 triggersourceIsGui = aStation->getAeraStationTriggerIsGUI();
223 if (!triggersourceIsFD)
224 triggersourceIsFD = aStation->getAeraStationTriggerIsFD();
225 if (!triggersourceIsHEAT)
226 triggersourceIsHEAT = aStation->getAeraStationTriggerIsHEAT();
227 if (!triggersourceIsAERAlet)
228 triggersourceIsAERAlet = aStation->getAeraStationTriggerIsAERAlet();
229 if (!triggersourceIsAIRPLANE)
230 triggersourceIsAIRPLANE = aStation->getAeraStationTriggerIsAirplane();
231 if (!triggersourceIsPeriodic)
232 triggersourceIsPeriodic = aStation->getAeraStationTriggerIsPeriodic();
233 if (!triggersourceIsPassThrough)
234 triggersourceIsPassThrough = aStation->getAeraStationTriggerIsPassThrough();
241 if (triggersourceIsSelf || triggersourceIsCalib || triggersourceIsScint || triggersourceIsSD ||
242 triggersourceIsGui || triggersourceIsFD || triggersourceIsHEAT || triggersourceIsAERAlet ||
243 triggersourceIsAIRPLANE || triggersourceIsPeriodic || triggersourceIsPassThrough)
244 triggersourceIsAevb = 0;
246 if (triggersourceIsSelf == 1) {
250 if (triggersourceIsCalib == 1) {
254 if (triggersourceIsScint == 1) {
258 if (triggersourceIsSD == 1) {
262 if (triggersourceIsGui == 1) {
266 if (triggersourceIsFD == 1) {
270 if (triggersourceIsHEAT == 1) {
274 if (triggersourceIsAERAlet == 1) {
278 if (triggersourceIsAIRPLANE == 1) {
282 if (triggersourceIsPeriodic == 1) {
286 if (triggersourceIsPassThrough == 1) {
288 WARNING(
"Event IsPassThrough");
290 if (triggersourceIsSD == 1 || triggersourceIsGui == 1 || triggersourceIsFD == 1 ||
291 triggersourceIsHEAT == 1 || triggersourceIsAERAlet == 1 || triggersourceIsAIRPLANE == 1 ||
292 triggersourceIsPeriodic == 1 || triggersourceIsPassThrough == 1)
294 if (triggersourceIsAevb == 1) {
295 WARNING(
"Event skipped! No known trigger source found.");
301 ostringstream stationname;
302 for (
int i = 0; i < raw.REvent->getAeraEventLsCount(); ++i) {
304 const auto aStation = raw.REvent->getAeraEventStation(i);
306 const int station_id = aStation->getAeraStationLsID();
307 if (aStation->getAeraStationTriggerIsAevb() == 1 ||
308 aStation->getAeraStationTracelength() == 0)
313 if (station_id > 200 && station_id < 210)
314 stationname <<
"M" << (station_id - 200);
316 stationname <<
"AERA_" << station_id;
319 WARNING(
"Overwriting station information");
325 const rdet::Station& detstation = det::Detector::GetInstance().GetRDetector().GetStation(station);
327 WARNING(
"Overwriting station trigger information");
331 triggersourceIsSelf = aStation->getAeraStationTriggerIsSelf();
332 triggersourceIsCalib = aStation->getAeraStationTriggerIsCalibration();
333 triggersourceIsScint = aStation->getAeraStationTriggerIsScintillator();
334 triggersourceIsSD = aStation->getAeraStationTriggerIsSD();
335 triggersourceIsGui = aStation->getAeraStationTriggerIsGUI();
336 triggersourceIsFD = aStation->getAeraStationTriggerIsFD();
337 triggersourceIsHEAT = aStation->getAeraStationTriggerIsHEAT();
338 triggersourceIsAERAlet = aStation->getAeraStationTriggerIsAERAlet();
339 triggersourceIsAIRPLANE = aStation->getAeraStationTriggerIsAirplane();
340 triggersourceIsPeriodic = aStation->getAeraStationTriggerIsPeriodic();
341 triggersourceIsPassThrough = aStation->getAeraStationTriggerIsPassThrough();
342 triggersourceIsAevb = aStation->getAeraStationTriggerIsAevb();
344 if (triggersourceIsSelf)
346 else if (triggersourceIsCalib)
348 else if (triggersourceIsScint)
350 else if (triggersourceIsSD)
352 else if (triggersourceIsGui)
354 else if (triggersourceIsFD)
356 else if (triggersourceIsHEAT)
358 else if (triggersourceIsAERAlet)
360 else if (triggersourceIsAIRPLANE)
362 else if (triggersourceIsPeriodic)
364 else if (triggersourceIsPassThrough)
366 else if (triggersourceIsSD || triggersourceIsGui || triggersourceIsFD || triggersourceIsHEAT ||
367 triggersourceIsAERAlet || triggersourceIsAIRPLANE || triggersourceIsPeriodic ||
368 triggersourceIsPassThrough)
370 else if (triggersourceIsAevb)
371 WARNING(
"Trigger source unknown on station level.");
374 WARNING(
"Overwriting station GPS information");
380 WARNING(
"Overwriting station header");
383 if (aStation->getAeraStationHWType() == 1)
385 else if (aStation->getAeraStationHWType() == 2)
387 else if (aStation->getAeraStationHWType() == 3)
391 msg <<
" Unknown Hardware type :: getAeraEvbHardwareType() = "
392 << aStation->getAeraStationHWType() <<
"\n"
393 " Skip to next event";
399 const double samplingfreq = aStation->getAeraStationSamplingFreq() *
utl::megahertz;
402 const unsigned int ts_s = aStation->getAeraStationSeconds();
404 stationts.
SetGPSTime(ts_s, aStation->getAeraStationNanoseconds());
409 WARNING(
"Event skipped! TimeStamp was not filled correctly.");
413 double pretrigtime = 0;
415 if (aStation->getAeraStationHWType() == 1) {
416 if ((aStation->getAeraStationHWVersion() < 7 &&
417 aStation->getAeraStationHWVersion() > 0) ||
418 (raw.REvent->getAeraEventRunId() > 200000 && raw.REvent->getAeraEventRunId() < 200300)) {
419 const unsigned int s = aStation->getAeraStationMessagePreTriggerWindow();
420 const unsigned int t = aStation->getAeraStationMessageCoincidenceWindow();
421 pretrigtime = (s + t) / samplingfreq;
422 }
else if (aStation->getAeraStationHWVersion() >= 7) {
424 unsigned short int pre;
427 uc[0] = aStation->getAeraStationMessageV2PPSWindows(0);
428 uc[1] = aStation->getAeraStationMessageV2PPSWindows(1);
429 const unsigned int coinc = aStation->getAeraStationMessageV2PPSControl(6);
430 pretrigtime = (pre + coinc) / samplingfreq;
433 pretrigtime = aStation->getAeraStationTriggerPos() / samplingfreq;
439 WARNING(
"Event skipped! TimeStamp was not filled correctly.");
444 if (aStation->getAeraStationHWType() == 1 && aStation->getAeraStationVersion() >= 3) {
449 for (
int k = 36; k < 36+4; ++k)
450 uc[k - 36] = aStation->getAeraStationMessageV2PPSGPS(k);
453 const float addTempInt = aStation->getAeraStationGerTemperatureInt();
454 const float addTempExt = aStation->getAeraStationGerTemperatureExt();
460 const int numberofsamples = aStation->getAeraStationTracelength();
462 unsigned int thresh = 0;
464 for (
int ch_id = 1; ch_id <= detstation.
GetNChannels(); ++ch_id) {
468 if ((aStation->getAeraStationChannelMask() & (1 << (ch_id-1))) == 0) {
474 if (aStation->getAeraStationHWType() == 3 || aStation->getAeraStationHWType() == 1) {
477 if (aStation->getAeraStationTracelength() == 0) {
479 info <<
" No data in channel: " << ch_id <<
". "
480 " Channel will be marked as not active.";
485 for (
int ii = 0; ii < numberofsamples; ++ii)
486 thistrace.
PushBack(aStation->getAeraStationADC(ch_id-1)->GetADCValues(ii));
489 info <<
"Electronic readout is not implemented. Electronic type is "
490 << aStation->getAeraStationHWType() <<
". "
491 ". Channel is set to not active\n";
498 if (aStation->getAeraStationHWType() == 1) {
499 if (((aStation->getAeraStationHWVersion() < 7) &&
500 (aStation->getAeraStationHWVersion() > 0)) ||
501 ((raw.REvent->getAeraEventRunId() > 200000) && (raw.REvent->getAeraEventRunId() < 200300 )) ) {
503 thresh = aStation->getAeraStationMessageSignalThresholdCH0();
505 thresh = aStation->getAeraStationMessageSignalThresholdCH1();
507 thresh = aStation->getAeraStationMessageSignalThresholdCH2();
509 thresh = aStation->getAeraStationMessageSignalThresholdCH3();
511 if (thresh != 0xFFFF)
514 thresh = aStation->getAeraStationMessageNoiseThresholdCH0();
516 thresh = aStation->getAeraStationMessageNoiseThresholdCH1();
518 thresh = aStation->getAeraStationMessageNoiseThresholdCH2();
520 thresh = aStation->getAeraStationMessageNoiseThresholdCH3();
521 if (thresh != 0xFFFF)
523 }
else if (aStation->getAeraStationHWVersion() >= 7) {
525 thresh = aStation->getAeraStationMessageV2Threshold1CH1();
527 thresh = aStation->getAeraStationMessageV2Threshold1CH2();
529 thresh = aStation->getAeraStationMessageV2Threshold1CH3();
531 thresh = aStation->getAeraStationMessageV2Threshold1CH4();
533 if (thresh != 0xFFFF)
536 thresh = aStation->getAeraStationMessageV2Threshold2CH1();
538 thresh = aStation->getAeraStationMessageV2Threshold2CH2();
540 thresh = aStation->getAeraStationMessageV2Threshold2CH3();
542 thresh = aStation->getAeraStationMessageV2Threshold2CH4();
543 if (thresh != 0xFFFF)
557 header.
SetId(id_str.str());
567 const string error =
"Attempted to write into read-only IoAuger event file.";
576 INFO(
"Non-existent RawEvent, unable to stream to file.");
582 const FEvent& fdEvent =
event.GetFEvent();
584 eyesEnd = fdEvent.
EyesEnd(ComponentSelector::eHasData); eIt != eyesEnd; ++eIt)
585 if (eIt->HasTriggerData()) {
597 INFO(
"Non-existent sd-trigger, unable to stream to file.");
602 INFO(
"No trigger, skipping event in IoAuger. "
603 "Use Offline-native for streaming.");
609 const AugerEvent&
raw =
event.GetRawEvent();
611 fAugerFile->Write(const_cast<AugerEvent&>(raw));
bool HasTrigger() const
check whether the central trigger object exists
AugerFile::Mode ConvertMode(const Mode m)
void SetAERAletTrigger(const bool trig)
Set if Event comes from AERALET trigger.
StationTriggerData & GetTriggerData()
Get Trigger data for the station.
Detector description interface for Station-related data.
bool HasTriggerData() const
Check whether trigger data object exists.
boost::filter_iterator< ComponentSelector, ConstAllEyeIterator > ConstEyeIterator
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.
Interface class to access to the SD part of an event.
void Write(const evt::Event &event) override
Open file for write, fail if exists.
EventTrigger & GetTrigger()
Get the object with central trigger data, throw if n.a.
EventTrigger & GetTrigger()
Get the object with central trigger data, throw if n.a.
EyeIterator EyesEnd(const ComponentSelector::Status status)
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 Open(const std::string &filename, const Mode mode=eRead, utl::Branch *const b=nullptr) override
void SetGUITrigger(const bool trig)
Set if Event comes from GUI trigger.
#define INFO(message)
Macro for logging informational messages.
Base class for exceptions trying to access non-existing components.
virtual ~IoAugerEventFile()
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.
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 SetExternalTrigger(const bool trig)
Set if Event was externally triggered.
void SetSelfTrigger(const bool trig)
Set if Event was selftriggered.
int GetNEvents() override
void SetHEATTrigger(const bool trig)
Set if Event comes from HEAT trigger.
bool HasStationHeader() const
Check whether StationHeader exists.
Class representing a document branch.
Status
Return code for seek operation.
class to hold data at the radio Station level.
Status FindEvent(const unsigned int n) override
seek Event id set cursor there
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.
void MakeStationHeader()
Make Station Header object.
void MakeTrigger()
Create the central trigger object.
constexpr double nanosecond
Header & GetHeader()
access to REvent Header
bool HasTrigger() const
check whether the central trigger object exists
int GetNChannels() const
Number of channels in station.
EyeIterator EyesBegin(const ComponentSelector::Status status)
constexpr double megahertz
StationGPSData & GetGPSData()
Get GPS data for the station.
Status GotoPosition(const unsigned int n) override
goto by position in the file
#define WARNING(message)
Macro for logging warning messages.
Top of Fluorescence Detector event hierarchy.
void SetPassThroughTrigger(const bool trig)
Set if Event comes from PASSTHROUGH trigger.
void SetSDTrigger(const bool trig)
Set if Event comes from SD trigger.
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)
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.
Overwrite if exist and open for write.
sevt::Header & GetHeader()
std::string GetAlgorithm() const
Get algorithm of the trigger.
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.
constexpr double microsecond
void MakeStation(const int stationId)
make a station with specifying Id, throw if invalid stationId
Root of the Muon event hierarchy.
void SetHWTemperatureInt(const double temp)
Status Read(evt::Event &event) override
read current event advance cursor by 1
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