Geant4-11
Functions
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 G4gspos (G4String vname, G4int num, G4String vmoth, G4double x, G4double y, G4double z, G4int irot, G4String vonly)
 
void PG4gspos (G4String *tokens)
 

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 193 of file G4gsposp.cc.

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 += gSeparator;
273 newName = newName + index;
274
275 // update vteClone
276 vteClone->SetName(newName);
277 vteClone->SetSolid(solid);
278 vteClone->SetHasNegPars(negpars);
279
280 // let vte and vol table know about it
281 G3Vol.PutVTE(vteClone);
282 vte->AddClone(vteClone);
283
284 // add aG3Pos to the vteClone
285 vteClone->AddG3Pos(aG3Pos);
286 mvteClone->AddDaughter(vteClone);
287 vteClone->AddMother(mvteClone);
288
289 // copy all daughters
290 G4CloneDaughters(vte, vteClone);
291
292 // retrieve daughters parameters
293 if (!negpars) G4ProcessDaughters(vteClone);
294 }
295 }
296}
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
static constexpr double cm
Definition: G4SIunits.hh:99
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

References G3VolTableEntry::AddClone(), G3VolTableEntry::AddDaughter(), G3VolTableEntry::AddG3Pos(), G3VolTableEntry::AddMother(), cm, G3NegVolPars(), G3toG4MakeSolid(), G3Vol, G4CloneDaughters(), G4ProcessDaughters(), G3VolTableEntry::GetClone(), G3VolTableEntry::GetName(), G3VolTableEntry::GetNmed(), G3VolTableEntry::GetNoClones(), G3VolTableEntry::GetNpar(), G3VolTableEntry::GetRpar(), G3VolTableEntry::GetShape(), gSeparator, G3VolTable::PutVTE(), G3VolTableEntry::SetHasNegPars(), G3VolTableEntry::SetName(), and G3VolTableEntry::SetSolid().

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:193
G3VolTableEntry * GetVTE(const G4String &Vname)
Definition: G3VolTable.cc:53

References G3VolTableEntry::AddDaughter(), G3VolTableEntry::AddG3Pos(), G3VolTableEntry::AddMother(), cm, FatalException, G3Vol, G4CreateCloneVTE(), G4Exception(), G3VolTableEntry::GetClone(), G3VolTableEntry::GetNoClones(), G3VolTableEntry::GetNpar(), G3VolTableEntry::GetRpar(), G3VolTable::GetVTE(), and G3VolTableEntry::HasNegPars().

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)

References G3fillParams(), G4gspos(), Ipar, G4InuclParticleNames::name(), PTgspos, Rpar, and Spar.

Referenced by G3CLEval().