CMS 3D CMS Logo

SteppingAction.h
Go to the documentation of this file.
1 #ifndef SimG4Core_SteppingAction_H
2 #define SimG4Core_SteppingAction_H
3 
6 
7 #include "G4LogicalVolume.hh"
8 #include "G4Region.hh"
9 #include "G4UserSteppingAction.hh"
10 #include "G4VPhysicalVolume.hh"
11 #include "G4VTouchable.hh"
12 #include "G4Track.hh"
13 
14 #include <string>
15 #include <vector>
16 
17 class CMSSteppingVerbose;
18 
20  sAlive = 0,
29 };
30 
31 class SteppingAction : public G4UserSteppingAction {
32 public:
33  explicit SteppingAction(const CMSSteppingVerbose*, const edm::ParameterSet&, bool hasW);
34  ~SteppingAction() override = default;
35 
36  void UserSteppingAction(const G4Step* aStep) final;
37 
39 
40 private:
41  bool initPointer();
42 
43  inline bool isInsideDeadRegion(const G4Region* reg) const;
44  inline bool isOutOfTimeWindow(const G4Region* reg, const double& time) const;
45 
46  bool isLowEnergy(const G4LogicalVolume*, const G4Track*) const;
47  void PrintKilledTrack(const G4Track*, const TrackStatus&) const;
48 
49  const G4VPhysicalVolume* tracker{nullptr};
50  const G4VPhysicalVolume* calo{nullptr};
54  double maxTrackTime;
57 
58  unsigned int numberTimes;
59  unsigned int numberEkins;
60  unsigned int numberPart;
61  unsigned int ndeadRegions;
62  unsigned int nWarnings{0};
64 
65  bool initialized{false};
66  bool killBeamPipe{false};
67  bool hasWatcher;
68 
69  std::vector<double> maxTrackTimes, ekinMins;
70  std::vector<std::string> maxTimeNames, ekinNames, ekinParticles;
71  std::vector<std::string> deadRegionNames;
72  std::vector<const G4Region*> maxTimeRegions;
73  std::vector<const G4Region*> deadRegions;
74  std::vector<G4LogicalVolume*> ekinVolumes;
75  std::vector<int> ekinPDG;
76 };
77 
78 inline bool SteppingAction::isInsideDeadRegion(const G4Region* reg) const {
79  bool res = false;
80  for (auto& region : deadRegions) {
81  if (reg == region) {
82  res = true;
83  break;
84  }
85  }
86  return res;
87 }
88 
89 inline bool SteppingAction::isOutOfTimeWindow(const G4Region* reg, const double& time) const {
90  double tofM = maxTrackTime;
91  for (unsigned int i = 0; i < numberTimes; ++i) {
92  if (reg == maxTimeRegions[i]) {
93  tofM = maxTrackTimes[i];
94  break;
95  }
96  }
97  return (time > tofM);
98 }
99 
100 #endif
void UserSteppingAction(const G4Step *aStep) final
const G4VPhysicalVolume * tracker
std::vector< int > ekinPDG
SteppingAction(const CMSSteppingVerbose *, const edm::ParameterSet &, bool hasW)
std::vector< const G4Region * > deadRegions
double theCriticalDensity
SimActivityRegistry::G4StepSignal m_g4StepSignal
unsigned int numberPart
bool isOutOfTimeWindow(const G4Region *reg, const double &time) const
const CMSSteppingVerbose * steppingVerbose
unsigned int numberEkins
Definition: Electron.h:6
TrackStatus
G4int maxNumberOfSteps
void PrintKilledTrack(const G4Track *, const TrackStatus &) const
std::vector< std::string > deadRegionNames
bool isLowEnergy(const G4LogicalVolume *, const G4Track *) const
unsigned int numberTimes
std::vector< double > maxTrackTimes
bool isInsideDeadRegion(const G4Region *reg) const
std::vector< G4LogicalVolume * > ekinVolumes
double theCriticalEnergyForVacuum
double maxZCentralCMS
std::vector< double > ekinMins
std::vector< std::string > maxTimeNames
std::vector< std::string > ekinNames
double maxTrackTimeForward
unsigned int ndeadRegions
~SteppingAction() override=default
std::vector< std::string > ekinParticles
Definition: Common.h:9
std::vector< const G4Region * > maxTimeRegions
unsigned int nWarnings