19#ifndef BDSAUXILIARYNAVIGATOR_H
20#define BDSAUXILIARYNAVIGATOR_H
22#include "BDSMagnetStrength.hh"
25#include "G4AffineTransform.hh"
26#include "G4Navigator.hh"
27#include "G4ThreeVector.hh"
28#include "G4Transform3D.hh"
32class G4VPhysicalVolume;
79 static void RegisterCurvilinearBridgeWorld(G4VPhysicalVolume* curvilinearBridgeWorldPVIn)
82 static void ResetNavigatorStates();
86 const G4ThreeVector* direction =
nullptr,
87 const G4bool pRelativeSearch =
true,
88 const G4bool ignoreDirection =
true,
89 G4bool useCurvilinear =
true)
const;
95 G4bool useCurvilinear =
true)
const;
102 G4bool useCurvilinear =
true)
const;
112 const G4ThreeVector& globalDirection,
113 const G4double stepLength = 0,
114 const G4bool useCurvilinear =
true,
115 const G4double marginLength = 1)
const;
122 const G4ThreeVector& localDirection,
123 const G4bool useCurvilinear =
true)
const;
129 const G4bool useCurvilinear =
true)
const;
133 const G4bool useCurvilinear =
true)
const;
137 const G4bool useCurvilinear =
true)
const;
145 const G4bool useCurvilinear =
true)
const;
151 const G4double globalAxis[3],
152 const G4bool useCurvilinear =
true)
const;
156 const G4ThreeVector& globalAxis,
157 const G4bool useCurvilinear =
true)
const;
164 const G4bool useCurvilinear =
true)
const;
170 std::pair<G4ThreeVector, G4ThreeVector>
ConvertAxisToGlobal(
const std::pair<G4ThreeVector, G4ThreeVector>& localAxis,
171 const G4bool useCurvilinear =
true)
const;
176 const G4bool useCurvilinear =
true)
const;
181 const G4ThreeVector& localAxis,
182 const G4bool useCurvilinear =
true)
const;
187 const G4ThreeVector& localPosition,
188 const G4bool useCurvilinear =
true)
const;
193 const G4ThreeVector& unitField,
194 const G4double angle,
195 const G4ThreeVector& position,
196 const G4ThreeVector& unitMomentum,
198 const G4bool useCurvilinearWorld,
200 const G4double tilt = 0);
203 const G4ThreeVector& unitMomentum,
205 const G4bool useCurvilinearWorld);
207 BDSStep CurvilinearToGlobal(
const G4ThreeVector& localPosition,
208 const G4ThreeVector& localMomentum,
209 const G4bool useCurvilinearWorld);
211 BDSStep CurvilinearToGlobal(
const G4double fieldArcLength,
212 const G4ThreeVector& unitField,
213 const G4double angle,
214 const G4ThreeVector& CLPosition,
215 const G4ThreeVector& CLMomentum,
216 const G4bool useCurvilinearWorld,
218 const G4double tilt = 0);
221 mutable G4AffineTransform globalToLocal;
222 mutable G4AffineTransform localToGlobal;
223 mutable G4AffineTransform globalToLocalCL;
224 mutable G4AffineTransform localToGlobalCL;
225 mutable G4bool bridgeVolumeWasUsed;
243 G4Navigator*
Navigator(G4bool curvilinear)
const;
246 const G4AffineTransform&
GlobalToLocal(G4bool curvilinear)
const;
247 const G4AffineTransform&
LocalToGlobal(G4bool curvilinear)
const;
250 void InitialiseTransform(
const G4bool massworld =
true,
251 const G4bool curvilinearWorld =
true)
const;
259 void InitialiseTransform(
const G4ThreeVector& globalPosition)
const;
265 void InitialiseTransform(
const G4ThreeVector& globalPosition,
266 const G4ThreeVector& globalMomentum,
267 const G4double stepLength);
Extra G4Navigator to get coordinate transforms.
G4ThreeVector ConvertToGlobal(const G4ThreeVector &localPosition, const G4bool useCurvilinear=true) const
static G4VPhysicalVolume * curvilinearBridgeWorldPV
Cache of world PV to test if we're getting the wrong volume for the transform.
G4VPhysicalVolume * LocateGlobalPointAndSetup(const G4ThreeVector &point, const G4ThreeVector *direction=nullptr, const G4bool pRelativeSearch=true, const G4bool ignoreDirection=true, G4bool useCurvilinear=true) const
A wrapper for the underlying static navigator instance located within this class.
BDSStep GlobalToCurvilinear(const G4double fieldArcLength, const G4ThreeVector &unitField, const G4double angle, const G4ThreeVector &position, const G4ThreeVector &unitMomentum, const G4double h, const G4bool useCurvilinearWorld, const G4double FCof, const G4double tilt=0)
G4Navigator * Navigator(G4bool curvilinear) const
Utility function to select appropriate navigator.
static G4VPhysicalVolume * worldPV
Cache of world PV to test if we're getting the wrong volume for the transform.
G4ThreeVector ConvertAxisToLocal(const G4ThreeVector &globalAxis, const G4bool useCurvilinear=true) const
static G4int numberOfInstances
BDSStep ConvertToGlobalStep(const G4ThreeVector &localPosition, const G4ThreeVector &localDirection, const G4bool useCurvilinear=true) const
static G4Navigator * auxNavigator
G4ThreeVector ConvertToLocalNoSetup(const G4ThreeVector &globalPosition, const G4bool useCurvilinear=true) const
Similar to above function but does NOT initialise the transforms.
static void AttachWorldVolumeToNavigatorCL(G4VPhysicalVolume *curvilinearWorldPVIn)
G4ThreeVector ConvertAxisToGlobal(const G4ThreeVector &localAxis, const G4bool useCurvilinear=true) const
static G4Navigator * auxNavigatorCLB
static G4Navigator * auxNavigatorCL
const G4AffineTransform & LocalToGlobal(G4bool curvilinear) const
Utility function to select appropriate transform.
static G4VPhysicalVolume * curvilinearWorldPV
Cache of world PV to test if we're getting the wrong volume for the transform.
BDSStep ConvertToLocal(G4Step const *const step, G4bool useCurvilinear=true) const
static void AttachWorldVolumeToNavigator(G4VPhysicalVolume *worldPVIn)
Setup the navigator w.r.t. to a world volume - typically real world.
const G4AffineTransform & GlobalToLocal(G4bool curvilinear) const
Utility function to select appropriate transform.
A simple class to represent the positions of a step.