CMS 3D CMS Logo

LowEnergyFastSimModel.cc
Go to the documentation of this file.
3 
7 
8 #include "G4VFastSimulationModel.hh"
9 #include "G4EventManager.hh"
10 #include "G4Electron.hh"
11 #include "GFlashHitMaker.hh"
12 #include "G4Region.hh"
13 #include "G4Material.hh"
14 #include "G4Positron.hh"
15 #include "G4ParticleDefinition.hh"
16 #include "G4PhysicalConstants.hh"
17 
18 constexpr G4double twomass = 2 * CLHEP::electron_mass_c2;
19 constexpr G4double scaleFactor = 1.05;
20 
22  : G4VFastSimulationModel(name, region),
23  fRegion(region),
24  fTrackingAction(nullptr),
25  fCheck(true),
26  fTailPos(0., 0., 0.) {
27  fEmax = parSet.getParameter<double>("LowEnergyGflashEcalEmax") * CLHEP::GeV;
28  fPositron = G4Positron::Positron();
29  fMaterial = nullptr;
30  auto table = G4Material::GetMaterialTable();
31  for (auto& mat : *table) {
32  G4String nam = mat->GetName();
33  size_t n = nam.size();
34  if (n > 4) {
35  G4String sn = nam.substr(n - 5, 5);
36  if (sn == "PbWO4") {
37  fMaterial = mat;
38  break;
39  }
40  }
41  }
42  G4String nm = (nullptr == fMaterial) ? "not found!" : fMaterial->GetName();
43  edm::LogVerbatim("LowEnergyFastSimModel") << "LowEGFlash material: <" << nm << ">";
44 }
45 
46 G4bool LowEnergyFastSimModel::IsApplicable(const G4ParticleDefinition& particle) {
47  return (11 == std::abs(particle.GetPDGEncoding()));
48 }
49 
50 G4bool LowEnergyFastSimModel::ModelTrigger(const G4FastTrack& fastTrack) {
51  const G4Track* track = fastTrack.GetPrimaryTrack();
52  G4double energy = track->GetKineticEnergy();
53  if (fMaterial != track->GetMaterial() || energy >= fEmax)
54  return false;
55 
56  /*
57  edm::LogVerbatim("LowEnergyFastSimModel") << track->GetDefinition()->GetParticleName()
58  << " Ekin(MeV)=" << energy << " material: <"
59  << track->GetMaterial()->GetName() << ">";
60  */
61  if (fCheck) {
62  if (nullptr == fTrackingAction) {
63  fTrackingAction = static_cast<const TrackingAction*>(G4EventManager::GetEventManager()->GetUserTrackingAction());
64  }
65  const G4Track* mother = fTrackingAction->geant4Track();
66  const TrackInformation* ptr = static_cast<TrackInformation*>(mother->GetUserInformation());
67  if (ptr->isPrimary()) {
68  int pdgMother = mother->GetDefinition()->GetPDGEncoding();
69  if (std::abs(pdgMother) == 11 || pdgMother == 22)
70  return false;
71  }
72  }
73  return true;
74 }
75 
76 void LowEnergyFastSimModel::DoIt(const G4FastTrack& fastTrack, G4FastStep& fastStep) {
77  fastStep.KillPrimaryTrack();
78  fastStep.SetPrimaryTrackPathLength(0.0);
79  auto track = fastTrack.GetPrimaryTrack();
80  G4double energy = track->GetKineticEnergy() * scaleFactor;
81 
82  const G4ThreeVector& pos = track->GetPosition();
83 
84  G4double inPointEnergy = fParam.GetInPointEnergyFraction(energy) * energy;
85 
86  // take into account positron annihilation (not included in in-point)
87  if (fPositron == track->GetDefinition())
88  energy += twomass;
89 
90  const G4ThreeVector& momDir = track->GetMomentumDirection();
91 
92  // in point energy deposition
93  GFlashEnergySpot spot;
94  spot.SetEnergy(inPointEnergy);
95  spot.SetPosition(pos);
96  fHitMaker.make(&spot, &fastTrack);
97 
98  // tail energy deposition
99  const G4double etail = energy - inPointEnergy;
100  const G4int nspots = etail;
101  const G4double tailEnergy = etail / (nspots + 1);
102  /*
103  edm::LogVerbatim("LowEnergyFastSimModel") << track->GetDefinition()->GetParticleName()
104  << " Ekin(MeV)=" << energy << " material: <"
105  << track->GetMaterial()->GetName()
106  << "> Elocal=" << inPointEnergy
107  << " Etail=" << tailEnergy
108  << " Nspots=" << nspots+1;
109  */
110  for (G4int i = 0; i <= nspots; ++i) {
111  const G4double r = fParam.GetRadius(energy);
112  const G4double z = fParam.GetZ();
113 
114  const G4double phi = CLHEP::twopi * G4UniformRand();
115  fTailPos.set(r * std::cos(phi), r * std::sin(phi), z);
116  fTailPos.rotateUz(momDir);
117  fTailPos += pos;
118 
119  spot.SetEnergy(tailEnergy);
120  spot.SetPosition(fTailPos);
121  fHitMaker.make(&spot, &fastTrack);
122  }
123 }
Log< level::Info, true > LogVerbatim
bool isPrimary() const
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
const G4ParticleDefinition * fPositron
G4bool IsApplicable(const G4ParticleDefinition &particle) override
constexpr G4double twomass
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
LowEnergyFastSimParam fParam
const G4Material * fMaterial
G4double GetInPointEnergyFraction(G4double energy) const
const G4Track * geant4Track() const
const TrackingAction * fTrackingAction
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
LowEnergyFastSimModel(const G4String &name, G4Region *region, const edm::ParameterSet &parSet)
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
constexpr G4double scaleFactor
void DoIt(const G4FastTrack &fastTrack, G4FastStep &fastStep) override
G4bool ModelTrigger(const G4FastTrack &fastTrack) override
G4double GetRadius(G4double energy) const