ATLAS Offline Software
Loading...
Searching...
No Matches
EnergyCalculator.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5// EnergyCalculator.h
6// Prepared 10-Apr-2002 Bill Seligman
7// from code written by Jozsef Toth.
8// 07-May-2003 AMS: now EnergyCalculator is not a singleton
9// 02-July-2003 J.T. Charge collection added
10// 20-July-2004 J.T. FieldMapVersion variable is added
11// 25-May-2005 J.T. -calling sequence of GapAdj changed
12// -new variables and function for reading and handling
13// values of HV of power supplies
14// - IonReco :for suppress signal because of ion recombination
15// - DriftVelo: Walkowiak's formula for drift velocity
16// Sept-2006 J.T. - collect signal from the Barrette volume
17// Nov -2006 J.T. - fieldmap array structures changed,
18// - lengths defined dinamically
19// - field map for first/last fold and for Barrett volume are included
20// May 2009 AMS move to namespace LArG4::EC
21// duplicated data members removed
22
23#ifndef LArG4_EC_EnergyCalculator_H
24#define LArG4_EC_EnergyCalculator_H
25
26
27
28#include "CLHEP/Units/SystemOfUnits.h"
29
34
37
40
41#include "G4ThreeVector.hh"
42#include "HVHelper.h"
43#include "globals.hh"
44#include <string>
45#include <vector>
46#include <memory>
48class LArG4BirksLaw;
49
50namespace LArG4 {
51
52 namespace EC {
53
55 {
56 public:
57
58 EnergyCalculator(const std::string& name, ISvcLocator *pSvcLocator);
59 // Update handlers
60 void CorrectionTypeHandler(Gaudi::Details::PropertyBase&);
61 void SolidTypeHandler(Gaudi::Details::PropertyBase&);
62
63 virtual StatusCode initialize() override final;
64 virtual StatusCode finalize() override final;
65
67 // The interface for LArVCalculator.
68 virtual G4float OOTcut() const override final { return m_OOTcut; }
69 virtual G4bool Process(const G4Step*, std::vector<LArHitData>&) const override final;
70
71 // Check if the current hitTime is in-time
72 virtual G4bool isInTime(G4double hitTime) const override final
73 {
74 return !(hitTime > m_OOTcut); //FIXME should we be checking the absolute value of hitTime here?
75 }
76
77
78 private:
79 G4bool (EnergyCalculator::*m_Process_type) (const G4Step*, std::vector<LArHitData>&) const{};
80 G4double (EnergyCalculator::*m_GetGapSize_type) (const G4ThreeVector &p) const{};
81 G4double (EnergyCalculator::*m_distance_to_the_nearest_electrode_type) (const G4ThreeVector &p, G4double /*Barret_PhiStart*/) const{};
82
83 G4bool Process_Default(const G4Step*, std::vector<LArHitData>&) const;
84 G4bool Process_Barrett(const G4Step*, std::vector<LArHitData>&) const;
85 G4bool FindIdentifier_Default(const G4Step *, std::vector<LArHitData>&, G4ThreeVector &, G4ThreeVector &) const;
86 G4bool FindIdentifier_Barrett(const G4Step *, G4double, std::vector<LArHitData>&, G4ThreeVector &, G4ThreeVector &) const;
87 G4bool FindDMIdentifier_Barrett(const G4Step* step, std::vector<LArHitData>&) const;
88 G4bool GetCompartment_Barrett(const G4ThreeVector&,G4double,G4double,G4double,
89 G4int &, G4int &) const;
90
91 G4double GetHV_Value(const G4ThreeVector& p, G4double PhiStartOfPhiDiv) const;
92 G4double GetGapSize_Default(const G4ThreeVector &p) const {
93 return GetGapSize(p);
94 }
95 G4double GetGapSize_Barrett(const G4ThreeVector &p) const;
96 G4int GetPhiGap_Barrett(const G4ThreeVector &p, G4double PhiStartOfPhiDiv) const;
97 G4double distance_to_the_nearest_electrode_Default(const G4ThreeVector &p, G4double /*Barret_PhiStart*/) const {
99 }
100 G4double distance_to_the_nearest_electrode_Barrett(const G4ThreeVector &p, G4double Barret_PhiStart) const;
101
102 ServiceHandle<ILArCalibCalculatorSvc> m_supportCalculator{this, "SupportCalculator", "EMECSupportCalibrationCalculator"};
103
104 void SetConst_OuterBarrett(void); // used only for initialization
105 G4bool GetVolumeIndex(const G4Step *, G4int &, G4int &) const;
106 static const G4double s_LongBarThickness;// = 20. *mm;
107 static const G4double s_ColdCorrection;// =1.0036256;
108 static const G4double s_StripWidth;// =3.*mm/ColdCorrection;
109 static const G4double s_KapGap;// =1.*mm/ColdCorrection;
110 static const G4double s_EdgeWidth;// =1.*mm;
111 static const G4double s_DistOfEndofCuFromBack;// =22.77*mm/ColdCorrection;
112 static const G4double s_DistOfStartofCuFromBack;//=31.*mm; // frontface of the barrette
113 static const G4double s_ZmaxOfSignal;// DistOfStartofCuFromBack - DistOfEndofCuFromBack + EdgeWidth;
114
115 static const G4double s_S3_Etalim[21];
116 static const G4double s_Rmeas_outer[50];
117 static const G4double s_Zmeas_outer[2];
118 G4double m_RefzDist = 0.0; // = dElecFocaltoWRP+dWRPtoFrontFace+WheelThickness+ // used as const after
119 // +dWRPtoFrontFace+ LongBarThickness // initialization
120 // -DistOfEndofCuFromBack
121
122 G4double m_S3_Rlim[21]{}; // used as const after init
123 G4double m_rlim[50]{}; // used as const after init
124 G4double m_zlim[4]{}; // used as const after init
125
126 UnsignedIntegerProperty m_corrProp{this, "EnergyCorrection", 8, &EnergyCalculator::CorrectionTypeHandler};
128
129 G4double (EnergyCalculator::*m_ecorr_method) (G4double, const G4ThreeVector&, const G4ThreeVector&, G4double /*Barret_PhiStart*/) const{};
130 G4double dummy_correction_method(G4double e, const G4ThreeVector&, const G4ThreeVector&,
131 G4double /*Barret_PhiStart*/) const {
132 return e;
133 }
134 G4double GapAdjustment_old(G4double, const G4ThreeVector&, const G4ThreeVector&, G4double /*Barret_PhiStart*/) const;
135 G4double GapAdjustment (G4double, const G4ThreeVector&, const G4ThreeVector&, G4double /*Barret_PhiStart*/) const;
136 G4double GapAdjustment_E (G4double, const G4ThreeVector&, const G4ThreeVector&, G4double /*Barret_PhiStart*/) const;
137 G4double GapAdjustment_s (G4double, const G4ThreeVector&, const G4ThreeVector&, G4double /*Barret_PhiStart*/) const;
138 G4double GapAdjustment__sE (G4double, const G4ThreeVector&, const G4ThreeVector&, G4double /*Barret_PhiStart*/) const;
139 G4double CalculateChargeCollection(G4double, const G4ThreeVector&, const G4ThreeVector&, G4double /*Barret_PhiStart*/) const;
140 G4double CalculateChargeCollection1(G4double, const G4ThreeVector&, const G4ThreeVector&, G4double /*Barret_PhiStart*/) const;
141
142 // get power of gap in signal calculation
143 DoubleProperty m_GApower{this, "EMECGapPower", 1.4}; // used as const after init
144 inline G4double GApower() const { return m_GApower; };
145
146 // **************************************************************************
147 //Declaration of variables,functions for charge collection
148 //J.T
149 // **************************************************************************
150
151
152 //variables specific for wheel geometry
170
171
172 G4double m_ElectrodeFanHalfThickness = 0.0; // used as const after init
173 G4double m_FanEleThicknessOld = 0.0; // used as const after init
174 G4double m_FanEleFoldRadiusOld = 0.0; // used as const after init
175 G4double m_FanAbsThickness = 0.0; // used as const after init
176 G4double m_FanEleThickness = 0.0; // used as const after init
177 G4double m_WaveLength = 0.0; // used as const after init
178
179 G4double m_zsep12[44]{}; // used as const after initialization
180 G4double m_ziw[7]{}; // used as const after initialization
181 G4double m_zsep23[22]{}; // used as const after initialization
182
183
184 inline G4double ElectrodeFanHalfThickness() const { return m_ElectrodeFanHalfThickness; };
185 inline G4double FanEleThicknessOld() const { return m_FanEleThicknessOld; };
186 inline G4double FanEleFoldRadiusOld() const { return m_FanEleFoldRadiusOld; };
187 inline G4double FanAbsThickness() const { return m_FanAbsThickness; };
188 inline G4double FanEleThickness() const { return m_FanEleThickness; };
189 inline G4double WaveLength() const { return m_WaveLength; };
190
191 //variables specific for Efield calculation
192
193 G4String m_FieldMapVersion; // used as const after init
194
195 static const G4double s_GridSize;
196 static const G4double s_AverageGap;
197 static const G4double s_inv_AverageGap;
198
200 G4bool FieldMapPrepared = false;
201 G4double* FieldMap{}; // [NumberOfRadialLayers][ZYWeight][MaxNofPoints];
202 G4double* MinZofLayer{}; //these are limits of the
203 G4double* MaxZofLayer{}; //area where the FieldMap can
204 G4double* MinYofLayer{}; //be used for interpolation
205 G4double* MaxYofLayer{};
206 G4int* NofColofLayer{}; // a column is parallel to y
207 G4int* NofRowofLayer{}; // a row is parallel to z
209 G4int* pLayer{};
210 };
211
212 struct Wheel_Efield_Map {G4bool FieldMapPrepared = false;
214 G4double* RadiusOfLayers{};
220 G4double GridShift = 0;
221 };
222
223 Wheel_Efield_Map m_ChCollInner{},m_ChCollOuter{}; // used as const after init
224 Wheel_Efield_Map* m_ChCollWheelType = nullptr; // used as const after init
225
226 inline const Wheel_Efield_Map* ChCollWheelType() const { return m_ChCollWheelType; };
227
236
238 inline G4int Index(const Fold_Efield_Map* foldmap, G4int i, G4int j, G4int k ) const {
239 return foldmap->pLayer[i]+j*foldmap->NofPointsinLayer[i]+k;
240 };
241 void SetFoldArea(G4double, FoldArea & ) const;
242
243 StringProperty m_HVMapVersion{this, "EMECHVMap", "v02"}; // used only for initialization
244 BooleanProperty m_DB_HV{this, "EMECHVEnable", false};
245
246 static const G4double s_AverageHV;
247 static const G4double s_AverageEfield;
248 static const G4double s_AverageCurrent;
249
250 static const G4double s_LArTemperature_ECC0;//={88.15}; //K
251 static const G4double s_LArTemperature_ECC1;//={88.37};
252 static const G4double s_LArTemperature_ECC5;//={87.97};
253 static const G4double s_LArTemperature_av ;// ={88.16};
254
255 //Efield in [kv/cm], driftvelo in [mm/microsec], Temperature in [K]
256
257 inline static G4double IonReco(const G4double Efield) {
258 if(Efield<=0.000001){return 0.;}
259 if(Efield>2.) {return (1./(1. +0.36/Efield));}
260 return (1./(1.04+0.28/Efield));
261 }
262
263 inline static G4double DriftVelo(const G4double T, const G4double Efield) {
264 if( Efield <= 0.000001) {return 0.;}
265 return ( (-0.01481*(T-90.371)+1.)*
266 ( 0.141*Efield*log(1.+12.4/Efield)+
267 1.627*pow(Efield,0.317) )
268 -0.0075*(T-90.371)
269 );
270 }
271
272 // functions specific for geometry
273
274 void SetHalfWave(G4double, WheelGeometry &) const;
275 void GetPhiGap(const G4double *, WheelGeometry &) const;
276 void SetYlimitsofPhigapinWheel(G4double, G4double, const WheelGeometry & wg, G4double * Ylimits) const;
277 G4double YofSurface(G4double,G4double,G4double,const WheelGeometry &) const;
278 inline G4double YofNeutralFibre(G4double alpha,G4double rho, const WheelGeometry & wg) const {
279 return YofSurface(alpha,rho,0., wg);
280 }
281 G4double FoldingAngle(G4double) const;
282 G4double HalfLArGapSize(G4double, G4double) const;
283
284 // functions specific for charge coll.
285
286 void IniGeomforFieldMaps(void); // called only at init phase
287 void LoadFieldMaps(const G4String&); // called only at init phase
288 void PrepareFieldMap(Wheel_Efield_Map* ChCollWheelType); // called only at init phase
289 G4double GetCurrent(const G4double *,const G4double *,G4double, G4double Barret_PhiStart) const;
290 void TransformWheeltoFieldMap(const G4double *,G4double *, const WheelGeometry & wg, const FoldArea & fa) const;
291 void SetYlimitsofPhigapinFieldMap(G4int, const WheelGeometry & wg, G4double * Ylimits) const;
292 void TransFromBarrtoWheel(const G4double*, G4double PhiStartOfPhiDiv, G4double*) const;
293 G4double GetWeightfromFieldMap(G4int,G4double,G4double, const FoldArea & fa) const;
294 G4double HalfLArGapSizeOld(G4double) const;
295
296 // pick up surface_suppression_range
297 DoubleProperty m_CHC_Esr{this, "EMECRsr", 0.2*CLHEP::mm}; // used as const after init
298 inline G4double CHC_Esr() const { return m_CHC_Esr; };
299
300#ifdef DEBUG_CHCL // non thread-safe debug of charge collection
301 static const G4int s_CHCMaxPrint=00; // exists only if debug activated
302 static G4int s_CHCIprint; // exists only if debug activated
303 static G4double s_CHCEbad; // exists only if debug activated
304 static G4double s_CHCEtotal; // exists only if debug activated
305 static G4double s_CHCStotal; // exists only if debug activated
306#endif
307
308 private:
309 /* to be developed...
310 std::pair<double, double>DxToFans(Hep3Vector &p);
311 double XDistanceToTheNeutralFibre(const Hep3Vector& P) const;
312 */
313 G4double GetGapSize(const G4ThreeVector &p) const;
314
315 // public:
316 G4double distance_to_the_nearest_electrode(const G4ThreeVector &p) const;
317
318 UnsignedIntegerProperty m_solidtypeProp{this, "WheelType", 0, &EnergyCalculator::SolidTypeHandler};
320 IntegerProperty m_zside{this, "zSide", 1};
323 const LArWheelCalculator * lwc() const { return m_lwc; }
324
325 ServiceHandle<IGeoModelSvc> m_geoModel{this, "GeoModelSvc", "GeoModelSvc"};
326 ServiceHandle<IGeoDbTagSvc> m_geoDbTagSvc{this, "GeoDbTagSvc", "GeoDbTagSvc"};
327 StringProperty m_suffix{this, "EMECChMap", "v03"};
328
329 // Aug 2007 AMS, lost Aug 2008, restored May 2009
332
333 G4double GetCurrent1(const G4ThreeVector &, const G4ThreeVector &, G4double) const;
334
337
338 G4int _getIRlayer(G4double rforalpha) const;
339 G4int _getIRlayerA(G4double rforalpha) const;
340
341 G4double _interpolateCurrentSubStep(G4double rforalpha, G4int gapup, const G4double vmap[],
342 G4double tol, const FoldArea & fa, G4int & gaperr ) const;
343
344
345 G4double _interpolateCurrentSubStep1(G4double rforalpha, const G4double vmap[],
346 const G4ThreeVector & Pe, int side_dte, int Pe_fan,
347 const G4ThreeVector & Pa, int side_dta, int Pa_fan,
348 const FoldArea & fa, G4int & gaperr ) const;
349
350 G4double _AdjustedPhiOfPoint_Barrett(const G4ThreeVector& p, G4double PhiStartOfPhiDiv) const;
351
352 static inline G4double _normalizeAngle2Pi(G4double a) {
353 return ( a<0.) ?
354 a + CLHEP::twopi
355 :
356 (a >= CLHEP::twopi ? a - CLHEP::twopi: a);
357 }
358
359 G4double getPhiStartOfPhiDiv(const G4Step* step) const;
360
361 private:
362 std::unique_ptr<const HVHelper> m_HVHelper;
363 const static G4double s_GA_SubstepSize;
364 G4double DistanceToEtaLine(const G4ThreeVector &p, G4double eta) const;
365
366 struct geometry_t {
367 G4int zSide; // +- 3 for inner wheel, +- 2 for outer wheel, z determines sign
368 G4int sampling;
369 G4int region;
370 G4double etaScale; // 1/deta
371 G4double etaOffset; // set so that the range of etaBin starts at zero for each compartment
372 G4int maxEta; // the maximum value of etaBin in this compartment
373 G4int gapsPerBin; // number of phi gaps (in LArWheelSolid) for each cell bin.
374 G4int maxPhi; // the maximum value of phiBin in this compartment
375 };
376 static const geometry_t s_geometry[];
377
379 const G4ThreeVector& p, G4double PhiStartOfPhiDiv,
380 G4double &phi, G4int &compartment, G4int &eta_bin
381 ) const;
382
383 };
384 } // namespace EC
385} // namespace LArG4
386
387#endif // LArG4_EC_EnergyCalculator_H
float hitTime(const AFP_SIDSimHit &hit)
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
static Double_t a
LArCalculatorSvcImp(const std::string &name, ISvcLocator *pSvcLocator)
Gaudi::Property< double > m_OOTcut
G4bool Process_Barrett(const G4Step *, std::vector< LArHitData > &) const
G4double CalculateChargeCollection1(G4double, const G4ThreeVector &, const G4ThreeVector &, G4double) const
G4bool Process_Default(const G4Step *, std::vector< LArHitData > &) const
G4double distance_to_the_nearest_electrode(const G4ThreeVector &p) const
virtual StatusCode initialize() override final
G4double(EnergyCalculator::* m_GetGapSize_type)(const G4ThreeVector &p) const
static const G4double s_S3_Etalim[21]
Wheel_Efield_Map * m_ChCollWheelType
EnergyCalculator(const EnergyCalculator &)
G4double GetGapSize_Barrett(const G4ThreeVector &p) const
UnsignedIntegerProperty m_solidtypeProp
G4double GapAdjustment__sE(G4double, const G4ThreeVector &, const G4ThreeVector &, G4double) const
G4double DistanceToEtaLine(const G4ThreeVector &p, G4double eta) const
G4double YofSurface(G4double, G4double, G4double, const WheelGeometry &) const
static const G4double s_AverageEfield
G4int _getIRlayer(G4double rforalpha) const
G4double GapAdjustment_s(G4double, const G4ThreeVector &, const G4ThreeVector &, G4double) const
G4double GetWeightfromFieldMap(G4int, G4double, G4double, const FoldArea &fa) const
G4double dummy_correction_method(G4double e, const G4ThreeVector &, const G4ThreeVector &, G4double) const
void LoadFieldMaps(const G4String &)
void SetFoldArea(G4double, FoldArea &) const
static const G4double s_LArTemperature_ECC1
static const G4double s_AverageHV
void CreateArrays(Wheel_Efield_Map &, G4int)
static const G4double s_LArTemperature_ECC5
G4double _interpolateCurrentSubStep1(G4double rforalpha, const G4double vmap[], const G4ThreeVector &Pe, int side_dte, int Pe_fan, const G4ThreeVector &Pa, int side_dta, int Pa_fan, const FoldArea &fa, G4int &gaperr) const
static const G4double s_Zmeas_outer[2]
static const G4double s_ZmaxOfSignal
static const geometry_t s_geometry[]
G4double GetCurrent1(const G4ThreeVector &, const G4ThreeVector &, G4double) const
static const G4double s_GridSize
G4bool GetCompartment_Barrett(const G4ThreeVector &, G4double, G4double, G4double, G4int &, G4int &) const
static const G4double s_LArTemperature_ECC0
G4double HalfLArGapSizeOld(G4double) const
LArWheelCalculator * m_electrode_calculator
LArG4::LArWheelCalculator_t m_solidtype
G4bool GetVolumeIndex(const G4Step *, G4int &, G4int &) const
G4bool FindIdentifier_Default(const G4Step *, std::vector< LArHitData > &, G4ThreeVector &, G4ThreeVector &) const
void GetPhiGap(const G4double *, WheelGeometry &) const
G4double distance_to_the_nearest_electrode_Default(const G4ThreeVector &p, G4double) const
void CorrectionTypeHandler(Gaudi::Details::PropertyBase &)
ServiceHandle< ILArCalibCalculatorSvc > m_supportCalculator
static const G4double s_ColdCorrection
virtual G4bool isInTime(G4double hitTime) const override final
G4bool(EnergyCalculator::* m_Process_type)(const G4Step *, std::vector< LArHitData > &) const
G4double GapAdjustment_old(G4double, const G4ThreeVector &, const G4ThreeVector &, G4double) const
G4double GapAdjustment(G4double, const G4ThreeVector &, const G4ThreeVector &, G4double) const
G4bool FindIdentifier_Barrett(const G4Step *, G4double, std::vector< LArHitData > &, G4ThreeVector &, G4ThreeVector &) const
static const G4double s_AverageCurrent
G4double(EnergyCalculator::* m_ecorr_method)(G4double, const G4ThreeVector &, const G4ThreeVector &, G4double) const
G4double _AdjustedPhiOfPoint_Barrett(const G4ThreeVector &p, G4double PhiStartOfPhiDiv) const
const Wheel_Efield_Map * ChCollWheelType() const
virtual StatusCode finalize() override final
virtual G4bool Process(const G4Step *, std::vector< LArHitData > &) const override final
G4double(EnergyCalculator::* m_distance_to_the_nearest_electrode_type)(const G4ThreeVector &p, G4double) const
static const G4double s_KapGap
virtual G4float OOTcut() const override final
G4bool FindDMIdentifier_Barrett(const G4Step *step, std::vector< LArHitData > &) const
G4double FanEleFoldRadiusOld() const
static const G4double s_DistOfStartofCuFromBack
G4double GetGapSize(const G4ThreeVector &p) const
G4double GetGapSize_Default(const G4ThreeVector &p) const
static const G4double s_LongBarThickness
void SetYlimitsofPhigapinFieldMap(G4int, const WheelGeometry &wg, G4double *Ylimits) const
static const G4double s_StripWidth
G4double ElectrodeFanHalfThickness() const
G4bool GetBarrettePCE(const G4ThreeVector &p, G4double PhiStartOfPhiDiv, G4double &phi, G4int &compartment, G4int &eta_bin) const
G4double GetHV_Value(const G4ThreeVector &p, G4double PhiStartOfPhiDiv) const
static const G4double s_DistOfEndofCuFromBack
void SetHalfWave(G4double, WheelGeometry &) const
static const G4double s_AverageGap
G4double GetCurrent(const G4double *, const G4double *, G4double, G4double Barret_PhiStart) const
G4double CalculateChargeCollection(G4double, const G4ThreeVector &, const G4ThreeVector &, G4double) const
static const G4double s_Rmeas_outer[50]
G4double FoldingAngle(G4double) const
UnsignedIntegerProperty m_corrProp
G4double YofNeutralFibre(G4double alpha, G4double rho, const WheelGeometry &wg) const
static const G4double s_LArTemperature_av
EnergyCalculator(const std::string &name, ISvcLocator *pSvcLocator)
G4int Index(const Fold_Efield_Map *foldmap, G4int i, G4int j, G4int k) const
static const G4double s_EdgeWidth
void TransformWheeltoFieldMap(const G4double *, G4double *, const WheelGeometry &wg, const FoldArea &fa) const
G4double GapAdjustment_E(G4double, const G4ThreeVector &, const G4ThreeVector &, G4double) const
ServiceHandle< IGeoDbTagSvc > m_geoDbTagSvc
EnergyCalculator & operator=(const EnergyCalculator &)
static const G4double s_inv_AverageGap
void SolidTypeHandler(Gaudi::Details::PropertyBase &)
G4double HalfLArGapSize(G4double, G4double) const
void SetYlimitsofPhigapinWheel(G4double, G4double, const WheelGeometry &wg, G4double *Ylimits) const
void PrepareFieldMap(Wheel_Efield_Map *ChCollWheelType)
static G4double DriftVelo(const G4double T, const G4double Efield)
G4double FanEleThicknessOld() const
G4int GetPhiGap_Barrett(const G4ThreeVector &p, G4double PhiStartOfPhiDiv) const
static G4double IonReco(const G4double Efield)
G4int _getIRlayerA(G4double rforalpha) const
G4double distance_to_the_nearest_electrode_Barrett(const G4ThreeVector &p, G4double Barret_PhiStart) const
ServiceHandle< IGeoModelSvc > m_geoModel
G4double _interpolateCurrentSubStep(G4double rforalpha, G4int gapup, const G4double vmap[], G4double tol, const FoldArea &fa, G4int &gaperr) const
std::unique_ptr< const HVHelper > m_HVHelper
static const G4double s_GA_SubstepSize
void TransFromBarrtoWheel(const G4double *, G4double PhiStartOfPhiDiv, G4double *) const
const LArWheelCalculator * lwc() const
EnergyCorrection_t m_correction_type
G4double getPhiStartOfPhiDiv(const G4Step *step) const
static G4double _normalizeAngle2Pi(G4double a)
const LArWheelCalculator * elc() const
This class separates some of the geometry details of the LAr endcap.
EnergyCorrection_t
@ EMEC_ECOR_CHCL1