12 #include "G4ParticleTable.hh" 16 #include <CLHEP/Units/GlobalPhysicalConstants.h> 17 #include <CLHEP/Units/SystemOfUnits.h> 20 mode =
p.getUntrackedParameter<
bool>(
"ChangeFromFirstStep",
true);
22 <<
" start at first step to " <<
mode;
29 edm::LogVerbatim(
"SimG4CoreWatcher") <<
"MonopoleSteppingAction::Initialize ESGetToken for MagneticField";
37 <<
" Y: " << (
bField->inTesla(
p)).
y() <<
" Z: " <<
bZ;
41 G4ParticleTable *partTable = G4ParticleTable::GetParticleTable();
43 for (
int ii = 0;
ii < partTable->size();
ii++) {
44 G4ParticleDefinition *particle = partTable->GetParticle(
ii);
48 pdgCode.push_back(particle->GetPDGEncoding());
66 const G4Track *aTrack = (*trk)();
67 int code = aTrack->GetDefinition()->GetPDGEncoding();
70 eStart = aTrack->GetTotalEnergy();
71 pxStart = aTrack->GetMomentum().x();
72 pyStart = aTrack->GetMomentum().y();
73 pzStart = aTrack->GetMomentum().z();
74 dirxStart = aTrack->GetMomentumDirection().x();
75 diryStart = aTrack->GetMomentumDirection().y();
76 dirzStart = aTrack->GetMomentumDirection().z();
78 LogDebug(
"SimG4CoreWatcher") <<
"MonopoleSeppingAction Track " << code <<
" Flag " <<
actOnTrack 79 <<
" (px,py,pz,E) = (" <<
pxStart / GeV <<
", " <<
pyStart / GeV <<
", " 87 double eT,
pT, pZ, tStep;
88 G4Track *aTrack = aStep->GetTrack();
89 G4ThreeVector initialPosition(0, 0, 0);
91 tStep = aTrack->GetGlobalTime();
96 const G4ThreeVector &dirStep = aTrack->GetMomentumDirection();
97 double lStep = aTrack->GetStepLength();
98 double xStep = aTrack->GetPosition().x() - lStep * dirStep.x();
99 double yStep = aTrack->GetPosition().y() - lStep * dirStep.y();
100 double zStep = aTrack->GetPosition().z() - lStep * dirStep.z();
101 double vStep = aTrack->GetVelocity();
103 tStep = (vStep > 0. ? (lStep / vStep) : 0.);
104 double eStep = aTrack->GetTotalEnergy();
105 eT = eStep * dirStep.perp();
106 pT = aTrack->GetMomentum().perp();
107 pZ = aTrack->GetMomentum().z();
109 LogDebug(
"SimG4CoreWatcher") <<
"MonopoleSeppingAction: tStep " << tStep <<
" eT " << eT <<
" pT " <<
pT <<
" pZ " 115 double eT2 = (eT1 > 0. ? (1. / eT1) : 0.);
121 LogDebug(
"SimG4CoreWatcher") <<
"MonopoleSeppingAction: Factor eT = " << eT <<
" " << eT1 <<
" " << eT2
122 <<
", pT = " <<
pT <<
" " <<
pT1 <<
", pZ = " << pZ <<
" " << pZ1
123 <<
", time = " << tStep <<
" " << ts1 <<
", Factors " <<
fac0 <<
" " <<
fac1 <<
" " 124 <<
fac2 <<
", Final ones " << fact1 <<
" " << fact2;
126 G4ThreeVector displacement = (fact1 * ez + fact2 *
et) *
CLHEP::m;
128 LogDebug(
"SimG4CoreWatcher") <<
"MonopoleSeppingAction: Initial " << initialPosition <<
" Displacement " 129 << displacement <<
" Final " << (initialPosition + displacement);
130 aTrack->SetPosition(initialPosition + displacement);
std::vector< int > pdgCode
Log< level::Info, true > LogVerbatim
edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > tok_bFieldH_
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
uint32_t cc[maxCellsPerHit]
void registerConsumes(edm::ConsumesCollector) override
U second(std::pair< T, U > const &p)
void update(const BeginOfRun *) override
This routine will be called when the appropriate signal arrives.
MonopoleSteppingAction(edm::ParameterSet const &p)
void beginRun(edm::EventSetup const &) override
~MonopoleSteppingAction() override