CMS 3D CMS Logo

CustomPhysicsList.cc
Go to the documentation of this file.
7 
11 
12 #include "G4Decay.hh"
13 #include "G4hMultipleScattering.hh"
14 #include "G4hIonisation.hh"
15 #include "G4ProcessManager.hh"
16 
19 
20 using namespace CLHEP;
21 
22 G4ThreadLocal std::unique_ptr<G4Decay> CustomPhysicsList::fDecayProcess;
23 G4ThreadLocal std::unique_ptr<G4ProcessHelper> CustomPhysicsList::myHelper;
24 
26  : G4VPhysicsConstructor(name)
27 {
28  myConfig = p;
29  dfactor = p.getParameter<double>("dark_factor");
30  edm::FileInPath fp = p.getParameter<edm::FileInPath>("particlesDef");
31  fHadronicInteraction = p.getParameter<bool>("rhadronPhysics");
32 
33  particleDefFilePath = fp.fullPath();
34 
36  fDecayProcess.reset(nullptr);
37  myHelper.reset(nullptr);
38 
39  edm::LogInfo("SimG4CoreCustomPhysics")
40  << "CustomPhysicsList: Path for custom particle definition file: \n"
41  <<particleDefFilePath << "\n" << " dark_factor= " << dfactor;
42 }
43 
45 }
46 
48  edm::LogInfo("SimG4CoreCustomPhysics")
49  << "===== CustomPhysicsList::ConstructParticle ";
50  fParticleFactory.get()->loadCustomParticles(particleDefFilePath);
51 }
52 
54 
55  edm::LogInfo("SimG4CoreCustomPhysics")
56  <<"CustomPhysicsList: adding CustomPhysics processes "
57  << "for the list of particles";
58 
59  fDecayProcess.reset(new G4Decay());
60  G4PhysicsListHelper* ph = G4PhysicsListHelper::GetPhysicsListHelper();
61 
62  for(auto particle : fParticleFactory.get()->GetCustomParticles()) {
63  CustomParticle* cp = dynamic_cast<CustomParticle*>(particle);
64  if(cp) {
65  G4ProcessManager* pmanager = particle->GetProcessManager();
66  edm::LogInfo("SimG4CoreCustomPhysics")
67  <<"CustomPhysicsList: " << particle->GetParticleName()
68  <<" PDGcode= " << particle->GetPDGEncoding()
69  << " Mass= " << particle->GetPDGMass()/GeV <<" GeV.";
70  if(pmanager) {
71  if(particle->GetPDGCharge() != 0.0) {
72  ph->RegisterProcess(new G4hMultipleScattering, particle);
73  ph->RegisterProcess(new G4hIonisation, particle);
74  }
75  if(fDecayProcess.get()->IsApplicable(*particle)) {
76  ph->RegisterProcess(fDecayProcess.get(), particle);
77  }
78  if(cp->GetCloud() && fHadronicInteraction &&
79  CustomPDGParser::s_isRHadron(particle->GetPDGEncoding())) {
80  edm::LogInfo("SimG4CoreCustomPhysics")
81  <<"CustomPhysicsList: " << particle->GetParticleName()
82  <<" CloudMass= " <<cp->GetCloud()->GetPDGMass()/GeV
83  <<" GeV; SpectatorMass= " << cp->GetSpectator()->GetPDGMass()/GeV<<" GeV.";
84 
85  if(!myHelper.get()) { myHelper.reset(new G4ProcessHelper(myConfig, fParticleFactory.get())); }
86  pmanager->AddDiscreteProcess(new FullModelHadronicProcess(myHelper.get()));
87  }
88  if(particle->GetParticleType()=="darkpho"){
90  pmanager->AddDiscreteProcess(darkGamma);
91  }
92  }
93  }
94  }
95 }
T getParameter(std::string const &) const
const double GeV
Definition: MathUtil.h:16
static G4ThreadLocal std::unique_ptr< G4Decay > fDecayProcess
void ConstructProcess() override
CustomPhysicsList(const std::string &name, const edm::ParameterSet &p)
edm::ParameterSet myConfig
std::string particleDefFilePath
G4ParticleDefinition * GetCloud()
static G4ThreadLocal std::unique_ptr< G4ProcessHelper > myHelper
void ConstructParticle() override
G4ParticleDefinition * GetSpectator()
static bool s_isRHadron(int pdg)
std::unique_ptr< CustomParticleFactory > fParticleFactory
~CustomPhysicsList() override