CMS 3D CMS Logo

StackingAction.cc
Go to the documentation of this file.
7 
9 
10 #include "G4VProcess.hh"
11 #include "G4EmProcessSubType.hh"
12 #include "G4LogicalVolumeStore.hh"
13 #include "G4RegionStore.hh"
14 #include "Randomize.hh"
15 #include <CLHEP/Units/SystemOfUnits.h>
16 #include "G4VSolid.hh"
17 #include "G4TransportationManager.hh"
18 #include "G4GammaGeneralProcess.hh"
19 #include "G4LossTableManager.hh"
20 
22  : trackAction(trka), steppingVerbose(sv) {
23  trackNeutrino = p.getParameter<bool>("TrackNeutrino");
24  killHeavy = p.getParameter<bool>("KillHeavy");
25  killGamma = p.getParameter<bool>("KillGamma");
26  kmaxGamma = p.getParameter<double>("GammaThreshold") * CLHEP::MeV;
27  kmaxIon = p.getParameter<double>("IonThreshold") * CLHEP::MeV;
28  kmaxProton = p.getParameter<double>("ProtonThreshold") * CLHEP::MeV;
29  kmaxNeutron = p.getParameter<double>("NeutronThreshold") * CLHEP::MeV;
30  killDeltaRay = p.getParameter<bool>("KillDeltaRay");
31  limitEnergyForVacuum = p.getParameter<double>("CriticalEnergyForVacuum") * CLHEP::MeV;
32  maxTrackTime = p.getParameter<double>("MaxTrackTime") * CLHEP::ns;
33  maxTrackTimeForward = p.getParameter<double>("MaxTrackTimeForward") * CLHEP::ns;
34  maxZCentralCMS = p.getParameter<double>("MaxZCentralCMS") * CLHEP::m;
35  maxTrackTimes = p.getParameter<std::vector<double> >("MaxTrackTimes");
36  maxTimeNames = p.getParameter<std::vector<std::string> >("MaxTimeNames");
37  deadRegionNames = p.getParameter<std::vector<std::string> >("DeadRegions");
38  savePDandCinAll = p.getUntrackedParameter<bool>("SaveAllPrimaryDecayProductsAndConversions", true);
39  savePDandCinTracker = p.getUntrackedParameter<bool>("SavePrimaryDecayProductsAndConversionsInTracker", false);
40  savePDandCinCalo = p.getUntrackedParameter<bool>("SavePrimaryDecayProductsAndConversionsInCalo", false);
41  savePDandCinMuon = p.getUntrackedParameter<bool>("SavePrimaryDecayProductsAndConversionsInMuon", false);
42  saveFirstSecondary = p.getUntrackedParameter<bool>("SaveFirstLevelSecondary", false);
43 
44  gRusRoEnerLim = p.getParameter<double>("RusRoGammaEnergyLimit") * CLHEP::MeV;
45  nRusRoEnerLim = p.getParameter<double>("RusRoNeutronEnergyLimit") * CLHEP::MeV;
46 
47  gRusRoEcal = p.getParameter<double>("RusRoEcalGamma");
48  gRusRoHcal = p.getParameter<double>("RusRoHcalGamma");
49  gRusRoMuonIron = p.getParameter<double>("RusRoMuonIronGamma");
50  gRusRoPreShower = p.getParameter<double>("RusRoPreShowerGamma");
51  gRusRoCastor = p.getParameter<double>("RusRoCastorGamma");
52  gRusRoWorld = p.getParameter<double>("RusRoWorldGamma");
53 
54  nRusRoEcal = p.getParameter<double>("RusRoEcalNeutron");
55  nRusRoHcal = p.getParameter<double>("RusRoHcalNeutron");
56  nRusRoMuonIron = p.getParameter<double>("RusRoMuonIronNeutron");
57  nRusRoPreShower = p.getParameter<double>("RusRoPreShowerNeutron");
58  nRusRoCastor = p.getParameter<double>("RusRoCastorNeutron");
59  nRusRoWorld = p.getParameter<double>("RusRoWorldNeutron");
60 
61  gRusRoZDC = p.getParameter<double>("RusRoZDCGamma");
62  gRusRoHGcal = p.getParameter<double>("RusRoHGcalGamma");
63  nRusRoZDC = p.getParameter<double>("RusRoZDCNeutron");
64  nRusRoHGcal = p.getParameter<double>("RusRoHGcalNeutron");
65 
66  if (gRusRoEnerLim > 0.0 && (gRusRoEcal < 1.0 || gRusRoHcal < 1.0 || gRusRoMuonIron < 1.0 || gRusRoPreShower < 1.0 ||
67  gRusRoCastor < 1.0 || gRusRoWorld < 1.0)) {
68  gRRactive = true;
69  }
70  if (nRusRoEnerLim > 0.0 && (nRusRoEcal < 1.0 || nRusRoHcal < 1.0 || nRusRoMuonIron < 1.0 || nRusRoPreShower < 1.0 ||
71  nRusRoCastor < 1.0 || nRusRoWorld < 1.0)) {
72  nRRactive = true;
73  }
74 
75  if (p.exists("TestKillingOptions")) {
76  killInCalo = (p.getParameter<edm::ParameterSet>("TestKillingOptions")).getParameter<bool>("KillInCalo");
77  killInCaloEfH = (p.getParameter<edm::ParameterSet>("TestKillingOptions")).getParameter<bool>("KillInCaloEfH");
78  edm::LogWarning("SimG4CoreApplication")
79  << " *** Activating special test killing options in StackingAction \n"
80  << " *** Kill secondaries in Calorimetetrs volume = " << killInCalo << "\n"
81  << " *** Kill electromagnetic secondaries from hadrons in Calorimeters volume= " << killInCaloEfH;
82  }
83 
84  initPointer();
85 
86  edm::LogVerbatim("SimG4CoreApplication")
87  << "StackingAction initiated with"
88  << " flag for saving decay products in "
89  << " Tracker: " << savePDandCinTracker << " in Calo: " << savePDandCinCalo << " in Muon: " << savePDandCinMuon
90  << " everywhere: " << savePDandCinAll << "\n saveFirstSecondary"
91  << ": " << saveFirstSecondary << " Tracking neutrino flag: " << trackNeutrino
92  << " Kill Delta Ray flag: " << killDeltaRay << " Kill hadrons/ions flag: " << killHeavy
93  << " MaxZCentralCMS = " << maxZCentralCMS / CLHEP::m << " m"
94  << " MaxTrackTimeForward = " << maxTrackTimeForward / CLHEP::ns << " ns";
95 
96  if (killHeavy) {
97  edm::LogVerbatim("SimG4CoreApplication") << "StackingAction kill protons below " << kmaxProton / CLHEP::MeV
98  << " MeV, neutrons below " << kmaxNeutron / CLHEP::MeV << " MeV and ions"
99  << " below " << kmaxIon / CLHEP::MeV << " MeV";
100  }
102 
103  edm::LogVerbatim("SimG4CoreApplication") << "StackingAction kill tracks with "
104  << "time larger than " << maxTrackTime / CLHEP::ns << " ns ";
105  numberTimes = maxTimeNames.size();
106  if (0 < numberTimes) {
107  for (unsigned int i = 0; i < numberTimes; ++i) {
108  edm::LogVerbatim("SimG4CoreApplication")
109  << " MaxTrackTime for " << maxTimeNames[i] << " is " << maxTrackTimes[i] << " ns ";
110  maxTrackTimes[i] *= CLHEP::ns;
111  }
112  }
113  if (limitEnergyForVacuum > 0.0) {
114  edm::LogVerbatim("SimG4CoreApplication")
115  << "StackingAction LowDensity regions - kill if E < " << limitEnergyForVacuum / CLHEP::MeV << " MeV";
116  printRegions(lowdensRegions, "LowDensity");
117  }
118  if (deadRegions.size() > 0.0) {
119  edm::LogVerbatim("SimG4CoreApplication") << "StackingAction Dead regions - kill all secondaries ";
120  printRegions(deadRegions, "Dead");
121  }
122  if (gRRactive) {
123  edm::LogVerbatim("SimG4CoreApplication")
124  << "StackingAction: "
125  << "Russian Roulette for gamma Elimit(MeV)= " << gRusRoEnerLim / CLHEP::MeV << "\n"
126  << " ECAL Prob= " << gRusRoEcal << "\n"
127  << " HCAL Prob= " << gRusRoHcal << "\n"
128  << " MuonIron Prob= " << gRusRoMuonIron << "\n"
129  << " PreShower Prob= " << gRusRoPreShower << "\n"
130  << " HGCAL Prob= " << gRusRoHGcal << "\n"
131  << " ZDC Prob= " << gRusRoZDC << "\n"
132  << " CASTOR Prob= " << gRusRoCastor << "\n"
133  << " World Prob= " << gRusRoWorld;
134  }
135  if (nRRactive) {
136  edm::LogVerbatim("SimG4CoreApplication")
137  << "StackingAction: "
138  << "Russian Roulette for neutron Elimit(MeV)= " << nRusRoEnerLim / CLHEP::MeV << "\n"
139  << " ECAL Prob= " << nRusRoEcal << "\n"
140  << " HCAL Prob= " << nRusRoHcal << "\n"
141  << " MuonIron Prob= " << nRusRoMuonIron << "\n"
142  << " PreShower Prob= " << nRusRoPreShower << "\n"
143  << " HGCAL Prob= " << nRusRoHGcal << "\n"
144  << " ZDC Prob= " << nRusRoZDC << "\n"
145  << " CASTOR Prob= " << nRusRoCastor << "\n"
146  << " World Prob= " << nRusRoWorld;
147  }
148 
149  if (savePDandCinTracker) {
150  edm::LogVerbatim("SimG4CoreApplication") << "StackingAction Tracker regions: ";
151  printRegions(trackerRegions, "Tracker");
152  }
153  if (savePDandCinCalo) {
154  edm::LogVerbatim("SimG4CoreApplication") << "StackingAction Calo regions: ";
155  printRegions(caloRegions, "Calo");
156  }
157  if (savePDandCinMuon) {
158  edm::LogVerbatim("SimG4CoreApplication") << "StackingAction Muon regions: ";
159  printRegions(muonRegions, "Muon");
160  }
161  worldSolid = G4TransportationManager::GetTransportationManager()
162  ->GetNavigatorForTracking()
163  ->GetWorldVolume()
164  ->GetLogicalVolume()
165  ->GetSolid();
166 }
167 
168 G4ClassificationOfNewTrack StackingAction::ClassifyNewTrack(const G4Track* aTrack) {
169  // G4 interface part
170  G4ClassificationOfNewTrack classification = fUrgent;
171  const int pdg = aTrack->GetDefinition()->GetPDGEncoding();
172  const int abspdg = std::abs(pdg);
173  auto track = const_cast<G4Track*>(aTrack);
174  const G4VProcess* creatorProc = aTrack->GetCreatorProcess();
175 
176  if (creatorProc == nullptr && aTrack->GetParentID() != 0) {
177  edm::LogWarning("StackingAction::ClassifyNewTrack")
178  << " TrackID=" << aTrack->GetTrackID() << " ParentID=" << aTrack->GetParentID() << " "
179  << aTrack->GetDefinition()->GetParticleName() << " Ekin(MeV)=" << aTrack->GetKineticEnergy();
180  }
181  if (aTrack->GetKineticEnergy() < 0.0) {
182  edm::LogWarning("StackingAction::ClassifyNewTrack")
183  << " TrackID=" << aTrack->GetTrackID() << " ParentID=" << aTrack->GetParentID() << " "
184  << aTrack->GetDefinition()->GetParticleName() << " Ekin(MeV)=" << aTrack->GetKineticEnergy() << " creator "
185  << creatorProc->GetProcessName();
186  }
187  // primary
188  if (creatorProc == nullptr || aTrack->GetParentID() == 0) {
189  if (!trackNeutrino && (abspdg == 12 || abspdg == 14 || abspdg == 16 || abspdg == 18)) {
190  classification = fKill;
191  } else if (worldSolid->Inside(aTrack->GetPosition()) == kOutside) {
192  classification = fKill;
193  } else {
195  }
196  } else {
197  // secondary
198  const G4Region* reg = aTrack->GetVolume()->GetLogicalVolume()->GetRegion();
199  const double time = aTrack->GetGlobalTime();
200 
201  // definetly killed tracks
202  if (aTrack->GetTrackStatus() == fStopAndKill) {
203  classification = fKill;
204  } else if (!trackNeutrino && (abspdg == 12 || abspdg == 14 || abspdg == 16 || abspdg == 18)) {
205  classification = fKill;
206 
207  } else if (std::abs(aTrack->GetPosition().z()) >= maxZCentralCMS) {
208  // very forward secondary
209  if (time > maxTrackTimeForward) {
210  classification = fKill;
211  } else {
212  const G4Track* mother = trackAction->geant4Track();
213  MCTruthUtil::secondary(track, *mother, 0);
214  }
215 
216  } else if (isItOutOfTimeWindow(reg, time)) {
217  // time window check
218  classification = fKill;
219 
220  } else {
221  // potentially good for tracking
222  const double ke = aTrack->GetKineticEnergy();
223  G4int subType = (nullptr != creatorProc) ? creatorProc->GetProcessSubType() : 0;
224 
225  LogDebug("SimG4CoreApplication") << "##StackingAction:Classify Track " << aTrack->GetTrackID() << " Parent "
226  << aTrack->GetParentID() << " " << aTrack->GetDefinition()->GetParticleName()
227  << " Ekin(MeV)=" << ke / CLHEP::MeV << " subType=" << subType << " ";
228 
229  // kill tracks in specific regions
230  if (isThisRegion(reg, deadRegions)) {
231  classification = fKill;
232  }
233  if (classification != fKill && ke <= limitEnergyForVacuum && isThisRegion(reg, lowdensRegions)) {
234  classification = fKill;
235 
236  } else if (classification != fKill) {
237  // very low-energy gamma
238  if (pdg == 22 && killGamma && ke < kmaxGamma) {
239  classification = fKill;
240  }
241 
242  // specific track killing - not for production
243  if (killExtra && classification != fKill) {
244  if (killHeavy && classification != fKill) {
245  if (((pdg / 1000000000 == 1) && (((pdg / 10000) % 100) > 0) && (((pdg / 10) % 100) > 0) &&
246  (ke < kmaxIon)) ||
247  ((pdg == 2212) && (ke < kmaxProton)) || ((pdg == 2112) && (ke < kmaxNeutron))) {
248  classification = fKill;
249  }
250  }
251 
252  if (killDeltaRay && classification != fKill && aTrack->GetParentID() > 0 &&
254  classification = fKill;
255  }
256 
257  if (killInCalo && classification != fKill && isThisRegion(reg, caloRegions)) {
258  classification = fKill;
259  }
260  if (killInCaloEfH && classification != fKill) {
261  int pdgMother = std::abs(trackAction->geant4Track()->GetDefinition()->GetPDGEncoding());
262  if ((pdg == 22 || abspdg == 11) && pdgMother != 11 && pdgMother != 22 && isThisRegion(reg, caloRegions)) {
263  classification = fKill;
264  }
265  }
266  }
267 
268  // Russian roulette && MC truth
269  if (classification != fKill) {
270  const G4Track* mother = trackAction->geant4Track();
271  int flag = 0;
272  if (savePDandCinAll) {
273  flag = isItPrimaryDecayProductOrConversion(subType, *mother);
274  } else {
278  flag = isItPrimaryDecayProductOrConversion(subType, *mother);
279  }
280  }
281  if (saveFirstSecondary && 0 == flag) {
282  flag = isItFromPrimary(*mother, flag);
283  }
284 
285  // Russian roulette
286  if (2112 == pdg || 22 == pdg) {
287  double currentWeight = aTrack->GetWeight();
288 
289  if (1.0 >= currentWeight) {
290  double prob = 1.001;
291  double elim = 0.0;
292 
293  // neutron
294  if (nRRactive && pdg == 2112) {
295  elim = nRusRoEnerLim;
296  if (reg == regionEcal) {
297  prob = nRusRoEcal;
298  } else if (reg == regionHcal) {
299  prob = nRusRoHcal;
300  } else if (reg == regionMuonIron) {
302  } else if (reg == regionPreShower) {
304  } else if (reg == regionHGcal) {
305  prob = nRusRoHGcal;
306  } else if (reg == regionZDC) {
307  prob = nRusRoZDC;
308  } else if (reg == regionCastor) {
309  prob = nRusRoCastor;
310  } else if (reg == regionWorld) {
311  prob = nRusRoWorld;
312  }
313 
314  // gamma
315  } else if (gRRactive && pdg == 22) {
316  elim = gRusRoEnerLim;
317  if (reg == regionEcal || reg == regionPreShower) {
318  if (rrApplicable(aTrack, *mother)) {
319  if (reg == regionEcal) {
320  prob = gRusRoEcal;
321  } else {
323  }
324  }
325  } else {
326  if (reg == regionHcal) {
327  prob = gRusRoHcal;
328  } else if (reg == regionMuonIron) {
330  } else if (reg == regionHGcal) {
331  prob = gRusRoHGcal;
332  } else if (reg == regionZDC) {
333  prob = gRusRoZDC;
334  } else if (reg == regionCastor) {
335  prob = gRusRoCastor;
336  } else if (reg == regionWorld) {
337  prob = gRusRoWorld;
338  }
339  }
340  }
341  if (prob < 1.0 && aTrack->GetKineticEnergy() < elim) {
342  if (G4UniformRand() < prob) {
343  track->SetWeight(currentWeight / prob);
344  } else {
345  classification = fKill;
346  }
347  }
348  }
349  }
350  if (classification != fKill) {
351  MCTruthUtil::secondary(track, *mother, flag);
352  }
353  LogDebug("SimG4CoreApplication")
354  << "StackingAction:Classify Track " << aTrack->GetTrackID() << " Parent " << aTrack->GetParentID()
355  << " Type " << aTrack->GetDefinition()->GetParticleName() << " Ekin=" << ke / CLHEP::MeV
356  << " MeV from process subType=" << subType << " as " << classification << " Flag: " << flag;
357  }
358  }
359  }
360  }
361  if (nullptr != steppingVerbose) {
362  steppingVerbose->stackFilled(aTrack, (classification == fKill));
363  }
364  return classification;
365 }
366 
368 
370 
372  // prepare region vector
373  const unsigned int num = maxTimeNames.size();
374  maxTimeRegions.resize(num, nullptr);
375 
376  // Russian roulette
377  const std::vector<G4Region*>* rs = G4RegionStore::GetInstance();
378 
379  for (auto& reg : *rs) {
380  const G4String& rname = reg->GetName();
381  if ((gRusRoEcal < 1.0 || nRusRoEcal < 1.0) && rname == "EcalRegion") {
382  regionEcal = reg;
383  }
384  if ((gRusRoHcal < 1.0 || nRusRoHcal < 1.0) && rname == "HcalRegion") {
385  regionHcal = reg;
386  }
387  if ((gRusRoMuonIron < 1.0 || nRusRoMuonIron < 1.0) && rname == "MuonIron") {
388  regionMuonIron = reg;
389  }
390  if ((gRusRoPreShower < 1.0 || nRusRoPreShower < 1.0) && rname == "PreshowerRegion") {
391  regionPreShower = reg;
392  }
393  if ((gRusRoCastor < 1.0 || nRusRoCastor < 1.0) && rname == "CastorRegion") {
394  regionCastor = reg;
395  }
396  if ((gRusRoZDC < 1.0 || nRusRoZDC < 1.0) && rname == "ZDCRegion") {
397  regionZDC = reg;
398  }
399  if ((gRusRoHGcal < 1.0 || nRusRoHGcal < 1.0) && rname == "HGCalRegion") {
400  regionHGcal = reg;
401  }
402  if ((gRusRoWorld < 1.0 || nRusRoWorld < 1.0) && rname == "DefaultRegionForTheWorld") {
403  regionWorld = reg;
404  }
405 
406  // time limits
407  for (unsigned int i = 0; i < num; ++i) {
408  if (rname == (G4String)(maxTimeNames[i])) {
409  maxTimeRegions[i] = reg;
410  break;
411  }
412  }
413  //
414  if (savePDandCinTracker &&
415  (rname == "BeamPipe" || rname == "BeamPipeVacuum" || rname == "TrackerPixelSensRegion" ||
416  rname == "TrackerPixelDeadRegion" || rname == "TrackerDeadRegion" || rname == "TrackerSensRegion" ||
417  rname == "FastTimerRegionBTL" || rname == "FastTimerRegionETL" || rname == "FastTimerRegionSensBTL" ||
418  rname == "FastTimerRegionSensETL")) {
419  trackerRegions.push_back(reg);
420  }
421  if (savePDandCinCalo && (rname == "HcalRegion" || rname == "EcalRegion" || rname == "PreshowerSensRegion" ||
422  rname == "PreshowerRegion" || rname == "APDRegion" || rname == "HGCalRegion")) {
423  caloRegions.push_back(reg);
424  }
425  if (savePDandCinMuon && (rname == "MuonChamber" || rname == "MuonSensitive_RPC" || rname == "MuonIron" ||
426  rname == "Muon" || rname == "MuonSensitive_DT-CSC")) {
427  muonRegions.push_back(reg);
428  }
429  if (rname == "BeamPipeOutside" || rname == "BeamPipeVacuum") {
430  lowdensRegions.push_back(reg);
431  }
432  for (auto& dead : deadRegionNames) {
433  if (rname == (G4String)(dead)) {
434  deadRegions.push_back(reg);
435  }
436  }
437  }
438 }
439 
440 bool StackingAction::isThisRegion(const G4Region* reg, std::vector<const G4Region*>& regions) const {
441  bool flag = false;
442  for (auto& region : regions) {
443  if (reg == region) {
444  flag = true;
445  break;
446  }
447  }
448  return flag;
449 }
450 
451 int StackingAction::isItPrimaryDecayProductOrConversion(const int stype, const G4Track& mother) const {
452  int flag = 0;
453  auto motherInfo = static_cast<const TrackInformation*>(mother.GetUserInformation());
454  // Check whether mother is a primary
455  if (motherInfo->isPrimary()) {
456  if (stype == fDecay) {
457  flag = 1;
458  } else if (stype == fGammaConversion) {
459  flag = 2;
460  }
461  }
462  return flag;
463 }
464 
465 bool StackingAction::rrApplicable(const G4Track* aTrack, const G4Track& mother) const {
466  auto motherInfo = static_cast<const TrackInformation*>(mother.GetUserInformation());
467 
468  // Check whether mother is gamma, e+, e-
469  const int genID = motherInfo->genParticlePID();
470  return (22 != genID && 11 != std::abs(genID));
471 }
472 
473 int StackingAction::isItFromPrimary(const G4Track& mother, int flagIn) const {
474  int flag = flagIn;
475  if (flag != 1) {
476  auto ptr = static_cast<const TrackInformation*>(mother.GetUserInformation());
477  if (ptr->isPrimary()) {
478  flag = 3;
479  }
480  }
481  return flag;
482 }
483 
484 bool StackingAction::isItOutOfTimeWindow(const G4Region* reg, const double& t) const {
485  double tofM = maxTrackTime;
486  for (unsigned int i = 0; i < numberTimes; ++i) {
487  if (reg == maxTimeRegions[i]) {
488  tofM = maxTrackTimes[i];
489  break;
490  }
491  }
492  return (t > tofM);
493 }
494 
495 void StackingAction::printRegions(const std::vector<const G4Region*>& reg, const std::string& word) const {
496  for (unsigned int i = 0; i < reg.size(); ++i) {
497  edm::LogVerbatim("SimG4CoreApplication")
498  << " StackingAction: " << word << "Region " << i << ". " << reg[i]->GetName();
499  }
500 }
double nRusRoPreShower
Log< level::Info, true > LogVerbatim
G4ClassificationOfNewTrack ClassifyNewTrack(const G4Track *aTrack) final
StackingAction(const TrackingAction *, const edm::ParameterSet &ps, const CMSSteppingVerbose *)
std::vector< const G4Region * > lowdensRegions
double maxZCentralCMS
void PrepareNewEvent() override
const G4Region * regionZDC
std::vector< double > maxTrackTimes
bool rrApplicable(const G4Track *, const G4Track &) const
static void secondary(G4Track *aSecondary, const G4Track &mother, int)
Definition: MCTruthUtil.cc:17
double gRusRoPreShower
double nRusRoEnerLim
const G4Region * regionCastor
const G4Region * regionMuonIron
const G4Track * geant4Track() const
int isItFromPrimary(const G4Track &, int) const
std::vector< const G4Region * > deadRegions
const CMSSteppingVerbose * steppingVerbose
uint64_t word
std::vector< const G4Region * > muonRegions
std::vector< std::string > maxTimeNames
void NewStage() override
const G4Region * regionEcal
unsigned int numberTimes
void printRegions(const std::vector< const G4Region *> &reg, const std::string &word) const
double nRusRoMuonIron
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
G4VSolid * worldSolid
bool isItOutOfTimeWindow(const G4Region *, const double &) const
const G4Region * regionHGcal
void stackFilled(const G4Track *, bool isKilled) const
int genParticlePID() const
bool isThisRegion(const G4Region *, std::vector< const G4Region *> &) const
bool savePDandCinTracker
static void primary(G4Track *aPrimary)
Definition: MCTruthUtil.cc:7
std::vector< std::string > deadRegionNames
double gRusRoEnerLim
const G4Region * regionHcal
std::vector< const G4Region * > maxTimeRegions
double maxTrackTimeForward
const G4String rname[NREG]
static bool isGammaElectronPositron(int pdgCode)
const G4Region * regionPreShower
const TrackingAction * trackAction
Log< level::Warning, false > LogWarning
double gRusRoMuonIron
std::vector< const G4Region * > trackerRegions
int isItPrimaryDecayProductOrConversion(const int subtype, const G4Track &) const
#define LogDebug(id)
std::vector< const G4Region * > caloRegions
double limitEnergyForVacuum
const G4Region * regionWorld