5 #include "G4LogicalVolumeStore.hh" 6 #include "G4ParticleTable.hh" 7 #include "G4PhysicalVolumeStore.hh" 8 #include "G4RegionStore.hh" 9 #include "G4UnitsTable.hh" 10 #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 if (theTrack->GetKineticEnergy() < 0.0) {
106 <<
"SteppingAction::UserSteppingAction: Track #" << theTrack->GetTrackID() <<
" " 107 << theTrack->GetDefinition()->GetParticleName() <<
" Ekin(MeV)= " << theTrack->GetKineticEnergy() / MeV;
109 theTrack->SetKineticEnergy(0.0);
112 const G4StepPoint* preStep = aStep->GetPreStepPoint();
113 const G4StepPoint* postStep = aStep->GetPostStepPoint();
121 <<
"Track #" << theTrack->GetTrackID() <<
" " << theTrack->GetDefinition()->GetParticleName()
122 <<
" E(MeV)= " << preStep->GetKineticEnergy() / MeV <<
" Nstep= " << theTrack->GetCurrentStepNumber()
123 <<
" is killed due to edep=NaN inside PV: " << preStep->GetPhysicalVolume()->GetName() <<
" at " 124 << theTrack->GetPosition() <<
" StepLen(mm)= " << aStep->GetStepLength();
141 <<
"Track #" << theTrack->GetTrackID() <<
" " << theTrack->GetDefinition()->GetParticleName()
142 <<
" E(MeV)= " << preStep->GetKineticEnergy() / MeV <<
" Nstep= " << theTrack->GetCurrentStepNumber()
143 <<
" is killed due to limit on number of steps;/n PV: " << preStep->GetPhysicalVolume()->GetName() <<
" at " 144 << theTrack->GetPosition() <<
" StepLen(mm)= " << aStep->GetStepLength();
147 const double time = theTrack->GetGlobalTime();
157 const G4LogicalVolume* lv = postStep->GetPhysicalVolume()->GetLogicalVolume();
158 const G4Region* theRegion = lv->GetRegion();
180 theTrack->GetDefinition()->GetPDGCharge() != 0.0 && lv->GetMaterial()->GetDensity() <=
theCriticalDensity) {
186 bool isKilled =
false;
188 if (preStep->GetPhysicalVolume() ==
tracker && postStep->GetPhysicalVolume() ==
calo) {
189 math::XYZVectorD pos((postStep->GetPosition()).
x(), (postStep->GetPosition()).
y(), (postStep->GetPosition()).
z());
192 (postStep->GetMomentum()).
y(),
193 (postStep->GetMomentum()).
z(),
194 postStep->GetTotalEnergy());
196 uint32_t
id = theTrack->GetTrackID();
198 std::pair<math::XYZVectorD, math::XYZTLorentzVectorD>
p(
pos, mom);
202 theTrack->SetTrackStatus(fStopAndKill);
214 const double ekin = theTrack->GetKineticEnergy();
215 int pCode = theTrack->GetDefinition()->GetPDGEncoding();
231 const G4PhysicalVolumeStore*
pvs = G4PhysicalVolumeStore::GetInstance();
232 for (
auto const& pvcite : *
pvs) {
233 const G4String& pvname = pvcite->GetName();
234 if (pvname ==
"Tracker" || pvname ==
"tracker:Tracker_1")
236 else if (pvname ==
"CALO" || pvname ==
"caloBase:CALO_1")
243 <<
"SteppingAction: pointer for Tracker " <<
tracker <<
" and for Calo " <<
calo;
245 const G4LogicalVolumeStore* lvs = G4LogicalVolumeStore::GetInstance();
248 for (
auto const& lvcite : *lvs) {
249 const G4String& lvname = lvcite->GetName();
250 if (lvname ==
"CMStoZDC" || lvname ==
"cmsextent:CMStoZDC") {
266 G4ParticleTable* theParticleTable = G4ParticleTable::GetParticleTable();
273 <<
" and KE cut off " <<
ekinMins[
i] / MeV <<
" MeV";
277 const G4RegionStore* rs = G4RegionStore::GetInstance();
280 for (
auto const& rcite : *rs) {
281 const G4String&
rname = rcite->GetName();
292 for (
auto const& rcite : *rs) {
293 const G4String&
rname = rcite->GetName();
311 typ =
" in dead region ";
314 typ =
" out of time window ";
317 typ =
" low energy limit ";
320 typ =
" low energy limit in vacuum ";
323 typ =
" energy deposition is NaN ";
326 typ =
" very forward track ";
329 typ =
" too many steps ";
334 G4VPhysicalVolume*
pv = aTrack->GetNextVolume();
335 vname =
pv->GetLogicalVolume()->GetName();
336 rname =
pv->GetLogicalVolume()->GetRegion()->GetName();
338 const double ekin = aTrack->GetKineticEnergy();
339 if (ekin < 2 * CLHEP::MeV) {
343 <<
"Track #" << aTrack->GetTrackID() <<
" StepN= " << aTrack->GetCurrentStepNumber() <<
" " 344 << aTrack->GetDefinition()->GetParticleName() <<
" E(MeV)=" << ekin / CLHEP::MeV
345 <<
" T(ns)=" << aTrack->GetGlobalTime() / CLHEP::ns <<
" is killed due to " << typ <<
"\n LV: " << vname <<
" (" 346 <<
rname <<
") at " << aTrack->GetPosition() <<
" step(cm)=" << aTrack->GetStep()->GetStepLength() / CLHEP::cm;
Log< level::Info, true > LogVerbatim
const G4LogicalVolume * m_CMStoZDC
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
bool isForZDC(const G4LogicalVolume *lv, int pdg) const
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