LArSoft  v09_90_00
Liquid Argon Software toolkit - https://larsoft.org/
OpFastScintillation.hh
Go to the documentation of this file.
1 // Class adapted for LArSoft by Ben Jones, MIT 10/10/12
2 //
3 // This class is a physics process based on the standard Geant4
4 // scintillation process.
5 //
6 // It has been stripped down and adapted to form the backbone of
7 // the LArG4 fast optical simulation. Photons, instead of being
8 // produced and added to the geant4 particle stack, are logged
9 // and used to predict the visibility of this step to each PMT in
10 // the detector.
11 //
12 // The photonvisibilityservice looks up the visibility of the relevant
13 // xyz point, and if a photon is detected at a given PMT, one OnePhoton
14 // object is logged in the OpDetPhotonTable
15 //
16 // At the end of the event, the OpDetPhotonTable is read out
17 // by LArG4, and detected photons are stored in the event.
18 //
19 // This process can be used alongside the standard Cerenkov process,
20 // which does step geant4 opticalphotons. Both the fast scintillation
21 // table and the geant4 sensitive detectors are read out by LArG4 to
22 // produce a combined SimPhoton collection.
23 //
24 //
25 //
26 // ********************************************************************
27 // * License and Disclaimer *
28 // * *
29 // * The Geant4 software is copyright of the Copyright Holders of *
30 // * the Geant4 Collaboration. It is provided under the terms and *
31 // * conditions of the Geant4 Software License, included in the file *
32 // * LICENSE and available at http://cern.ch/geant4/license . These *
33 // * include a list of copyright holders. *
34 // * *
35 // * Neither the authors of this software system, nor their employing *
36 // * institutes,nor the agencies providing financial support for this *
37 // * work make any representation or warranty, express or implied, *
38 // * regarding this software system or assume any liability for its *
39 // * use. Please see the license in the file LICENSE and URL above *
40 // * for the full disclaimer and the limitation of liability. *
41 // * *
42 // * This code implementation is the result of the scientific and *
43 // * technical work of the GEANT4 collaboration. *
44 // * By using, copying, modifying or distributing the software (or *
45 // * any work based on the software) you agree to acknowledge its *
46 // * use in resulting scientific publications, and indicate your *
47 // * acceptance of all terms of the Geant4 Software license. *
48 // ********************************************************************
49 //
50 //
51 // GEANT4 tag $Name: not supported by cvs2svn $
52 //
53 //
55 // Scintillation Light Class Definition
57 //
58 // File: OpFastScintillation.hh
59 // Description: Discrete Process - Generation of Scintillation Photons
60 // Version: 1.0
61 // Created: 1998-11-07
62 // Author: Peter Gumplinger
63 // Updated: 2010-10-20 Allow the scintillation yield to be a function
64 // of energy deposited by particle type
65 // Thanks to Zach Hartwig (Department of Nuclear
66 // Science and Engineeering - MIT)
67 // 2005-07-28 add G4ProcessType to constructor
68 // 2002-11-21 change to user G4Poisson for small MeanNumPotons
69 // 2002-11-07 allow for fast and slow scintillation
70 // 2002-11-05 make use of constant material properties
71 // 2002-05-16 changed to inherit from VRestDiscreteProcess
72 // 2002-05-09 changed IsApplicable method
73 // 1999-10-29 add method and class descriptors
74 //
75 // mail: gum@triumf.ca
76 //
78 
79 #ifndef OpFastScintillation_h
80 #define OpFastScintillation_h 1
81 
83 // Includes
85 
87 #include "larcoreobj/SimpleTypesAndConstants/geo_vectors.h" // geo::Point_t
88 #include "larsim/PhotonPropagation/PhotonVisibilityTypes.h" // phot::MappedT0s_t
89 
90 #include "Geant4/G4ForceCondition.hh"
91 #include "Geant4/G4ParticleDefinition.hh"
92 #include "Geant4/G4PhysicsOrderedFreeVector.hh"
93 #include "Geant4/G4PhysicsTable.hh"
94 #include "Geant4/G4ProcessType.hh"
95 #include "Geant4/G4String.hh"
96 #include "Geant4/G4ThreeVector.hh"
97 #include "Geant4/G4Types.hh"
98 #include "Geant4/G4VRestDiscreteProcess.hh"
99 
100 #include "TF1.h"
101 #include "TVector3.h"
102 
103 #include <memory> // std::unique_ptr
104 
105 class G4EmSaturation;
106 class G4Step;
107 class G4Track;
108 class G4VParticleChange;
109 namespace CLHEP {
110  class RandGeneral;
111 }
112 namespace geo {
113  class GeometryCore;
114 }
115 namespace phot {
116  class PhotonVisibilityService;
117 }
118 
119 // Class Description:
120 // RestDiscrete Process - Generation of Scintillation Photons.
121 // Class inherits publicly from G4VRestDiscreteProcess.
122 // Class Description - End:
123 
125 // Class Definition
127 
128 namespace larg4 {
129 
130  class OpFastScintillation : public G4VRestDiscreteProcess {
131 
132  private:
134  // Operators
136 
137  // OpFastScintillation& operator=(const OpFastScintillation &right);
138 
139  public: // Without description
141  // Constructors and Destructor
143 
144  OpFastScintillation(const G4String& processName = "Scintillation",
145  G4ProcessType type = fElectromagnetic);
146 
148 
150  // Methods
152 
153  public: // With description
154  // OpFastScintillation Process has both PostStepDoIt (for energy
155  // deposition of particles in flight) and AtRestDoIt (for energy
156  // given to the medium by particles at rest)
157 
158  virtual G4bool IsApplicable(const G4ParticleDefinition& aParticleType);
159  // Returns true -> 'is applicable', for any particle type except
160  // for an 'opticalphoton' and for short-lived particles
161 
162  G4double GetMeanFreePath(const G4Track& aTrack, G4double, G4ForceCondition*);
163  // Returns infinity; i. e. the process does not limit the step,
164  // but sets the 'StronglyForced' condition for the DoIt to be
165  // invoked at every step.
166 
167  G4double GetMeanLifeTime(const G4Track& aTrack, G4ForceCondition*);
168  // Returns infinity; i. e. the process does not limit the time,
169  // but sets the 'StronglyForced' condition for the DoIt to be
170  // invoked at every step.
171 
172  virtual G4VParticleChange* PostStepDoIt(const G4Track& aTrack, const G4Step& aStep);
173  virtual G4VParticleChange* AtRestDoIt(const G4Track& aTrack, const G4Step& aStep);
174 
175  // These are the methods implementing the scintillation process.
176 
177  void SetTrackSecondariesFirst(const G4bool state);
178  // If set, the primary particle tracking is interrupted and any
179  // produced scintillation photons are tracked next. When all
180  // have been tracked, the tracking of the primary resumes.
181 
182  void SetFiniteRiseTime(const G4bool state);
183  // If set, the OpFastScintillation process expects the user to have
184  // set the constant material property FAST/SLOWSCINTILLATIONRISETIME.
185 
186  G4bool GetTrackSecondariesFirst() const;
187  // Returns the boolean flag for tracking secondaries first.
188 
189  G4bool GetFiniteRiseTime() const;
190  // Returns the boolean flag for a finite scintillation rise time.
191 
192  void SetScintillationYieldFactor(const G4double yieldfactor);
193  // Called to set the scintillation photon yield factor, needed when
194  // the yield is different for different types of particles. This
195  // scales the yield obtained from the G4MaterialPropertiesTable.
196 
197  G4double GetScintillationYieldFactor() const;
198  // Returns the photon yield factor.
199 
200  void SetScintillationExcitationRatio(const G4double excitationratio);
201  // Called to set the scintillation exciation ratio, needed when
202  // the scintillation level excitation is different for different
203  // types of particles. This overwrites the YieldRatio obtained
204  // from the G4MaterialPropertiesTable.
205 
206  G4double GetScintillationExcitationRatio() const;
207  // Returns the scintillation level excitation ratio.
208 
209  G4PhysicsTable* GetFastIntegralTable() const;
210  // Returns the address of the fast scintillation integral table.
211 
212  G4PhysicsTable* GetSlowIntegralTable() const;
213  // Returns the address of the slow scintillation integral table.
214 
215  void AddSaturation(G4EmSaturation* sat) { emSaturation = sat; }
216  // Adds Birks Saturation to the process.
217 
218  void RemoveSaturation() { emSaturation = NULL; }
219  // Removes the Birks Saturation from the process.
220 
221  G4EmSaturation* GetSaturation() const { return emSaturation; }
222  // Returns the Birks Saturation.
223 
224  void SetScintillationByParticleType(const G4bool);
225  // Called by the user to set the scintillation yield as a function
226  // of energy deposited by particle type
227 
228  G4bool GetScintillationByParticleType() const { return scintillationByParticleType; }
229  // Return the boolean that determines the method of scintillation
230  // production
231 
232  void DumpPhysicsTable() const;
233  // Prints the fast and slow scintillation integral tables.
234 
235  /*std::vector<double> GetVUVTime(double, int);
236  std::vector<double> GetVisibleTimeOnlyCathode(double, int);*/
237  // old timings -- to be deleted
238 
239  void getVUVTimes(std::vector<double>& arrivalTimes,
240  const double distance_in_cm,
241  const size_t angle_bin);
242  void generateParam(const size_t index, const size_t angle_bin);
243  // Functions for vuv component Landau + Exponential timing parameterisation, updated method
244 
245  void getVISTimes(std::vector<double>& arrivalTimes,
246  const TVector3& ScintPoint,
247  const TVector3& OpDetPoint);
248  // Visible component timing parameterisation
249 
250  void detectedDirectHits(std::map<size_t, int>& DetectedNum,
251  const double Num,
252  geo::Point_t const& ScintPoint) const;
253  void detectedReflecHits(std::map<size_t, int>& ReflDetectedNum,
254  const double Num,
255  geo::Point_t const& ScintPoint) const;
256 
257  protected:
258  void BuildThePhysicsTable();
259  // It builds either the fast or slow scintillation integral table;
260  // or both.
261 
262  bool RecordPhotonsProduced(const G4Step& aStep, double N);
263  // Note the production of N photons in at point xyz.
264  // pass on to generate detector response, etc.
265 
267  // Class Data Members
269 
270  std::unique_ptr<G4PhysicsTable> theSlowIntegralTable;
271  std::unique_ptr<G4PhysicsTable> theFastIntegralTable;
272 
275 
276  G4double YieldFactor;
277 
278  G4double ExcitationRatio;
279 
281 
282  private:
284  double h; // height
285  double w; // width
287  int type;
288  };
289 
291  bool usesSemiAnalyticModel() const;
292 
293  int VUVHits(const double Nphotons_created,
294  geo::Point_t const& ScintPoint,
295  OpticalDetector const& opDet) const;
296  // Calculates semi-analytic model number of hits for vuv component
297 
298  int VISHits(geo::Point_t const& ScintPoint,
299  OpticalDetector const& opDet,
300  const double cathode_hits_rec,
301  const std::array<double, 3> hotspot) const;
302  // Calculates semi-analytic model number of hits for visible component
303 
304  G4double single_exp(const G4double t, const G4double tau2) const;
305  G4double bi_exp(const G4double t, const G4double tau1, const G4double tau2) const;
306 
307  G4double scint_time(const G4Step& aStep,
308  G4double ScintillationTime,
309  G4double ScintillationRiseTime) const;
310  void propagationTime(std::vector<double>& arrival_time_dist,
311  G4ThreeVector x0,
312  const size_t OpChannel,
313  bool Reflected = false); //const;
314 
315  // emission time distribution when there is a finite rise time
316  G4double sample_time(const G4double tau1, const G4double tau2) const;
317 
318  // Facility for TPB emission energies
319  double reemission_energy() const;
320  std::map<double, double> tpbemission;
321  std::unique_ptr<CLHEP::RandGeneral> fTPBEm;
322 
323  void average_position(G4Step const& aStep, double* xzyPos) const;
324 
325  G4EmSaturation* emSaturation;
326  // functions and parameters for the propagation time parametrization
329 
330  /*TF1 const* functions_vuv[8];
331  TF1 const* functions_vis[5];
332  double fd_break;
333  double fd_max;
334  double ftf1_sampling_factor;
335  double ft0_max, ft0_break_point;*/
336 
337  //For new VUV time parametrization
338  double fstep_size, fmin_d, fmax_d, fvuv_vgroup_mean, fvuv_vgroup_max, finflexion_point_distance,
339  fangle_bin_timing_vuv;
340  std::vector<std::vector<double>> fparameters[7];
341  // vector containing generated VUV timing parameterisations
342  std::vector<std::vector<TF1>> VUV_timing;
343  // vector containing min and max range VUV timing parameterisations are sampled to
344  std::vector<std::vector<double>> VUV_max;
345  std::vector<std::vector<double>> VUV_min;
346 
347  // For new VIS time parameterisation
348  double fvis_vmean, fangle_bin_timing_vis;
349  std::vector<double> fdistances_refl;
350  std::vector<double> fradial_distances_refl;
351  std::vector<std::vector<std::vector<double>>> fcut_off_pars;
352  std::vector<std::vector<std::vector<double>>> ftau_pars;
353 
354  struct Dims {
355  double h, w; // height, width
356  };
357 
358  // solid angle of rectangular aperture calculation functions
359  double Rectangle_SolidAngle(const double a, const double b, const double d) const;
360  double Rectangle_SolidAngle(Dims const& o, const std::array<double, 3> v) const;
361  // solid angle of circular aperture calculation functions
362  double Disk_SolidAngle(const double d, const double h, const double b) const;
363  // solid angle of a dome aperture calculation functions
364  double Omega_Dome_Model(const double distance, const double theta) const;
365 
366  // For VUV semi-analytic hits
367  // Gaisser-Hillas correction parameters for VUV Nhits estimation
368  G4double Gaisser_Hillas(const double x, const double* par) const;
370  // flat PDs
372  std::vector<std::vector<double>> fGHvuvpars_flat;
373  std::vector<double> fborder_corr_angulo_flat;
374  std::vector<std::vector<double>> fborder_corr_flat;
375  // dome PDs
377  std::vector<std::vector<double>> fGHvuvpars_dome;
378  std::vector<double> fborder_corr_angulo_dome;
379  std::vector<std::vector<double>> fborder_corr_dome;
380 
381  // For VIS semi-analytic hits
383  // correction parameters for VIS Nhits estimation
385  // flat PDs
386  std::vector<double> fvis_distances_x_flat;
387  std::vector<double> fvis_distances_r_flat;
388  std::vector<std::vector<std::vector<double>>> fvispars_flat;
389  // dome PDs
390  std::vector<double> fvis_distances_x_dome;
391  std::vector<double> fvis_distances_r_dome;
392  std::vector<std::vector<std::vector<double>>> fvispars_dome;
393 
394  // geometry properties
395  double fplane_depth, fcathode_zdimension, fcathode_ydimension;
397  std::vector<geo::BoxBoundedGeo> const fActiveVolumes;
398 
399  // Optical detector properties for semi-analytic hits
400  // int foptical_detector_type; // unused
401  double fradius;
404  std::vector<geo::Point_t> fOpDetCenter;
405  std::vector<int> fOpDetType;
406  std::vector<double> fOpDetLength;
407  std::vector<double> fOpDetHeight;
408  //double fGlobalTimeOffset;
409 
410  void ProcessStep(const G4Step& step);
411 
412  bool const bPropagate;
413 
416 
418  bool const fUseNhitsModel = false;
420  bool const fOnlyActiveVolume = false;
423  bool const fOnlyOneCryostat = false;
425  bool const fOpaqueCathode = false;
426 
427  bool isOpDetInSameTPC(geo::Point_t const& ScintPoint, geo::Point_t const& OpDetPoint) const;
428  bool isScintInActiveVolume(geo::Point_t const& ScintPoint);
429  double interpolate(const std::vector<double>& xData,
430  const std::vector<double>& yData,
431  double x,
432  bool extrapolate,
433  size_t i = 0) const;
434  void interpolate3(std::array<double, 3>& inter,
435  const std::vector<double>& xData,
436  const std::vector<double>& yData1,
437  const std::vector<double>& yData2,
438  const std::vector<double>& yData3,
439  double x,
440  bool extrapolate) const;
441 
442  static std::vector<geo::BoxBoundedGeo> extractActiveVolumes(geo::GeometryCore const& geom);
443 
444  }; // class OpFastScintillation
445 
446  double finter_d(double*, double*);
447  double LandauPlusExpoFinal(double*, double*);
448  double model_close(double*, double*);
449  double model_far(double*, double*);
450 
451  static const size_t acos_bins = 2000000;
452  constexpr double acos_table(const double x);
453  double fast_acos(const double x);
454 
456  // Inline methods
458  inline G4bool OpFastScintillation::IsApplicable(const G4ParticleDefinition& aParticleType)
459  {
460  if (aParticleType.GetParticleName() == "opticalphoton") return false;
461  if (aParticleType.IsShortLived()) return false;
462 
463  return true;
464  }
465 
466  inline void OpFastScintillation::SetTrackSecondariesFirst(const G4bool state)
467  {
468  fTrackSecondariesFirst = state;
469  }
470 
471  inline void OpFastScintillation::SetFiniteRiseTime(const G4bool state)
472  {
473  fFiniteRiseTime = state;
474  }
475 
476  inline G4bool OpFastScintillation::GetTrackSecondariesFirst() const
477  {
478  return fTrackSecondariesFirst;
479  }
480 
481  inline G4bool OpFastScintillation::GetFiniteRiseTime() const
482  {
483  return fFiniteRiseTime;
484  }
485 
486  inline void OpFastScintillation::SetScintillationYieldFactor(const G4double yieldfactor)
487  {
488  YieldFactor = yieldfactor;
489  }
490 
491  inline G4double OpFastScintillation::GetScintillationYieldFactor() const
492  {
493  return YieldFactor;
494  }
495 
496  inline void OpFastScintillation::SetScintillationExcitationRatio(const G4double excitationratio)
497  {
498  ExcitationRatio = excitationratio;
499  }
500 
501  inline G4double OpFastScintillation::GetScintillationExcitationRatio() const
502  {
503  return ExcitationRatio;
504  }
505 
506  inline G4PhysicsTable* OpFastScintillation::GetSlowIntegralTable() const
507  {
508  return theSlowIntegralTable.get();
509  }
510 
511  inline G4PhysicsTable* OpFastScintillation::GetFastIntegralTable() const
512  {
513  return theFastIntegralTable.get();
514  }
515 
516  inline void OpFastScintillation::DumpPhysicsTable() const
517  {
518  if (theFastIntegralTable) {
519  G4int PhysicsTableSize = theFastIntegralTable->entries();
520  G4PhysicsOrderedFreeVector* v;
521  for (G4int i = 0; i < PhysicsTableSize; i++) {
522  v = (G4PhysicsOrderedFreeVector*)(*theFastIntegralTable)[i];
523  v->DumpValues();
524  }
525  }
526  if (theSlowIntegralTable) {
527  G4int PhysicsTableSize = theSlowIntegralTable->entries();
528  G4PhysicsOrderedFreeVector* v;
529  for (G4int i = 0; i < PhysicsTableSize; i++) {
530  v = (G4PhysicsOrderedFreeVector*)(*theSlowIntegralTable)[i];
531  v->DumpValues();
532  }
533  }
534  }
535 
536  template <typename TReal>
537  inline constexpr double dist(const TReal* x, const TReal* y, const unsigned int dimension)
538  {
539  double d = 0.;
540  for (unsigned int p = 0; p < dimension; ++p) {
541  d += (*(x + p) - *(y + p)) * (*(x + p) - *(y + p));
542  }
543  return std::sqrt(d);
544  }
545 
546  template <typename TVector3>
547  inline constexpr double dist(const std::array<double, 3> x,
548  const TVector3 y,
549  const unsigned int dimension,
550  const unsigned int start)
551  {
552  double d = 0.;
553  for (unsigned int p = start; p < dimension; ++p) {
554  d += (x[p] - y[p]) * (x[p] - y[p]);
555  }
556  return std::sqrt(d);
557  }
558 
559  // implements relative method - do not use for comparing with zero
560  // use this most of the time, tolerance needs to be meaningful in your context
561  template <typename TReal>
562  inline constexpr static bool
563  isApproximatelyEqual(TReal a, TReal b, TReal tolerance = std::numeric_limits<TReal>::epsilon())
564  {
565  TReal diff = std::fabs(a - b);
566  if (diff <= tolerance) return true;
567  if (diff < std::fmax(std::fabs(a), std::fabs(b)) * tolerance) return true;
568  return false;
569  }
570 
571  // supply tolerance that is meaningful in your context
572  // for example, default tolerance may not work if you are comparing double with float
573  template <typename TReal>
574  inline constexpr static bool isApproximatelyZero(
575  TReal a,
576  TReal tolerance = std::numeric_limits<TReal>::epsilon())
577  {
578  if (std::fabs(a) <= tolerance) return true;
579  return false;
580  }
581 
582  // use this when you want to be on safe side
583  // for example, don't start rover unless signal is above 1
584  template <typename TReal>
585  inline constexpr static bool
586  isDefinitelyLessThan(TReal a, TReal b, TReal tolerance = std::numeric_limits<TReal>::epsilon())
587  {
588  TReal diff = a - b;
589  if (diff < tolerance) return true;
590  if (diff < std::fmax(std::fabs(a), std::fabs(b)) * tolerance) return true;
591  return false;
592  }
593 
594  template <typename TReal>
595  inline constexpr static bool
596  isDefinitelyGreaterThan(TReal a, TReal b, TReal tolerance = std::numeric_limits<TReal>::epsilon())
597  {
598  TReal diff = a - b;
599  if (diff > tolerance) return true;
600  if (diff > std::fmax(std::fabs(a), std::fabs(b)) * tolerance) return true;
601  return false;
602  }
603 
604  // template<typename Function, typename... Args>
605  // auto OpFastScintillation::invoke_memoized(Function function, Args... args)
606  // {
607  // using key_type = std::tuple<Args...>;
608  // using value_type = std::invoke_result_t<Function, Args...>;
609  // static_assert(! std::is_same_v<Function, std::function<value_type(Args...)>>,
610  // "cannot memoize on std::function (use a lambda instead)");
611  // static_assert(! std::is_same_v<Function, value_type(*)(Args...)>,
612  // "cannot memoize on function pointer (use a lambda instead)");
613  // static std::mutex mutex;
614  // static std::map<key_type, value_type> cache;
615  // auto key = std::tuple(args...);
616  // auto lock = std::lock_guard<std::mutex>(mutex);
617  // if (cache.count(key)){
618  // return cache[key];
619  // }
620  // return cache[key] = std::apply(function, key);
621  // }
622 
623 } // namespace larg4
624 
625 #endif /* OpFastScintillation_h */
Float_t x
Definition: compare.C:6
std::vector< std::vector< std::vector< double > > > fvispars_dome
G4EmSaturation * GetSaturation() const
std::vector< geo::Point_t > fOpDetCenter
void interpolate3(std::array< double, 3 > &inter, const std::vector< double > &xData, const std::vector< double > &yData1, const std::vector< double > &yData2, const std::vector< double > &yData3, const double x, const bool extrapolate)
std::vector< double > fOpDetHeight
Float_t y
Definition: compare.C:6
std::map< double, double > tpbemission
std::vector< std::vector< std::vector< double > > > fvispars_flat
Geant4 interface.
constexpr double dist(const std::array< double, 3 > x, const TVector3 y, const unsigned int dimension, const unsigned int start)
std::vector< double > fvis_distances_r_flat
double finter_d(double *x, double *par)
std::vector< double > fdistances_refl
std::unique_ptr< G4PhysicsTable > theSlowIntegralTable
double model_far(double *x, double *par)
std::vector< std::vector< TF1 > > VUV_timing
double model_close(double *x, double *par)
std::vector< std::vector< double > > fGHvuvpars_flat
std::vector< std::vector< double > > VUV_min
std::vector< std::vector< double > > fGHvuvpars_dome
std::vector< double > fborder_corr_angulo_dome
constexpr unsigned int dimension()
bool const bPropagate
Whether propagation of photons is enabled.
std::vector< std::vector< double > > fborder_corr_dome
std::vector< std::vector< double > > fborder_corr_flat
std::vector< double > fvis_distances_x_flat
constexpr double acos_table(const double x)
std::vector< double > fborder_corr_angulo_flat
std::vector< double > fOpDetLength
Definitions of geometry vector data types.
std::unique_ptr< CLHEP::RandGeneral > fTPBEm
std::vector< geo::BoxBoundedGeo > const fActiveVolumes
std::vector< std::vector< std::vector< double > > > ftau_pars
Float_t d
Definition: plot.C:235
G4bool GetScintillationByParticleType() const
Description of geometry of one entire detector.
Definition: GeometryCore.h:119
static constexpr bool isDefinitelyGreaterThan(TReal a, TReal b, TReal tolerance=std::numeric_limits< TReal >::epsilon())
Provides a base class aware of world box coordinates.
std::vector< double > fradial_distances_refl
std::vector< double > fvis_distances_r_dome
ROOT::Math::PositionVector3D< ROOT::Math::Cartesian3D< double >, ROOT::Math::GlobalCoordinateSystemTag > Point_t
Type for representation of position in physical 3D space.
Definition: geo_vectors.h:180
General LArSoft Utilities.
std::vector< std::vector< std::vector< double > > > fcut_off_pars
A container for photon visibility mapping data.
static constexpr bool isApproximatelyEqual(TReal a, TReal b, TReal tolerance=std::numeric_limits< TReal >::epsilon())
std::vector< double > fvis_distances_x_dome
Declaration of types related to photon visibility.
phot::PhotonVisibilityService const *const fPVS
Photon visibility service instance.
std::vector< std::vector< double > > VUV_max
void AddSaturation(G4EmSaturation *sat)
static const size_t acos_bins
static constexpr bool isDefinitelyLessThan(TReal a, TReal b, TReal tolerance=std::numeric_limits< TReal >::epsilon())
phot::MappedFunctions_t ParPropTimeTF1
double interpolate(const std::vector< double > &xData, const std::vector< double > &yData, const double x, const bool extrapolate, size_t i)
Namespace collecting geometry-related classes utilities.
static constexpr bool isApproximatelyZero(TReal a, TReal tolerance=std::numeric_limits< TReal >::epsilon())
double LandauPlusExpoFinal(double *x, double *par)
double fast_acos(double x)
std::unique_ptr< G4PhysicsTable > theFastIntegralTable