6 #include "G4LogicalVolumeStore.hh" 7 #include "G4ParticleTable.hh" 8 #include "G4PhysicalVolumeStore.hh" 9 #include "G4RegionStore.hh" 10 #include "G4UnitsTable.hh" 11 #include "G4SystemOfUnits.hh" 33 maxTrackTime =
p.getParameter<
double>(
"MaxTrackTime") * CLHEP::ns;
35 maxTrackTimes =
p.getParameter<std::vector<double> >(
"MaxTrackTimes");
36 maxTimeNames =
p.getParameter<std::vector<std::string> >(
"MaxTimeNames");
39 ekinMins =
p.getParameter<std::vector<double> >(
"EkinThresholds");
40 ekinNames =
p.getParameter<std::vector<std::string> >(
"EkinNames");
41 ekinParticles =
p.getParameter<std::vector<std::string> >(
"EkinParticles");
47 <<
" MaxTrackTime = " <<
maxTrackTime / CLHEP::ns <<
" ns;" 64 <<
"SteppingAction: Number of DeadRegions where all trackes are killed " <<
ndeadRegions;
99 G4Track* theTrack = aStep->GetTrack();
102 const G4StepPoint* preStep = aStep->GetPreStepPoint();
103 const G4StepPoint* postStep = aStep->GetPostStepPoint();
111 <<
"Track #" << theTrack->GetTrackID() <<
" " << theTrack->GetDefinition()->GetParticleName()
112 <<
" E(MeV)= " << preStep->GetKineticEnergy() / MeV <<
" Nstep= " << theTrack->GetCurrentStepNumber()
113 <<
" is killed due to edep=NaN inside PV: " << preStep->GetPhysicalVolume()->GetName() <<
" at " 114 << theTrack->GetPosition() <<
" StepLen(mm)= " << aStep->GetStepLength();
131 <<
"Track #" << theTrack->GetTrackID() <<
" " << theTrack->GetDefinition()->GetParticleName()
132 <<
" E(MeV)= " << preStep->GetKineticEnergy() / MeV <<
" Nstep= " << theTrack->GetCurrentStepNumber()
133 <<
" is killed due to limit on number of steps;/n PV: " << preStep->GetPhysicalVolume()->GetName() <<
" at " 134 << theTrack->GetPosition() <<
" StepLen(mm)= " << aStep->GetStepLength();
137 const double time = theTrack->GetGlobalTime();
147 const G4LogicalVolume* lv = postStep->GetPhysicalVolume()->GetLogicalVolume();
148 const G4Region* theRegion = lv->GetRegion();
169 theTrack->GetDefinition()->GetPDGCharge() != 0.0 && lv->GetMaterial()->GetDensity() <=
theCriticalDensity) {
175 bool isKilled =
false;
178 math::XYZVectorD pos((preStep->GetPosition()).
x(), (preStep->GetPosition()).
y(), (preStep->GetPosition()).
z());
181 (preStep->GetMomentum()).
y(),
182 (preStep->GetMomentum()).
z(),
183 preStep->GetTotalEnergy());
185 uint32_t
id = theTrack->GetTrackID();
187 std::pair<math::XYZVectorD, math::XYZTLorentzVectorD>
p(
pos, mom);
191 theTrack->SetTrackStatus(fStopAndKill);
203 const double ekin = theTrack->GetKineticEnergy();
204 int pCode = theTrack->GetDefinition()->GetPDGEncoding();
220 const G4PhysicalVolumeStore*
pvs = G4PhysicalVolumeStore::GetInstance();
221 for (
auto const& pvcite : *
pvs) {
222 const G4String& pvname = pvcite->GetName();
223 if (pvname ==
"Tracker")
225 else if (pvname ==
"CALO")
232 <<
"SteppingAction: pointer for Tracker " <<
tracker <<
" and for Calo " <<
calo;
234 const G4LogicalVolumeStore* lvs = G4LogicalVolumeStore::GetInstance();
237 for (
auto const& lvcite : *lvs) {
238 const G4String& lvname = lvcite->GetName();
252 G4ParticleTable* theParticleTable = G4ParticleTable::GetParticleTable();
259 <<
" and KE cut off " <<
ekinMins[
i] / MeV <<
" MeV";
263 const G4RegionStore* rs = G4RegionStore::GetInstance();
266 for (
auto const& rcite : *rs) {
267 const G4String&
rname = rcite->GetName();
278 for (
auto const& rcite : *rs) {
279 const G4String&
rname = rcite->GetName();
297 typ =
" in dead region ";
300 typ =
" out of time window ";
303 typ =
" low energy limit ";
306 typ =
" low energy limit in vacuum ";
309 typ =
" energy deposition is NaN ";
312 typ =
" very forward track ";
315 typ =
" too many steps ";
320 G4VPhysicalVolume*
pv = aTrack->GetNextVolume();
321 vname =
pv->GetLogicalVolume()->GetName();
322 rname =
pv->GetLogicalVolume()->GetRegion()->GetName();
324 const double ekin = aTrack->GetKineticEnergy();
325 if (ekin < 2 * CLHEP::MeV) {
329 <<
"Track #" << aTrack->GetTrackID() <<
" StepN= " << aTrack->GetCurrentStepNumber() <<
" " 330 << aTrack->GetDefinition()->GetParticleName() <<
" E(MeV)=" << ekin / CLHEP::MeV
331 <<
" T(ns)=" << aTrack->GetGlobalTime() / CLHEP::ns <<
" is killed due to " << typ <<
"\n LV: " << vname <<
" (" 332 <<
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
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > XYZTLorentzVectorD
Lorentz vector with cylindrical internal representation using pseudorapidity.
std::vector< const G4Region * > deadRegions
double theCriticalDensity
SimActivityRegistry::G4StepSignal m_g4StepSignal
constexpr bool isNotFinite(T x)
~SteppingAction() override
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
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > XYZVectorD
spatial vector with cartesian internal representation
void PrintKilledTrack(const G4Track *, const TrackStatus &) const
std::vector< std::string > deadRegionNames
const G4VPhysicalVolume * calo
Abs< T >::type abs(const T &t)
bool isLowEnergy(const G4LogicalVolume *, const G4Track *) const
bool isThisVolume(const G4VTouchable *touch, const G4VPhysicalVolume *pv) const
std::vector< double > maxTrackTimes
bool isInsideDeadRegion(const G4Region *reg) const
std::vector< G4LogicalVolume * > ekinVolumes
double theCriticalEnergyForVacuum
EventAction * eventAction_
std::vector< double > ekinMins
std::vector< std::string > maxTimeNames
std::vector< std::string > ekinNames
double maxTrackTimeForward
const G4String rname[NREG]
void addTkCaloStateInfo(uint32_t t, const std::pair< math::XYZVectorD, math::XYZTLorentzVectorD > &p)
void NextStep(const G4Step *, const G4SteppingManager *ptr, bool isKilled) const
SteppingAction(EventAction *ea, const edm::ParameterSet &ps, const CMSSteppingVerbose *, bool hasW)
Log< level::Warning, false > LogWarning
unsigned int ndeadRegions
std::vector< std::string > ekinParticles
std::vector< const G4Region * > maxTimeRegions