Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4ReflectionFactory.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 G4ReflectionFactory
31//
32// Class description:
33//
34// Class providing functions for volumes placements with a general
35// transfomation that can contain reflection.
36// Reflection is then applied to a solid: a new G4ReflectedSolid
37// instance is created and is placed with a transformation containing
38// pure rotation and translation only.
39// The pair of constituent and reflected logical volumes is
40// considered as a generalized logical volume that is addressed
41// by user specifying the constituent logical volume.
42//
43// Decomposition of a general transformation that can include reflection
44// in a "reflection-free" transformation:
45//
46// x(inM') = TG*x(inM) TG - general transformation
47// = T*(R*x(inM)) T - "reflection-free" transformation
48// = T* x(inReflM)
49//
50// Daughters transformation:
51// When a volume V containing daughter D with transformation TD
52// is placed in mother M with a general tranformation TGV,
53// the TGV is decomposed. New reflected volume ReflV containing
54// a new daughter ReflD with reflected transformation ReflTD is created:
55//
56// x(inV) = TD * x(inD);
57// x(inM) = TGV * x(inV)
58// = TV * R * x(inV)
59// = TV * R * TD * x(inD)
60// = TV * R*TD*R-1 * R*x(inD)
61// = TV * ReflTD * x(inReflD)
62
63// Author: Ivana Hrivnacova, 16.10.2001 (Ivana.Hrivnacova@cern.ch)
64// --------------------------------------------------------------------
65#ifndef G4_REFLECTION_FACTORY_HH
66#define G4_REFLECTION_FACTORY_HH
67
68#include "G4Types.hh"
69#include "G4Transform3D.hh"
70#include "geomdefs.hh"
71
72#include <map>
73
75class G4LogicalVolume;
76class G4VSolid;
78
79typedef std::pair<G4VPhysicalVolume*,
81typedef std::map<G4LogicalVolume*, G4LogicalVolume*,
82 std::less<G4LogicalVolume*> > G4ReflectedVolumesMap;
83
85{
86 typedef G4ReflectedVolumesMap::const_iterator LogicalVolumesMapIterator;
87
88 public: // with description
89
90 virtual ~G4ReflectionFactory();
91 // Virtual destructor.
92
94 // Gets pointer to the instance of the singleton.
95
96 G4PhysicalVolumesPair Place(const G4Transform3D& transform3D,
97 const G4String& name,
99 G4LogicalVolume* motherLV,
100 G4bool isMany,
101 G4int copyNo,
102 G4bool surfCheck=false);
103 // Evaluates the passed transformation; if it contains reflection
104 // it performs its decomposition, creates new reflected solid and
105 // logical volume (or retrieves them from a map if the reflected
106 // objects were already created), transforms the daughters (if present)
107 // and place it in the given mother.
108 // The result is a pair of physical volumes;
109 // the second physical volume is a placement in a reflected mother
110 // or 0 if mother LV was not reflected.
111
113 G4LogicalVolume* LV,
114 G4LogicalVolume* motherLV,
115 EAxis axis,
116 G4int nofReplicas,
117 G4double width,
118 G4double offset=0);
119 // Creates replica in the given mother.
120 // The result is a pair of physical volumes;
121 // the second physical volume is a replica in a reflected mother
122 // or 0 if mother LV was not reflected.
123
125 G4LogicalVolume* LV,
126 G4LogicalVolume* motherLV,
127 EAxis axis,
128 G4int nofDivisions,
129 G4double width,
130 G4double offset);
132 G4LogicalVolume* LV,
133 G4LogicalVolume* motherLV,
134 EAxis axis,
135 G4int nofDivisions,
136 G4double offset);
138 G4LogicalVolume* LV,
139 G4LogicalVolume* motherLV,
140 EAxis axis,
141 G4double width,
142 G4double offset);
143 // Creates division in the given mother.
144 // The result is a pair of physical volumes;
145 // the second physical volume is a division in a reflected mother
146 // or 0 if mother LV was not reflected.
147
148 void SetVerboseLevel(G4int verboseLevel);
149 G4int GetVerboseLevel() const;
150 // Sets/gets verbosity level.
151
152 void SetVolumesNameExtension(const G4String& nameExtension);
153 const G4String& GetVolumesNameExtension() const;
154 // Returns the name extension for the reflected solids
155 // and logical volumes.
156
157 void SetScalePrecision(G4double scaleValue);
159 // Sets/gets precision factor for the scale consistency check
160 // The default value is set to 10*kCarTolerance.
161
163 // Returns the consituent volume of the given reflected volume,
164 // 0 if the given reflected volume was not found.
165
167 // Returns the reflected volume of the given consituent volume,
168 // 0 if the given volume was not reflected.
169
171 // Returns true if the given volume has been already reflected
172 // (is in the map of constituent volumes).
173
175 // Returns true if the given volume is a reflected volume
176 // (is in the map reflected volumes).
177
179 // Returns a handle to the internal map of volumes which have
180 // been reflected, after that placement or replication is performed.
181
182 void Reset();
183 // Resets maps of constituent and reflected volumes.
184 // To be used exclusively when volumes are removed from the stores.
185
186 protected:
187
189 // Protected singleton constructor.
190
193 // Disabled copy constructor and assignment operator.
194
195 private:
196
197 G4LogicalVolume* ReflectLV(G4LogicalVolume* LV, G4bool surfCheck=false);
198 // Gets/creates the reflected solid and logical volume
199 // and copies + transforms LV daughters.
200
201 G4LogicalVolume* CreateReflectedLV(G4LogicalVolume* LV);
202 // Creates the reflected solid and logical volume
203 // and add the logical volumes pair in the maps.
204
205 void ReflectDaughters(G4LogicalVolume* LV,
206 G4LogicalVolume* refLV, G4bool surfCheck=false);
207 // Reflects daughters recursively.
208
209 void ReflectPVPlacement(G4VPhysicalVolume* PV,
210 G4LogicalVolume* refLV, G4bool surfCheck=false);
211 // Copies and transforms daughter of PVPlacement type of
212 // a constituent volume into a reflected volume.
213
214 void ReflectPVReplica(G4VPhysicalVolume* PV, G4LogicalVolume* refLV);
215 // Copies and transforms daughter of PVReplica type of
216 // a constituent volume into a reflected volume.
217
218 void ReflectPVDivision(G4VPhysicalVolume* PV, G4LogicalVolume* refLV);
219 // Copies and transforms daughter of PVDivision type of
220 // a constituent volume into a reflected volume.
221
222 void ReflectPVParameterised(G4VPhysicalVolume* PV,
223 G4LogicalVolume* refLV, G4bool surfCheck=false);
224 // Not implemented yet.
225 // Should copy and transform daughter of PVReplica type of
226 // a constituent volume into a reflected volume.
227
228 G4bool IsReflection(const G4Scale3D& scale) const;
229 // Returns true if the scale is negative, false otherwise.
230
231 void CheckScale(const G4Scale3D& scale) const;
232 // Checks if scale correspond to fScale, if not gives exception.
233
234 G4VPVDivisionFactory* GetPVDivisionFactory() const;
235 // Checks if the division factory is instanciated,
236 // if not gives exception.
237
238 void PrintConstituentLVMap();
239 // Temporary - for debugging purpose.
240
241 private:
242
243 static G4ReflectionFactory* fInstance;
244 static const G4String fDefaultNameExtension;
245 static const G4Scale3D fScale;
246 G4double fScalePrecision;
247
248 G4int fVerboseLevel;
249 G4String fNameExtension;
250 G4ReflectedVolumesMap fConstituentLVMap;
251 G4ReflectedVolumesMap fReflectedLVMap;
252};
253
254#endif
std::map< G4LogicalVolume *, G4LogicalVolume *, std::less< G4LogicalVolume * > > G4ReflectedVolumesMap
std::pair< G4VPhysicalVolume *, G4VPhysicalVolume * > G4PhysicalVolumesPair
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
const G4String & GetVolumesNameExtension() const
G4bool IsReflected(G4LogicalVolume *lv) const
G4PhysicalVolumesPair Divide(const G4String &name, G4LogicalVolume *LV, G4LogicalVolume *motherLV, EAxis axis, G4int nofDivisions, G4double width, G4double offset)
G4LogicalVolume * GetReflectedLV(G4LogicalVolume *lv) const
static G4ReflectionFactory * Instance()
void SetVerboseLevel(G4int verboseLevel)
G4double GetScalePrecision() const
G4PhysicalVolumesPair Place(const G4Transform3D &transform3D, const G4String &name, G4LogicalVolume *LV, G4LogicalVolume *motherLV, G4bool isMany, G4int copyNo, G4bool surfCheck=false)
G4bool IsConstituent(G4LogicalVolume *lv) const
G4ReflectionFactory(const G4ReflectionFactory &)
void SetScalePrecision(G4double scaleValue)
G4PhysicalVolumesPair Replicate(const G4String &name, G4LogicalVolume *LV, G4LogicalVolume *motherLV, EAxis axis, G4int nofReplicas, G4double width, G4double offset=0)
const G4ReflectedVolumesMap & GetReflectedVolumesMap() const
G4LogicalVolume * GetConstituentLV(G4LogicalVolume *reflLV) const
G4ReflectionFactory & operator=(const G4ReflectionFactory &)
void SetVolumesNameExtension(const G4String &nameExtension)
EAxis
Definition: geomdefs.hh:54