Geant4 10.7.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4VPhysicalVolume.cc
Go to the documentation of this file.
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// class G4VPhysicalVolume Implementation
27//
28// 15.01.13, G.Cosmo, A.Dotti: Modified for thread-safety for MT
29// 28.08.96, P.Kent: Replaced transform by rotmat + vector
30// 25.07.96, P.Kent: Modified interface for new `Replica' capable geometry
31// 24.07.95, P.Kent: First non-stub version
32// --------------------------------------------------------------------
33
34#include "G4VPhysicalVolume.hh"
35
37#include "G4LogicalVolume.hh"
38
39// This new field helps to use the class G4PVManager
40//
42
43// These macros change the references to fields that are now encapsulated
44// in the class G4PVData.
45//
46#define G4MT_rot ((subInstanceManager.offset[instanceID]).frot)
47#define G4MT_tx ((subInstanceManager.offset[instanceID]).tx)
48#define G4MT_ty ((subInstanceManager.offset[instanceID]).ty)
49#define G4MT_tz ((subInstanceManager.offset[instanceID]).tz)
50#define G4MT_pvdata (subInstanceManager.offset[instanceID])
51
52// Constructor: init parameters and register in Store
53//
55 const G4ThreeVector& tlate,
56 const G4String& pName,
57 G4LogicalVolume* pLogical,
59 : flogical(pLogical), fname(pName)
60{
62
63 this->SetRotation( pRot ); // G4MT_rot = pRot;
64 this->SetTranslation( tlate ); // G4MT_trans = tlate;
65
66 // Initialize 'Shadow' data structure - for use by object persistency
67 pvdata = new G4PVData();
68 pvdata->frot = pRot;
69 pvdata->tx = tlate.x();
70 pvdata->ty = tlate.y();
71 pvdata->tz = tlate.z();
72
74}
75
76// Fake default constructor - sets only member data and allocates memory
77// for usage restricted to object persistency.
78//
80 : fname("")
81{
82 // Register to store
83 //
85
87}
88
89// Destructor - remove from Store
90//
92{
93 delete pvdata;
95}
96
97// This method is similar to the constructor. It is used by each worker
98// thread to achieve the same effect as that of the master thread exept
99// to register the new created instance. This method is invoked explicitly.
100// It does not create a new G4VPhysicalVolume instance.
101// It only assign the value for the fields encapsulated by the class G4PVData.
102//
104InitialiseWorker( G4VPhysicalVolume* /*pMasterObject*/,
105 G4RotationMatrix *pRot,
106 const G4ThreeVector &tlate)
107{
109
110 this->SetRotation( pRot ); // G4MT_rot = pRot;
111 this->SetTranslation( tlate ); // G4MT_trans = tlate;
112 // G4PhysicalVolumeStore::Register(this);
113}
114
115// Release memory allocated for offset
116//
118{
120}
121
122// This method is similar to the destructor. It is used by each worker
123// thread to achieve the partial effect as that of the master thread.
124// For G4VPhysicalVolume instances, nothing more to do here.
125//
127{
128}
129
130// Returns the private data instance manager.
131//
133{
134 return subInstanceManager;
135}
136
138{
139 return 1;
140}
141
143{
145}
146
148{
149 G4MT_tx=vec.x(); G4MT_ty=vec.y(); G4MT_tz=vec.z();
150}
151
153{
154 return G4MT_rot;
155}
156
158{
159 return G4MT_rot;
160}
161
163{
164 G4MT_rot = pRot;
165}
166
168{
169 static G4RotationMatrix aRotM;
170 static G4RotationMatrix IdentityRM;
171
172 G4RotationMatrix* retval = &IdentityRM;
173
174 // Insure against frot being a null pointer
175 if(this->GetRotation())
176 {
177 aRotM = GetRotation()->inverse();
178 retval= &aRotM;
179 }
180 return retval;
181}
182
184{
185 G4RotationMatrix aRotM; // Initialised to identity
186
187 // Insure against G4MT_rot being a null pointer
188 if(G4MT_rot)
189 {
190 aRotM = G4MT_rot->inverse();
191 }
192 return aRotM;
193}
194
196{
198}
199
201{
202 return G4MT_rot;
203}
204
206{
208}
209
210// Only implemented for placed and parameterised volumes.
211// Not required for replicas.
212//
214{
215 return false;
216}
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
#define G4MT_ty
#define G4MT_tz
#define G4MT_tx
#define G4MT_rot
double z() const
double x() const
double y() const
HepRotation inverse() const
G4int CreateSubInstance()
void SlaveCopySubInstanceArray()
G4RotationMatrix * frot
static void Register(G4VPhysicalVolume *pSolid)
static void DeRegister(G4VPhysicalVolume *pSolid)
static G4GEOM_DLL G4PVManager subInstanceManager
const G4RotationMatrix * GetRotation() const
G4RotationMatrix * GetObjectRotation() const
const G4ThreeVector GetTranslation() const
G4VPhysicalVolume(G4RotationMatrix *pRot, const G4ThreeVector &tlate, const G4String &pName, G4LogicalVolume *pLogical, G4VPhysicalVolume *pMother)
G4ThreeVector GetFrameTranslation() const
virtual G4bool CheckOverlaps(G4int res=1000, G4double tol=0., G4bool verbose=true, G4int errMax=1)
G4RotationMatrix GetObjectRotationValue() const
virtual G4int GetMultiplicity() const
const G4RotationMatrix * GetFrameRotation() const
void TerminateWorker(G4VPhysicalVolume *pMasterObject)
virtual ~G4VPhysicalVolume()
void SetTranslation(const G4ThreeVector &v)
void SetRotation(G4RotationMatrix *)
G4ThreeVector GetObjectTranslation() const
static const G4PVManager & GetSubInstanceManager()
void InitialiseWorker(G4VPhysicalVolume *pMasterObject, G4RotationMatrix *pRot, const G4ThreeVector &tlate)