ATLAS Offline Software
Loading...
Searching...
No Matches
PhysicsListSvc Class Reference

#include <PhysicsListSvc.h>

Inheritance diagram for PhysicsListSvc:
Collaboration diagram for PhysicsListSvc:

Public Member Functions

 PhysicsListSvc (const std::string &name, ISvcLocator *pSvcLocator)
virtual ~PhysicsListSvc ()=default
virtual StatusCode initialize () override
virtual void CreatePhysicsList () override
virtual G4VUserPhysicsList * GetPhysicsList () override
virtual void SetPhysicsList () override
virtual void SetPhysicsOptions () override

Private Member Functions

void CommandLog (int returnCode, const std::string &commandString) const
 This command prints a message about a G4Command depending on its returnCode.

Private Attributes

ToolHandle< IPhysicsOptionToolm_fastSimulationConstructor {this, "FastSimConstructor", "", "Physics Constructor for fast simulation physics"}
ToolHandleArray< IPhysicsOptionToolm_phys_option {this, "PhysOption", {}, "Tool handle array of physics options" }
ToolHandleArray< IPhysicsOptionToolm_phys_decay {this, "PhysicsDecay", {}, "Tool handle array of physics decays"}
G4VModularPhysicsList * m_physicsList {}
Gaudi::Property< std::string > m_physicsListName {this, "PhysicsList", "FTFP_BERT", "Name for physics list"}
 !< Handle on the physics list
Gaudi::Property< double > m_neutronTimeCut {this, "NeutronTimeCut", 0, "Time cut for neutron killer"}
 !< Name for the physics list (property to be set in the tool)
Gaudi::Property< double > m_neutronEnergyCut {this, "NeutronEnergyCut", 0, "Energy cut for neutron killer"}
 !< Time cut for neutrons (in the neutron killer process)
Gaudi::Property< double > m_generalCut {this, "GeneralCut", 0, "General cut"}
 !< Energy cut for neutrons (in the neutron killer process)
Gaudi::Property< double > m_emMaxEnergy {this, "EMMaxEnergy", -1., "Maximum energy for EM tables"}
 !< A general cut - this isn't normally used in our simulation
Gaudi::Property< double > m_emMinEnergy {this, "EMMinEnergy", -1., "Minimum energy for EM tables"}
 !< Maximum energy of the pre-calculated EM cross-section tables
Gaudi::Property< int > m_emNumberOfBinsPerDecade {this, "EMNumberOfBinsPerDecade", -1, "Number of bins per Energy decade. Used for both DeDx and for the Lambda binning."}
 !< Minimum energy of the pre-calculated EM cross-section tables
Gaudi::Property< bool > m_applyEMCuts {this, "ApplyEMCuts", true, "Apply cuts EM flag in Geant4"}
 !< Number of bins per Energy decade. Used for both DeDx and for the Lambda binning.
Gaudi::Property< bool > m_quietMode {this, "QuietMode", false, ""}
 !< Switch for the G4 "apply cuts" EM physics flag
Gaudi::Property< bool > m_unstableAntiNeutrons {this, "UnstableAntiNeutrons",false,"Bugfix for ATLASSIM-6634 until we switch to using Geant4 11"}

Detailed Description

Definition at line 23 of file PhysicsListSvc.h.

Constructor & Destructor Documentation

◆ PhysicsListSvc()

PhysicsListSvc::PhysicsListSvc ( const std::string & name,
ISvcLocator * pSvcLocator )

Definition at line 22 of file PhysicsListSvc.cxx.

23 : base_class(name,pSvcLocator)
24{
25}

◆ ~PhysicsListSvc()

virtual PhysicsListSvc::~PhysicsListSvc ( )
virtualdefault

Member Function Documentation

◆ CommandLog()

void PhysicsListSvc::CommandLog ( int returnCode,
const std::string & commandString ) const
private

This command prints a message about a G4Command depending on its returnCode.

Definition at line 215 of file PhysicsListSvc.cxx.

216{
217 switch(returnCode) {
218 case 0: { ATH_MSG_DEBUG("G4 Command: " << commandString << " - Command Succeeded"); } break;
219 case 100: { ATH_MSG_ERROR("G4 Command: " << commandString << " - Command Not Found!"); } break;
220 case 200: {
221 auto* stateManager = G4StateManager::GetStateManager();
222 ATH_MSG_DEBUG("G4 Command: " << commandString << " - Illegal Application State (" <<
223 stateManager->GetStateString(stateManager->GetCurrentState()) << ")!");
224 } break;
225 case 300: { ATH_MSG_ERROR("G4 Command: " << commandString << " - Parameter Out of Range!"); } break;
226 case 400: { ATH_MSG_ERROR("G4 Command: " << commandString << " - Parameter Unreadable!"); } break;
227 case 500: { ATH_MSG_ERROR("G4 Command: " << commandString << " - Parameter Out of Candidates!"); } break;
228 case 600: { ATH_MSG_ERROR("G4 Command: " << commandString << " - Alias Not Found!"); } break;
229 default: { ATH_MSG_ERROR("G4 Command: " << commandString << " - Unknown Status!"); } break;
230 }
231
232}
#define ATH_MSG_ERROR(x)
#define ATH_MSG_DEBUG(x)

◆ CreatePhysicsList()

void PhysicsListSvc::CreatePhysicsList ( )
overridevirtual

Definition at line 49 of file PhysicsListSvc.cxx.

50{
51 ATH_MSG_DEBUG("PhysicsListSvc::CreatePhysicsList()");
52 if (m_physicsListName.value() != ""){
53 G4PhysListFactory factory;
54 if (m_quietMode) { factory.SetVerbose(0); } // HACK
55 AtlasPhysListFactory Atlasfactory;
56 if (m_quietMode) {
57 Atlasfactory.SetVerbose(0); // HACK
58 G4HadronicProcessStore::Instance()->SetVerbose(0);
59 }
60 if (factory.IsReferencePhysList(m_physicsListName.value()))
61 {
62 ATH_MSG_INFO("Creating Geant4 PhysicsList: " << m_physicsListName.value());
63 m_physicsList = factory.GetReferencePhysList(m_physicsListName.value());
64 }
65 else if (Atlasfactory.IsReferencePhysList(m_physicsListName.value()))
66 {
67 ATH_MSG_INFO("Creating ATLAS PhysicsList: " << m_physicsListName.value());
69 }
70 }
71
72 if (!m_physicsList)
73 {
74 ATH_MSG_ERROR("Unable to initialize physics List: " << m_physicsList);
75 throw "PhysicsListInitializationError";
76 }
77 // Call these as functions. As this could be used as a base class, having
78 // these as separate functions lets someone who is inheriting from this use
79 // them...
80
81 // sort m_phys_option list
82 std::vector<IPhysicsOptionTool*> sortedPhysicsOptions;
83 sortedPhysicsOptions.reserve(m_phys_option.size());
84 // Manually sorting ToolHandleArray
85 {
86 // BSM Physics
87 for (auto& physOptTool: m_phys_option) {
88 if (physOptTool->GetOptionType() == G4AtlasPhysicsOption::Type::BSMPhysics) {
89 sortedPhysicsOptions.push_back(&*physOptTool);
90 }
91 }
92
93 // Add particles from the PDG Table not currently known to Geant4
94 for (auto& physOptTool: m_phys_option) {
95 if (physOptTool->GetOptionType() == G4AtlasPhysicsOption::Type::QS_ExtraParticles) {
96 sortedPhysicsOptions.push_back(&*physOptTool);
97 }
98 }
99
100 // Add MSC and Ionisation processes for specific particles (possibly merge with the next one?)
101 for (auto& physOptTool: m_phys_option) {
102 if (physOptTool->GetOptionType() == G4AtlasPhysicsOption::Type::QS_ExtraProc) {
103 sortedPhysicsOptions.push_back(&*physOptTool);
104 }
105 }
106
107 // G4StepLimitation, LUCID Op Process, TRT XTR process
108 for (auto& physOptTool: m_phys_option) {
109 if (physOptTool->GetOptionType() == G4AtlasPhysicsOption::Type::GlobalProcesses) {
110 sortedPhysicsOptions.push_back(&*physOptTool);
111 }
112 }
113
114 // Unknown
115 for (auto& physOptTool: m_phys_option) {
116 if (physOptTool->GetOptionType() == G4AtlasPhysicsOption::Type::UnknownType) {
117 ATH_MSG_ERROR(physOptTool->name() << "set as UnknownType. This tool will not be used to modify the physics list of this job.");
118 }
119 }
120 }
121
122 //Register physics options to the G4VModularPhysicsList
123 for (auto& physOptTool: sortedPhysicsOptions)
124 {
125 ATH_MSG_DEBUG("Registering " << physOptTool->name());
126 m_physicsList->RegisterPhysics(physOptTool->GetPhysicsOption().release());
127 }
128 //Register decays to the G4VModularPhysicsList
129 for (auto& physDecayTool: m_phys_decay)
130 {
131 ATH_MSG_DEBUG("Registering " << physDecayTool->name());
132 m_physicsList->RegisterPhysics(physDecayTool->GetPhysicsOption().release());
133 }
134
135 m_physicsList->RegisterPhysics(m_fastSimulationConstructor->GetPhysicsOption().release());
136
137 //ConstructProcess();
138 ATH_MSG_DEBUG("end of PhysicsListSvc::CreatePhysicsList()");
139}
#define ATH_MSG_INFO(x)
G4VModularPhysicsList * GetReferencePhysList(const G4String &)
G4bool IsReferencePhysList(const G4String &)
ToolHandleArray< IPhysicsOptionTool > m_phys_option
ToolHandle< IPhysicsOptionTool > m_fastSimulationConstructor
Gaudi::Property< bool > m_quietMode
!< Switch for the G4 "apply cuts" EM physics flag
ToolHandleArray< IPhysicsOptionTool > m_phys_decay
Gaudi::Property< std::string > m_physicsListName
!< Handle on the physics list
G4VModularPhysicsList * m_physicsList

◆ GetPhysicsList()

G4VUserPhysicsList * PhysicsListSvc::GetPhysicsList ( )
overridevirtual

Definition at line 142 of file PhysicsListSvc.cxx.

143{
144 if (!m_physicsList) {
145 this->CreatePhysicsList();
146 }
147 return m_physicsList;
148}
virtual void CreatePhysicsList() override

◆ initialize()

StatusCode PhysicsListSvc::initialize ( )
overridevirtual

Definition at line 28 of file PhysicsListSvc.cxx.

29{
30 ATH_MSG_DEBUG("PhysicsListSvc::initialize()");
31 if (m_phys_option.size())
32 {
33 ATH_MSG_INFO( "Initializing list of " << m_phys_option.size() << " physics options" );
34 CHECK( m_phys_option.retrieve() );
35 }
36
37 if (m_phys_decay.size())
38 {
39 ATH_MSG_INFO( "Initializing list of " << m_phys_decay.size() << " Decays " );
40 CHECK( m_phys_decay.retrieve() );
41 }
42
44
45 return StatusCode::SUCCESS;
46}
#define CHECK(...)
Evaluate an expression and check for errors.

◆ SetPhysicsList()

void PhysicsListSvc::SetPhysicsList ( )
overridevirtual

Definition at line 151 of file PhysicsListSvc.cxx.

152{
153 if(!m_physicsList) {
154 this->CreatePhysicsList();
155 }
156 G4RunManager::GetRunManager()->SetUserInitialization(m_physicsList);
157}

◆ SetPhysicsOptions()

void PhysicsListSvc::SetPhysicsOptions ( )
overridevirtual

Definition at line 160 of file PhysicsListSvc.cxx.

161{
162 if (!m_physicsList)
163 {
164 ATH_MSG_WARNING("Physics list not initialized before calling ConstructProcess()");
165 return;
166 }
167
168 if(m_generalCut.value() > 0. && std::abs(m_generalCut.value())>std::numeric_limits<double>::epsilon())
169 {
170 m_physicsList->SetDefaultCutValue(m_generalCut.value());
171 }
172
173 std::vector<std::string> g4commands;
174 if (m_neutronTimeCut.value() > 0. && std::abs(m_neutronTimeCut.value())>std::numeric_limits<double>::epsilon())
175 {
176 std::ostringstream oss;
177 oss<<"/physics_engine/neutron/timeLimit "<<m_neutronTimeCut.value()<<" ns";
178 g4commands.push_back(oss.str());
179 }
180
181 if (m_neutronEnergyCut.value() > 0. && std::abs(m_neutronEnergyCut.value())>std::numeric_limits<double>::epsilon())
182 {
183 std::ostringstream oss;
184 oss<<"/physics_engine/neutron/energyLimit "<<m_neutronEnergyCut.value()<<" MeV";
185 g4commands.push_back(oss.str());
186 }
187
188 if(!g4commands.empty()) {
189 // Send UI commands
190 ATH_MSG_DEBUG("G4 Command: Trying in SetPhysicsOptions()");
191 G4UImanager* ui = G4UImanager::GetUIpointer();
192 for (const auto& g4command : g4commands) {
193 int returnCode = ui->ApplyCommand( g4command );
194 CommandLog(returnCode, g4command);
195 }
196 }
197
198 G4EmParameters* emp = G4EmParameters::Instance();
199 if (m_emMaxEnergy.value()>=0) emp->SetMaxEnergy(m_emMaxEnergy.value());
200 if (m_emNumberOfBinsPerDecade.value()>=0) emp->SetNumberOfBinsPerDecade(m_emNumberOfBinsPerDecade.value());
201 if (m_emMinEnergy.value()>=0) emp->SetMinEnergy(m_emMinEnergy.value());
202 if (m_applyEMCuts.value())
203 {
204 emp->SetApplyCuts(true);
205 }
206
208 G4AntiNeutron::Definition()->SetPDGStable(false);
209 }
210
211 return;
212}
#define ATH_MSG_WARNING(x)
Gaudi::Property< double > m_neutronEnergyCut
!< Time cut for neutrons (in the neutron killer process)
Gaudi::Property< double > m_emMaxEnergy
!< A general cut - this isn't normally used in our simulation
Gaudi::Property< double > m_emMinEnergy
!< Maximum energy of the pre-calculated EM cross-section tables
Gaudi::Property< double > m_neutronTimeCut
!< Name for the physics list (property to be set in the tool)
Gaudi::Property< bool > m_applyEMCuts
!< Number of bins per Energy decade. Used for both DeDx and for the Lambda binning.
Gaudi::Property< int > m_emNumberOfBinsPerDecade
!< Minimum energy of the pre-calculated EM cross-section tables
Gaudi::Property< bool > m_unstableAntiNeutrons
void CommandLog(int returnCode, const std::string &commandString) const
This command prints a message about a G4Command depending on its returnCode.
Gaudi::Property< double > m_generalCut
!< Energy cut for neutrons (in the neutron killer process)

Member Data Documentation

◆ m_applyEMCuts

Gaudi::Property<bool> PhysicsListSvc::m_applyEMCuts {this, "ApplyEMCuts", true, "Apply cuts EM flag in Geant4"}
private

!< Number of bins per Energy decade. Used for both DeDx and for the Lambda binning.

Definition at line 61 of file PhysicsListSvc.h.

61{this, "ApplyEMCuts", true, "Apply cuts EM flag in Geant4"};

◆ m_emMaxEnergy

Gaudi::Property<double> PhysicsListSvc::m_emMaxEnergy {this, "EMMaxEnergy", -1., "Maximum energy for EM tables"}
private

!< A general cut - this isn't normally used in our simulation

Definition at line 52 of file PhysicsListSvc.h.

52{this, "EMMaxEnergy", -1., "Maximum energy for EM tables"};

◆ m_emMinEnergy

Gaudi::Property<double> PhysicsListSvc::m_emMinEnergy {this, "EMMinEnergy", -1., "Minimum energy for EM tables"}
private

!< Maximum energy of the pre-calculated EM cross-section tables

Definition at line 53 of file PhysicsListSvc.h.

53{this, "EMMinEnergy", -1., "Minimum energy for EM tables"};

◆ m_emNumberOfBinsPerDecade

Gaudi::Property<int> PhysicsListSvc::m_emNumberOfBinsPerDecade {this, "EMNumberOfBinsPerDecade", -1, "Number of bins per Energy decade. Used for both DeDx and for the Lambda binning."}
private

!< Minimum energy of the pre-calculated EM cross-section tables

Definition at line 60 of file PhysicsListSvc.h.

60{this, "EMNumberOfBinsPerDecade", -1, "Number of bins per Energy decade. Used for both DeDx and for the Lambda binning."};

◆ m_fastSimulationConstructor

ToolHandle<IPhysicsOptionTool> PhysicsListSvc::m_fastSimulationConstructor {this, "FastSimConstructor", "", "Physics Constructor for fast simulation physics"}
private

Definition at line 43 of file PhysicsListSvc.h.

43{this, "FastSimConstructor", "", "Physics Constructor for fast simulation physics"};

◆ m_generalCut

Gaudi::Property<double> PhysicsListSvc::m_generalCut {this, "GeneralCut", 0, "General cut"}
private

!< Energy cut for neutrons (in the neutron killer process)

Definition at line 51 of file PhysicsListSvc.h.

51{this, "GeneralCut", 0, "General cut"};

◆ m_neutronEnergyCut

Gaudi::Property<double> PhysicsListSvc::m_neutronEnergyCut {this, "NeutronEnergyCut", 0, "Energy cut for neutron killer"}
private

!< Time cut for neutrons (in the neutron killer process)

Definition at line 50 of file PhysicsListSvc.h.

50{this, "NeutronEnergyCut", 0, "Energy cut for neutron killer"};

◆ m_neutronTimeCut

Gaudi::Property<double> PhysicsListSvc::m_neutronTimeCut {this, "NeutronTimeCut", 0, "Time cut for neutron killer"}
private

!< Name for the physics list (property to be set in the tool)

Definition at line 49 of file PhysicsListSvc.h.

49{this, "NeutronTimeCut", 0, "Time cut for neutron killer"};

◆ m_phys_decay

ToolHandleArray<IPhysicsOptionTool> PhysicsListSvc::m_phys_decay {this, "PhysicsDecay", {}, "Tool handle array of physics decays"}
private

Definition at line 46 of file PhysicsListSvc.h.

46{this, "PhysicsDecay", {}, "Tool handle array of physics decays"};

◆ m_phys_option

ToolHandleArray<IPhysicsOptionTool> PhysicsListSvc::m_phys_option {this, "PhysOption", {}, "Tool handle array of physics options" }
private

Definition at line 45 of file PhysicsListSvc.h.

45{this, "PhysOption", {}, "Tool handle array of physics options" };

◆ m_physicsList

G4VModularPhysicsList* PhysicsListSvc::m_physicsList {}
private

Definition at line 47 of file PhysicsListSvc.h.

47{};

◆ m_physicsListName

Gaudi::Property<std::string> PhysicsListSvc::m_physicsListName {this, "PhysicsList", "FTFP_BERT", "Name for physics list"}
private

!< Handle on the physics list

Definition at line 48 of file PhysicsListSvc.h.

48{this, "PhysicsList", "FTFP_BERT", "Name for physics list"};

◆ m_quietMode

Gaudi::Property<bool> PhysicsListSvc::m_quietMode {this, "QuietMode", false, ""}
private

!< Switch for the G4 "apply cuts" EM physics flag

Definition at line 62 of file PhysicsListSvc.h.

62{this, "QuietMode", false, ""};

◆ m_unstableAntiNeutrons

Gaudi::Property<bool> PhysicsListSvc::m_unstableAntiNeutrons {this, "UnstableAntiNeutrons",false,"Bugfix for ATLASSIM-6634 until we switch to using Geant4 11"}
private

Definition at line 63 of file PhysicsListSvc.h.

63{this, "UnstableAntiNeutrons",false,"Bugfix for ATLASSIM-6634 until we switch to using Geant4 11"};

The documentation for this class was generated from the following files: