ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4FieldManager.hh
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4FieldManager.hh
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 // G4FieldManager
27 //
28 // Class description:
29 //
30 // A class to manage (Store) a pointer to the Field subclass that
31 // describes the field of a detector (magnetic, electric or other).
32 // Also stores a reference to the chord finder.
33 //
34 // The G4FieldManager class exists to allow the user program to specify
35 // the electric, magnetic and/or other field(s) of the detector.
36 //
37 // A field manager can be set to a logical volume (or to more than one),
38 // in order to vary its field from that of the world. In this manner
39 // a zero or constant field can override a global field, a more or
40 // less exact version can override the external approximation, lower
41 // or higher precision for tracking can be specified, a different
42 // stepper can be chosen for different volumes, ...
43 //
44 // It also stores a pointer to the ChordFinder object that can do the
45 // propagation in this field. All geometrical track "advancement"
46 // in the field is handled by this ChordFinder object.
47 //
48 // G4FieldManager allows the other classes/object (of the MagneticField
49 // & other class categories) to find out whether a detector field object
50 // exists and what that object is.
51 //
52 // The Chord Finder must be created either by calling CreateChordFinder
53 // for a Magnetic Field or by the user creating a a Chord Finder object
54 // "manually" and setting this pointer.
55 //
56 // A default FieldManager is created by the singleton class
57 // G4NavigatorForTracking and exists before main is called.
58 // However a new one can be created and given to G4NavigatorForTracking.
59 //
60 // Our current design envisions that one Field manager is
61 // valid for each region detector.
62 //
63 // It is expected that a particular geometrical region has a Field manager.
64 // By default a Field Manager is created for the world volume, and
65 // will be utilised for all volumes unless it is overridden by a 'local'
66 // field manager.
67 // Note also that a region with both electric E and magnetic B field will
68 // have these treated as one field.
69 // Similarly it could be extended to treat other fields as additional
70 // components of a single field type.
71 
72 // Author: John Apostolakis, 10.03.97 - design and implementation
73 // -------------------------------------------------------------------
74 #ifndef G4FIELDMANAGER_HH
75 #define G4FIELDMANAGER_HH 1
76 
77 #include "globals.hh"
78 
79 class G4Field;
80 class G4MagneticField;
81 class G4ChordFinder;
82 class G4Track; // Forward reference for parameter configuration
83 
85 {
86  public: // with description
87 
88  G4FieldManager(G4Field* detectorField = nullptr,
89  G4ChordFinder* pChordFinder = nullptr,
90  G4bool b = true ); // fieldChangesEnergy is taken from field
91  // General constructor for any field.
92  // -> Must be set with field and chordfinder for use.
93  G4FieldManager(G4MagneticField* detectorMagneticField);
94  // Creates ChordFinder
95  // -> Assumes pure magnetic field (so energy constant)
96 
97  virtual ~G4FieldManager();
98 
99  G4FieldManager(const G4FieldManager&) = delete;
100  G4FieldManager& operator=(const G4FieldManager&) = delete;
101 
102  G4bool SetDetectorField(G4Field* detectorField, G4int failMode = 0);
103  // Pushes the field to the equation.
104  // Failure to push the field (due to absence of a chord finder, driver,
105  // stepper or equation) is
106  // - '0' = quiet : Do not complain if chordFinder == 0
107  // (It will still warn for other error.)
108  // - '1' = warn : a warning if anything is missing
109  // - '2'/else = FATAL : a fatal error for all other values.
110  // Returns success (true) or failure (false)
111 
112  inline void ProposeDetectorField(G4Field* detectorField);
113  // Pushes the field to this class only -- no further.
114  // Should be used to initialise this field, only *before* creating
115  // the chord finder and its dependent classes.
116  // User is then responsible to ensure that:
117  // i) an equation, stepper, driver and chord finder are created
118  // ii) this field is used by the equation.
119 
120  inline void ChangeDetectorField(G4Field* detectorField);
121  // Pushes the field to the equation ( & keeps its address )
122  // Can be used only once the equation, stepper, driver and chord finder
123  // have all been created. Else it is an error.
124 
125  inline const G4Field* GetDetectorField() const;
126  inline G4bool DoesFieldExist() const;
127  // Set, get and check the field object
128 
129  void CreateChordFinder(G4MagneticField* detectorMagField);
130  inline void SetChordFinder(G4ChordFinder* aChordFinder);
131  inline G4ChordFinder* GetChordFinder();
132  inline const G4ChordFinder* GetChordFinder() const;
133  // Create, set or get the associated Chord Finder
134 
135  virtual void ConfigureForTrack( const G4Track * );
136  // Setup the choice of the configurable parameters
137  // relying on the current track's energy, particle identity, ..
138  // Note: in addition to the values of member variables,
139  // a user can use this to change the ChordFinder, the field, ...
140 
141  public: // with description
142 
143  inline G4double GetDeltaIntersection() const;
144  // Accuracy for boundary intersection.
145 
146  inline G4double GetDeltaOneStep() const;
147  // Accuracy for one tracking/physics step.
148 
149  inline void SetAccuraciesWithDeltaOneStep(G4double valDeltaOneStep);
150  // Sets both accuracies, maintaining a fixed ratio for accuracies
151  // of volume Intersection and Integration (in One Step)
152 
153  inline void SetDeltaOneStep(G4double valueD1step);
154  // Set accuracy for integration of one step. (only)
155  inline void SetDeltaIntersection(G4double valueDintersection);
156  // Set accuracy of intersection of a volume. (only)
157 
158  inline G4double GetMinimumEpsilonStep() const;
159  inline void SetMinimumEpsilonStep( G4double newEpsMin );
160  // Minimum for Relative accuracy of a Step
161 
162  inline G4double GetMaximumEpsilonStep() const;
163  inline void SetMaximumEpsilonStep( G4double newEpsMax );
164  // Maximum for Relative accuracy of a Step
165 
166  inline G4bool DoesFieldChangeEnergy() const;
167  inline void SetFieldChangesEnergy(G4bool value);
168  // For electric field this should be true
169  // For magnetic field this should be false
170 
171  virtual G4FieldManager* Clone() const;
172  // Needed for multi-threading, create a clone of this object
173 
174  private:
175 
177  // Check whether field/equation change the energy,
178  // and sets the data member accordingly
179  // Note: does not handle special cases - this must be done
180  // separately (e.g. magnetic monopole in B field )
181 
182  private:
183 
186  // Dependent objects -- with state that depends on tracking
187 
188  G4bool fAllocatedChordFinder = false; // Did we used "new" to
189  // create fChordFinder ?
190  // INVARIANTS of tracking ---------------------------------------
191  //
192  // 1. 'CONSTANTS' - default values for accuracy parameters
193  //
194  const G4double fEpsilonMinDefault= 5.0e-5; // Expected: 5.0e-5 to 1.0e-10 ...
195  const G4double fEpsilonMaxDefault= 1.0e-3; // Expected: 1.0e-3 to 1.0e-8 ...
196 
197  static G4double fDefault_Delta_One_Step_Value; // = 0.01 * millimeter;
198  static G4double fDefault_Delta_Intersection_Val; // = 0.001 * millimeter;
199  // Default values for accuracy parameters
200 
201  // 2. CHARACTERISTIC of field
202  //
204 
205  // 3. PARAMETERS that determine the accuracy of integration or intersection
206  //
207  G4double fDelta_One_Step_Value; // for one tracking/physics step
208  G4double fDelta_Intersection_Val; // for boundary intersection
209  // Values for the required accuracies
210 
213  // Values for the small possible relative accuracy of a step
214  // (corresponding to the greatest possible integration accuracy)
215 };
216 
217 // Implementation of inline functions
218 
219 #include "G4FieldManager.icc"
220 
221 #endif