MdShowerRegenerator.cc
Go to the documentation of this file.
1 #include <utl/config.h>
2 
3 #include <cmath>
4 #include <sstream>
5 #include <vector>
6 #include <limits>
7 
8 #include <fwk/CentralConfig.h>
9 #include <fwk/CoordinateSystemRegistry.h>
10 #include <fwk/RandomEngineRegistry.h>
11 
12 #include <evt/Event.h>
13 #include <evt/ShowerSimData.h>
14 
15 #include <mevt/MEvent.h>
16 #include <mevt/Counter.h>
17 #include <mevt/CounterSimData.h>
18 
19 #include <det/Detector.h>
20 #include <mdet/MDetector.h>
21 #include <mdet/Counter.h>
22 
23 #include <sevt/SEvent.h>
24 #include <sevt/Station.h>
25 #include <sevt/StationSimData.h>
26 
27 #include <utl/ConfigUtils.h>
28 #include <utl/ErrorLogger.h>
29 #include <utl/GeometryUtilities.h>
30 #include <utl/MathConstants.h>
31 #include <utl/Particle.h>
32 #include <utl/ParticleCases.h>
33 #include <utl/PhysicalConstants.h>
34 #include <utl/Point.h>
35 #include <utl/RandomEngine.h>
36 #include <utl/TimeStamp.h>
37 #include <utl/Math.h>
38 #include <utl/Reader.h>
39 #include <utl/TabularStream.h>
40 #include <utl/TabulatedFunction.h>
41 //#include <utl/UTMPoint.h>
42 //#include <utl/ReferenceEllipsoid.h>
43 
44 #include <CLHEP/Random/RandFlat.h>
45 #include <CLHEP/Random/RandPoisson.h>
46 #include <CLHEP/Random/RandGauss.h>
47 
48 #include "MdShowerRegenerator.h"
49 
50 using namespace MdShowerRegeneratorAG;
51 using namespace fwk;
52 using namespace evt;
53 using namespace mevt;
54 using namespace utl;
55 using namespace std;
56 
57 using CLHEP::RandFlat;
58 using CLHEP::RandPoisson;
59 
60 //#warning "MD_THETASIM_MAX - MD_LARGE_SIDE are brutally hard coded!!!"
61 #define MD_THETASIM_MAX 80*utl::degree
62 #define MD_SIM_AREA 30*utl::m2
63 #define MD_LARGE_SIDE 12*utl::m
64 
65 namespace MdShowerRegeneratorAG {
66 
67 struct InStats {
68  int InRad;
69  int InPhi;
70  int IsIn;
71 };
72 
74 
79  inline
80  double
81  PlaneFrontTime(const CoordinateSystemPtr showerCS, const Point& corePosition,
82  const Point& position)
83  {
84  return (corePosition.GetZ(showerCS) - position.GetZ(showerCS)) / kSpeedOfLight;
85  }
86 
87 } // namespace MdShowerRegeneratorAG
88 
89 
91  fInnerRadiusCut(0.),
92  fOuterRadiusCut(1.e6*km),
93  fElectronEnergyCut(0),
94  fMuonEnergyCut(0),
95  fPhotonEnergyCut(0),
96  fHadronEnergyCut(0),
97  fMesonEnergyCut(0),
98  fDeltaROverR(0),
99  fDeltaPhi(0),
100  fHorizontalParticleCut(0),
101  fRandomEngine(0),
102  fOnlyMuons( true ),
103  fMuonWeightScale(1)
104 {
105  fNMuons=0;
106  fNInjected=0;
108 }
109 
110 
113 {
114 
115  Branch topB =
116  CentralConfig::GetInstance()->GetTopBranch("MdShowerRegenerator");
117 
118  AttributeMap useAtt;
119  useAtt["use"] = string("yes");
120 
121  Branch distanceCutB = topB.GetChild("DistanceCuts");
122 
123  Branch inB = distanceCutB.GetChild("InnerRadiusCut", useAtt);
124  if (inB)
126 
127  Branch outB = distanceCutB.GetChild("OuterRadiusCut", useAtt);
128  if (outB)
129  outB.GetData(fOuterRadiusCut);
130 
131  Branch energyCutB = topB.GetChild("EnergyCuts");
132  energyCutB.GetChild("ElectronEnergyCut").GetData(fElectronEnergyCut);
133  energyCutB.GetChild("MuonEnergyCut").GetData(fMuonEnergyCut);
134  energyCutB.GetChild("PhotonEnergyCut").GetData(fPhotonEnergyCut);
135  energyCutB.GetChild("HadronEnergyCut").GetData(fHadronEnergyCut);
136  energyCutB.GetChild("MesonEnergyCut").GetData(fMesonEnergyCut);
137 
138  Branch algoB = topB.GetChild("AlgorithmParameters");
139  algoB.GetChild("DeltaROverR").GetData(fDeltaROverR);
140  algoB.GetChild("DeltaPhi").GetData(fDeltaPhi);
141  algoB.GetChild("HorizontalParticleCut").GetData(fHorizontalParticleCut);
142 
143  if (topB.GetChild("MuonWeightScale"))
144  topB.GetChild("MuonWeightScale").GetData(fMuonWeightScale);
145 
146  fRandomEngine = &RandomEngineRegistry::GetInstance().Get(RandomEngineRegistry::eDetector).GetEngine();
147 
148  //This is to avoid verification
149  LoadConfig(topB, "OnlyMuons", fOnlyMuons, true );
150 
151  return eSuccess;
152 }
153 
154 bool
155 MdShowerRegenerator::IsIn(double phi, double r, InStats & stat)
156 {
157  bool retphi = IsPhiIn( phi );
158  bool retrad = IsRIn( r );
159 
160  bool isin = retphi && retrad;
161 
162  if( retrad )
163  ++(stat.InRad);
164 
165  if( retphi ) {
166  ++(stat.InPhi);
167 /*
168  std::cout << "Phi1 " << fPhi1/utl::degree << "\n";
169  std::cout << "Phi2 " << fPhi2/utl::degree << "\n";
170  std::cout << "phi " << phi/utl::degree << "\n";
171 */
172  }
173 
174  if( isin )
175  ++(stat.IsIn);
176 
177  return isin;
178 }
179 
180 
181 void
182 MdShowerRegenerator::SetRadRange(double r1, double r2)
183 {
184  fR1 = r1;
185  fR2 = r2;
186 }
187 
188 void
189 MdShowerRegenerator::SetPhiRange( double phi, double dphi)
190 {
191 
192  fPhi1 = phi - dphi;
193  fPhi2 = phi + dphi;
194 
195  if (fPhi1 < -kPi) {
196  if (fPhi2 > kPi) {
197  fPhi1 = -kPi;
198  fPhi2 = kPi;
199  } else
200  fPhi1 += 2*kPi;
201  } else if (fPhi2 > kPi)
202  fPhi2 -= 2*kPi;
203 }
204 
205 bool
207 {
208  if (fPhi1 < fPhi2)
209  return fPhi1 <= phi && phi <= fPhi2;
210  else
211  return fPhi1 <= phi || phi <= fPhi2;
212 }
213 
214 bool
215 MdShowerRegenerator::IsRIn(const double r )
216 { return fR1 <= r && r <= fR2; }
217 
218 bool
220  const double pEnergy)
221  const
222 {
223  switch (pType) {
224  case OFFLINE_PHOTON:
225  return pEnergy < fPhotonEnergyCut;
226  case OFFLINE_ELECTRONS:
227  return pEnergy < fElectronEnergyCut;
228  case OFFLINE_MUONS:
229  return pEnergy < fMuonEnergyCut;
230  case OFFLINE_BARYONS:
231  return pEnergy < fHadronEnergyCut;
232  case OFFLINE_MESONS:
233  return pEnergy < fMesonEnergyCut;
234  default:
235  return true;
236  }
237 }
238 
239 bool
241 {
242  switch (pType) {
243  case OFFLINE_MUONS:
244  ++fNMuons;
245  return true;
246  default:
247  return false;
248  }
249 }
250 
251 
254 {
255  INFO("Performing Unthinning...");
256 
257  if (!event.HasSimShower()) {
258  ERROR("Current event does not have a simulated shower.");
259  return eFailure;
260  }
261  ShowerSimData& simShower = event.GetSimShower();
262 
263  if( !simShower.HasGroundParticles()){
264  ERROR("Current event does not have a simulated shower with particles.");
265  return eFailure;
266  } else {
267  INFO("Retrieving ground particles from shower");
268  }
269 
270  if (simShower.GetMinRadiusCut() < fInnerRadiusCut) {
271  ostringstream msg;
272  msg << "Setting new value for fMinRadiusCut: " << fInnerRadiusCut;
273  WARNING(msg);
274  simShower.SetMinRadiusCut(fInnerRadiusCut);
275  }
276 
277  //Retrieve muon detector
278  const mdet::MDetector& mDetector = det::Detector::GetInstance().GetMDetector();
279 
280  if (!event.HasMEvent())
281  event.MakeMEvent();
282 
283  MEvent& mEvent = event.GetMEvent();
284 
285  if(event.HasSEvent()){
286  WARNING("SEvent found. InnerRadiusCut from MdShowerRegenerator.xml meaningless!");
287  }
288  /* Get the shower coordinate system.
289  * The origin of this coordinate system is the core position of the shower.
290  * The z axis points opposite to the direction of motion of the primary
291  * particle (i.e., its 3-momentum is anti-parallel to the unit vector in z direction).
292  * The y axis is in the horizontal plane as defined by the local coordinate system.
293  * The x axis completes the system to a right-handed coordinate system.
294  */
295  const CoordinateSystemPtr showerCS = simShower.GetShowerCoordinateSystem();
296 
297  /* Get the auger coordinate system associated to the shower core position.
298  * Get the local coordinate system corresponding to the shower core position.
299  * This is an Auger Coordinate System, i.e.,
300  * the x-y plane is horizontal and the z axis points up.
301  */
302  const CoordinateSystemPtr grParticleCS = simShower.GetLocalCoordinateSystem();
303 
304  /* Site coordinate system */
305  const CoordinateSystemPtr siteCS = det::Detector::GetInstance().GetSiteCoordinateSystem();
306 
307  const CoordinateSystemPtr localCS = simShower.GetLocalCoordinateSystem();
308  const double showerZenith = (-simShower.GetDirection()).GetTheta(localCS);
309  const double samplingAreaFactor = 4. * fDeltaPhi * fDeltaROverR / cos(showerZenith);
310 
311  //Loop over all counters
313  cIt != mDetector.CountersEnd(); ++cIt) {
314 
315  const int mId = cIt->GetId();
316 
317  if (!mEvent.HasCounter(mId))
318  mEvent.MakeCounter(mId);
319 
320  mevt::Counter& eCounter = mEvent.GetCounter(mId);
321 
322  if (!eCounter.HasSimData())
323  eCounter.MakeSimData();
324 
325  CounterSimData& sSim = eCounter.GetSimData();
326 
327  //check sd if station is inside min radius
328  //using the distance of Sd instead of Md to always have pairs of simulators when simulating in XD (Md + Sd), the difference is of the order of few meters and is zero for vertical showers (for now, see MModelConfig.xml)
329 
330  bool sd_exists = false;
331  if(event.HasSEvent()){
332  sevt::SEvent& sEvent = event.GetSEvent();
333  int partnerId = cIt->GetAssociatedTankId();
334  if(sEvent.HasStation(partnerId)){
335  sevt::Station& sStation = sEvent.GetStation(partnerId);
336  if(sStation.HasSimData()){
337  sevt::StationSimData& sSimData = sStation.GetSimData();
338  sd_exists = true;
339  if(sSimData.IsInsideMinRadius()){
340  INFO("Associated Sd-Tank was flagged InsideMinRadiusCut. Forcing the same for Md-Counter.");
341  sSim.SetIsInsideMinRadius();
342  continue;
343  }
344  }
345  }
346  }
347  if(!sd_exists){ //if simulating in Md-only mode, use fInnerRadiusCut from xml
348  const Point& countPos = cIt->GetPosition();
349  double cR = countPos.GetRho(showerCS);
350  if (cR < fInnerRadiusCut) {
351  sSim.SetIsInsideMinRadius();
352  continue;
353  }
354  }
355  }
356  InStats stat;
357  stat.InRad = 0;
358  stat.InPhi = 0;
359  stat.IsIn = 0;
360 
361  ShowerParticleIterator particleIt = simShower.GroundParticlesBegin();
362  for (; particleIt != simShower.GroundParticlesEnd(); ++particleIt) {
363 
364  const Point& partPos = particleIt->GetPosition();
365 
366  if (IsParticleEnergyLow(particleIt->GetType(), particleIt->GetKineticEnergy()))
367  continue;
368 
369  if( fOnlyMuons && !IsMuon(particleIt->GetType()) )
370  continue;
371 
372  //Loop over all counters
374  cIt != mDetector.CountersEnd(); ++cIt) {
375 
376  const int mId = cIt->GetId();
377 
378  mevt::Counter& eCounter = mEvent.GetCounter(mId);
379 
380  CounterSimData& sSim = eCounter.GetSimData();
381 
382  if(sSim.IsInsideMinRadius())
383  continue;
384 
385  //GetPosition actually is from Station obj which is a friend of Counter obj
386  const Point& countPos = cIt->GetPosition();
387  // const UTMPoint utm( countPos, ReferenceEllipsoid::GetWGS84());
388 
389  double cR = countPos.GetRho(showerCS);
390 
391  if (cR > fOuterRadiusCut)
392  continue;
393 
394  double r = partPos.GetRho(showerCS);
395  double phi = partPos.GetPhi(showerCS);
396 
397  SetPhiRange( countPos.GetPhi(showerCS), fDeltaPhi );
398  SetRadRange( cR*(1.-fDeltaROverR),cR*(1.+fDeltaROverR));
399 
400  if( !IsIn(phi, r, stat) )
401  continue;
402 
403  //scale the weight of muons accordingly the fMuonWeightScale parameter
404  const double pWeight =
405  (particleIt->GetType() == utl::Particle::eMuon ||
406  particleIt->GetType() == utl::Particle::eAntiMuon?
407  fMuonWeightScale*particleIt->GetWeight():
408  particleIt->GetWeight());
409 
410  /*
411  std::cout << "Counter Id: " << mId << "\n";
412  std::cout << "particleIt->GetType() " << particleIt->GetType() << "\n";
413  std::cout << "Particle original weitgh " << pWeight << "\n";
414  std::cout << "fPhi1 " << fPhi1/utl::degree << "\n";
415  std::cout << "fPhi2 " << fPhi2/utl::degree << "\n";
416  std::cout << "fDeltaPhi " << fDeltaPhi/utl::degree << "\n";
417  std::cout << "phi " << phi/utl::degree << "\n";
418  */
419 
420  Particle newParticle(*particleIt);
421  //Set Parent (same particle at this level)
422  newParticle.SetParent( newParticle );
423 
424  // Uses the depth of the first module (arbitratry)
425  const double cDepth = cIt->ModulesBegin()->GetDepth();
426  //std::cout << "cDepth " << cDepth/utl::m << " (m)" << std::endl;
427 
428  const Vector& pDirection = newParticle.GetDirection();
429  const double pCosine = -1.*pDirection.GetZ(grParticleCS);
430  //const double pSine = pDirection.GetRho(grParticleCS);
431 
432  //Avoid upgoing or too inclined particles
433  if (pCosine < 0 || pCosine < cos(MD_THETASIM_MAX)){
434  /*
435  std::cout << "Horizontal cut at cos(" << MD_THETASIM_MAX/utl::degree << ")=" << cos(MD_THETASIM_MAX) << std::endl;
436  std::cout << "pCosine " << pCosine << std::endl;
437  */
439  continue;
440  }
441 
442  // particle time relative to the core time
443  const double pTime = particleIt->GetTime().GetInterval();
444 
445  // Nominal area of counter detectors
446  //const double RadiusCounter = sqrt( MD_SIM_AREA / kPi );
447  const double RadiusCounter = MD_LARGE_SIDE;
448  //const double ExtraRadius = cDepth * pSine/pCosine;
449  const double ExtraRadius = cDepth * tan(MD_THETASIM_MAX);
450  /*
451  std::cout << "RadiusCounter " << RadiusCounter/utl::m << " (m)" << std::endl;
452  std::cout << "ExtraRadius " << ExtraRadius/utl::m << " (m)" << std::endl;
453  std::cout << "Particle theta " << acos(pCosine)/utl::degree << " (deg)" << std::endl;
454  */
455  const double samplingArea = samplingAreaFactor * Sqr(cR);
456  const double pWeightDensity = pWeight / samplingArea;
457  const double effArea = kPi * Sqr( RadiusCounter/utl::m+ExtraRadius/utl::m );
458 
459  const double avgN = pWeightDensity * effArea;
460 
461  unsigned int n(0);
462  double weight(0);
463  n = RandPoisson::shoot(fRandomEngine, avgN);
464  /*
465  std::cout << "Reweight: " << pWeightDensity << std::endl;
466  std::cout << "effective area: " << effArea << std::endl;
467  std::cout << "Average number of particles: " << avgN << std::endl;
468  std::cout << "Poisson number to propagate: " << n << std::endl;
469  */
470  weight = 1;
471  newParticle.SetWeight(weight);
472 
473  const CoordinateSystemPtr localCS = cIt->GetLocalCoordinateSystem();
474 
475  for (unsigned int i = 0; i < n; ++i) {
476 
477 
478  //Uniform distribution on a circle
479  const double r = (RadiusCounter+ExtraRadius) * sqrt( RandFlat::shoot(fRandomEngine, 0, 1) );
480  const double phi = 2.*kPi * RandFlat::shoot(fRandomEngine, 0, 1);
481 
482  //Set new position (impact point)
483  const Point pNewPosition(r, phi, 0, localCS, Point::kCylindrical);
484  newParticle.SetPosition(pNewPosition);
485 
486  //Set new direction (impinging vector)
487  const Vector pNewDirection( pDirection.GetR(grParticleCS), pDirection.GetTheta(grParticleCS), pDirection.GetPhi(grParticleCS), grParticleCS, Vector::kSpherical );
488  newParticle.SetDirection(pNewDirection);
489 
490  //Set new time
491  double pShiftedTime = pTime + PlaneFrontTime(showerCS, partPos, pNewPosition);
492  newParticle.SetTime(pShiftedTime);
493  /*
494  std::cout << "injected radius: " << r/utl::m << " m" << std::endl;
495  std::cout << "injected phi : " << phi/utl::degree << " deg" << std::endl;
496  std::cout << "pTime : " << pTime/utl::ns << " ns " << std::endl;
497  std::cout << "pShiftedTime : " << pShiftedTime/utl::ns << " ns " << std::endl;
498  */
499  sSim.AddGrdParticle(newParticle);
500  ++fNInjected;
501 
502  } // for n
503 
504  } // loop on mdet::Counters
505  }//loop on shower particles
506 
507  std::cout << "Total number of muons in the shower " << fNMuons << std::endl;
508  std::cout << "Total number of muons injected for ground prop " << fNInjected << std::endl;
509  std::cout << "IsIn " << stat.IsIn << std::endl;
510  std::cout << "InDeltaR " << stat.InRad << std::endl;
511  std::cout << "InDeltaPhi " << stat.InPhi << std::endl;
512  std::cout << "muons rejected because of cut in zenith at " << MD_THETASIM_MAX/utl::degree<< "deg "<< fNHorizontalRejected << std::endl;
513 
514  return eSuccess;
515 }
516 
517 
520 {
521  return eSuccess;
522 }
523 
524 
void SetTime(const TimeInterval &time)
Definition: Particle.h:123
Branch GetTopBranch() const
Definition: Branch.cc:63
utl::CoordinateSystemPtr GetLocalCoordinateSystem() const
Get the Auger coordinate system associated to the shower core position.
Iterator to retrieve particles from utl::VShowerParticlList.
Station Level Simulated Data
VModule::ResultFlag Init()
Initialize: invoked at beginning of run (NOT beginning of event)
constexpr T Sqr(const T &x)
Point object.
Definition: Point.h:32
bool HasStation(const int stationId) const
Check whether station exists.
Definition: SEvent.cc:81
double GetPhi(const CoordinateSystemPtr &coordinateSystem) const
azimuth (phi) angle in spherical and cylindrical coordinates
Definition: BasicVector.h:254
utl::ShowerParticleIterator GroundParticlesEnd() const
const TimeInterval & GetTime() const
Arrival time delay at the ground.
Definition: Particle.h:122
bool HasMEvent() const
Report success to RunController.
Definition: VModule.h:62
double GetMinRadiusCut() const
Get the minimum radius from shower axis for which there are valid particles in the shower...
bool IsInsideMinRadius() const
Check whether the station is in the shower hole.
void SetPosition(const utl::Point &position)
Definition: Particle.h:111
#define MD_THETASIM_MAX
Counter level event data.
CounterConstIterator CountersEnd() const
End iterator over the counters.
Definition: MDetector.h:99
double GetR(const CoordinateSystemPtr &coordinateSystem) const
radius r in spherical coordinates coordinates (distance to origin)
Definition: BasicVector.h:257
Interface class to access to the SD part of an event.
Definition: SEvent.h:39
Describes a particle for Simulation.
Definition: Particle.h:26
double GetTheta(const CoordinateSystemPtr &coordinateSystem) const
zenith (theta) angle in spherical coordinates
Definition: BasicVector.h:248
void SetDirection(const utl::Vector &direction)
Definition: Particle.h:115
bool HasGroundParticles() const
bool HasSimShower() const
std::map< std::string, std::string > AttributeMap
Definition: Branch.h:24
bool IsParticleEnergyLow(const int, const double) const
#define INFO(message)
Macro for logging informational messages.
Definition: ErrorLogger.h:161
double PlaneFrontTime(const CoordinateSystemPtr showerCS, const Point &corePosition, const Point &position)
Calculate time of arrival of the plan front at point x.
bool HasCounter(const int cId) const
Definition: MEvent.h:43
Branch GetChild(const std::string &childName) const
Get child of this Branch by child name.
Definition: Branch.cc:211
Detector associated to muon detector hierarchy.
Definition: MDetector.h:32
bool IsInsideMinRadius() const
Interface class to access Shower Simulated parameters.
Definition: ShowerSimData.h:49
boost::shared_ptr< const CoordinateTransformer > CoordinateSystemPtr
Shared pointer for coordinate systems.
Class representing a document branch.
Definition: Branch.h:107
class to hold data at Station level
bool HasSimData() const
Check whether station simulated data exists.
const utl::Vector & GetDirection() const
Get the direction of the shower axis. This is the true direction of shower movement.
constexpr double kPi
Definition: MathConstants.h:24
bool IsIn(double phi, double r, InStats &)
constexpr double degree
const double km
void SetWeight(const double weight)
Definition: Particle.h:127
#define WARNING(message)
Macro for logging warning messages.
Definition: ErrorLogger.h:163
void GetData(bool &b) const
Overloads of the GetData member template function.
Definition: Branch.cc:644
VModule::ResultFlag Run(evt::Event &event)
Run: invoked once per event.
Station & GetStation(const int stationId)
retrieve station by id throw utl::NonExistentComponentException if n.a.
Definition: SEvent.h:116
double GetInterval() const
Get the time interval as a double (in Auger base units)
Definition: TimeInterval.h:69
void SetIsInsideMinRadius(const bool isIn=true)
double GetRho(const CoordinateSystemPtr &coordinateSystem) const
radius r in cylindrical coordinates (distance to z axis)
Definition: BasicVector.h:263
CounterGroup::ConstIterator CounterConstIterator
Defines a more meaningful (and shorter) type for iterators.
Definition: MDetector.h:44
Counter level simulation data.
double GetKineticEnergy() const
Get kinetic energy of the particle.
Definition: Particle.h:130
void AddGrdParticle(const utl::Particle &particle)
constexpr double kSpeedOfLight
ResultFlag
Flag returned by module methods to the RunController.
Definition: VModule.h:60
double GetWeight() const
Particle weight (assigned by shower generator thinning algorithms)
Definition: Particle.h:126
#define MD_LARGE_SIDE
void SetMinRadiusCut(const double minR)
Set the minimum radius cut.
void LoadConfig(const utl::Branch &b, const std::string &tag, T1 &var, const T2 &defaultValue)
Helper method to load a particular configuration parameter.
Definition: ConfigUtils.h:35
Vector object.
Definition: Vector.h:30
int GetType() const
Definition: Particle.h:101
bool HasSimData() const
const Point & GetPosition() const
Position of the particle.
Definition: Particle.h:110
Report failure to RunController, causing RunController to terminate execution.
Definition: VModule.h:64
void MakeCounter(const int cId)
Definition: MEvent.h:40
sevt::StationSimData & GetSimData()
Get simulated data at station level.
Counter & GetCounter(const int cId)
Definition: MEvent.h:34
void SetParent(Particle &parent)
Definition: Particle.h:150
CounterConstIterator CountersBegin() const
Begin iterator over the counters.
Definition: MDetector.h:92
double GetZ(const CoordinateSystemPtr &coordinateSystem) const
Definition: BasicVector.h:212
CounterSimData & GetSimData()
#define ERROR(message)
Macro for logging error messages.
Definition: ErrorLogger.h:165
constexpr double m
Definition: AugerUnits.h:121
const Vector & GetDirection() const
Unit vector giving particle direction.
Definition: Particle.h:114
utl::ShowerParticleIterator GroundParticlesBegin() const
Root of the Muon event hierarchy.
Definition: MEvent.h:25
bool HasSEvent() const
VModule::ResultFlag Finish()
Finish: invoked at end of the run (NOT end of the event)
utl::RandomEngine::RandomEngineType * fRandomEngine
utl::CoordinateSystemPtr GetShowerCoordinateSystem() const

, generated on Tue Sep 26 2023.