BDSIM
BDSIM is a Geant4 extension toolkit for simulation of particle transport in accelerator beamlines.
Loading...
Searching...
No Matches
BDSNavigatorPlacements.cc
1/*
2Beam Delivery Simulation (BDSIM) Copyright (C) Royal Holloway,
3University of London 2001 - 2023.
4
5This file is part of BDSIM.
6
7BDSIM is free software: you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published
9by the Free Software Foundation version 3 of the License.
10
11BDSIM is distributed in the hope that it will be useful, but
12WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with BDSIM. If not, see <http://www.gnu.org/licenses/>.
18*/
19#include "BDSDebug.hh"
20#include "BDSNavigatorPlacements.hh"
21
22#include "G4AffineTransform.hh"
23#include "G4Navigator.hh"
24#include "G4ThreeVector.hh"
25
26#include <utility>
27
28G4Navigator* BDSNavigatorPlacements::navigator = new G4Navigator();
30G4VPhysicalVolume* BDSNavigatorPlacements::worldPV = nullptr;
31
32BDSNavigatorPlacements::BDSNavigatorPlacements():
33 globalToLocal(G4AffineTransform()),
34 localToGlobal(G4AffineTransform())
35{
36 numberOfInstances++;
37}
38
39BDSNavigatorPlacements::~BDSNavigatorPlacements()
40{
41 // Only delete static navigator objects when last instance is deleted
42 if (numberOfInstances == 1)
43 {
44 delete navigator; navigator = nullptr;
45 }
47}
48
49void BDSNavigatorPlacements::ResetNavigatorStates()
50{
51 navigator->ResetStackAndState();
52}
53
54G4ThreeVector BDSNavigatorPlacements::ConvertToLocal(const G4ThreeVector& globalPosition,
55 G4bool& foundAPlacementVolume) const
56{
57 foundAPlacementVolume = InitialiseTransform(globalPosition);
58 if (!foundAPlacementVolume)
59 {return G4ThreeVector();}
60 return globalToLocal.TransformPoint(globalPosition);
61}
62
63G4ThreeVector BDSNavigatorPlacements::ConvertToLocalNoSetup(const G4ThreeVector& globalPosition) const
64{
65 return globalToLocal.TransformPoint(globalPosition);
66}
67
68G4ThreeVector BDSNavigatorPlacements::ConvertAxisToGlobal(const G4ThreeVector& localAxis) const
69{
70 return localToGlobal.TransformAxis(localAxis);
71}
72
73std::pair<G4ThreeVector, G4ThreeVector> BDSNavigatorPlacements::ConvertAxisToGlobal(const std::pair<G4ThreeVector, G4ThreeVector>& localAxis) const
74{
75 G4ThreeVector globalB = localToGlobal.TransformAxis(localAxis.first);
76 G4ThreeVector globalE = localToGlobal.TransformAxis(localAxis.second);
77 return std::make_pair(globalB, globalE);
78}
79
80G4bool BDSNavigatorPlacements::InitialiseTransform(const G4ThreeVector& globalPosition) const
81{
82 G4VPhysicalVolume* foundPVVolume = navigator->LocateGlobalPointAndSetup(globalPosition);
83 if (foundPVVolume == worldPV)
84 {return false;}
85 globalToLocal = navigator->GetGlobalToLocalTransform();
86 localToGlobal = navigator->GetLocalToGlobalTransform();
87 return true; // found a placement volume ok
88}
G4bool InitialiseTransform(const G4ThreeVector &globalPosition) const
G4ThreeVector ConvertToLocalNoSetup(const G4ThreeVector &globalPosition) const
Similar to above function but does NOT initialise the transforms.
G4ThreeVector ConvertToLocal(const G4ThreeVector &globalPosition, G4bool &foundAPlacementVolume) const
G4ThreeVector ConvertAxisToGlobal(const G4ThreeVector &localAxis) const
static G4VPhysicalVolume * worldPV
Cache of world PV to test if we're getting the wrong volume for the transform.
static G4Navigator * navigator