6 #include "G4LogicalVolumeStore.hh" 7 #include "G4ParticleTable.hh" 8 #include "G4PhysicalVolumeStore.hh" 9 #include "G4RegionStore.hh" 10 #include "G4UnitsTable.hh" 11 #include "G4SystemOfUnits.hh" 19 : steppingVerbose(
sv), hasWatcher(hasW) {
26 maxTrackTime =
p.getParameter<
double>(
"MaxTrackTime") * CLHEP::ns;
28 maxTrackTimes =
p.getParameter<std::vector<double> >(
"MaxTrackTimes");
29 maxTimeNames =
p.getParameter<std::vector<std::string> >(
"MaxTimeNames");
32 ekinMins =
p.getParameter<std::vector<double> >(
"EkinThresholds");
33 ekinNames =
p.getParameter<std::vector<std::string> >(
"EkinNames");
34 ekinParticles =
p.getParameter<std::vector<std::string> >(
"EkinParticles");
40 <<
" MaxTrackTime = " <<
maxTrackTime / CLHEP::ns <<
" ns;" 57 <<
"SteppingAction: Number of DeadRegions where all trackes are killed " <<
ndeadRegions;
89 G4Track* theTrack = aStep->GetTrack();
92 if (theTrack->GetKineticEnergy() < 0.0) {
96 <<
"SteppingAction::UserSteppingAction: Track #" << theTrack->GetTrackID() <<
" " 97 << theTrack->GetDefinition()->GetParticleName() <<
" Ekin(MeV)= " << theTrack->GetKineticEnergy() / MeV;
99 theTrack->SetKineticEnergy(0.0);
102 const G4StepPoint* preStep = aStep->GetPreStepPoint();
103 const G4StepPoint* postStep = aStep->GetPostStepPoint();
118 <<
"Track #" << theTrack->GetTrackID() <<
" " << theTrack->GetDefinition()->GetParticleName()
119 <<
" E(MeV)= " << preStep->GetKineticEnergy() / MeV <<
" Nstep= " << theTrack->GetCurrentStepNumber()
120 <<
" is killed due to limit on number of steps;/n PV: " << preStep->GetPhysicalVolume()->GetName() <<
" at " 121 << theTrack->GetPosition() <<
" StepLen(mm)= " << aStep->GetStepLength();
124 const double time = theTrack->GetGlobalTime();
134 const G4LogicalVolume* lv = postStep->GetPhysicalVolume()->GetLogicalVolume();
135 const G4Region* theRegion = lv->GetRegion();
156 theTrack->GetDefinition()->GetPDGCharge() != 0.0 && lv->GetMaterial()->GetDensity() <=
theCriticalDensity) {
162 bool isKilled =
false;
164 if (preStep->GetPhysicalVolume() ==
tracker && postStep->GetPhysicalVolume() ==
calo) {
171 theTrack->SetTrackStatus(fStopAndKill);
183 const double ekin = theTrack->GetKineticEnergy();
184 int pCode = theTrack->GetDefinition()->GetPDGEncoding();
200 const G4PhysicalVolumeStore*
pvs = G4PhysicalVolumeStore::GetInstance();
201 for (
auto const& pvcite : *
pvs) {
202 const G4String& pvname = pvcite->GetName();
203 if (pvname ==
"Tracker" || pvname ==
"tracker:Tracker_1") {
205 }
else if (pvname ==
"CALO" || pvname ==
"caloBase:CALO_1") {
212 <<
"SteppingAction: pointer for Tracker " <<
tracker <<
" and for Calo " <<
calo;
214 const G4LogicalVolumeStore* lvs = G4LogicalVolumeStore::GetInstance();
217 for (
auto const& lvcite : *lvs) {
218 const G4String& lvname = lvcite->GetName();
232 G4ParticleTable* theParticleTable = G4ParticleTable::GetParticleTable();
239 <<
" and KE cut off " <<
ekinMins[
i] / MeV <<
" MeV";
243 const G4RegionStore* rs = G4RegionStore::GetInstance();
246 for (
auto const& rcite : *rs) {
247 const G4String&
rname = rcite->GetName();
258 for (
auto const& rcite : *rs) {
259 const G4String&
rname = rcite->GetName();
277 typ =
" in dead region ";
280 typ =
" out of time window ";
283 typ =
" low energy limit ";
286 typ =
" low energy limit in vacuum ";
289 typ =
" energy deposition is NaN ";
292 typ =
" very forward track ";
295 typ =
" too many steps ";
300 G4VPhysicalVolume*
pv = aTrack->GetNextVolume();
301 vname =
pv->GetLogicalVolume()->GetName();
302 rname =
pv->GetLogicalVolume()->GetRegion()->GetName();
304 const double ekin = aTrack->GetKineticEnergy();
305 if (ekin < 2 * CLHEP::MeV) {
309 <<
"Track #" << aTrack->GetTrackID() <<
" StepN= " << aTrack->GetCurrentStepNumber() <<
" " 310 << aTrack->GetDefinition()->GetParticleName() <<
" E(MeV)=" << ekin / CLHEP::MeV
311 <<
" T(ns)=" << aTrack->GetGlobalTime() / CLHEP::ns <<
" is killed due to " << typ <<
"\n LV: " << vname <<
" (" 312 <<
rname <<
") at " << aTrack->GetPosition() <<
" step(cm)=" << aTrack->GetStep()->GetStepLength() / CLHEP::cm;
Log< level::Info, true > LogVerbatim
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
bool isOutOfTimeWindow(const G4Region *reg, const double &time) const
const CMSSteppingVerbose * steppingVerbose
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
void PrintKilledTrack(const G4Track *, const TrackStatus &) const
std::vector< std::string > deadRegionNames
Abs< T >::type abs(const T &t)
bool isLowEnergy(const G4LogicalVolume *, const G4Track *) const
std::vector< double > maxTrackTimes
bool isInsideDeadRegion(const G4Region *reg) const
std::vector< G4LogicalVolume * > ekinVolumes
const G4VPhysicalVolume * calo
double theCriticalEnergyForVacuum
std::vector< double > ekinMins
std::vector< std::string > maxTimeNames
std::vector< std::string > ekinNames
double maxTrackTimeForward
const G4String rname[NREG]
void nextStep(const G4Step *, const G4SteppingManager *ptr, bool isKilled) const
Log< level::Warning, false > LogWarning
unsigned int ndeadRegions
std::vector< std::string > ekinParticles
std::vector< const G4Region * > maxTimeRegions