FdEyeMerger.cc
Go to the documentation of this file.
1 #include <fwk/VModule.h>
2 #include <utl/ErrorLogger.h>
3 
4 #include <det/Detector.h>
5 #include <fdet/FDetector.h>
6 #include <fdet/FDetComponentSelector.h>
7 #include <fdet/Eye.h>
8 #include <fdet/Telescope.h>
9 #include <evt/Event.h>
10 #include <fevt/FEvent.h>
11 #include <fevt/Eye.h>
12 #include <fevt/Telescope.h>
13 #include <fevt/EyeHeader.h>
14 #include <fevt/EyeTriggerData.h>
15 
16 #include "FdEyeMerger.h"
17 
18 #include <sstream>
19 
20 using namespace std;
21 using namespace fwk;
22 using namespace utl;
23 using namespace evt;
24 using namespace det;
25 using namespace fdet;
26 using namespace fevt;
27 using namespace FdEyeMergerKG;
28 
29 
30 // helper function (physical eyeId, physical telId) --> (virtual telId)
31 unsigned int
32 GetVirtualTelescopeId(const unsigned int virtualEyeId,
33  const unsigned int eyeId, const unsigned int telId)
34 {
35  const FDetector& fdDet = det::Detector::GetInstance().GetFDetector();
36  const fdet::Eye& eye = fdDet.GetEye(virtualEyeId);
37  if (!eye.IsVirtual())
38  throw NonExistentComponentException("eye is not virtual");
39 
40  for (fdet::Eye::TelescopeIterator telIter = eye.TelescopesBegin();
41  telIter != eye.TelescopesEnd(); ++telIter) {
42  if (telIter->GetParentPhysicalEyeId() == eyeId &&
43  telIter->GetParentPhysicalId() == telId)
44  return telIter->GetId();
45  }
46 
47  throw NonExistentComponentException("could not find telescope id");
48  return 0;
49 }
50 
51 
54 {
55  const fdet::FDetector& fdDet = det::Detector::GetInstance().GetFDetector();
56 
57  for (FDetector::EyeIterator eIt = fdDet.EyesBegin(FDetComponentSelector::eVirtual),
58  end = fdDet.EyesEnd(FDetComponentSelector::eVirtual); eIt != end; ++eIt) {
59  const fdet::Eye& eye = *eIt;
60  const int id = eye.GetId();
61 
62  if (!fEyeMergeMap[id].empty()) {
63  ostringstream errMsg;
64  errMsg << "multiple occurrance of mergedEye with id " << id << " --> ignored!";
65  ERROR(errMsg);
66  continue;
67  }
68 
69  const EyeIds eyesInDetector = eye.GetParticipatingEyeIds();
70  if (eyesInDetector.empty()) {
71  ostringstream errMsg;
72  errMsg << "empty set of participating eyes for virtual eye with id=" << id
73  << " --> ignored!";
74  ERROR(errMsg);
75  continue;
76  }
77 
78  fEyeMergeMap[id] = eyesInDetector;
79  } // end foreach virtual eye
80 
81  ostringstream info;
82  info << " Version: " << GetVersionInfo(VModule::eRevisionNumber) << "\n";
83  for (EyeMapIterator eyeMapIter = fEyeMergeMap.begin();
84  eyeMapIter != fEyeMergeMap.end(); ++eyeMapIter) {
85  info << "\t merge eye (";
86  for (EyeIdsIterator eyeIter = eyeMapIter->second.begin();
87  eyeIter != eyeMapIter->second.end(); ++eyeIter) {
88  if (eyeIter != eyeMapIter->second.begin())
89  info << ", ";
90  info << *eyeIter;
91  }
92  info << ") -->" << eyeMapIter->first << "\n";
93  }
94  INFO(info);
95 
96  return eSuccess;
97 }
98 
99 
101 FdEyeMerger::Run(evt::Event& event)
102 {
103  if (!event.HasFEvent())
104  return eSuccess;
105 
106  const FEvent& fdEvent = event.GetFEvent();
107 
108  for (EyeMapIterator eyeMapIter = fEyeMergeMap.begin();
109  eyeMapIter != fEyeMergeMap.end(); ++eyeMapIter) {
110 
111  const int mergedEye = eyeMapIter->first;
112  if (fdEvent.HasEye(mergedEye)) {
113  ostringstream errMsg;
114  errMsg << "attempt to merge into existing eye " << mergedEye
115  << " --> ignored!";
116  ERROR(errMsg);
117  continue;
118  }
119 
120  EyeIds eyesInEvent;
121  for (EyeIdsIterator iter = eyeMapIter->second.begin();
122  iter != eyeMapIter->second.end(); ++iter)
123  if (fdEvent.HasEye(*iter))
124  eyesInEvent.insert(*iter);
125 
126  if (!eyesInEvent.empty())
127  MergeEyes(event, mergedEye, eyesInEvent, eyeMapIter->second);
128  }
129 
130  return eSuccess;
131 }
132 
133 
134 void
135 FdEyeMerger::MergeEyes(evt::Event& event,
136  const int destinationEye,
137  const set<unsigned int>& eyesInEvent,
138  const set<unsigned int>& eyesInDetector)
139 {
140  fevt::FEvent& fdEvent = event.GetFEvent();
141 
142  TimeStamp firstTriggerTime;
143  unsigned int firstEyeId = 0;
144  for (EyeIdsIterator eyeIdIter = eyesInEvent.begin();
145  eyeIdIter != eyesInEvent.end(); ++eyeIdIter) {
146  const fevt::EyeHeader& thisEyeHeader = fdEvent.GetEye(*eyeIdIter).GetHeader();
147  if (!firstTriggerTime || thisEyeHeader.GetTimeStamp() < firstTriggerTime) {
148  firstTriggerTime = thisEyeHeader.GetTimeStamp();
149  firstEyeId = *eyeIdIter;
150  }
151  }
152  const fevt::Eye& firstEye = fdEvent.GetEye(firstEyeId);
153 
154  fdEvent.MakeEye(destinationEye);
155  fevt::Eye& mergedEye = fdEvent.GetEye(destinationEye);
156  mergedEye.MakeHeader();
157  mergedEye.MakeTriggerData();
158 
159  fevt::EyeHeader& mergedEyeHeader = mergedEye.GetHeader();
160  mergedEyeHeader = firstEye.GetHeader();
161 
162  fevt::EyeTriggerData& mergedEyeTrigger = mergedEye.GetTriggerData();
163  mergedEyeTrigger = firstEye.GetTriggerData();
164 
165  for (EyeIdsIterator eyeIdIter = eyesInDetector.begin();
166  eyeIdIter != eyesInDetector.end(); ++eyeIdIter) {
167 
168  const EyeIdsIterator eyesInDetIter = eyesInEvent.find(*eyeIdIter);
169 
170  if (eyesInDetIter != eyesInEvent.end()) {
171 
172  const fevt::Eye& thisEye = fdEvent.GetEye(*eyesInDetIter);
173 
174  const TimeInterval timeOffset =
175  thisEye.GetHeader().GetTimeStamp() - firstTriggerTime;
176 
177  for (fevt::Eye::ConstTelescopeIterator telIter = thisEye.TelescopesBegin(ComponentSelector::eInDAQ);
178  telIter != thisEye.TelescopesEnd(ComponentSelector::eInDAQ); ++telIter) {
179  const int telId = GetVirtualTelescopeId(destinationEye, thisEye.GetId(), telIter->GetId());
180  mergedEye.MakeTelescope(telId);
181  const unsigned int originalTimeOffset = telIter->GetTimeOffset();
182  fevt::Telescope& thisTel = mergedEye.GetTelescope(telId);
183  thisTel.Assign(*telIter);
184  if (thisTel.GetStatus() >= ComponentSelector::eHasData)
185  thisTel.SetTimeOffset(int(originalTimeOffset + timeOffset.GetInterval()));
186  }
187  } else {
188  // use uptime to evaluate mirrors in DAQ for eyes without trigger
189  const FDetector& fdDet = det::Detector::GetInstance().GetFDetector();
190  const fdet::Eye& thisEye = fdDet.GetEye(*eyeIdIter);
191  for (fdet::Eye::TelescopeIterator telIter = thisEye.TelescopesBegin();
192  telIter != thisEye.TelescopesEnd(); ++telIter) {
193  if (telIter->GetUpTimeFraction() > 0) {
194  const int telId = GetVirtualTelescopeId(destinationEye, thisEye.GetId(), telIter->GetId());
196  }
197  }
198  }
199  }
200 }
201 
202 
204 FdEyeMerger::Finish()
205 {
206  return eSuccess;
207 }
208 
Telescope & GetTelescope(const unsigned int telescopeId, const ComponentSelector::Status status=ComponentSelector::eHasData)
Retrieve Telescope by Id, throw exception if not existent.
Definition: FEvent/Eye.cc:57
unsigned int GetId() const
Definition: FEvent/Eye.h:54
Trigger data for an fevt::Eye.
fevt::EyeHeader & GetHeader()
Header for this Eye Event.
Definition: FEvent/Eye.cc:180
Fluorescence Detector Eye Event.
Definition: FEvent/Eye.h:29
ComponentSelector::Status GetStatus() const
bool HasFEvent() const
Header of Eye-level event.
Definition: EyeHeader.h:32
void SetTimeOffset(const unsigned int toffset)
#define INFO(message)
Macro for logging informational messages.
Definition: ErrorLogger.h:161
void MakeEye(const unsigned int eyeId, const ComponentSelector::Status status=ComponentSelector::eHasData)
Definition: FEvent.cc:115
void Init()
Initialise the registry.
Base class for exceptions trying to access non-existing components.
const Eye & GetEye(const unsigned int eyeId) const
Find eye by numerical Id.
Definition: FDetector.cc:68
EyeIterator EyesBegin(const FDetComponentSelector::Type type=FDetComponentSelector::ePhysical) const
iterator pointing to first eye of given type (ePhysical, eVirtual, eAll)
Definition: FDetector.h:72
Detector description interface for Eye-related data.
Definition: FDetector/Eye.h:45
void MakeTelescope(const unsigned int telescopeId, const ComponentSelector::Status status=ComponentSelector::eHasData)
Make Telescope telescopeId.
Definition: FEvent/Eye.cc:102
Detector description interface for FDetector-related data.
Definition: FDetector.h:44
A TimeStamp holds GPS second and nanosecond for some event.
Definition: TimeStamp.h:110
std::set< unsigned int > EyeIds
Definition: FdEyeMerger.h:29
boost::filter_iterator< FDetComponentSelector, AllEyeIterator > EyeIterator
Definition: FDetector.h:69
EyeMap::const_iterator EyeMapIterator
Definition: FdEyeMerger.h:32
TelescopeIterator TelescopesEnd()
first available tel of status eHasData (DEPRECATED)
Definition: FEvent/Eye.cc:230
TelescopeIterator TelescopesBegin() const
Beginning of the collection of telescopes.
Definition: FDetector/Eye.h:79
unsigned int GetId() const
Eye numerical Id.
void MakeHeader()
Definition: FEvent/Eye.cc:195
Top of Fluorescence Detector event hierarchy.
Definition: FEvent.h:33
Eye & GetEye(const unsigned int eyeId, const ComponentSelector::Status status=ComponentSelector::eHasData)
return Eye by id
Definition: FEvent.cc:70
TelescopeIterator TelescopesBegin()
first available tel of status eHasData (DEPRECATED)
Definition: FEvent/Eye.cc:207
double GetInterval() const
Get the time interval as a double (in Auger base units)
Definition: TimeInterval.h:69
boost::filter_iterator< TelIsCommissioned, InternalConstTelescopeIterator > TelescopeIterator
An iterator over telescopes.
Definition: FDetector/Eye.h:76
bool HasEye(const unsigned int eyeId, const ComponentSelector::Status status=ComponentSelector::eHasData) const
Definition: FEvent.cc:57
A TimeInterval is used to represent time elapsed between two events.
Definition: TimeInterval.h:43
ResultFlag
Flag returned by module methods to the RunController.
Definition: VModule.h:60
unsigned int GetVirtualTelescopeId(const unsigned int virtualEyeId, const unsigned int eyeId, const unsigned int telId)
Definition: FdEyeMerger.cc:32
utl::TimeStamp GetTimeStamp() const
Time of the Eye Event as tagged by FD-DAS (== eye trigger time plus pixel trace length) ...
Definition: EyeHeader.h:118
TelescopeIterator TelescopesEnd() const
End of the collection of telescopes.
Definition: FDetector/Eye.h:83
fevt::EyeTriggerData & GetTriggerData()
Trigger data for this eye.
Definition: FEvent/Eye.cc:155
Fluorescence Detector Telescope Event.
std::set< unsigned int > GetParticipatingEyeIds() const
Returns a list of eye id&#39;s that participate in this (virtual) eye.
#define ERROR(message)
Macro for logging error messages.
Definition: ErrorLogger.h:165
boost::filter_iterator< ComponentSelector, ConstAllTelescopeIterator > ConstTelescopeIterator
Definition: FEvent/Eye.h:73
void MakeTriggerData()
Definition: FEvent/Eye.cc:170
EyeIds::const_iterator EyeIdsIterator
Definition: FdEyeMerger.h:30
void Assign(const Telescope &t)
copy all but keep original telescope and eye id
bool IsVirtual() const
Returns whether this eye is a virtual eye.
EyeIterator EyesEnd(const FDetComponentSelector::Type type=FDetComponentSelector::ePhysical) const
iterator pointing to end of available eyes of given type (ePhysical, eVirtual, eAll) ...
Definition: FDetector.h:76

, generated on Tue Sep 26 2023.