5 #include "G4LogicalVolumeStore.hh" 6 #include "G4ParticleTable.hh" 7 #include "G4PhysicalVolumeStore.hh" 8 #include "G4RegionStore.hh" 9 #include "G4UnitsTable.hh" 10 #include "G4SystemOfUnits.hh" 32 maxTrackTime =
p.getParameter<
double>(
"MaxTrackTime") * CLHEP::ns;
34 maxTrackTimes =
p.getParameter<std::vector<double> >(
"MaxTrackTimes");
35 maxTimeNames =
p.getParameter<std::vector<std::string> >(
"MaxTimeNames");
38 ekinMins =
p.getParameter<std::vector<double> >(
"EkinThresholds");
39 ekinNames =
p.getParameter<std::vector<std::string> >(
"EkinNames");
40 ekinParticles =
p.getParameter<std::vector<std::string> >(
"EkinParticles");
46 <<
" MaxTrackTime = " <<
maxTrackTime / CLHEP::ns <<
" ns;" 63 <<
"SteppingAction: Number of DeadRegions where all trackes are killed " <<
ndeadRegions;
98 G4Track* theTrack = aStep->GetTrack();
101 const G4StepPoint* preStep = aStep->GetPreStepPoint();
102 const G4StepPoint* postStep = aStep->GetPostStepPoint();
110 <<
"Track #" << theTrack->GetTrackID() <<
" " << theTrack->GetDefinition()->GetParticleName()
111 <<
" E(MeV)= " << preStep->GetKineticEnergy() / MeV <<
" Nstep= " << theTrack->GetCurrentStepNumber()
112 <<
" is killed due to edep=NaN inside PV: " << preStep->GetPhysicalVolume()->GetName() <<
" at " 113 << theTrack->GetPosition() <<
" StepLen(mm)= " << aStep->GetStepLength();
130 <<
"Track #" << theTrack->GetTrackID() <<
" " << theTrack->GetDefinition()->GetParticleName()
131 <<
" E(MeV)= " << preStep->GetKineticEnergy() / MeV <<
" Nstep= " << theTrack->GetCurrentStepNumber()
132 <<
" is killed due to limit on number of steps;/n PV: " << preStep->GetPhysicalVolume()->GetName() <<
" at " 133 << theTrack->GetPosition() <<
" StepLen(mm)= " << aStep->GetStepLength();
136 const double time = theTrack->GetGlobalTime();
146 const G4LogicalVolume* lv = postStep->GetPhysicalVolume()->GetLogicalVolume();
147 const G4Region* theRegion = lv->GetRegion();
168 theTrack->GetDefinition()->GetPDGCharge() != 0.0 && lv->GetMaterial()->GetDensity() <=
theCriticalDensity) {
174 bool isKilled =
false;
176 if (preStep->GetPhysicalVolume() ==
tracker && postStep->GetPhysicalVolume() ==
calo) {
177 math::XYZVectorD pos((postStep->GetPosition()).
x(), (postStep->GetPosition()).
y(), (postStep->GetPosition()).
z());
180 (postStep->GetMomentum()).
y(),
181 (postStep->GetMomentum()).
z(),
182 postStep->GetTotalEnergy());
184 uint32_t
id = theTrack->GetTrackID();
186 std::pair<math::XYZVectorD, math::XYZTLorentzVectorD>
p(
pos, mom);
190 theTrack->SetTrackStatus(fStopAndKill);
202 const double ekin = theTrack->GetKineticEnergy();
203 int pCode = theTrack->GetDefinition()->GetPDGEncoding();
219 const G4PhysicalVolumeStore*
pvs = G4PhysicalVolumeStore::GetInstance();
220 for (
auto const& pvcite : *
pvs) {
221 const G4String& pvname = pvcite->GetName();
222 if (pvname ==
"Tracker" || pvname ==
"tracker:Tracker_1")
224 else if (pvname ==
"CALO" || pvname ==
"caloBase:CALO_1")
231 <<
"SteppingAction: pointer for Tracker " <<
tracker <<
" and for Calo " <<
calo;
233 const G4LogicalVolumeStore* lvs = G4LogicalVolumeStore::GetInstance();
236 for (
auto const& lvcite : *lvs) {
237 const G4String& lvname = lvcite->GetName();
251 G4ParticleTable* theParticleTable = G4ParticleTable::GetParticleTable();
258 <<
" and KE cut off " <<
ekinMins[
i] / MeV <<
" MeV";
262 const G4RegionStore* rs = G4RegionStore::GetInstance();
265 for (
auto const& rcite : *rs) {
266 const G4String&
rname = rcite->GetName();
277 for (
auto const& rcite : *rs) {
278 const G4String&
rname = rcite->GetName();
296 typ =
" in dead region ";
299 typ =
" out of time window ";
302 typ =
" low energy limit ";
305 typ =
" low energy limit in vacuum ";
308 typ =
" energy deposition is NaN ";
311 typ =
" very forward track ";
314 typ =
" too many steps ";
319 G4VPhysicalVolume*
pv = aTrack->GetNextVolume();
320 vname =
pv->GetLogicalVolume()->GetName();
321 rname =
pv->GetLogicalVolume()->GetRegion()->GetName();
323 const double ekin = aTrack->GetKineticEnergy();
324 if (ekin < 2 * CLHEP::MeV) {
328 <<
"Track #" << aTrack->GetTrackID() <<
" StepN= " << aTrack->GetCurrentStepNumber() <<
" " 329 << aTrack->GetDefinition()->GetParticleName() <<
" E(MeV)=" << ekin / CLHEP::MeV
330 <<
" T(ns)=" << aTrack->GetGlobalTime() / CLHEP::ns <<
" is killed due to " << typ <<
"\n LV: " << vname <<
" (" 331 <<
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
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