File indexing completed on 2023-08-06 22:43:36
0001 #ifndef SimG4Core_Phase2SteppingAction_H
0002 #define SimG4Core_Phase2SteppingAction_H
0003
0004 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0005 #include "SimG4Core/Notification/interface/SimActivityRegistry.h"
0006 #include "SimG4Core/Application/interface/SteppingTrackStatus.h"
0007
0008 #include "G4LogicalVolume.hh"
0009 #include "G4Region.hh"
0010 #include "G4UserSteppingAction.hh"
0011 #include "G4VPhysicalVolume.hh"
0012 #include "G4VTouchable.hh"
0013 #include "G4Track.hh"
0014
0015 #include <string>
0016 #include <vector>
0017
0018 class CMSSteppingVerbose;
0019
0020 class Phase2SteppingAction : public G4UserSteppingAction {
0021 public:
0022 explicit Phase2SteppingAction(const CMSSteppingVerbose*, const edm::ParameterSet&, bool hasW);
0023 ~Phase2SteppingAction() override = default;
0024
0025 void UserSteppingAction(const G4Step* aStep) final;
0026
0027 SimActivityRegistry::G4StepSignal m_g4StepSignal;
0028
0029 private:
0030 bool initPointer();
0031
0032 inline bool isInsideDeadRegion(const G4Region* reg) const;
0033 inline bool isOutOfTimeWindow(const G4Region* reg, const double& time) const;
0034
0035 bool isLowEnergy(const G4LogicalVolume*, const G4Track*) const;
0036 void PrintKilledTrack(const G4Track*, const TrackStatus&) const;
0037
0038 const G4VPhysicalVolume* cmse{nullptr};
0039 const G4VPhysicalVolume* tracker{nullptr};
0040 const G4VPhysicalVolume* calo{nullptr};
0041 const G4VPhysicalVolume* btl{nullptr};
0042 const CMSSteppingVerbose* steppingVerbose;
0043 double theCriticalEnergyForVacuum;
0044 double theCriticalDensity;
0045 double maxTrackTime;
0046 double maxTrackTimeForward;
0047 double maxZCentralCMS;
0048
0049 unsigned int numberTimes;
0050 unsigned int numberEkins;
0051 unsigned int numberPart;
0052 unsigned int ndeadRegions;
0053 unsigned int nWarnings{0};
0054 G4int maxNumberOfSteps;
0055
0056 bool initialized{false};
0057 bool killBeamPipe{false};
0058 bool hasWatcher;
0059
0060 std::vector<double> maxTrackTimes, ekinMins;
0061 std::vector<std::string> maxTimeNames, ekinNames, ekinParticles;
0062 std::vector<std::string> deadRegionNames;
0063 std::vector<const G4Region*> maxTimeRegions;
0064 std::vector<const G4Region*> deadRegions;
0065 std::vector<G4LogicalVolume*> ekinVolumes;
0066 std::vector<int> ekinPDG;
0067 };
0068
0069 inline bool Phase2SteppingAction::isInsideDeadRegion(const G4Region* reg) const {
0070 bool res = false;
0071 for (auto& region : deadRegions) {
0072 if (reg == region) {
0073 res = true;
0074 break;
0075 }
0076 }
0077 return res;
0078 }
0079
0080 inline bool Phase2SteppingAction::isOutOfTimeWindow(const G4Region* reg, const double& time) const {
0081 double tofM = maxTrackTime;
0082 for (unsigned int i = 0; i < numberTimes; ++i) {
0083 if (reg == maxTimeRegions[i]) {
0084 tofM = maxTrackTimes[i];
0085 break;
0086 }
0087 }
0088 return (time > tofM);
0089 }
0090
0091 #endif