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
G3toG4BuildTree.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// $Id$
28//
29// modified by I. Hrivnacova, 2.8.99
30
31#include "globals.hh"
32#include "G3toG4BuildTree.hh"
33#include "G3RotTable.hh"
34#include "G3MedTable.hh"
35#include "G3VolTable.hh"
36#include "G3SensVolVector.hh"
37#include "G3Pos.hh"
38#include "G4LogicalVolume.hh"
39#include "G4PVPlacement.hh"
41#include "G4Transform3D.hh"
42
44{
45 G3toG4BuildLVTree(curVTE, motherVTE);
46 G3toG4BuildPVTree(curVTE);
47}
48
50{
51 // check existence of the solid
52 if (curVTE->GetSolid()) {
53 G4LogicalVolume* curLog = curVTE->GetLV();
54 if (!curLog) {
55 // skip creating logical volume
56 // in case it already exists
57
58 // material
59 G4Material* material = 0;
60 G3MedTableEntry* mte = G3Med.get(curVTE->GetNmed());
61 if (mte) material = mte->GetMaterial();
62 if (!material) {
63 G4String err_message = "VTE " + curVTE->GetName()
64 + " has not defined material!!";
65 G4Exception("G3toG4BuildLVTree()", "G3toG40001",
66 FatalException, err_message);
67 return;
68 }
69
70 // logical volume
71 curLog =
72 new G4LogicalVolume(curVTE->GetSolid(), material, curVTE->GetName());
73 curVTE->SetLV(curLog);
74
75 // insert logical volume to G3SensVol vector
76 // in case it is sensitive
77 if (mte->GetISVOL()) G3SensVol.push_back(curLog);
78 }
79 }
80 else {
81 if ( !(curVTE->GetDivision() && motherVTE->GetMasterClone() == motherVTE &&
82 motherVTE->GetNoClones()>1)) {
83 // ignore dummy vte's
84 // (this should be the only case when the vte is dummy but
85 // is present in mother <-> daughters tree
86 G4String err_message = "VTE " + curVTE->GetName()
87 + " has not defined solid!!";
88 G4Exception("G3toG4BuildLVTree()", "G3toG40002",
89 FatalException, err_message);
90 return;
91 }
92 }
93
94 // process daughters
95 G4int Ndau = curVTE->GetNoDaughters();
96 for (int Idau=0; Idau<Ndau; Idau++){
97 G3toG4BuildLVTree(curVTE->GetDaughter(Idau), curVTE);
98 }
99}
100
102{
103 // check existence of the solid
104 if (curVTE->GetSolid()) {
105 G4LogicalVolume* curLog = curVTE->GetLV();
106
107 // positions in motherVTE
108 for (G4int i=0; i<curVTE->NPCopies(); i++){
109
110 G3Pos* theG3Pos = curVTE->GetG3PosCopy(i);
111 if (theG3Pos) {
112
113 // loop over all mothers
114 for (G4int im=0; im<curVTE->GetNoMothers(); im++) {
115
116 G3VolTableEntry* motherVTE = curVTE->GetMother(im);
117 if (theG3Pos->GetMotherName() == motherVTE->GetMasterClone()->GetName()) {
118
119 // get mother logical volume
120 G4LogicalVolume* mothLV=0;
121 G4String motherName = motherVTE->GetName();
122 if (!curVTE->FindMother(motherName)) continue;
123 if (curVTE->FindMother(motherName)->GetName() != motherName) {
124 // check consistency - tbr
125 G4String err_message =
126 "G3toG4BuildTree: Inconsistent mother <-> daughter !!";
127 G4Exception("G3toG4BuildPVTree()", "G3toG40003",
128 FatalException, err_message);
129 return;
130 }
131 mothLV = motherVTE->GetLV();
132
133 // copy number
134 // (in G3 numbering starts from 1 but in G4 from 0)
135 G4int copyNo = theG3Pos->GetCopy() - 1;
136
137 // position it if not top-level volume
138
139 if (mothLV != 0) {
140
141 // transformation
142 G4int irot = theG3Pos->GetIrot();
143 G4RotationMatrix* theMatrix = 0;
144 if (irot>0) theMatrix = G3Rot.Get(irot);
145 G4Rotate3D rotation;
146 if (theMatrix) {
147 rotation = G4Rotate3D(*theMatrix);
148 }
149
150 #ifndef G3G4_NO_REFLECTION
151 G4Translate3D translation(*(theG3Pos->GetPos()));
152 G4Transform3D transform3D = translation * (rotation.inverse());
153
155 ->Place(transform3D, // transformation
156 curVTE->GetName(), // PV name
157 curLog, // its logical volume
158 mothLV, // mother logical volume
159 false, // only
160 copyNo); // copy
161 #else
162 new G4PVPlacement(theMatrix, // rotation matrix
163 *(theG3Pos->GetPos()), // its position
164 curLog, // its LogicalVolume
165 curVTE->GetName(), // PV name
166 mothLV, // Mother LV
167 0, // only
168 copyNo); // copy
169 #endif
170
171 // verbose
172 #ifdef G3G4DEBUG
173 G4cout << "PV: " << i << "th copy of " << curVTE->GetName()
174 << " in " << motherVTE->GetName() << " copyNo: "
175 << copyNo << " irot: " << irot << " pos: "
176 << *(theG3Pos->GetPos()) << G4endl;
177 #endif
178 }
179 }
180 }
181 // clear this position
182 curVTE->ClearG3PosCopy(i);
183 i--;
184 }
185 }
186
187 // divisions
188 if (curVTE->GetDivision()) {
189 curVTE->GetDivision()->CreatePVReplica();
190 // verbose
191 #ifdef G3G4DEBUG
192 G4cout << "CreatePVReplica: " << curVTE->GetName()
193 << " in " << curVTE->GetMother()->GetName() << G4endl;
194 #endif
195
196 // clear this divison
197 curVTE->ClearDivision();
198 }
199 }
200
201 // process daughters
202 G4int Ndau = curVTE->GetNoDaughters();
203 for (int Idau=0; Idau<Ndau; Idau++){
204 G3toG4BuildPVTree(curVTE->GetDaughter(Idau));
205 }
206}
207
G3G4DLL_API G3MedTable G3Med
Definition: clparse.cc:56
G3G4DLL_API G3RotTable G3Rot
Definition: clparse.cc:57
G3G4DLL_API G3SensVolVector G3SensVol
Definition: clparse.cc:61
void G3toG4BuildTree(G3VolTableEntry *curVTE, G3VolTableEntry *motherVTE)
void G3toG4BuildLVTree(G3VolTableEntry *curVTE, G3VolTableEntry *motherVTE)
void G3toG4BuildPVTree(G3VolTableEntry *curVTE)
@ FatalException
HepGeom::Rotate3D G4Rotate3D
int G4int
Definition: G4Types.hh:66
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
void CreatePVReplica()
Definition: G3Division.cc:126
G4Material * GetMaterial() const
G4int GetISVOL() const
G3MedTableEntry * get(G4int id) const
Definition: G3MedTable.cc:44
Definition: G3Pos.hh:44
G4ThreeVector * GetPos()
Definition: G3Pos.cc:73
G4int GetCopy()
Definition: G3Pos.cc:68
G4String & GetMotherName()
Definition: G3Pos.cc:58
G4int GetIrot()
Definition: G3Pos.cc:63
G4RotationMatrix * Get(G4int id) const
Definition: G3RotTable.cc:44
G3VolTableEntry * FindMother(const G4String &vname)
G3VolTableEntry * GetMasterClone()
G3VolTableEntry * GetMother(G4int i)
G4VSolid * GetSolid()
G3Division * GetDivision()
void ClearG3PosCopy(G4int copy)
G4LogicalVolume * GetLV()
void SetLV(G4LogicalVolume *lv)
G3Pos * GetG3PosCopy(G4int copy=0)
G3VolTableEntry * GetDaughter(G4int i)
static G4ReflectionFactory * Instance()
G4PhysicalVolumesPair Place(const G4Transform3D &transform3D, const G4String &name, G4LogicalVolume *LV, G4LogicalVolume *motherLV, G4bool isMany, G4int copyNo, G4bool surfCheck=false)
Transform3D inverse() const
Definition: Transform3D.cc:142
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41