98 #include "TLorentzVector.h" 100 #include "Geant4/globals.hh" 101 #include "Geant4/G4ParticleTypes.hh" 102 #include "Geant4/G4EmProcessSubType.hh" 103 #include "Geant4/Randomize.hh" 104 #include "Geant4/G4Poisson.hh" 105 #include "Geant4/G4VPhysicalVolume.hh" 127 #include "cetlib_except/exception.h" 129 #include "TRandom3.h" 131 #include "boost/algorithm/string.hpp" 152 : G4VRestDiscreteProcess(processName, type)
154 G4cout<<
"BEA1 timing distribution"<<G4endl;
155 SetProcessSubType(25);
172 if (verboseLevel>0) {
173 G4cout << GetProcessName() <<
" is created " << G4endl;
189 : G4VRestDiscreteProcess(rhs.GetProcessName(), rhs.GetProcessType())
250 aParticleChange.Initialize(aTrack);
254 const G4Material* aMaterial = aTrack.GetMaterial();
255 G4MaterialPropertiesTable* aMaterialPropertiesTable =
256 aMaterial->GetMaterialPropertiesTable();
257 if (!aMaterialPropertiesTable)
258 return G4VRestDiscreteProcess::PostStepDoIt(aTrack, aStep);
260 G4StepPoint* pPreStepPoint = aStep.GetPreStepPoint();
262 G4ThreeVector x0 = pPreStepPoint->GetPosition();
263 G4ThreeVector p0 = aStep.GetDeltaPosition().unit();
314 aParticleChange.SetNumberOfSecondaries(0);
342 if (verboseLevel>0) {
343 G4cout <<
"\n Exiting from OpFastScintillation::DoIt -- NumberOfSecondaries = " 344 << aParticleChange.GetNumberOfSecondaries() << G4endl;
348 return G4VRestDiscreteProcess::PostStepDoIt(aTrack, aStep);
355 if(step.GetTotalEnergyDeposit() <= 0)
return;
360 (
double)(step.GetTotalEnergyDeposit()/CLHEP::MeV),
361 (
float)(step.GetPreStepPoint()->GetPosition().x()/CLHEP::cm),
362 (
float)(step.GetPreStepPoint()->GetPosition().y()/CLHEP::cm),
363 (
float)(step.GetPreStepPoint()->GetPosition().z()/CLHEP::cm),
364 (
float)(step.GetPostStepPoint()->GetPosition().x()/CLHEP::cm),
365 (
float)(step.GetPostStepPoint()->GetPosition().y()/CLHEP::cm),
366 (
float)(step.GetPostStepPoint()->GetPosition().z()/CLHEP::cm),
367 (
double)(step.GetPreStepPoint()->GetGlobalTime()),
368 (
double)(step.GetPostStepPoint()->GetGlobalTime()),
371 step.GetTrack()->GetParticleDefinition()->GetPDGEncoding(),
372 step.GetPreStepPoint()->GetPhysicalVolume()->GetName()
389 const G4Track * aTrack = aStep.GetTrack();
391 G4StepPoint* pPreStepPoint = aStep.GetPreStepPoint();
392 G4StepPoint* pPostStepPoint = aStep.GetPostStepPoint();
394 const G4DynamicParticle* aParticle = aTrack->GetDynamicParticle();
395 const G4Material* aMaterial = aTrack->GetMaterial();
397 G4int materialIndex = aMaterial->GetIndex();
398 G4int tracknumber = aStep.GetTrack()->GetTrackID();
400 G4ThreeVector x0 = pPreStepPoint->GetPosition();
401 G4ThreeVector p0 = aStep.GetDeltaPosition().unit();
403 G4double
t0 = pPreStepPoint->GetGlobalTime();
406 G4MaterialPropertiesTable* aMaterialPropertiesTable =
407 aMaterial->GetMaterialPropertiesTable();
410 size_t NOpChannels = 0;
414 G4MaterialPropertyVector* Fast_Intensity =
415 aMaterialPropertiesTable->GetProperty(
"FASTCOMPONENT");
416 G4MaterialPropertyVector* Slow_Intensity =
417 aMaterialPropertiesTable->GetProperty(
"SLOWCOMPONENT");
419 if (!Fast_Intensity && !Slow_Intensity )
429 if (Fast_Intensity && Slow_Intensity) nscnt = 2;
441 G4ParticleDefinition *pDef = aParticle->GetDefinition();
448 if(pDef==G4Proton::ProtonDefinition())
450 YieldRatio = aMaterialPropertiesTable->
451 GetConstProperty(
"PROTONYIELDRATIO");
456 else if(pDef==G4MuonPlus::MuonPlusDefinition()||pDef==G4MuonMinus::MuonMinusDefinition())
458 YieldRatio = aMaterialPropertiesTable->
459 GetConstProperty(
"MUONYIELDRATIO");
463 else if(pDef==G4PionPlus::PionPlusDefinition()||pDef==G4PionMinus::PionMinusDefinition())
465 YieldRatio = aMaterialPropertiesTable->
466 GetConstProperty(
"PIONYIELDRATIO");
470 else if(pDef==G4KaonPlus::KaonPlusDefinition()||pDef==G4KaonMinus::KaonMinusDefinition())
472 YieldRatio = aMaterialPropertiesTable->
473 GetConstProperty(
"KAONYIELDRATIO");
477 else if(pDef==G4Alpha::AlphaDefinition())
479 YieldRatio = aMaterialPropertiesTable->
480 GetConstProperty(
"ALPHAYIELDRATIO");
485 else if(pDef==G4Electron::ElectronDefinition() ||
486 pDef==G4Gamma::GammaDefinition())
488 YieldRatio = aMaterialPropertiesTable->
489 GetConstProperty(
"ELECTRONYIELDRATIO");
495 YieldRatio = aMaterialPropertiesTable->
496 GetConstProperty(
"ELECTRONYIELDRATIO");
505 YieldRatio = aMaterialPropertiesTable->
506 GetConstProperty(
"ELECTRONYIELDRATIO");
512 double const xyz[3] = { x0[0]/CLHEP::cm, x0[1]/CLHEP::cm, x0[2]/CLHEP::cm };
515 float const* ReflVisibilities =
nullptr;
516 float const* ReflT0s =
nullptr;
518 TF1* ParPropTimeTF1 =
nullptr;
555 for (G4int scnt = 1; scnt <= nscnt; scnt++) {
557 G4double ScintillationTime = 0.*CLHEP::ns;
558 G4double ScintillationRiseTime = 0.*CLHEP::ns;
559 G4PhysicsOrderedFreeVector* ScintillationIntegral = NULL;
564 ScintillationTime = aMaterialPropertiesTable->
565 GetConstProperty(
"FASTTIMECONSTANT");
567 ScintillationRiseTime = aMaterialPropertiesTable->
568 GetConstProperty(
"FASTSCINTILLATIONRISETIME");
570 ScintillationIntegral =
574 ScintillationTime = aMaterialPropertiesTable->
575 GetConstProperty(
"SLOWTIMECONSTANT");
577 ScintillationRiseTime = aMaterialPropertiesTable->
578 GetConstProperty(
"SLOWSCINTILLATIONRISETIME");
580 ScintillationIntegral =
586 YieldRatio = aMaterialPropertiesTable->
587 GetConstProperty(
"YIELDRATIO");
591 Num =
std::min(YieldRatio,1.0)*MeanNumberOfPhotons;
596 ScintillationTime = aMaterialPropertiesTable->
597 GetConstProperty(
"FASTTIMECONSTANT");
599 ScintillationRiseTime = aMaterialPropertiesTable->
600 GetConstProperty(
"FASTSCINTILLATIONRISETIME");
602 ScintillationIntegral =
608 Num = MeanNumberOfPhotons - Num;
609 ScintillationTime = aMaterialPropertiesTable->
610 GetConstProperty(
"SLOWTIMECONSTANT");
612 ScintillationRiseTime = aMaterialPropertiesTable->
613 GetConstProperty(
"SLOWSCINTILLATIONRISETIME");
615 ScintillationIntegral =
619 if (!ScintillationIntegral)
continue;
640 std::map<int, int> DetectedNum;
642 std::map<int, int> ReflDetectedNum;
644 for(
size_t OpDet=0; OpDet!=NOpChannels; OpDet++)
646 G4int DetThisPMT = G4int(G4Poisson(Visibilities[OpDet] * Num));
650 DetectedNum[OpDet]=DetThisPMT;
657 G4int ReflDetThisPMT = G4int(G4Poisson(ReflVisibilities[OpDet] * Num));
660 ReflDetectedNum[OpDet]=ReflDetThisPMT;
669 std::map<int, std::map<int, int>> StepPhotonTable;
672 itdetphot!=DetectedNum.end(); ++itdetphot)
674 std::map<int, int> StepPhotons;
675 for (G4int i = 0; i < itdetphot->second; ++i)
677 G4double deltaTime = aStep.GetStepLength() /
678 ((pPreStepPoint->GetVelocity()+ pPostStepPoint->GetVelocity())/2.);
681 if (ScintillationRiseTime==0.0) {
682 deltaTime = deltaTime -
683 ScintillationTime * std::log( G4UniformRand() );
685 deltaTime = deltaTime +
686 sample_time(ScintillationRiseTime, ScintillationTime);
690 deltaTime += ParPropTimeTF1[itdetphot->first].GetRandom();
693 G4double aSecondaryTime = t0 + deltaTime;
694 float Time = aSecondaryTime;
695 int ticks =
static_cast<int>(Time);
696 StepPhotons[ticks]++;
698 StepPhotonTable[itdetphot->first] = StepPhotons;
704 CLHEP::Hep3Vector prePoint = (aStep.GetPreStepPoint())->GetPosition();
705 CLHEP::Hep3Vector postPoint = (aStep.GetPostStepPoint())->GetPosition();
707 double xO = ( ( (prePoint.getX() + postPoint.getX() ) / 2.0) / CLHEP::cm );
708 double yO = ( ( (prePoint.getY() + postPoint.getY() ) / 2.0) / CLHEP::cm );
709 double zO = ( ( (prePoint.getZ() + postPoint.getZ() ) / 2.0) / CLHEP::cm );
710 double const xyzPos[3] = {xO,yO,zO};
716 int photonTime = stepPhotonsIt->first;
717 int numPhotons = stepPhotonsIt->second;
731 itdetphot!=DetectedNum.end(); ++itdetphot)
733 G4double propagation_time = 0;
734 std::vector<double> arrival_time_dist_vuv;
737 double OpDetCenter[3];
739 G4ThreeVector OpDetPoint(OpDetCenter[0]*CLHEP::cm,OpDetCenter[1]*CLHEP::cm,OpDetCenter[2]*CLHEP::cm);
740 double distance_in_cm = (x0 - OpDetPoint).
mag()/CLHEP::cm;
741 arrival_time_dist_vuv =
GetVUVTime(distance_in_cm, itdetphot->second);
742 if(!(arrival_time_dist_vuv.size()>0)) {
748 for (G4int i = 0; i < itdetphot->second; ++i)
750 G4double deltaTime = aStep.GetStepLength() /
751 ((pPreStepPoint->GetVelocity()+
752 pPostStepPoint->GetVelocity())/2.);
754 if (ScintillationRiseTime==0.0)
756 deltaTime = deltaTime -
757 ScintillationTime * std::log( G4UniformRand() );
761 deltaTime = deltaTime +
762 sample_time(ScintillationRiseTime, ScintillationTime);
765 G4double aSecondaryTime = t0 + deltaTime;
767 propagation_time = arrival_time_dist_vuv.at(i)*CLHEP::ns;
770 TVector3 PhotonPosition(x0[0],x0[1],x0[2]);
773 float Energy = 9.7*CLHEP::eV;
774 float Time = aSecondaryTime;
776 Time += propagation_time;
781 PhotToAdd.
Energy = Energy;
782 PhotToAdd.
Time = Time;
786 fst->
AddPhoton(itdetphot->first, std::move(PhotToAdd));
793 itdetphot!=ReflDetectedNum.end(); ++itdetphot)
795 G4double propagation_time = 0;
796 std::vector<double> arrival_time_dist_vis;
799 double OpDetCenter[3];
801 G4ThreeVector OpDetPoint(OpDetCenter[0]*CLHEP::cm,OpDetCenter[1]*CLHEP::cm,OpDetCenter[2]*CLHEP::cm);
804 double t0_vis_lib = ReflT0s[itdetphot->first];
806 if(!(arrival_time_dist_vis.size()>0)) {
811 for (G4int i = 0; i < itdetphot->second; ++i)
813 G4double deltaTime = aStep.GetStepLength() /
814 ((pPreStepPoint->GetVelocity()+
815 pPostStepPoint->GetVelocity())/2.);
817 if (ScintillationRiseTime==0.0)
819 deltaTime = deltaTime -
820 ScintillationTime * std::log( G4UniformRand() );
824 deltaTime = deltaTime +
825 sample_time(ScintillationRiseTime, ScintillationTime);
827 G4double aSecondaryTime = t0 + deltaTime;
829 propagation_time = arrival_time_dist_vis.at(i)*CLHEP::ns;
831 TVector3 PhotonPosition(x0[0],x0[1],x0[2]);
834 std::map<double,double> tpbemission=lar::providerFrom<detinfo::LArPropertiesService>()->TpbEm();
835 const int nbins=tpbemission.size();
837 double * parent=
new double[nbins];
841 { parent[ii++]=(*iter).second;
844 CLHEP::RandGeneral rgen0(parent,nbins);
846 double energy_reemited = rgen0.fire()*((*(--tpbemission.end())).first-(*tpbemission.begin()).first)+(*tpbemission.begin()).first;
848 float Energy = energy_reemited*CLHEP::eV;
849 float Time = aSecondaryTime;
851 Time += propagation_time;
856 PhotToAdd.
Energy = Energy;
857 PhotToAdd.
Time = Time;
860 fst->
AddPhoton(itdetphot->first, std::move(PhotToAdd));
882 const G4MaterialTable* theMaterialTable =
883 G4Material::GetMaterialTable();
884 G4int numOfMaterials = G4Material::GetNumberOfMaterials();
893 for (G4int i=0 ; i < numOfMaterials; i++)
895 G4PhysicsOrderedFreeVector* aPhysicsOrderedFreeVector =
896 new G4PhysicsOrderedFreeVector();
897 G4PhysicsOrderedFreeVector* bPhysicsOrderedFreeVector =
898 new G4PhysicsOrderedFreeVector();
903 G4Material* aMaterial = (*theMaterialTable)[i];
905 G4MaterialPropertiesTable* aMaterialPropertiesTable =
906 aMaterial->GetMaterialPropertiesTable();
908 if (aMaterialPropertiesTable) {
910 G4MaterialPropertyVector* theFastLightVector =
911 aMaterialPropertiesTable->GetProperty(
"FASTCOMPONENT");
913 if (theFastLightVector) {
918 G4double currentIN = (*theFastLightVector)[0];
920 if (currentIN >= 0.0) {
925 G4double currentPM = theFastLightVector->Energy(0);
927 G4double currentCII = 0.0;
929 aPhysicsOrderedFreeVector->
930 InsertValues(currentPM , currentCII);
934 G4double prevPM = currentPM;
935 G4double prevCII = currentCII;
936 G4double prevIN = currentIN;
942 i < theFastLightVector->GetVectorLength();
945 currentPM = theFastLightVector->Energy(i);
946 currentIN = (*theFastLightVector)[i];
948 currentCII = 0.5 * (prevIN + currentIN);
950 currentCII = prevCII +
951 (currentPM - prevPM) * currentCII;
953 aPhysicsOrderedFreeVector->
954 InsertValues(currentPM, currentCII);
957 prevCII = currentCII;
964 G4MaterialPropertyVector* theSlowLightVector =
965 aMaterialPropertiesTable->GetProperty(
"SLOWCOMPONENT");
967 if (theSlowLightVector) {
972 G4double currentIN = (*theSlowLightVector)[0];
974 if (currentIN >= 0.0) {
979 G4double currentPM = theSlowLightVector->Energy(0);
981 G4double currentCII = 0.0;
983 bPhysicsOrderedFreeVector->
984 InsertValues(currentPM , currentCII);
988 G4double prevPM = currentPM;
989 G4double prevCII = currentCII;
990 G4double prevIN = currentIN;
996 i < theSlowLightVector->GetVectorLength();
999 currentPM = theSlowLightVector->Energy(i);
1000 currentIN = (*theSlowLightVector)[i];
1002 currentCII = 0.5 * (prevIN + currentIN);
1004 currentCII = prevCII +
1005 (currentPM - prevPM) * currentCII;
1007 bPhysicsOrderedFreeVector->
1008 InsertValues(currentPM, currentCII);
1011 prevCII = currentCII;
1035 G4Exception(
"OpFastScintillation::SetScintillationByParticleType",
"Scint02",
1036 JustWarning,
"Redefinition: Birks Saturation is replaced by ScintillationByParticleType!");
1048 G4ForceCondition* condition)
1050 *condition = StronglyForced;
1061 G4ForceCondition* condition)
1063 *condition = Forced;
1075 G4double ran1 = G4UniformRand();
1076 G4double ran2 = G4UniformRand();
1080 G4double
d = (tau1+tau2)/tau2;
1083 G4double t = -1.0*tau2*std::log(1-ran1);
1085 if (ran2 <=
bi_exp(t,tau1,tau2)/g)
return t;
1099 std::vector<double> arrival_time_distrb;
1100 arrival_time_distrb.clear();
1104 if(distance < 10 || distance >
fd_max) {
1105 G4cout<<
"WARNING: Parametrization of Direct Light not fully reliable"<<G4endl;
1106 G4cout<<
"Too close/far to the PMT -> set 0 VUV photons(?)!!!!!!"<<G4endl;
1107 return arrival_time_distrb;
1110 const double signal_t_range = 1000.;
1111 const double vuv_vgroup = 10.13;
1112 double t_direct = distance/vuv_vgroup;
1121 TF1 *flandau =
new TF1(
"flandau",
"[2]*TMath::Landau(x,[0],[1])",0,signal_t_range/2);
1122 flandau->SetParameters(pars_landau);
1128 TF1 *fexpo =
new TF1(
"fexpo",
"expo",0, signal_t_range/2);
1129 fexpo->SetParameters(pars_expo);
1131 TF1 *fint =
new TF1(
"fint",
finter_d,flandau->GetMaximumX(),3*t_direct,5);
1132 double parsInt[5] = {pars_landau[0], pars_landau[1], pars_landau[2], pars_expo[0], pars_expo[1]};
1133 fint->SetParameters(parsInt);
1134 double t_int = fint->GetMinimumX();
1135 double minVal = fint->Eval(t_int);
1138 G4cout<<
"WARNING: Parametrization of Direct Light discontinuous (landau + expo)!!!!!!"<<G4endl;
1141 double parsfinal[6] = {t_int, pars_landau[0], pars_landau[1], pars_landau[2], pars_expo[0], pars_expo[1]};
1142 fVUVTiming->SetParameters(parsfinal);
1145 int f_sampling = 1000;
1148 fVUVTiming->SetNpx(f_sampling);
1150 for(
int i=0; i<number_photons; i++)
1151 arrival_time_distrb.push_back(fVUVTiming->GetRandom());
1158 G4cout<<
"BEAMAUS timing distribution hecha"<<G4endl;
1159 return arrival_time_distrb;
1169 std::vector<double> arrival_time_distrb;
1170 arrival_time_distrb.clear();
1174 G4cout<<
"WARNING: Parametrization of Cathode-Only reflected Light not fully reliable"<<G4endl;
1175 G4cout<<
"Too close/far to the PMT -> set 0 Visible photons(?)!!!!!!"<<G4endl;
1176 return arrival_time_distrb;
1179 const double signal_t_range = 1000.;
1184 pars_landau[0] = -0.798934 + 1.06216*t0;
1192 TF1 *flandau =
new TF1(
"flandau",
"[2]*TMath::Landau(x,[0],[1])",0,signal_t_range/2);
1193 flandau->SetParameters(pars_landau);
1194 TF1 *fexpo =
new TF1(
"fexpo",
"expo",0, signal_t_range/2);
1195 fexpo->SetParameters(pars_expo);
1197 TF1 *fint =
new TF1(
"fint",
finter_d,flandau->GetMaximumX(),2*t0,5);
1198 double parsInt[5] = {pars_landau[0], pars_landau[1], pars_landau[2], pars_expo[0], pars_expo[1]};
1199 fint->SetParameters(parsInt);
1200 double t_int = fint->GetMinimumX();
1201 double minVal = fint->Eval(t_int);
1204 G4cout<<
"WARNING: Parametrization of Direct Light discontinuous (landau + expo)!!!!!!"<<G4endl;
1207 double parsfinal[6] = {t_int, pars_landau[0], pars_landau[1], pars_landau[2], pars_expo[0], pars_expo[1]};
1208 fVisTiming->SetParameters(parsfinal);
1211 int f_sampling = 1000;
1214 fVisTiming->SetNpx(f_sampling);
1216 for(
int i=0; i<number_photons; i++)
1217 arrival_time_distrb.push_back(fVisTiming->GetRandom());
1225 G4cout<<
"Timing distribution BEAMAUS!"<<G4endl;
1226 return arrival_time_distrb;
1231 double y1 = par[2]*TMath::Landau(x[0],par[0],par[1]);
1232 double y2 = TMath::Exp(par[3]+x[0]*par[4]);
1234 return TMath::Abs(y1 - y2);
1244 double y1 = par[3]*TMath::Landau(x[0],par[1],par[2]);
1245 double y2 = TMath::Exp(par[4]+x[0]*par[5]);
1246 if(x[0] > par[0]) y1 = 0.;
1247 if(x[0] < par[0]) y2 = 0.;
1255 double y1 = par[2]*TMath::Landau(x[0],par[0],par[1]);
1256 double y2 = par[5]*TMath::Landau(x[0],par[3],par[4]);
1258 return TMath::Abs(y1 - y2);
code to link reconstructed objects back to the MC truth information
Store parameters for running LArG4.
bool IncludePropTime() const
void AddPhoton(size_t opchannel, sim::OnePhoton &&photon)
G4bool scintillationByParticleType
G4PhysicsTable * GetSlowIntegralTable() const
G4EmSaturation * GetSaturation() const
OpDetGeo const & OpDetGeoFromOpDet(unsigned int OpDet) const
Number of OpDets in the whole detector.
G4PhysicsTable * theFastIntegralTable
Encapsulate the construction of a single cyostat.
double ftf1_sampling_factor
double VisibleEnergyDeposit() const
void SetDirectLightPropFunctions(TF1 const *functions[8], double &d_break, double &d_max, double &tf1_sampling_factor) const
G4bool GetFiniteRiseTime() const
Float_t y1[n_points_granero]
G4double GetScintillationExcitationRatio() const
G4bool GetTrackSecondariesFirst() const
G4double sample_time(G4double tau1, G4double tau2)
G4bool fTrackSecondariesFirst
G4double single_exp(G4double t, G4double tau2)
void ProcessStep(const G4Step &step)
void GetCenter(double *xyz, double localz=0.0) const
double finter_d(double *x, double *par)
bool NoPhotonPropagation() const
double finter_r(double *x, double *par)
Energy deposited on a readout Optical Detector by simulated tracks.
OpFastScintillation(const G4String &processName="Scintillation", G4ProcessType type=fElectromagnetic)
void Reset(const G4Step *step)
Float_t y2[n_points_geant4]
void SetReflectedCOLightPropFunctions(TF1 const *functions[5], double &t0_max, double &t0_break_point) const
bool StoreReflected() const
virtual G4VParticleChange * AtRestDoIt(const G4Track &aTrack, const G4Step &aStep)
G4PhysicsTable * theSlowIntegralTable
contains objects relating to OpDet hits
void BuildThePhysicsTable()
Use Geant4's user "hooks" to maintain a list of particles generated by Geant4.
float const * GetAllVisibilities(double const *xyz, bool wantReflected=false) const
void SetScintillationByParticleType(const G4bool)
bool RecordPhotonsProduced(const G4Step &aStep, double N)
TF1 * GetTimingTF1(double const *xyz) const
static IonizationAndScintillation * Instance()
std::vector< double > GetVisibleTimeOnlyCathode(double, int)
TF1 const * functions_vis[5]
bool FillSimEnergyDeposits() const
G4PhysicsTable * GetFastIntegralTable() const
G4bool GetScintillationByParticleType() const
void AddEnergyDeposit(int n_elec, int n_photon, double energy, float start_x, float start_y, float start_z, float end_x, float end_y, float end_z, double start_time, double end_time, int trackid, int pdgcode, std::string vol="EMPTY")
void AddOpDetBacktrackerRecord(sim::OpDetBacktrackerRecord soc)
void AddScintillationPhotons(TrackID_t trackID, timePDclock_t timePDclock, double numberPhotons, double const *xyz, double energy)
Add scintillation photons and energy to this OpticalDetector.
Encapsulate the geometry of an optical detector.
G4double bi_exp(G4double t, G4double tau1, G4double tau2)
static OpDetPhotonTable * Instance(bool LitePhotons=false)
TF1 const * functions_vuv[8]
Singleton to access a unified treatment of ionization and scintillation in LAr.
contains information for a single step in the detector simulation
static int GetCurrentTrackID()
virtual G4VParticleChange * PostStepDoIt(const G4Track &aTrack, const G4Step &aStep)
double NumberScintillationPhotons() const
G4EmSaturation * emSaturation
bool IncludeParPropTime() const
G4double GetMeanFreePath(const G4Track &aTrack, G4double, G4ForceCondition *)
G4double GetMeanLifeTime(const G4Track &aTrack, G4ForceCondition *)
size_t NOpChannels() const
virtual bool ScintByParticleType() const =0
Namespace collecting geometry-related classes utilities.
std::vector< double > GetVUVTime(double, int)
G4double GetScintillationYieldFactor() const
art framework interface to geometry description
bool UseLitePhotons() const
double LandauPlusExpoFinal(double *x, double *par)
float const * GetReflT0s(double const *xyz) const