ATLAS Offline Software
Loading...
Searching...
No Matches
GlobalFieldManagerTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
3*/
4
5// Main header
7
8// Local package include
10
11// Geant4 includes
12#include "G4ChordFinder.hh"
13#include "G4FieldManager.hh"
14#include "G4MagIntegratorStepper.hh"
15#include "G4MagneticField.hh"
16#include "G4PropagatorInField.hh"
17#include "G4TransportationManager.hh"
18#include "G4Version.hh"
19#include "G4VIntegrationDriver.hh"
20
21//-----------------------------------------------------------------------------
22// Tool constructor
23//-----------------------------------------------------------------------------
25 const std::string& name,
26 const IInterface* parent)
27 : G4FieldManagerToolBase(type, name, parent)
28{
29}
30
31//-----------------------------------------------------------------------------
32// Initialize a field manager
33//-----------------------------------------------------------------------------
35{
36 ATH_MSG_DEBUG("initializeField");
37
38 if (m_fieldOn) {
39
40 // Retrieve the G4MagneticField
41 G4MagneticField* field = m_fieldSvc->getField();
42
43 // Retrieve the global field manager
44 auto transpManager = G4TransportationManager::GetTransportationManager();
45
46 auto* field_manager = [&] () -> G4FieldManager* {
48 // In the case of tight stepping we need to make our own global field manager
49 // Create a new field manager
50 auto* stepping_field_manager = new TightMuonSteppingFieldManager();
51
52 // Assign it to the global field manager
53 transpManager->SetFieldManager(stepping_field_manager);
54 return stepping_field_manager;
55 } else {
56 // Otherwise get the default from the transportation manager
57 return transpManager->GetFieldManager();
58 }
59 }();
60
61 // Configure the field manager
62 field_manager->SetDetectorField(field);
63 ATH_CHECK( setFieldParameters(field_manager) );
64
65 // Create and configure the ChordFinder
66 field_manager->CreateChordFinder(field);
67
68#if G4VERSION_NUMBER < 1040
69 ATH_MSG_DEBUG("Old style stepper setting");
70 G4MagIntegratorStepper* stepper = getStepper(m_integratorStepper, field);
71 G4MagInt_Driver* magDriver = field_manager->GetChordFinder()->GetIntegrationDriver();
72 magDriver->RenewStepperAndAdjust(stepper);
73#else
74 ATH_MSG_DEBUG("New style stepper setting");
75 G4VIntegrationDriver* driver = createDriverAndStepper(m_integratorStepper, field);
76 G4ChordFinder* chordFinder = field_manager->GetChordFinder();
77 chordFinder->SetIntegrationDriver(driver);
78#endif
79
80 // Configure the propagator
81 G4PropagatorInField* propagator = transpManager->GetPropagatorInField();
82 if (m_maxStep>0) propagator->SetLargestAcceptableStep(m_maxStep);
83 }
84
85 return StatusCode::SUCCESS;
86}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x)
StatusCode setFieldParameters(G4FieldManager *fieldMgr) const
Common method to apply configuredfield parameters.
G4MagIntegratorStepper * getStepper(const std::string &stepperType, G4MagneticField *field) const
Common method to construct a stepper of requested type.
Gaudi::Property< double > m_maxStep
ServiceHandle< IG4FieldSvc > m_fieldSvc
Handle to the G4 field service.
Gaudi::Property< bool > m_fieldOn
G4FieldManagerToolBase(const std::string &type, const std::string &name, const IInterface *parent)
Standard constructor.
Gaudi::Property< std::string > m_integratorStepper
The type of stepper to use.
Gaudi::Property< bool > m_useTightMuonStepping
Tight muon stepping parameters via the field manager's configure for track.
GlobalFieldManagerTool(const std::string &type, const std::string &name, const IInterface *parent)
Standard constructor.
StatusCode initializeField() override final
Initialize a field manager.
G4FieldManager that sets tight stepping for muons; caches global values for other particles.