RdEventMerger.cc
Go to the documentation of this file.
1 #include "RdEventMerger.h"
2 
3 #include <fwk/CentralConfig.h>
4 
5 #include <utl/Reader.h>
6 #include <utl/ErrorLogger.h>
7 #include <utl/TimeStamp.h>
8 #include <utl/TimeInterval.h>
9 #include <utl/TraceAlgorithm.h>
10 
11 #include <io/EventFile.h>
12 #include <io/EventFileChain.h>
13 #include <io/CDASToOfflineEventConverter.h>
14 
15 #include <AugerEvent.h>
16 #include <evt/Event.h>
17 #include <evt/Header.h>
18 #include <sevt/SEvent.h>
19 #include <sevt/Header.h>
20 #include <sevt/EventTrigger.h>
21 #include <revt/REvent.h>
22 #include <revt/EventTrigger.h>
23 #include <revt/Header.h>
24 #include <revt/StationTriggerData.h>
25 #include <revt/StationHeader.h>
26 #include <revt/StationGPSData.h>
27 #include <revt/Channel.h>
28 #include <revt/Station.h>
29 
30 #include <rdet/RDetector.h>
31 #include <rdet/Station.h>
32 
33 #include <fevt/FEvent.h>
34 #include <fevt/Header.h>
35 
36 using namespace std;
37 using namespace utl;
38 using namespace fwk;
39 using namespace io;
40 using namespace evt;
41 using namespace sevt;
42 using namespace revt;
43 
44 namespace RdEventMerger {
45 
47  fInputFiles(0),
48  fEventsWritten(0),
49  fOfflineFile(NULL),
50  fTempEvt(NULL),
51  fSkipAERAlet(0)
52  {
53  }
54 
55  RdEventMerger::~RdEventMerger()
56  {
57  delete fOfflineFile ;
58  }
59 
62  {
63  // Initialize your module here. This method
64  // is called once at the beginning of the run.
65  // The eSuccess flag indicates the method ended
66  // successfully. For other possible return types,
67  // see the VModule documentation.
68 
69  INFO("RdEventMerger::Init()");
70 
71  // Read in the configurations of the xml file
72  Branch topBranch = CentralConfig::GetInstance()->GetTopBranch("RdEventMerger");
73 
74  topBranch.GetChild("OutputFile").GetData(fOffFilename);
75  topBranch.GetChild("WriteMergedFile").GetData(fWriteMerged);
76  topBranch.GetChild("BufferSize").GetData(fBufferSize);
77  topBranch.GetChild("BufferIncrement").GetData(fBufferInc);
78  topBranch.GetChild("RadioMerging").GetData(fRadioMerging);
79  topBranch.GetChild("InputFilenames").GetData(fInputFilenames);
80 
81  topBranch.GetChild("Offset").GetData(fOffset);
82  topBranch.GetChild("CoincidenceWindow").GetData(fCoinWindow);
83  topBranch.GetChild("RadioOffset").GetData(fRadioOffset);
84  topBranch.GetChild("SkipAERAlet").GetData(fSkipAERAlet);
85 
86  if (fBufferInc > fBufferSize) {
87  INFO("<SdBufferIncrement> must be smaller than <SdBufferSize>");
88  return eFailure;
89  }
90 
91  // Read Sd input file type
92  string fileType;
93  topBranch.GetChild("InputFileType").GetData(fileType);
94  if (fileType == "Offline")
96  else if (fileType == "FDAS")
97  fFileType = eFDas;
98  else if (fileType == "CDAS")
99  fFileType = eCDas;
100  else if (fileType == "CORSIKA")
102  else if (fileType == "IoAuger")
104  else if (fileType == "RadioAERA")
106  else if (fileType == "RadioAERAroot")
108 
109  // Create hybrid output file
110  std::ostringstream info;
111  info << "Creating new merged hybrid output file: " << fOffFilename;
112  INFO(info);
113  if (fWriteMerged)
114  fOfflineFile = new EventFile(fOffFilename, io::eNew, io::eOffline);
115 
116  // Opening input file(s)
117  info.str("");
118  info << "Opening input file(s): ";
119  for (vector<string>::const_iterator fIt = fInputFilenames.begin(); fIt != fInputFilenames.end(); ++fIt)
120  info << *fIt << " " ;
121  INFO(info);
122 
124 
125  // ASCII output file, for development purposes
126  string filename = "out.txt";
127  outfile.open(filename.c_str(),ios::out);
128 
129  return eSuccess;
130  }
131 
132 
134  RdEventMerger::Run(evt::Event& event)
135  {
136 
137  // Read radio event (use EventFileReader)
138  REvent& rEvent = event.GetREvent();
139  stringstream message;
140  message << "Radio event " << rEvent.GetHeader().GetId()
141  << " GPS second: " << rEvent.GetHeader().GetTime().GetGPSSecond()
142  << " found with " << rEvent.GetNumberOfStations() << " stations!";
143  INFO(message.str());
144 
145  // Start big while over all input events until coincidence is found or radio event is outside buffer
146  while(1) {
147 
148  // Fill the buffer with input events
149  while (fInputBuffer.size() < fBufferSize) {
150 
151  // Create temporary event and read next input event into it
152  fTempEvt = new Event();
154 
155  if (EndOfInputFiles) {
156  INFO("#### End of input files reached, no more filling of buffer ####");
157  // only if buffer is empty the last event has been reached, so break,
158  // otherwise only break filling of buffer loop
159  if (!fInputBuffer.size()) {
160  return eBreakLoop;
161  } else {
162  break;
163  }
164  }
165 
166  unsigned int Id;
167 
168  if (!fRadioMerging) {
169  // Next lines are needed to get the whole (raw) Sd event
170  // If you don't do this, you don't get the Trigger
171  if(fTempEvt->HasRawEvent() && fTempEvt->GetRawEvent().HasSd()) {
172  *fTempEvt << (fTempEvt)->GetRawEvent().Sd();
173  Id = (fTempEvt)->GetSEvent().GetHeader().GetId();
174  if ((fTempEvt)->GetSEvent().GetTrigger().GetAlgorithm()=="AERA" && fSkipAERAlet==true) {
175  delete fTempEvt;
176  continue;
177  }
178  }
179  else {
180  delete fTempEvt;
181  continue;
182  }
183  }
184  else Id = (fTempEvt)->GetREvent().GetHeader().GetId();
185 
186  // Get the event ID to sort the map (GPS second is not unique), and set the map element of the buffer
187 
188  fInputBuffer[Id] = *fTempEvt;
189 
190  delete fTempEvt;
191 
192  }// end while to fill buffer
193 
194  const revt::Header& RadioHead = rEvent.GetHeader();
195  int StationNumber = RadioHead.GetNumberOfStations();
196  double DeltaT;
197  int CoinCount=0;
198  utl::TimeStamp RdTime = RadioHead.GetTime();
199  utl::TimeStamp InputTime,firstTime,lateTime,lastTime;
200 
201  // Create a bunch of iterators to select events from input buffer
202  map<const unsigned int,evt::Event>::iterator firstInput = fInputBuffer.begin();
203  map<const unsigned int,evt::Event>::iterator lastInput = fInputBuffer.end();
204  map<const unsigned int,evt::Event>::iterator lateInput = fInputBuffer.begin();
205  map<const unsigned int,evt::Event>::iterator It = fInputBuffer.begin();
206  map<const unsigned int,evt::Event>::iterator eraseInput = fInputBuffer.begin();
207 
208  // Move iterators into position
209  lastInput--;
211  lateInput=lastInput;
212  else
213  advance(lateInput,(fBufferSize-fBufferInc-1));
214  advance(eraseInput,fBufferInc);
215 
216  // Read time stamps of first and last event in buffer
217  if (fRadioMerging) {
218  firstTime=(firstInput->second).GetREvent().GetHeader().GetTime();
219  lateTime=(lateInput->second).GetREvent().GetHeader().GetTime();
220  lastTime=(lastInput->second).GetREvent().GetHeader().GetTime();
221  }
222  else {
223  firstTime=(firstInput->second).GetSEvent().GetTrigger().GetTime();
224  lateTime=(lateInput->second).GetSEvent().GetTrigger().GetTime();
225  lastTime=(lastInput->second).GetSEvent().GetTrigger().GetTime();
226  }
227 
228  // Check if Rd event is earlier than events in input buffer
229  if (RdTime+fCoinWindow < firstTime) {
230  INFO("#### Radio event before input events, go to next event ####");
231  return eSuccess;
232  }
233  // Check if Rd event is in main part of input buffer
234  else if (RdTime < lateTime+fCoinWindow) {
235  while (1) {
236  if (fRadioMerging) InputTime=(It->second).GetREvent().GetHeader().GetTime()+fOffset;
237  else InputTime=(It->second).GetSEvent().GetTrigger().GetTime()+fOffset;
238  DeltaT=RdTime-InputTime;
239  if (abs(DeltaT)<fCoinWindow) {
240  INFO("#### Coincidence found in main part of buffer! ####");
241  if(fRadioMerging) {
242  int StationNumberadd = (It->second).GetREvent().GetHeader().GetNumberOfStations();
243  event.GetREvent().GetHeader().SetNumberOfStations(max(StationNumberadd,StationNumber));
244  for (revt::REvent::StationIterator sIt = (It->second).GetREvent().StationsBegin();
245  sIt != (It->second).GetREvent().StationsEnd(); ++sIt) {
246  revt::Station& station = *sIt;
247  int station_id = station.GetId();
248  // Create station and copy from buffer
249  event.GetREvent().MakeStation(station_id);
250  event.GetREvent().GetStation(station_id)=(It->second).GetREvent().GetStation(station_id);
251  // Shift trace start by RadioOffset
252  utl::TimeStamp TraceStart=event.GetREvent().GetStation(station_id).GetRawTraceStartTime();
253  TraceStart=TraceStart+fRadioOffset;
254  event.GetREvent().GetStation(station_id).SetRawTraceStartTime(TraceStart);
255  }
256  }
257  else {
258  event.MakeSEvent();
259  event.GetSEvent() = (It->second).GetSEvent();
260  if ((It->second).HasFEvent()) {
261  event.MakeFEvent();
262  event.GetFEvent() = (It->second).GetFEvent();
263  event.MakeRawEvent();
264  event.GetRawEvent() = (It->second).GetRawEvent();
265  }
266  }
267  if (fWriteMerged)
268  fOfflineFile->Write(event);
269  ExamineEvent(event);
270  fEventsWritten++;
271  INFO("#### Coincidence written ####");
272  CoinCount++;
273  }
274  if (It==lateInput)
275  break;
276  It++;
277  }
278  message.str("");
279  message << "#### Radio event in main part of input buffer, " << CoinCount << " coincidence(s) found ####" << endl
280  << "#### Leave buffer the same and move on to next radio event ####";
281  INFO(message.str());
282  return eSuccess;
283  }
284 
285  // Check if Rd event is in advanced part of input buffer
286  else if (RdTime <= lastTime) {
287  advance(It,(fBufferSize-fBufferInc));
288  while (It!=fInputBuffer.end()) {
289  if (fRadioMerging) InputTime=(It->second).GetREvent().GetHeader().GetTime()+fOffset;
290  else InputTime=(It->second).GetSEvent().GetTrigger().GetTime()+fOffset;
291  DeltaT=RdTime-InputTime;
292  if (abs(DeltaT)<fCoinWindow) {
293  INFO("#### Coincidence found in advanced buffer! ####");
294  if(fRadioMerging) {
295  int StationNumberadd = (It->second).GetREvent().GetHeader().GetNumberOfStations();
296  event.GetREvent().GetHeader().SetNumberOfStations(max(StationNumberadd,StationNumber));
297  for (revt::REvent::StationIterator sIt = (It->second).GetREvent().StationsBegin();
298  sIt != (It->second).GetREvent().StationsEnd(); ++sIt) {
299  revt::Station& station = *sIt;
300  int station_id = station.GetId();
301  // Create station and copy from buffer
302  event.GetREvent().MakeStation(station_id);
303  event.GetREvent().GetStation(station_id)=(It->second).GetREvent().GetStation(station_id);
304  // Shift trace start by RadioOffset
305  utl::TimeStamp TraceStart=event.GetREvent().GetStation(station_id).GetRawTraceStartTime();
306  TraceStart=TraceStart+fRadioOffset;
307  event.GetREvent().GetStation(station_id).SetRawTraceStartTime(TraceStart);
308  }
309  }
310  else {
311  event.MakeSEvent();
312  event.GetSEvent() = (It->second).GetSEvent();
313  if ((It->second).HasFEvent()) {
314  event.MakeFEvent();
315  event.GetFEvent() = (It->second).GetFEvent();
316  event.MakeRawEvent();
317  event.GetRawEvent() = (It->second).GetRawEvent();
318  }
319  }
320  if (fWriteMerged)
321  fOfflineFile->Write(event);
322  ExamineEvent(event);
323  fEventsWritten++;
324  INFO("#### Coincidence written ####");
325  CoinCount++;
326  }
327  It++;
328  }
329  message.str("");
330  message << "#### Radio event in advanced part of input buffer, " << CoinCount << " coincidence(s) found ####" << endl
331  << "#### Remove first " << fBufferInc << " elements from buffer and move on to next radio event ####";
332  INFO(message.str());
333  fInputBuffer.erase(firstInput,eraseInput);
334  return eSuccess;
335  }
336 
337  // Event must be later than input buffer
338  else {
339  if(EndOfInputFiles)
340  fInputBuffer.erase(firstInput);
341  else
342  fInputBuffer.erase(firstInput,eraseInput);
343  continue; // Restart big while loop to refill buffer
344  }
345 
346  } // end big while loop
347 
348  return eSuccess;
349  }
350 
351  // Function to examine the contents of the merged event and print to ascii file
352  void RdEventMerger::ExamineEvent(evt::Event& event){
353 
354  revt::REvent& rEvent = event.GetREvent();
355  const revt::Header& rHeader = rEvent.GetHeader();
356 
357  outfile << "#############################################################################" << endl
358  << "Coincidence found for radio event with ID "
359  << rHeader.GetId() << endl
360  << "Number of stations: " << rEvent.GetNumberOfStations() << endl
361  << "Timestamp: " << rHeader.GetTime() << endl
362  << "#############################################################################" << endl << endl;
363 
364  // Loop through stations
365  for (revt::REvent::StationIterator sIt = rEvent.StationsBegin();
366  sIt != rEvent.StationsEnd(); ++sIt) {
367  revt::Station& station = *sIt;
368  outfile << "Radio station found with ID " << station.GetId() << endl
369  << "Timestamp of station: " << station.GetRawTraceStartTime() << endl
370  << "Hardware type: " << station.GetStationHeader().GetHardwareType() << endl;
371  }
372 
373  if (event.HasSEvent()) {
374  const SEvent& sevent = event.GetSEvent();
375  const sevt::EventTrigger& SevtTrigger = sevent.GetTrigger() ;
376  outfile << endl << "Coinciding Sd event: " << sevent.GetHeader().GetId() << endl
377  << "Total # of stations: " << sevent.GetNumberOfStations() << endl
378  << "Triggered # of stations: " << SevtTrigger.GetNStations() << endl
379  << "Trigger sender: " << SevtTrigger.GetSender() << endl
380  << "Algorithm: " << SevtTrigger.GetAlgorithm() << endl
381  << "Time: " << sevent.GetHeader().GetTime() << endl << endl;
382  }
383 
384  }// end examining
385 
387  RdEventMerger::Finish()
388  {
389 
390  ostringstream info;
391  info << "Wrote " << fEventsWritten << " merged events.";
392  if (fWriteMerged)
393  INFO(info);
394 
395  outfile.close(); // close ascii output
396  if (fWriteMerged)
397  fOfflineFile->Close();
398 
399  delete fInputFiles;
400 
401  return eSuccess;
402  }
403 
404 }
Branch GetTopBranch() const
Definition: Branch.cc:63
Status Read(evt::Event &event)
read current event and advance cursor by 1
Report success to RunController.
Definition: VModule.h:62
FDas file format.
Definition: IoCodes.h:36
evt::Header & GetHeader()
int GetNumberOfStations() const
Get total number of stations in the event.
Definition: SEvent.h:124
Interface class to access to the Radio part of an event.
Definition: REvent.h:42
Interface class to access to the SD part of an event.
Definition: SEvent.h:39
std::vector< std::string > fInputFilenames
Definition: RdEventMerger.h:51
Open file for write, fail if exists.
Definition: IoCodes.h:19
utl::TimeStamp GetTime() const
Definition: REvent/Header.h:17
EventTrigger & GetTrigger()
Get the object with central trigger data, throw if n.a.
Definition: SEvent.h:148
#define INFO(message)
Macro for logging informational messages.
Definition: ErrorLogger.h:161
int GetId() const
Definition: SEvent/Header.h:20
StationIterator StationsEnd()
Definition: REvent.h:130
StationIterator StationsBegin()
Definition: REvent.h:128
void Init()
Initialise the registry.
vector< t2list > out
output of the algorithm: a list of clusters
Definition: XbAlgo.cc:32
Branch GetChild(const std::string &childName) const
Get child of this Branch by child name.
Definition: Branch.cc:211
boost::filter_iterator< StationFilter, AllStationIterator > StationIterator
Iterator over all (non-exculded) stations.
Definition: REvent.h:125
AugerEvent & GetRawEvent()
A TimeStamp holds GPS second and nanosecond for some event.
Definition: TimeStamp.h:110
const utl::TimeStamp & GetTime() const
Definition: SEvent/Header.h:19
Offline native file format.
Definition: IoCodes.h:35
air shower radio simulations generated with EVA
Definition: IoCodes.h:49
#define max(a, b)
Class representing a document branch.
Definition: Branch.h:107
Break current loop. It works for nested loops too!
Definition: VModule.h:66
class to hold data at the radio Station level.
int GetNumberOfStations() const
If a run is made of several files, will give you the file number of the event / provided by the daq...
Definition: REvent/Header.h:25
Interface class to access the Event Trigger (T3)
double abs(const SVector< n, T > &v)
Header & GetHeader()
access to REvent Header
Definition: REvent.h:239
int GetNumberOfStations() const
Get total number of stations in the event.
Definition: REvent.h:206
utl::TimeStamp GetRawTraceStartTime() const
Get absolute start time of the station-level trace as originally provided in raw data, for reconstructions use eTraceStartTime in StationRecData!
void GetData(bool &b) const
Overloads of the GetData member template function.
Definition: Branch.cc:644
int GetId() const
Get the station Id.
io::EventFileChain * fInputFiles
Definition: RdEventMerger.h:49
void Close()
Definition: EventFile.cc:129
void ExamineEvent(evt::Event &event)
unsigned int GetNStations() const
Get number of stations in the trigger.
const std::string & GetId() const
Get the event identifier.
Definition: Event/Header.h:31
A collection of EventFile.
ResultFlag
Flag returned by module methods to the RunController.
Definition: VModule.h:60
Interface to file I/O objects.
Definition: EventFile.h:34
unsigned long GetGPSSecond() const
GPS second.
Definition: TimeStamp.h:124
Header file holding the RD Event Trigger class definition (based on SD)
Definition: REvent/Header.h:14
Report failure to RunController, causing RunController to terminate execution.
Definition: VModule.h:64
bool HasRawEvent() const
sevt::Header & GetHeader()
Definition: SEvent.h:155
std::string GetAlgorithm() const
Get algorithm of the trigger.
HardwareType GetHardwareType() const
Get Type of hardware used (provided by the DAQ)
Definition: StationHeader.h:34
StationHeader & GetStationHeader()
Get the Station Header.
char * filename
Definition: dump1090.h:266
data-format of AERA
Definition: IoCodes.h:50
CDas file format.
Definition: IoCodes.h:37
std::string GetSender() const
Get sender of the trigger.
bool HasSEvent() const
int GetId() const
Definition: REvent/Header.h:21
io::EventFile * fOfflineFile
Definition: RdEventMerger.h:56
std::map< const unsigned int, evt::Event > fInputBuffer
Definition: RdEventMerger.h:52
void Write(const evt::Event &event)
Definition: EventFile.cc:137

, generated on Tue Sep 26 2023.