ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4PhysicalVolumeModel.hh
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4PhysicalVolumeModel.hh
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 //
28 //
29 // John Allison 31st December 1997.
30 //
31 // Class Description:
32 //
33 // Model for physical volumes. It describes a physical volume and its
34 // daughters to any desired depth. Note: the "requested depth" is
35 // specified in the modeling parameters; enum {UNLIMITED = -1}.
36 //
37 // For access to base class information, e.g., modeling parameters,
38 // use GetModelingParameters() inherited from G4VModel. See Class
39 // Description of the base class G4VModel.
40 //
41 // G4PhysicalVolumeModel assumes the modeling parameters have been set
42 // up with meaningful information - default vis attributes and culling
43 // policy in particular.
44 //
45 // The volumes are unpacked and sent to the scene handler. They are,
46 // in effect, "touchables" as defined by G4TouchableHistory. A
47 // touchable is defined not only by its physical volume name and copy
48 // number but also by its position in the geometry hierarchy.
49 //
50 // It is guaranteed that touchables are presented to the scene handler
51 // in top-down hierarchy order, i.e., ancestors first, mothers before
52 // daughters, so the scene handler can be assured that, if it is
53 // building its own scene graph tree, a mother, if any, will have
54 // already been encountered and there will already be a node in place
55 // on which to hang the current volume. But be aware that the
56 // visibility and culling policy might mean that some touchables are
57 // not passed to the scene handler so the drawn tree might have
58 // missing layers. GetFullPVPath allows you to know the full
59 // hierarchy.
60 
61 #ifndef G4PHYSICALVOLUMEMODEL_HH
62 #define G4PHYSICALVOLUMEMODEL_HH
63 
64 #include "G4VModel.hh"
65 #include "G4ModelingParameters.hh"
66 
67 #include "G4VTouchable.hh"
68 #include "G4Transform3D.hh"
69 #include "G4Plane3D.hh"
70 #include <iostream>
71 #include <vector>
72 #include <map>
73 
74 class G4VPhysicalVolume;
75 class G4LogicalVolume;
76 class G4VSolid;
77 class G4Material;
78 class G4VisAttributes;
79 class G4AttDef;
80 class G4AttValue;
81 
83 
84 public: // With description
85 
86  enum {UNLIMITED = -1};
87 
89 
90  // Nested class for identifying physical volume nodes.
92  public:
94  (G4VPhysicalVolume* pPV = 0,
95  G4int iCopyNo = 0,
96  G4int depth = 0,
98  G4bool drawn = true):
99  fpPV(pPV),
100  fCopyNo(iCopyNo),
101  fNonCulledDepth(depth),
103  fDrawn(drawn) {}
105  G4int GetCopyNo() const {return fCopyNo;}
107  const G4Transform3D& GetTransform() const {return fTransform;}
108  G4bool GetDrawn() const {return fDrawn;}
109  void SetDrawn(G4bool drawn) {fDrawn = drawn;}
111  private:
117  };
118 
119  // Nested class for handling nested parameterisations.
121  public:
123  (const std::vector<G4PhysicalVolumeNodeID>& fullPVPath);
124  const G4ThreeVector& GetTranslation(G4int depth) const;
125  const G4RotationMatrix* GetRotation(G4int depth) const;
126  G4VPhysicalVolume* GetVolume(G4int depth) const;
127  G4VSolid* GetSolid(G4int depth) const;
128  G4int GetReplicaNumber(G4int depth) const;
129  G4int GetHistoryDepth() const {return G4int(fFullPVPath.size());}
130  private:
131  const std::vector<G4PhysicalVolumeNodeID>& fFullPVPath;
132  };
133 
134  // Nested struct for encapsulating touchable properties
141  std::vector<G4PhysicalVolumeNodeID> fTouchableBaseFullPVPath;
142  };
143 
145  (G4VPhysicalVolume* = 0,
146  G4int requestedDepth = UNLIMITED,
147  const G4Transform3D& modelTransformation = G4Transform3D(),
148  const G4ModelingParameters* = 0,
149  G4bool useFullExtent = false,
150  const std::vector<G4PhysicalVolumeNodeID>& baseFullPVPath =
151  std::vector<G4PhysicalVolumeNodeID>());
152 
153  virtual ~G4PhysicalVolumeModel ();
154 
156  // The main task of a model is to describe itself to the graphics scene
157  // handler (a object which inherits G4VSceneHandler, which inherits
158  // G4VGraphicsScene).
159 
161  // A description which depends on the current state of the model.
162 
163  G4String GetCurrentTag () const;
164  // A tag which depends on the current state of the model.
165 
167 
169 
170  const G4VSolid* GetClippingSolid () const
171  {return fpClippingSolid;}
172 
174  // Current depth in geom. hierarchy.
175 
177  // Current physical volume.
178 
180  // Current copy number.
181 
183  // Current logical volume.
184 
186  // Current material.
187 
189  // Current transform.
190 
191  const std::vector<G4PhysicalVolumeNodeID>& GetBaseFullPVPath() const
192  {return fBaseFullPVPath;}
193  // Base for this G4PhysicalVolumeModel. It can be empty, which would be the
194  // case for the world volume. But the user may create a G4PhysicalVolumeModel
195  // for a volume anywhere in the tree, in which case the user must provide
196  // the transform (in the constructor) and the base path (SetBaseFullPVPath).
197 
198  const std::vector<G4PhysicalVolumeNodeID>& GetFullPVPath() const
199  {return fFullPVPath;}
200  // Vector of physical volume node identifiers for the current
201  // touchable. It is its path in the geometry hierarchy, similar to
202  // the concept of "touchable history" available from the navigator
203  // during tracking.
204 
205  const std::vector<G4PhysicalVolumeNodeID>& GetDrawnPVPath() const
206  {return fDrawnPVPath;}
207  // Path of the current drawn (non-culled) touchable in terms of
208  // drawn (non-culled) ancestors. It is a vector of physical volume
209  // node identifiers corresponding to the geometry hierarchy actually
210  // selected, i.e., with "culled" volumes NOT included.
211 
213  (const std::vector<G4PhysicalVolumeNodeID>&);
214  // Converts
215 
216  const std::map<G4String,G4AttDef>* GetAttDefs() const;
217  // Attribute definitions for current solid.
218 
219  std::vector<G4AttValue>* CreateCurrentAttValues() const;
220  // Attribute values for current solid. Each must refer to an
221  // attribute definition in the above map; its name is the key. The
222  // user must test the validity of this pointer (it must be non-zero
223  // and conform to the G4AttDefs, which may be checked with
224  // G4AttCheck) and delete the list after use. See
225  // G4XXXStoredSceneHandler::PreAddSolid for how to access and
226  // G4VTrajectory::ShowTrajectory for an example of the use of
227  // G4Atts.
228 
229  void SetRequestedDepth (G4int requestedDepth) {
230  fRequestedDepth = requestedDepth;
231  }
232 
233  void SetClippingSolid (G4VSolid* pClippingSolid) {
234  fpClippingSolid = pClippingSolid;
235  }
236 
238  fClippingMode = mode;
239  }
240 
241  G4bool Validate (G4bool warn);
242  // Validate, but allow internal changes (hence non-const function).
243 
244  void Abort () const {fAbort = true;}
245  // Abort all further traversing.
246 
247  void CurtailDescent() const {fCurtailDescent = true;}
248  // Curtail descent of current branch.
249 
250 protected:
251 
253  G4int requestedDepth,
254  const G4Transform3D&,
256 
258  G4int requestedDepth,
260  G4VSolid*,
261  G4Material*,
262  const G4Transform3D&,
264 
265  virtual void DescribeSolid (const G4Transform3D& theAT,
266  G4VSolid* pSol,
267  const G4VisAttributes* pVisAttribs,
268  G4VGraphicsScene& sceneHandler);
269 
270  void CalculateExtent ();
271 
273  // Data members...
274 
275  G4VPhysicalVolume* fpTopPV; // The physical volume.
276  G4String fTopPVName; // ...of the physical volume.
277  G4int fTopPVCopyNo; // ...of the physical volume.
279  // Requested depth of geom. hierarchy search.
280  G4bool fUseFullExtent; // ...if requested.
281  G4int fCurrentDepth; // Current depth of geom. hierarchy.
282  G4VPhysicalVolume* fpCurrentPV; // Current physical volume.
283  G4int fCurrentPVCopyNo; // Current copy number.
284  G4LogicalVolume* fpCurrentLV; // Current logical volume.
285  G4Material* fpCurrentMaterial; // Current material.
286  G4Transform3D* fpCurrentTransform; // Current transform.
287  std::vector<G4PhysicalVolumeNodeID> fBaseFullPVPath; // Base. May be empty.
288  std::vector<G4PhysicalVolumeNodeID> fFullPVPath; // Starts from base.
289  std::vector<G4PhysicalVolumeNodeID> fDrawnPVPath; // Omits culled volumes.
290  mutable G4bool fAbort; // Abort all further traversing.
291  mutable G4bool fCurtailDescent;// Can be set to curtail descent.
294 
295 private:
296 
297  // Private copy constructor and assigment operator - copying and
298  // assignment not allowed. Keeps CodeWizard happy.
301 };
302 
303 std::ostream& operator<<
304 (std::ostream& os, const G4PhysicalVolumeModel::G4PhysicalVolumeNodeID&);
305 
306 std::ostream& operator<<
307 (std::ostream& os, const std::vector<G4PhysicalVolumeModel::G4PhysicalVolumeNodeID>&);
308 
309 #endif