Geant4-11
G4Mesh.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//
27//
28//
29// John Allison May 2021
30//
31// G4Mesh encapsulates and validates a nested parameterisation, which we
32// call a "mesh". If a valid mesh cannot be created out of this
33// G4VPhysicalVolume* (which will probably be most common), it will
34// have a type "invalid". Then, usually, it may simply be destroyed.
35// The overhead of an invalid attempt is expected to be small.
36
37#include "G4Mesh.hh"
38
39#include "G4VPhysicalVolume.hh"
40#include "G4LogicalVolume.hh"
41#include "G4PVParameterised.hh"
43#include "G4Box.hh"
44#include "G4Tubs.hh"
45#include "G4Sphere.hh"
46
47std::map<G4int,G4String> G4Mesh::fEnumMap;
48
50: fpContainerVolume(containerVolume)
51, fMeshType(invalid)
52, fMeshDepth(0)
53, fTransform(transform)
54{
55 if (fpContainerVolume == nullptr) return;
56
57 static G4bool first = true;
58 if (first) {
59 first = false;
60 fEnumMap[invalid] = "invalid";
61 fEnumMap[rectangle] = "rectangle";
62 fEnumMap[cylinder] = "cylinder";
63 fEnumMap[sphere] = "sphere";
64 }
65
67
68 // check if this is a container for a nested parameterisation
69 G4bool isContainer = false;
70 if (pLV->GetNoDaughters()) {
71 fMeshDepth++;
72 const auto d0 = pLV->GetDaughter(0);
73 const auto d0LV = d0->GetLogicalVolume();
74 if (d0LV->GetNoDaughters()) {
75 fMeshDepth++;
76 const auto d00 = d0LV->GetDaughter(0);
77 const auto pvParam00 = dynamic_cast<G4PVParameterised*>(d00);
78 if (pvParam00) {
79 const auto param00 = pvParam00->GetParameterisation();
80 const auto nestedParam00 = dynamic_cast<G4VNestedParameterisation*>(param00);
81 if (nestedParam00) { // 2-deep mesh
82 isContainer = true;
83 }
84 } else {
85 const auto d00LV = d00->GetLogicalVolume();
86 if (d00LV->GetNoDaughters()) {
87 fMeshDepth++;
88 const auto d000 = d00LV->GetDaughter(0);
89 const auto pvParam000 = dynamic_cast<G4PVParameterised*>(d000);
90 if (pvParam000) {
91 const auto param000 = pvParam000->GetParameterisation();
92 const auto nestedParam000 = dynamic_cast<G4VNestedParameterisation*>(param000);
93 if (nestedParam000) { // 3-deep mesh
94 isContainer = true;
95 }
96 }
97 }
98 }
99 }
100 }
101 if (isContainer) {
102 // Get type
103 G4VSolid* pSol = pLV -> GetSolid ();
104 if (dynamic_cast<G4Box*>(pSol)) {
106 } else if (dynamic_cast<G4Tubs*>(pSol)) {
108 } else if (dynamic_cast<G4Sphere*>(pSol)) {
110 }
111 }
112}
113
115
116std::ostream& operator << (std::ostream& os, const G4Mesh& mesh) {
117 os << "G4Mesh: ";
118 os << "\nContainer: " << mesh.GetContainerVolume()->GetName();
119 os << "\nType: " << mesh.GetEnumMap().find(mesh.GetMeshType())->second;
120 os << "\nDepth: " << mesh.GetMeshDepth();
121 os << "\nTranslation: " << mesh.GetTransform().getTranslation();
122 os << "\nRotation: " << mesh.GetTransform().getRotation();
123 return os;
124}
const G4DNABoundingBox invalid
bool G4bool
Definition: G4Types.hh:86
Definition: G4Box.hh:56
size_t GetNoDaughters() const
G4VPhysicalVolume * GetDaughter(const G4int i) const
Definition: G4Mesh.hh:47
const std::map< G4int, G4String > & GetEnumMap() const
Definition: G4Mesh.hh:60
virtual ~G4Mesh()
Definition: G4Mesh.cc:114
static std::map< G4int, G4String > fEnumMap
Definition: G4Mesh.hh:67
MeshType GetMeshType() const
Definition: G4Mesh.hh:62
G4VPhysicalVolume * GetContainerVolume() const
Definition: G4Mesh.hh:61
G4int fMeshDepth
Definition: G4Mesh.hh:70
MeshType fMeshType
Definition: G4Mesh.hh:69
const G4Transform3D & GetTransform() const
Definition: G4Mesh.hh:64
@ invalid
Definition: G4Mesh.hh:51
@ rectangle
Definition: G4Mesh.hh:52
@ sphere
Definition: G4Mesh.hh:54
@ cylinder
Definition: G4Mesh.hh:53
G4Mesh(G4VPhysicalVolume *containerVolume, const G4Transform3D &)
Definition: G4Mesh.cc:49
G4VPhysicalVolume * fpContainerVolume
Definition: G4Mesh.hh:68
G4int GetMeshDepth() const
Definition: G4Mesh.hh:63
G4VPVParameterisation * GetParameterisation() const
Definition: G4Tubs.hh:75
G4LogicalVolume * GetLogicalVolume() const
const G4String & GetName() const
std::ostream & operator<<(std::ostream &, const BasicVector3D< float > &)
CLHEP::HepRotation getRotation() const
CLHEP::Hep3Vector getTranslation() const
G4bool transform(G4String &input, const G4String &type)