5 #include "G4ParticleDefinition.hh" 6 #include "G4ProcessManager.hh" 8 #include "G4StepLimiter.hh" 9 #include "G4hMultipleScattering.hh" 10 #include "G4hIonisation.hh" 11 #include "G4mplIonisation.hh" 12 #include "G4mplIonisationWithDeltaModel.hh" 14 #include <CLHEP/Units/SystemOfUnits.h> 17 : G4VPhysicsConstructor(
"Monopole Physics") {
18 verbose =
p.getUntrackedParameter<
int>(
"Verbosity", 0);
19 magCharge =
p.getUntrackedParameter<
int>(
"MonopoleCharge", 1);
20 deltaRay =
p.getUntrackedParameter<
bool>(
"MonopoleDeltaRay",
true);
21 multiSc =
p.getUntrackedParameter<
bool>(
"MonopoleMultiScatter",
false);
22 transport =
p.getUntrackedParameter<
bool>(
"MonopoleTransport",
true);
23 double mass =
p.getUntrackedParameter<
double>(
"MonopoleMass", 200);
24 if (pdt &&
mass > 0.0) {
26 for (HepPDT::ParticleDataTable::const_iterator
p = pdt->begin();
p != pdt->end(); ++
p, ++
ii) {
30 names.push_back(particle.name());
32 elCharges.push_back((
int)(particle.charge()));
36 G4cout <<
"CMSMonopolePhysics: Monopole[" <<
ii <<
"] " <<
particleName <<
" Mass " << particle.mass()
37 <<
" GeV, Magnetic Charge " <<
magCharge <<
", Electric Charge " << particle.charge() << G4endl;
38 }
else if (strcmp(
particleName.c_str(),
"AntiMono") == 0) {
39 names.push_back(particle.name());
41 elCharges.push_back((
int)(particle.charge()));
45 G4cout <<
"CMSMonopolePhysics: Monopole[" <<
ii <<
"] " <<
particleName <<
" Mass " << particle.mass()
46 <<
" GeV, Magnetic Charge " <<
magCharge <<
", Electric Charge " << particle.charge() << G4endl;
51 G4cout <<
"CMSMonopolePhysics has " <<
names.size() <<
" monopole candidates and delta Ray option " <<
deltaRay 58 for (
unsigned int ii = 0;
ii <
names.size(); ++
ii) {
65 G4cout <<
"Create Monopole " <<
names[
ii] <<
" of mass " <<
masses[
ii] / CLHEP::GeV <<
" GeV, magnetic charge " 75 G4cout <<
"### CMSMonopolePhysics ConstructProcess()" << G4endl;
77 G4PhysicsListHelper*
ph = G4PhysicsListHelper::GetPhysicsListHelper();
82 G4ProcessManager* pmanager = mpl->GetProcessManager();
85 o <<
"Monopole without a Process Manager";
91 G4double
mass = mpl->GetPDGMass();
93 G4cout <<
"### CMSMonopolePhysics instantiates for " << mpl->GetParticleName() <<
" at " << mpl <<
" Mass " 94 <<
mass / CLHEP::GeV <<
" GeV Mag " << magn <<
" Process manager " << pmanager << G4endl;
99 pmanager->RemoveProcess(idxt);
103 if (mpl->GetPDGCharge() != 0.0) {
105 G4hMultipleScattering* hmsc =
new G4hMultipleScattering();
106 ph->RegisterProcess(hmsc, mpl);
108 G4hIonisation* hioni =
new G4hIonisation();
109 ph->RegisterProcess(hioni, mpl);
112 G4mplIonisation* mplioni =
new G4mplIonisation(magn);
114 G4mplIonisationWithDeltaModel* ion =
new G4mplIonisationWithDeltaModel(magn,
"PAI");
115 ion->SetParticle(mpl);
116 mplioni->AddEmModel(0, ion, ion);
118 ph->RegisterProcess(mplioni, mpl);
120 pmanager->AddDiscreteProcess(
new G4StepLimiter());
122 pmanager->DumpInfo();
~CMSMonopolePhysics() override
std::vector< int > pdgEncodings
HepPDT::ParticleDataTable ParticleDataTable
std::vector< Monopole * > monopoles
std::vector< int > elCharges
G4double MagneticCharge() const
HepPDT::ParticleData ParticleData
std::vector< std::string > names
void ConstructProcess() override
void ConstructParticle() override
CMSMonopolePhysics(const HepPDT::ParticleDataTable *table_, const edm::ParameterSet &p)
std::vector< double > masses