Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4AssemblyVolume.hh
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//
27// $Id$
28//
29//
30// Class G4AssemblyVolume
31//
32// Class description:
33//
34// G4AssemblyVolume is a helper class to make the build process of geometry
35// easier. It allows to combine several volumes together in an arbitrary way
36// in 3D space and then work with the result as with a single logical volume
37// for placement.
38// The resulting objects are independent copies of each of the assembled
39// logical volumes. The placements are not, however, bound one to each other
40// when placement is done. They are seen as independent physical volumes in
41// space.
42
43// Author: Radovan Chytracek, John Apostolakis, Gabriele Cosmo
44// Date: November 2000
45//
46// History:
47// March 2006, I.Hrivnacova - Extended to support assembly of assemblies
48// of volumes and reflections
49// ----------------------------------------------------------------------
50#ifndef G4_ASSEMBLYVOLUME_H
51#define G4_ASSEMBLYVOLUME_H
52
53#include <vector>
54
55#include "G4Transform3D.hh"
56#include "G4AssemblyTriplet.hh"
57
59
61{
62 public: // with description
63
66 G4ThreeVector& translation,
67 G4RotationMatrix* rotation);
69 //
70 // Constructors & destructor.
71 // At destruction all the generated physical volumes and associated
72 // rotation matrices of the imprints will be destroyed.
73 //
74 // The rotation matrix passed as argument can be 0 (identity) or an address
75 // even of an object on the upper stack frame. During assembly imprint, a
76 // new matrix is created anyway and it is kept track of it so it can be
77 // automatically deleted later at the end of the application.
78 // This policy is adopted since user has no control on the way the
79 // rotations are combined.
80
81 void AddPlacedVolume( G4LogicalVolume* pPlacedVolume,
82 G4ThreeVector& translation,
83 G4RotationMatrix* rotation);
84 //
85 // Place the given volume 'pPlacedVolume' inside the assembly.
86 //
87 // The adopted approach:
88 //
89 // - Place it w.r.t. the assembly coordinate system.
90 // This step is applied to each of the participating volumes.
91 //
92 // The other possible approaches:
93 //
94 // - Place w.r.t. the firstly added volume.
95 // When placed the first, the virtual coordinate system becomes
96 // the coordinate system of the first one.
97 // Every next volume being added into the assembly will be placed
98 // w.r.t to the first one.
99 //
100 // - Place w.r.t the last placed volume.
101 // When placed the first, the virtual coordinate system becomes
102 // the coordinate system of the first one.
103 // Every next volume being added into the assembly will be placed
104 // w.r.t to the previous one.
105 //
106 // The rotation matrix passed as argument can be 0 (identity) or an address
107 // even of an object on the upper stack frame. During assembly imprint, a
108 // new matrix is created anyway and it is kept track of it so it can be
109 // automatically deleted later at the end of the application.
110 // This policy is adopted since user has no control on the way the
111 // rotations are combined.
112
113 void AddPlacedVolume( G4LogicalVolume* pPlacedVolume,
114 G4Transform3D& transformation);
115 //
116 // The same as previous, but takes complete 3D transformation in space
117 // as its argument.
118
119 void AddPlacedAssembly( G4AssemblyVolume* pAssembly,
120 G4Transform3D& transformation);
121 //
122 // The same as previous AddPlacedVolume(), but takes an assembly volume
123 // as its argument.
124
125 void AddPlacedAssembly( G4AssemblyVolume* pAssembly,
126 G4ThreeVector& translation,
127 G4RotationMatrix* rotation);
128 //
129 // The same as above AddPlacedVolume(), but takes an assembly volume
130 // as its argument with translation and rotation.
131
132 void MakeImprint( G4LogicalVolume* pMotherLV,
133 G4ThreeVector& translationInMother,
134 G4RotationMatrix* pRotationInMother,
135 G4int copyNumBase = 0,
136 G4bool surfCheck = false );
137 //
138 // Creates instance of an assembly volume inside the given mother volume.
139
140 void MakeImprint( G4LogicalVolume* pMotherLV,
141 G4Transform3D& transformation,
142 G4int copyNumBase = 0,
143 G4bool surfCheck = false );
144 //
145 // The same as previous Imprint() method, but takes complete 3D
146 // transformation in space as its argument.
147
148 inline std::vector<G4VPhysicalVolume*>::iterator GetVolumesIterator();
149 inline unsigned int TotalImprintedVolumes() const;
150 //
151 // Methods to access the physical volumes imprinted with the assembly.
152
153 unsigned int GetImprintsCount() const;
154 //
155 // Return the number of made imprints.
156
157 unsigned int GetInstanceCount() const;
158 //
159 // Return the number of existing instance of G4AssemblyVolume class.
160
161 unsigned int GetAssemblyID() const;
162 //
163 // Return instance number of this concrete object.
164
165 protected:
166
167 void SetInstanceCount( unsigned int value );
168 void SetAssemblyID( unsigned int value );
169
170 void InstanceCountPlus();
171 void InstanceCountMinus();
172
173 void SetImprintsCount( unsigned int value );
176 //
177 // Internal counting mechanism, used to compute unique the names of
178 // physical volumes created by MakeImprint() methods.
179
180 private:
181
182 void MakeImprint( G4AssemblyVolume* pAssembly,
183 G4LogicalVolume* pMotherLV,
184 G4Transform3D& transformation,
185 G4int copyNumBase = 0,
186 G4bool surfCheck = false );
187 //
188 // Function for placement of the given assembly in the given mother
189 // (called recursively if the assembly contains an assembly).
190
191 private:
192
193 std::vector<G4AssemblyTriplet> fTriplets;
194 //
195 // Participating volumes represented as a vector of
196 // <logical volume, translation, rotation>.
197
198 std::vector<G4VPhysicalVolume*> fPVStore;
199 //
200 // We need to keep list of physical volumes created by MakeImprint() method
201 // in order to be able to cleanup the objects when not needed anymore.
202 // This requires the user to keep assembly objects in memory during the
203 // whole job or during the life-time of G4Navigator, logical volume store
204 // and physical volume store keep pointers to physical volumes generated by
205 // the assembly volume.
206 // When an assembly object is about to die it will destroy all its
207 // generated physical volumes and rotation matrices as well !
208
209 unsigned int fImprintsCounter;
210 //
211 // Number of imprints of the given assembly volume.
212
213 static unsigned int fsInstanceCounter;
214 //
215 // Class instance counter.
216
217 unsigned int fAssemblyID;
218 //
219 // Assembly object ID derived from instance counter at construction time.
220
221};
222
223#include "G4AssemblyVolume.icc"
224
225#endif // G4_ASSEMBLYVOLUME_H
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
unsigned int GetImprintsCount() const
void MakeImprint(G4LogicalVolume *pMotherLV, G4ThreeVector &translationInMother, G4RotationMatrix *pRotationInMother, G4int copyNumBase=0, G4bool surfCheck=false)
std::vector< G4VPhysicalVolume * >::iterator GetVolumesIterator()
void ImprintsCountMinus()
unsigned int TotalImprintedVolumes() const
void SetAssemblyID(unsigned int value)
void AddPlacedAssembly(G4AssemblyVolume *pAssembly, G4Transform3D &transformation)
unsigned int GetAssemblyID() const
void SetInstanceCount(unsigned int value)
void AddPlacedVolume(G4LogicalVolume *pPlacedVolume, G4ThreeVector &translation, G4RotationMatrix *rotation)
void ImprintsCountPlus()
void SetImprintsCount(unsigned int value)
unsigned int GetInstanceCount() const