Geant4 10.7.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4gspos.cc File Reference
#include "G3G4Interface.hh"
#include "G3VolTable.hh"
#include "G3toG4.hh"
#include "G3Pos.hh"
#include "globals.hh"
#include "G4SystemOfUnits.hh"

Go to the source code of this file.

Functions

void G4CreateCloneVTE (G3VolTableEntry *vte, G3VolTableEntry *mvte, G4double pars[], G4int npar, G4int num, G4double x, G4double y, G4double z, G4int irot, G4String vonly)
 
void PG4gspos (G4String *tokens)
 
void G4gspos (G4String vname, G4int num, G4String vmoth, G4double x, G4double y, G4double z, G4int irot, G4String vonly)
 

Function Documentation

◆ G4CreateCloneVTE()

void G4CreateCloneVTE ( G3VolTableEntry vte,
G3VolTableEntry mvte,
G4double  pars[],
G4int  npar,
G4int  num,
G4double  x,
G4double  y,
G4double  z,
G4int  irot,
G4String  vonly 
)

Definition at line 192 of file G4gsposp.cc.

198{
199 // create a G3Pos
200 G4ThreeVector* offset = new G4ThreeVector(x*cm, y*cm, z*cm);
201 G3Pos* aG3Pos = new G3Pos(mvte->GetName(), num, offset, irot, vonly);
202
203 // loop over all mothers
204 for (G4int i=0; i<mvte->GetNoClones(); i++) {
205 // mvte was retrieved from its "master" name
206 // -> there is no need to call GetMasterClone()
207 G3VolTableEntry* mvteClone = mvte->GetClone(i);
208
209 G4String tmpName = "TRY";
210 G4String vteShape = vte->GetShape();
211 G3VolTableEntry* vteClone
212 = new G3VolTableEntry(tmpName, vteShape, pars, npar, vte->GetNmed(),
213 0, true);
214
215 // negative parameters will be updated only
216 // for vteClone, pars are unchanged
217 G4double* clonePars = vteClone->GetRpar();
218 G4int cloneNpar = vteClone->GetNpar();
219 G4bool negpars
220 = G3NegVolPars(clonePars, &cloneNpar, vteClone, mvteClone, "GSPOS");
221 vteClone->SetHasNegPars(negpars);
222
223 G3VolTableEntry* vteSameClone = 0;
224 G4VSolid* solid = 0;
225 if (!negpars) {
226 // check if vteClone with the same parameters exist
227 for (G4int ic=0; ic<vte->GetNoClones(); ic++) {
228 G3VolTableEntry* checkClone = vte->GetClone(ic);
229 G4int checkNpar = checkClone->GetNpar();
230 G4double* checkPars = checkClone->GetRpar();
231
232 G4bool isSame;
233 if (checkNpar != cloneNpar)
234 isSame = false;
235 else {
236 isSame = true;
237 for (G4int ip=0; ip<cloneNpar; ip++)
238 if (checkPars[ip] != clonePars[ip]) {
239 isSame = false;
240 break;
241 }
242 }
243 if (isSame) { vteSameClone = checkClone; break; }
244 }
245
246 if (vteSameClone) {
247 delete vteClone;
248
249 // add aG3Pos to the vteClone
250 vteSameClone->AddG3Pos(aG3Pos);
251 mvteClone->AddDaughter(vteSameClone);
252 vteSameClone->AddMother(mvteClone);
253 }
254 else {
255 // create the solid
256 G4bool hasNegPars;
257 G4bool deferred;
258 G4bool okAxis[3];
259 G4String vteName = vte->GetName();
260 G4String cloneShape = vteClone->GetShape();
261 solid = G3toG4MakeSolid(vteName, cloneShape, clonePars, cloneNpar,
262 hasNegPars, deferred, okAxis);
263 }
264 }
265
266 if ( negpars || !(vteSameClone)) {
267 // generate vteClone name
268 G4int cloneNo = vte->GetNoClones();
269 char index[5]; sprintf(index,"%d",cloneNo);
270 G4String newName = vte->GetName();
271 newName.append(gSeparator); newName = newName + index;
272
273 // update vteClone
274 vteClone->SetName(newName);
275 vteClone->SetSolid(solid);
276 vteClone->SetHasNegPars(negpars);
277
278 // let vte and vol table know about it
279 G3Vol.PutVTE(vteClone);
280 vte->AddClone(vteClone);
281
282 // add aG3Pos to the vteClone
283 vteClone->AddG3Pos(aG3Pos);
284 mvteClone->AddDaughter(vteClone);
285 vteClone->AddMother(mvteClone);
286
287 // copy all daughters
288 G4CloneDaughters(vte, vteClone);
289
290 // retrieve daughters parameters
291 if (!negpars) G4ProcessDaughters(vteClone);
292 }
293 }
294}
G3G4DLL_API G3VolTable G3Vol
Definition: clparse.cc:53
G4VSolid * G3toG4MakeSolid(const G4String &vname, const G4String &shape, const G4double *Rpar, const G4int npar, G4bool &NegVolPars, G4bool &Deferred, G4bool *OKAxis)
G3G4DLL_API char gSeparator
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
void G4CloneDaughters(G3VolTableEntry *vte, G3VolTableEntry *vteClone)
Definition: G4gsposp.cc:126
G4bool G3NegVolPars(G4double pars[], G4int *nparpt, G3VolTableEntry *vte, G3VolTableEntry *mvte, const char routine[])
void G4ProcessDaughters(G3VolTableEntry *vte)
Definition: G4gsposp.cc:65
Definition: G3Pos.hh:43
void AddClone(G3VolTableEntry *aDaughter)
void AddMother(G3VolTableEntry *aDaughter)
void SetName(G4String name)
G3VolTableEntry * GetClone(G4int i)
void AddG3Pos(G3Pos *aG3Pos)
void SetHasNegPars(G4bool hasNegPars)
G4double * GetRpar()
void AddDaughter(G3VolTableEntry *aDaughter)
void SetSolid(G4VSolid *solid)
G3VolTableEntry * PutVTE(G3VolTableEntry *aVTE)
Definition: G3VolTable.cc:75
G4String & append(const G4String &)

Referenced by G4gspos(), and G4gsposp().

◆ G4gspos()

void G4gspos ( G4String  vname,
G4int  num,
G4String  vmoth,
G4double  x,
G4double  y,
G4double  z,
G4int  irot,
G4String  vonly 
)

Definition at line 64 of file G4gspos.cc.

66{
67 // find VTEs
68 G3VolTableEntry* vte = G3Vol.GetVTE(vname);
69 G3VolTableEntry* mvte = G3Vol.GetVTE(vmoth);
70
71 if (vte == 0) {
72 G4String text = "G4gspos: '" + vname + "' has no VolTableEntry";
73 G4Exception("G4gspos()", "G3toG40017", FatalException, text);
74 return;
75 }
76 else if (mvte == 0) {
77 G4String text = "G4gspos: '" + vmoth + "' has no VolTableEntry";
78 G4Exception("G4gspos()", "G3toG40018", FatalException, text);
79 return;
80 }
81 else {
82 if (!vte->HasNegPars()) {
83 // position vector
84 G4ThreeVector* offset = new G4ThreeVector(x*cm, y*cm, z*cm);
85
86 // create a G3Pos object and add it to the vte
87 G3Pos* aG3Pos = new G3Pos(vmoth, num, offset, irot, vonly);
88 vte->AddG3Pos(aG3Pos);
89
90 // loop over all mothers
91 for (G4int i=0; i<mvte->GetNoClones(); i++) {
92 // (mvte is retrieved from its "master" name
93 // -> there is no need to call GetMasterClone()
94 G3VolTableEntry* mvteClone = mvte->GetClone(i);
95 vte->AddMother(mvteClone);
96 mvteClone->AddDaughter(vte);
97 }
98 }
99 else {
100 // if vte has neg parameters
101 // a new vte clone copy is created for each mother (clone copy)
102 // and its parameters are derived from it if possible
103
104 G4CreateCloneVTE(vte, mvte, vte->GetRpar(), vte->GetNpar(), num,
105 x, y, z, irot, vonly);
106 }
107 }
108}
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:35
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:192
G3VolTableEntry * GetVTE(const G4String &Vname)
Definition: G3VolTable.cc:53

Referenced by PG4gspos().

◆ PG4gspos()

void PG4gspos ( G4String tokens)

Definition at line 41 of file G4gspos.cc.

42{
43 // fill the parameter containers
44 G3fillParams(tokens,PTgspos);
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 // all parameters are passed to G4gsxxx methods
53 // in G3 default units
54 //G4double x = Rpar[0]*cm;
55 //G4double y = Rpar[1]*cm;
56 //G4double z = Rpar[2]*cm;
57 G4double x = Rpar[0];
58 G4double y = Rpar[1];
59 G4double z = Rpar[2];
60
61 G4gspos(name, num, moth, x, y, z, irot, only);
62}
G3G4DLL_API G4int Ipar[1000]
Definition: clparse.cc:65
void G3fillParams(G4String *tokens, const char *ptypes)
Definition: clparse.cc:218
G3G4DLL_API G4double Rpar[1000]
Definition: clparse.cc:66
G3G4DLL_API G4String Spar[1000]
Definition: clparse.cc:67
#define PTgspos
Definition: G3toG4.hh:52
void G4gspos(G4String vname, G4int num, G4String vmoth, G4double x, G4double y, G4double z, G4int irot, G4String vonly)
Definition: G4gspos.cc:64
const char * name(G4int ptype)

Referenced by G3CLEval().