G/FdProfileConstrainedGeometryFit.cc
Go to the documentation of this file.
1 #include <evt/Event.h>
2 //#include <evt/ShowerRecData.h>
3 #include <evt/ShowerFRecData.h>
4 
5 #include <fevt/Eye.h>
6 #include <fevt/Telescope.h>
7 #include <fevt/Pixel.h>
8 #include <fevt/EyeHeader.h>
9 #include <fevt/FEvent.h>
10 #include <fevt/EyeRecData.h>
11 #include <fevt/TelescopeRecData.h>
12 
13 #include <det/Detector.h>
14 
15 #include <fdet/Eye.h>
16 #include <fdet/Pixel.h>
17 #include <fdet/FDetector.h>
18 
19 #include <fwk/RunController.h>
20 #include <fwk/CentralConfig.h>
21 #include <fwk/LocalCoordinateSystem.h>
22 
23 #include <utl/PhysicalConstants.h>
24 
26 
27 #include "ChiZeroRegression.h"
28 #include "ProfileChi2.h"
29 
30 using namespace std;
31 using namespace fevt;
32 using namespace utl;
33 
34 
35 namespace FdProfileConstrainedGeometryFitPG {
36 
39 {
40  fPCGFitter.Init();
41 
42  Branch topBranch = fwk::CentralConfig::GetInstance()->GetTopBranch("FdProfileConstrainedGeometryFitPG");
43  topBranch.GetChild("eyeCut").GetData(fEyeCut);
44 
45  return eSuccess;
46 }
47 
48 
50 FdProfileConstrainedGeometryFit::Finish()
51 {
52  return eSuccess;
53 }
54 
55 
57 FdProfileConstrainedGeometryFit::Run(evt::Event& event)
58 {
59  if (!event.HasFEvent())
60  return eSuccess;
61  FEvent& fevent = event.GetFEvent();
62 
63  bool success = false;
64 
65  for (FEvent::EyeIterator eye = fevent.EyesBegin(ComponentSelector::eHasData),
66  end = fevent.EyesEnd(ComponentSelector::eHasData); eye != end; ++eye) {
67 
68  if ((!eye->HasRecData() ||
69  !eye->GetRecData().HasFRecShower()) &&
70  !det::Detector::GetInstance().GetFDetector().GetEye(*eye).IsVirtual()
71  /*eye->GetRecData().GetTimeFitNDof() <=0*/)
72  continue;
73 
74  unsigned int eyeId = eye->GetId();
75  cout << "PCGF for eye " << eyeId << " ...\n";
76  unsigned int eyeBit = (fEyeCut / int(pow(10., eyeId-1))) % 10;
77  if (eyeBit != 1) {
78  cout << "skipping due to eyeCut" << "\n";
79  continue;
80  }
81 
82  if (det::Detector::GetInstance().GetFDetector().GetEye(*eye).IsVirtual()) {
83  const int prevEye = GetDataFromPreviousFit(event, eyeId);
84  if (prevEye == 0) {
85  INFO("Could not find results from previous fits --- jump to next eye!");
86  continue;
87  }
88  }
89 
90  if (fPCGFitter.Run(*eye)) {
91  success = true;
92  } else {
93  eye->SetStatus(ComponentSelector::eDeSelected);
94  }
95 
96  cout << "PCGF for eye " << eye->GetId() << " DONE\n";
97  }
98 
99  if (success) {
100  ++fwk::RunController::GetInstance().GetRunData().GetNamedCounters()["FdProfileConstrainedGeometryFitPG/Good"];
101  return eSuccess;
102  }
103 
104  return eContinueLoop;
105 }
106 
107 int
108 FdProfileConstrainedGeometryFit::GetDataFromPreviousFit(evt::Event& event, int fgCurEye)
109 {
110 
111  const fdet::FDetector& detFD = det::Detector::GetInstance().GetFDetector();
112  fevt::FEvent& fevent = event.GetFEvent();
113 
114  set<unsigned int> eyeIds;
115 
116  // if the eye is virtual, take the data from any physical eye
117  if (detFD.GetEye(fgCurEye).IsVirtual()) {
120  ++eyeIter) {
121 
122  if (fevent.HasEye(eyeIter->GetId())) {
123  eyeIds.insert(eyeIter->GetId());
124  }
125 
126  }
127  }
128  // if the eye is physical, take the data from this eye
129  // or in case no previous data is found take it from any eye
130  else {
131  bool hasData = false;
132  if (fevent.GetEye(fgCurEye).HasRecData()) {
133  if ((fevent.GetEye(fgCurEye).GetRecData().HasFRecShower()) && (fevent.GetEye(fgCurEye).GetRecData().GetRp() != 0.)) {
134  hasData = true;
135  }
136  }
137 
138  if (hasData) {
139  eyeIds.insert(fgCurEye);
140  }
141  else {
144  ++eyeIter) {
145 
146  if (fevent.HasEye(eyeIter->GetId())) {
147  eyeIds.insert(eyeIter->GetId());
148  }
149 
150  }
151  }
152  }
153 
154  // Find the most time fit pixels
155  int maxNFitPixels = 0;
156  unsigned int maxNFitPixelsId = 0;
157  for (set<unsigned int>::const_iterator IdIter = eyeIds.begin();
158  IdIter != eyeIds.end();
159  ++IdIter) {
160 
161  // Check if the previous modules found something
162  if (!fevent.GetEye(*IdIter).HasRecData()) {
163  continue;
164  }
165  else if (!fevent.GetEye(*IdIter).GetRecData().HasFRecShower()) {
166  continue;
167  }
168 
169  const fevt::EyeRecData& eyeRecData = fevent.GetEye(*IdIter).GetRecData();
170  double nFitPixels = eyeRecData.GetNTimeFitPixels();
171 
172  if (nFitPixels > maxNFitPixels) {
173  maxNFitPixels = nFitPixels;
174  maxNFitPixelsId = *IdIter;
175  }
176 
177  cout << "Eye " << *IdIter << " has " << nFitPixels << " pixels in the time fit" << endl;
178 
179  } // for eyeIds
180 
181  int takeFromEye = 0;
182  if (maxNFitPixelsId != 0) {
183  takeFromEye = maxNFitPixelsId;
184  }
185  else {
186  return takeFromEye;
187  }
188  cout<<"take from "<<takeFromEye<<endl;
189 
190  const fdet::Eye& detEye = det::Detector::GetInstance().GetFDetector().GetEye(takeFromEye);
191  fevt::Eye& eventEye = event.GetFEvent().GetEye(takeFromEye);
192 
193  const fevt::EyeRecData& eyeRecData = eventEye.GetRecData();
194 
195  // Get the data
196 // const Vector& fSDP = eyeRecData.GetSDP();
197 // const double fChiZero = eyeRecData.GetChiZero();
198  const double fRp = eyeRecData.GetRp();
199  double fTZero = eyeRecData.GetTZero();
200  const Vector& fAxis = eyeRecData.GetFRecShower().GetAxis();
201  const Point& fCore = eyeRecData.GetFRecShower().GetCorePosition();
202  const double fTZeroErr = eyeRecData.GetTZeroError();
203  const double fRpErr = eyeRecData.GetRpError();
204  const double fChiZeroErr = eyeRecData.GetChiZeroError();
205  const Point telPos = detEye.GetPosition();
207  const double sdpTheta = eyeRecData.GetSDP().GetTheta(telCS);
208  const double sdpPhi = eyeRecData.GetSDP().GetPhi(telCS);
209  const Vector sdp = Vector(1, sdpTheta, sdpPhi, telCS, Vector::kSpherical);
210  const Point P_in_tel = telPos + Normalized(Cross(sdp, fAxis))*fRp;
211 
212  // Readjust the TZero according to the trigger offset of the different eyes
213  const utl::TimeInterval offset = eventEye.GetHeader().GetTimeStamp() - fevent.GetEye(fgCurEye).GetHeader().GetTimeStamp();
214  fTZero += offset.GetInterval();
215 
216  fevt::EyeRecData& curEyeRecData = fevent.GetEye(fgCurEye).GetRecData();
217  if (!curEyeRecData.HasFRecShower()) {
218  curEyeRecData.MakeFRecShower();
219  }
220 
221  const utl::TimeStamp eyeStamp = fevent.GetEye(fgCurEye).GetHeader().GetTimeStamp();
222  const Point eyePos = det::Detector::GetInstance().GetFDetector().GetEye(fgCurEye).GetPosition();
223 
224  bool fillEye = true;
225  for (fdet::Eye::TelescopeIterator detTelIt = detFD.GetEye(fgCurEye).TelescopesBegin();
226  detTelIt != detFD.GetEye(fgCurEye).TelescopesEnd(); ++detTelIt)
227  {
228  const int curtelId = detTelIt->GetId();
229  const Point curtelPos = detTelIt->GetPosition();
230  const CoordinateSystemPtr curtelCS = fwk::LocalCoordinateSystem::Create(curtelPos);
231  const Point core_in_curtel = fCore-fAxis*fCore.GetZ(curtelCS)/cos(fAxis.GetTheta(curtelCS));
232 
233  const Vector curtel_to_core = core_in_curtel-curtelPos;
234  const double chi0_in_curtel = Angle(curtel_to_core, fAxis);
235  const double rp_in_curtel = curtel_to_core.GetMag()*sin(chi0_in_curtel);
236  const utl::AxialVector SDP_in_curtel = Normalized(Cross(fAxis, curtel_to_core));
237  const Point P_in_curtel = curtelPos + Normalized(Cross(SDP_in_curtel, fAxis))*rp_in_curtel;
238  const Vector Pt_to_Pct = P_in_curtel - P_in_tel;
239  const double t0_in_curtel = fTZero + ((Pt_to_Pct*fAxis > 0.) ? -1. : 1.)*Pt_to_Pct.GetMag()/utl::kSpeedOfLight;
240 
241  if (fevent.GetEye(fgCurEye).HasTelescope(curtelId)) {
242  fevt::Telescope& tel = fevent.GetEye(fgCurEye).GetTelescope(curtelId);
243 
244  if (!tel.HasRecData())
245  tel.MakeRecData();
246 
247  fevt::TelescopeRecData& telRecData = tel.GetRecData();
248  telRecData.SetSDP(SDP_in_curtel);
249  telRecData.SetChiZero(chi0_in_curtel, fChiZeroErr);
250  telRecData.SetTZero(t0_in_curtel, fTZeroErr);
251  telRecData.SetRp(rp_in_curtel, fRpErr);
252  telRecData.SetTimeFitChiSquare(0,1);
253  telRecData.SetTimeFitCorrelations(0,0,0);
254  }
255 
256  //fill eye - choose tel with the same position as eye (usually, more of them are available)
257  if (fillEye && (curtelPos - eyePos).GetMag() < 1e-3) {
258  curEyeRecData.SetChiZero(chi0_in_curtel, fChiZeroErr);
259  curEyeRecData.SetTZero(t0_in_curtel, fTZeroErr);
260  curEyeRecData.SetRp(rp_in_curtel, fRpErr);
261  curEyeRecData.SetSDP(SDP_in_curtel);
262  curEyeRecData.SetTimeFitChiSquare(0,1);
263  curEyeRecData.SetTimeFitCorrelations(0,0,0);
264  curEyeRecData.SetSDPFitChiSquare(0,1);
265 
266  evt::ShowerFRecData& frecShower = curEyeRecData.GetFRecShower();
267  frecShower.SetAxis(fAxis);
268  frecShower.SetCorePosition(core_in_curtel);
269  try {
270  double tCore = t0_in_curtel;
271  tCore -= (rp_in_curtel / tan(chi0_in_curtel)) / kSpeedOfLight;
272  utl::TimeStamp timeAtCore = eyeStamp - TimeInterval(1000*100*ns) + TimeInterval(tCore);
273  frecShower.SetCoreTime(timeAtCore, 0); //, rp_in_tel, chi0_in_tel, t0_in_tel);
274  } catch (OutOfBoundException& e) {
275  ERROR(e.GetMessage());
276  return false;
277  }
278  fillEye = false;
279  }
280 
281  //SDP pixels
282  const unsigned int parentEyeId = detTelIt->GetParentPhysicalEyeId();
283  const unsigned int parentTelId = detTelIt->GetParentPhysicalId();
284  if (fevent.HasEye(parentEyeId) && fevent.GetEye(parentEyeId).HasRecData() && fevent.GetEye(fgCurEye).HasTelescope(curtelId)) {
285  fevt::EyeRecData& parentEyeRecData = fevent.GetEye(parentEyeId).GetRecData();
286  for (fevt::EyeRecData::PixelIterator pixelIter = parentEyeRecData.SDPPixelsBegin();
287  pixelIter != parentEyeRecData.SDPPixelsEnd(); ++pixelIter) {
288 
289  if (pixelIter->GetTelescopeId() == parentTelId) {
290  curEyeRecData.AddSDPPixel(fevent.GetEye(fgCurEye).GetTelescope(curtelId).GetPixel(pixelIter->GetId()));
291  }
292  }
293 
294  //time fit pixels
295  for (fevt::EyeRecData::PixelIterator pixelIter = parentEyeRecData.TimeFitPixelsBegin();
296  pixelIter != parentEyeRecData.TimeFitPixelsEnd(); ++pixelIter) {
297 
298  if (pixelIter->GetTelescopeId() == parentTelId) {
299  curEyeRecData.AddTimeFitPixel(fevent.GetEye(fgCurEye).GetTelescope(curtelId).GetPixel(pixelIter->GetId()));
300  }
301  }
302  }
303  }
304 
305 
306  for (fevt::EyeRecData::PixelIterator pixelIter = curEyeRecData.PulsedPixelsBegin();
307  pixelIter != curEyeRecData.PulsedPixelsEnd(); ++pixelIter) {
308 
309  unsigned int telId = pixelIter->GetTelescopeId();
310  if (fevent.GetEye(fgCurEye).HasTelescope(telId)) {
311  fevt::TelescopeRecData& telRecData = fevent.GetEye(fgCurEye).GetTelescope(telId).GetRecData();
312  const Point telPos = det::Detector::GetInstance().GetFDetector().GetEye(fgCurEye).GetTelescope(telId).GetPosition();
314  const double sdpTheta = telRecData.GetSDP().GetTheta(telCS);
315  const double sdpPhi = telRecData.GetSDP().GetPhi(telCS);
316 
317  const Vector sdp = Vector(1, sdpTheta, sdpPhi, telCS, Vector::kSpherical);
318  const Vector vertical(0,0,1, telCS);
319  const Vector horizontalInSDP = Normalized(Cross(sdp, vertical));
320 
321  const Vector pixelDirection = det::Detector::GetInstance().GetFDetector().GetPixel(*pixelIter).GetDirection();
322  const Vector pixelDirInSDP = pixelDirection - (sdp * pixelDirection)*sdp;
323  const double pixelChi = Angle(pixelDirInSDP, horizontalInSDP);
324 
325  pixelIter->GetRecData().SetChi_i(pixelChi);
326  }
327  }
328 
329  return takeFromEye;
330 
331  } // int HybridGeometryFinder::GetDataFromPreviousFit()
332 
333 /*
334 void
335 FdProfileConstrainedGeometryFit::FitTimingOfGivenGeometry(const Eye& eye)
336  const
337 {
338  const EyeRecData& eyeRec = eye.GetRecData();
339  ChiZeroRegression chi0reg(eyeRec);
340 
341  cout << "Parameters from Axis Finder:\n"
342  "Chi0: " << eyeRec.GetChiZero() << "\n"
343  "Chi^2: " << eyeRec.GetTimeFitChiSquare() << "\t"
344  "Rp: " << eyeRec.GetRp()/m << "\t"
345  "T0: " << eyeRec.GetTZero()/ns << "\n";
346 
347  double chi2 = 0;
348  double rp = 0;
349  double t0 = 0;
350  chi0reg(eyeRec.GetChiZero(), chi2, rp, t0);
351 
352  cout << "scanning Chi_0\n";
353 
354  for (int i = 0; i <= 180; ++i) {
355  cout << i << " degrees\n";
356 
357  chi0reg(i*degree, chi2, rp, t0);
358  cout << "Rp: " << rp/m << "\t"
359  "T0: " << t0/ns << "\t"
360  "Chi^2_t: " << chi2 << "\t";
361  }
362 }
363 */
364 }
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
AxialVector Cross(const Vector &l, const Vector &r)
Definition: OperationsAV.h:25
bool HasRecData() const
void SetChiZero(const double chiZero, const double error)
Definition: EyeRecData.h:237
Point object.
Definition: Point.h:32
double Angle(const double theta1, const double phi1, const double theta2, const double phi2)
double GetRpError() const
Definition: EyeRecData.h:91
double GetPhi(const CoordinateSystemPtr &coordinateSystem) const
azimuth (phi) angle in spherical and cylindrical coordinates
Definition: BasicVector.h:254
void SetSDPFitChiSquare(const double sdpChi2, const unsigned int ndof)
Definition: EyeRecData.h:229
fevt::EyeHeader & GetHeader()
Header for this Eye Event.
Definition: FEvent/Eye.cc:180
bool HasRecData() const
Definition: FEvent/Eye.h:116
Fluorescence Detector Eye Event.
Definition: FEvent/Eye.h:29
PixelIterator PulsedPixelsEnd()
Definition: EyeRecData.h:121
bool HasFEvent() const
double GetTheta(const CoordinateSystemPtr &coordinateSystem) const
zenith (theta) angle in spherical coordinates
Definition: BasicVector.h:248
fRp(t.GetRp())
void SetCorePosition(const utl::Point &core)
EyeIterator EyesEnd(const ComponentSelector::Status status)
Definition: FEvent.h:66
void SetTimeFitCorrelations(double rRpT0, double rRpChi0, double rChi0T0)
#define INFO(message)
Macro for logging informational messages.
Definition: ErrorLogger.h:161
void SetTimeFitCorrelations(const double rRpT0, const double rRpChi0, const double rChi0T0)
Definition: EyeRecData.h:243
void SetRp(const double rp, const double error)
Definition: EyeRecData.h:239
void Init()
Initialise the registry.
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
boost::filter_iterator< ComponentSelector, AllEyeIterator > EyeIterator
selective Eye iterators
Definition: FEvent.h:55
Branch GetChild(const std::string &childName) const
Get child of this Branch by child name.
Definition: Branch.cc:211
fevt::TelescopeRecData & GetRecData()
Reconstructed data for this telescope.
void AddSDPPixel(fevt::Pixel &pixel)
add a pixel to the list of SDP pixels
Definition: EyeRecData.h:149
PixelIterator PulsedPixelsBegin()
Definition: EyeRecData.h:119
double pow(const double x, const unsigned int i)
double GetMag() const
Definition: Vector.h:58
double GetTZeroError() const
Definition: EyeRecData.h:84
Detector description interface for FDetector-related data.
Definition: FDetector.h:44
double GetChiZeroError() const
Definition: EyeRecData.h:86
A TimeStamp holds GPS second and nanosecond for some event.
Definition: TimeStamp.h:110
Exception for reporting variable out of valid range.
void SetSDP(const utl::AxialVector &vec)
boost::shared_ptr< const CoordinateTransformer > CoordinateSystemPtr
Shared pointer for coordinate systems.
fTZero(t.GetTZero())
Class representing a document branch.
Definition: Branch.h:107
void MakeFRecShower()
Allocate reconstructed shower info.
Definition: EyeRecData.cc:58
PixelIterator SDPPixelsBegin()
Definition: EyeRecData.h:139
boost::filter_iterator< FDetComponentSelector, AllEyeIterator > EyeIterator
Definition: FDetector.h:69
void SetCoreTime(const utl::TimeStamp &coreTime, const utl::TimeInterval &coreTimeErr)
const double ns
TelescopeIterator TelescopesBegin() const
Beginning of the collection of telescopes.
Definition: FDetector/Eye.h:79
void SetAxis(const utl::Vector &axis)
bool HasFRecShower() const
Check if reconstructed shower info has been allocated.
Definition: EyeRecData.h:330
evt::ShowerFRecData & GetFRecShower()
Reconstructed shower info for this eye.
Definition: EyeRecData.h:323
EyeIterator EyesBegin(const ComponentSelector::Status status)
Definition: FEvent.h:58
void SetChiZero(const double chiZero, const double error)
void SetTimeFitChiSquare(const double tfitChi2, const unsigned int ndof)
Definition: EyeRecData.h:232
Telescope-specific shower reconstruction data.
void GetData(bool &b) const
Overloads of the GetData member template function.
Definition: Branch.cc:644
Top of Fluorescence Detector event hierarchy.
Definition: FEvent.h:33
Eye-specific shower reconstruction data.
Definition: EyeRecData.h:65
AxialVector Normalized(const AxialVector &v)
Definition: AxialVector.h:81
Eye & GetEye(const unsigned int eyeId, const ComponentSelector::Status status=ComponentSelector::eHasData)
return Eye by id
Definition: FEvent.cc:70
double GetInterval() const
Get the time interval as a double (in Auger base units)
Definition: TimeInterval.h:69
const utl::AxialVector & GetSDP() const
Definition: EyeRecData.h:75
boost::filter_iterator< TelIsCommissioned, InternalConstTelescopeIterator > TelescopeIterator
An iterator over telescopes.
Definition: FDetector/Eye.h:76
unsigned int GetNTimeFitPixels() const
Get number of Time Fit pixels.
Definition: EyeRecData.h:184
Pixel & GetPixel(const unsigned int pixelId, const ComponentSelector::Status status=ComponentSelector::eHasData)
Retrieve Pixel by Id, throw exception if not existent.
bool HasEye(const unsigned int eyeId, const ComponentSelector::Status status=ComponentSelector::eHasData) const
Definition: FEvent.cc:57
boost::indirect_iterator< InternalPixelIterator, fevt::Pixel & > PixelIterator
Iterator over pixels used in reconstruction.
Definition: EyeRecData.h:113
constexpr double kSpeedOfLight
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
void SetTZero(const double tzero, const double error)
double GetRp() const
Definition: EyeRecData.h:87
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
static CentralConfig * GetInstance()
Use this the first time you get an instance of central configuration.
bool HasTelescope(const unsigned int telescopeId, const ComponentSelector::Status status=ComponentSelector::eHasData) const
Check if the telescope is in the event.
Definition: FEvent/Eye.cc:117
void SetTimeFitChiSquare(const double tfitChi2, const unsigned int ndof)
PixelIterator TimeFitPixelsEnd()
Definition: EyeRecData.h:171
Vector object.
Definition: Vector.h:30
Interface class to access to Fluorescence reconstruction of a Shower.
void SetRp(const double rp, const double error)
TelescopeIterator TelescopesEnd() const
End of the collection of telescopes.
Definition: FDetector/Eye.h:83
void SetSDP(const utl::AxialVector &vec)
Definition: EyeRecData.h:218
AxialVector object.
Definition: AxialVector.h:30
double GetTZero() const
Definition: EyeRecData.h:83
void SetTZero(const double tzero, const double error)
Definition: EyeRecData.h:235
PixelIterator SDPPixelsEnd()
Definition: EyeRecData.h:143
void AddTimeFitPixel(fevt::Pixel &pixel)
add a pixel to the list of Time Fit pixels
Definition: EyeRecData.h:177
Fluorescence Detector Telescope Event.
double GetZ(const CoordinateSystemPtr &coordinateSystem) const
Definition: BasicVector.h:212
static Policy::type Create(const utl::Point &theOrigin)
Create the standard local coordinate system for a Point.
const utl::AxialVector & GetSDP() const
PixelIterator TimeFitPixelsBegin()
Definition: EyeRecData.h:167
#define ERROR(message)
Macro for logging error messages.
Definition: ErrorLogger.h:165
const utl::Point & GetCorePosition() const
Shower core as reconstructed by the FD or FD eye.
const std::string & GetMessage() const
Retrieve the message from the exception.
utl::Point GetPosition() const
Eye position.
utl::Branch GetTopBranch(const std::string &id)
Get top branch for moduleConfigLink with given id (XML files)
fevt::EyeRecData & GetRecData()
Reconstructed data for this eye.
Definition: FEvent/Eye.cc:130
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
const utl::Vector & GetAxis() const
Shower Axis as reconstructed by the FD or FD eye.

, generated on Tue Sep 26 2023.