Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4gsposp.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// by I.Hrivnacova, 13.10.99
30
31#include "G3G4Interface.hh"
32#include "G3toG4.hh"
33#include "G3VolTable.hh"
34#include "G3toG4MakeSolid.hh"
35#include "G3Division.hh"
36#include "G4SystemOfUnits.hh"
37#include "G4VSolid.hh"
38
39G4bool G3NegVolPars(G4double pars[], G4int *nparpt,
40 G3VolTableEntry* vte, G3VolTableEntry* mvte, const char routine[]);
41
42void PG4gsposp(G4String *tokens){
43 // fill the parameter containers
44 G3fillParams(tokens,PTgsposp);
45
46 // interpret the parameters
47 G4String name = Spar[0];
48 G4String moth = Spar[1];
49 G4String only = Spar[2];
50 G4int num = Ipar[0];
51 G4int irot = Ipar[1];
52 G4int npar = Ipar[2];
53 // all parameters are passed to G4gsxxx methods
54 // in G3 default units
55 //G4double x = Rpar[0]*cm;
56 //G4double y = Rpar[1]*cm;
57 //G4double z = Rpar[2]*cm;
58 G4double x = Rpar[0];
59 G4double y = Rpar[1];
60 G4double z = Rpar[2];
61 G4double *pars = &Rpar[3];
62
63 G4gsposp(name, num, moth, x, y, z, irot, only, pars, npar);
64}
65
67// restore negative volume parameters and create solid for all
68// vte daughters
69{
70 if (vte->HasNegPars()) {
71 G4cerr << " Warning:" << G4endl;
72 G4cerr << " G4ProcessDaughters: Ignored (vte has negative parameters)."
73 << G4endl;
74 }
75 else {
76 for (G4int i=0; i<vte->GetNoDaughters(); i++) {
77
78 G3VolTableEntry* dvte = vte->GetDaughter(i);
79
80 if (dvte->HasNegPars()) {
81 if (dvte->GetDivision()) {
82 // call division method for creating solid and updating
83 // dvte parameters
84 dvte->GetDivision()->UpdateVTE();
85 }
86 else {
87 // update negative parameters
88 G4double* pars = dvte->GetRpar();
89 G4int npar = dvte->GetNpar();
90 G4bool negpars
91 = G3NegVolPars(pars,&npar, dvte, vte, "GSPOS");
92
93 if (negpars) {
94 G4String text = "G3NegVolPars still returns negative parameters!";
95 G4Exception("G4ProcessDaughters()", "G3toG40019",
96 FatalException, text);
97 return;
98 }
99
100 // create solid
101 G4bool hasNegPars;
102 G4bool deferred;
103 G4bool okAxis[3];
104 G4VSolid* solid
105 = G3toG4MakeSolid(dvte->GetName(), dvte->GetShape(), pars, npar,
106 hasNegPars, deferred, okAxis);
107 if (hasNegPars) {
108 G4String text = "G3toG4MakeSolid still returns negative parameters!";
109 G4Exception("G4ProcessDaughters()", "G3toG40020",
110 FatalException, text);
111 return;
112 }
113
114 // update dvte
115 dvte->SetNRpar(npar, pars);
116 dvte->SetSolid(solid);
117 dvte->SetHasNegPars(hasNegPars);
118 }
119
120 // process daughters
121 G4ProcessDaughters(dvte);
122 }
123 }
124 }
125}
126
128// copy vte daughters to vteClone
129// (in case of daughters with negative parameters
130// or with divisions new clone copies have to be created)
131{
132 G4int nofDaughters = vte->GetNoDaughters();
133 if (nofDaughters>0)
134 for (G4int id=0; id<nofDaughters; id++) {
135 G3VolTableEntry* dvte = vte->GetDaughter(id);
136
137 if (dvte->HasNegPars() || dvte->GetDivision()){
138 // create new dvteClone with Position/Division
139 // and set it to vteClone
140
141 // get master of dvte
142 G3VolTableEntry* dvteMaster = dvte->GetMasterClone();
143
144 // generate vteClone name
145 G4int cloneNo = dvteMaster->GetNoClones();
146 char index[5]; sprintf(index,"%d",cloneNo);
147 G4String newName = dvteMaster->GetName();
148 newName.append(gSeparator); newName = newName + index;
149
150 // create dvteClone
151 G4String dvteShape = dvte->GetShape();
152 G4double* dvteRpar = dvte->GetRpar();
153 G4int dvteNpar = dvte->GetNpar();
154 G4int dvteNmed = dvte->GetNmed();
155 G4bool hasNegPars = dvte->HasNegPars();
156 G3VolTableEntry* dvteClone
157 = new G3VolTableEntry(newName, dvteShape, dvteRpar, dvteNpar,
158 dvteNmed, 0, hasNegPars);
159
160 // let dvte master and vol table know about it
161 G3Vol.PutVTE(dvteClone);
162 dvteMaster->AddClone(dvteClone);
163
164 // set mother daughter
165 vteClone->AddDaughter(dvteClone);
166 dvteClone->AddMother(vteClone);
167
168 // copy positions
169 G4int nofPositions = dvte->NPCopies();
170 for (G4int ip=0; ip<nofPositions; ip++)
171 dvteClone->AddG3Pos(dvte->GetG3PosCopy(ip));
172
173 // copy division
174 G3Division* dvteDivision = dvte->GetDivision();
175 if (dvteDivision) {
176 G3Division* dvteCloneDivision
177 = new G3Division(dvteClone, vteClone, *dvteDivision);
178 dvteClone->SetDivision(dvteCloneDivision);
179 dvteCloneDivision->UpdateVTE();
180 }
181
182 // clone daughters recursively
183 G4CloneDaughters(dvte, dvteClone);
184 }
185 else {
186 // set dvte to vteClone
187 vteClone->AddDaughter(dvte);
188 dvte->AddMother(vteClone);
189 }
190 }
191}
192
194 G4double pars[], G4int npar, G4int num,
195 G4double x, G4double y, G4double z, G4int irot, G4String vonly)
196//
197// create a new vte clone copy for each mother
198// and derive its parameters from the mother if possible
199{
200 // create a G3Pos
201 G4ThreeVector* offset = new G4ThreeVector(x*cm, y*cm, z*cm);
202 G3Pos* aG3Pos = new G3Pos(mvte->GetName(), num, offset, irot, vonly);
203
204 // loop over all mothers
205 for (G4int i=0; i<mvte->GetNoClones(); i++) {
206 // mvte was retrieved from its "master" name
207 // -> there is no need to call GetMasterClone()
208 G3VolTableEntry* mvteClone = mvte->GetClone(i);
209
210 G4String tmpName = "TRY";
211 G4String vteShape = vte->GetShape();
212 G3VolTableEntry* vteClone
213 = new G3VolTableEntry(tmpName, vteShape, pars, npar, vte->GetNmed(),
214 0, true);
215
216 // negative parameters will be updated only
217 // for vteClone, pars are unchanged
218 G4double* clonePars = vteClone->GetRpar();
219 G4int cloneNpar = vteClone->GetNpar();
220 G4bool negpars
221 = G3NegVolPars(clonePars, &cloneNpar, vteClone, mvteClone, "GSPOS");
222 vteClone->SetHasNegPars(negpars);
223
224 G3VolTableEntry* vteSameClone = 0;
225 G4VSolid* solid = 0;
226 if (!negpars) {
227 // check if vteClone with the same parameters exist
228 for (G4int ic=0; ic<vte->GetNoClones(); ic++) {
229 G3VolTableEntry* checkClone = vte->GetClone(ic);
230 G4int checkNpar = checkClone->GetNpar();
231 G4double* checkPars = checkClone->GetRpar();
232
233 G4bool isSame;
234 if (checkNpar != cloneNpar)
235 isSame = false;
236 else {
237 isSame = true;
238 for (G4int ip=0; ip<cloneNpar; ip++)
239 if (checkPars[ip] != clonePars[ip]) {
240 isSame = false;
241 break;
242 }
243 }
244 if (isSame) { vteSameClone = checkClone; break; }
245 }
246
247 if (vteSameClone) {
248 delete vteClone;
249
250 // add aG3Pos to the vteClone
251 vteSameClone->AddG3Pos(aG3Pos);
252 mvteClone->AddDaughter(vteSameClone);
253 vteSameClone->AddMother(mvteClone);
254 }
255 else {
256 // create the solid
257 G4bool hasNegPars;
258 G4bool deferred;
259 G4bool okAxis[3];
260 G4String vteName = vte->GetName();
261 G4String cloneShape = vteClone->GetShape();
262 solid = G3toG4MakeSolid(vteName, cloneShape, clonePars, cloneNpar,
263 hasNegPars, deferred, okAxis);
264 }
265 }
266
267 if ( negpars || !(vteSameClone)) {
268 // generate vteClone name
269 G4int cloneNo = vte->GetNoClones();
270 char index[5]; sprintf(index,"%d",cloneNo);
271 G4String newName = vte->GetName();
272 newName.append(gSeparator); newName = newName + index;
273
274 // update vteClone
275 vteClone->SetName(newName);
276 vteClone->SetSolid(solid);
277 vteClone->SetHasNegPars(negpars);
278
279 // let vte and vol table know about it
280 G3Vol.PutVTE(vteClone);
281 vte->AddClone(vteClone);
282
283 // add aG3Pos to the vteClone
284 vteClone->AddG3Pos(aG3Pos);
285 mvteClone->AddDaughter(vteClone);
286 vteClone->AddMother(mvteClone);
287
288 // copy all daughters
289 G4CloneDaughters(vte, vteClone);
290
291 // retrieve daughters parameters
292 if (!negpars) G4ProcessDaughters(vteClone);
293 }
294 }
295}
296
297void G4gsposp(G4String vname, G4int num, G4String vmoth, G4double x,
298 G4double y, G4double z, G4int irot, G4String vonly,
299 G4double pars[], G4int npar)
300{
301 // find VTEs
302 G3VolTableEntry* vte = G3Vol.GetVTE(vname);
303 G3VolTableEntry* mvte = G3Vol.GetVTE(vmoth);
304
305 if (vte == 0) {
306 G4String err_message1 = "G4gsposp: '" + vname + "' has no VolTableEntry";
307 G4Exception("G4psposp()", "G3toG40021", FatalException, err_message1);
308 return;
309 }
310 if (mvte == 0) {
311 G4String err_message2 = "G4gsposp: '" + vmoth + "' has no VolTableEntry";
312 G4Exception("G4psposp()", "G3toG40022", FatalException, err_message2);
313 return;
314 }
315 else {
316 // a new vte clone copy is created for each mother (clone copy)
317 // and its parameters are derived from it if possible
318
319 G4CreateCloneVTE(vte, mvte, pars, npar, num, x, y, z, irot, vonly);
320 }
321}
G3G4DLL_API G3VolTable G3Vol
Definition: clparse.cc:54
G4VSolid * G3toG4MakeSolid(const G4String &vname, const G4String &shape, const G4double *Rpar, const G4int npar, G4bool &NegVolPars, G4bool &Deferred, G4bool *OKAxis)
#define PTgsposp
Definition: G3toG4.hh:54
G3G4DLL_API G4int Ipar[1000]
Definition: clparse.cc:66
void G3fillParams(G4String *tokens, const char *ptypes)
Definition: clparse.cc:219
G3G4DLL_API G4double Rpar[1000]
Definition: clparse.cc:67
G3G4DLL_API G4String Spar[1000]
Definition: clparse.cc:68
G3G4DLL_API char gSeparator
@ FatalException
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
void G4CreateCloneVTE(G3VolTableEntry *vte, G3VolTableEntry *mvte, G4double pars[], G4int npar, G4int num, G4double x, G4double y, G4double z, G4int irot, G4String vonly)
Definition: G4gsposp.cc:193
void PG4gsposp(G4String *tokens)
Definition: G4gsposp.cc:42
void G4CloneDaughters(G3VolTableEntry *vte, G3VolTableEntry *vteClone)
Definition: G4gsposp.cc:127
G4bool G3NegVolPars(G4double pars[], G4int *nparpt, G3VolTableEntry *vte, G3VolTableEntry *mvte, const char routine[])
void G4gsposp(G4String vname, G4int num, G4String vmoth, G4double x, G4double y, G4double z, G4int irot, G4String vonly, G4double pars[], G4int npar)
Definition: G4gsposp.cc:297
void G4ProcessDaughters(G3VolTableEntry *vte)
Definition: G4gsposp.cc:66
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cerr
void UpdateVTE()
Definition: G3Division.cc:95
Definition: G3Pos.hh:44
void AddClone(G3VolTableEntry *aDaughter)
void AddMother(G3VolTableEntry *aDaughter)
void SetDivision(G3Division *division)
void SetName(G4String name)
G3VolTableEntry * GetMasterClone()
G3Division * GetDivision()
G3VolTableEntry * GetClone(G4int i)
void AddG3Pos(G3Pos *aG3Pos)
void SetHasNegPars(G4bool hasNegPars)
G4double * GetRpar()
void SetNRpar(G4int npar, G4double *Rpar)
void AddDaughter(G3VolTableEntry *aDaughter)
void SetSolid(G4VSolid *solid)
G3Pos * GetG3PosCopy(G4int copy=0)
G3VolTableEntry * GetDaughter(G4int i)
G3VolTableEntry * PutVTE(G3VolTableEntry *aVTE)
Definition: G3VolTable.cc:76
G3VolTableEntry * GetVTE(const G4String &Vname)
Definition: G3VolTable.cc:54
G4String & append(const G4String &)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41