Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/g3tog4/src/G4gsposp.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /g3tog4/src/G4gsposp.cc (Version 11.3.0) and /g3tog4/src/G4gsposp.cc (Version 5.1.p1)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                    <<   3 // * DISCLAIMER                                                       *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th <<   5 // * The following disclaimer summarizes all the specific disclaimers *
  6 // * the Geant4 Collaboration.  It is provided <<   6 // * of contributors to this software. The specific disclaimers,which *
  7 // * conditions of the Geant4 Software License <<   7 // * govern, are listed with their locations in:                      *
  8 // * LICENSE and available at  http://cern.ch/ <<   8 // *   http://cern.ch/geant4/license                                  *
  9 // * include a list of copyright holders.      << 
 10 // *                                                9 // *                                                                  *
 11 // * Neither the authors of this software syst     10 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     11 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     12 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     13 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file  <<  14 // * use.                                                             *
 16 // * for the full disclaimer and the limitatio << 
 17 // *                                               15 // *                                                                  *
 18 // * This  code  implementation is the result  <<  16 // * This  code  implementation is the  intellectual property  of the *
 19 // * technical work of the GEANT4 collaboratio <<  17 // * GEANT4 collaboration.                                            *
 20 // * By using,  copying,  modifying or  distri <<  18 // * By copying,  distributing  or modifying the Program (or any work *
 21 // * any work based  on the software)  you  ag <<  19 // * based  on  the Program)  you indicate  your  acceptance of  this *
 22 // * use  in  resulting  scientific  publicati <<  20 // * statement, and all its terms.                                    *
 23 // * acceptance of all terms of the Geant4 Sof << 
 24 // *******************************************     21 // ********************************************************************
 25 //                                                 22 //
 26 //                                                 23 //
                                                   >>  24 // $Id: G4gsposp.cc,v 1.15 2002/10/23 17:21:18 gcosmo Exp $
                                                   >>  25 // GEANT4 tag $Name: geant4-05-01-patch-01 $
 27 //                                                 26 //
 28 // by I.Hrivnacova, 13.10.99                       27 // by I.Hrivnacova, 13.10.99
 29                                                    28 
 30 #include "G3G4Interface.hh"                        29 #include "G3G4Interface.hh"
 31 #include "G3toG4.hh"                               30 #include "G3toG4.hh"
 32 #include "G3VolTable.hh"                           31 #include "G3VolTable.hh"
 33 #include "G3toG4MakeSolid.hh"                      32 #include "G3toG4MakeSolid.hh"
 34 #include "G3Division.hh"                           33 #include "G3Division.hh"
 35 #include "G4SystemOfUnits.hh"                  << 
 36 #include "G4VSolid.hh"                             34 #include "G4VSolid.hh"
 37                                                    35 
 38 G4bool G3NegVolPars(G4double pars[], G4int *np     36 G4bool G3NegVolPars(G4double pars[], G4int *nparpt, 
 39           G3VolTableEntry* vte, G3VolTableEntr     37           G3VolTableEntry* vte, G3VolTableEntry* mvte, const char routine[]);          
 40                                                    38 
 41 void PG4gsposp(G4String *tokens){              <<  39 void PG4gsposp(G4String tokens[]){
 42   // fill the parameter containers                 40   // fill the parameter containers
 43   G3fillParams(tokens,PTgsposp);                   41   G3fillParams(tokens,PTgsposp);
 44                                                    42   
 45   // interpret the parameters                      43   // interpret the parameters
 46   G4String name = Spar[0];                         44   G4String name = Spar[0];
 47   G4String moth = Spar[1];                         45   G4String moth = Spar[1];
 48   G4String only = Spar[2];                         46   G4String only = Spar[2];
 49   G4int num = Ipar[0];                             47   G4int num = Ipar[0];
 50   G4int irot = Ipar[1];                            48   G4int irot = Ipar[1];
 51   G4int npar = Ipar[2];                            49   G4int npar = Ipar[2];
 52   // all parameters are passed to G4gsxxx meth     50   // all parameters are passed to G4gsxxx methods
 53   // in G3 default units                           51   // in G3 default units         
 54   //G4double x = Rpar[0]*cm;                       52   //G4double x = Rpar[0]*cm;
 55   //G4double y = Rpar[1]*cm;                       53   //G4double y = Rpar[1]*cm;
 56   //G4double z = Rpar[2]*cm;                       54   //G4double z = Rpar[2]*cm;
 57   G4double x = Rpar[0];                            55   G4double x = Rpar[0];
 58   G4double y = Rpar[1];                            56   G4double y = Rpar[1];
 59   G4double z = Rpar[2];                            57   G4double z = Rpar[2];
 60   G4double *pars = &Rpar[3];                       58   G4double *pars = &Rpar[3];
 61                                                    59   
 62   G4gsposp(name, num, moth, x, y, z, irot, onl     60   G4gsposp(name, num, moth, x, y, z, irot, only, pars, npar);
 63 }                                                  61 }
 64                                                    62 
 65 void G4ProcessDaughters(G3VolTableEntry* vte)      63 void G4ProcessDaughters(G3VolTableEntry* vte)
 66 // restore negative volume parameters and crea     64 // restore negative volume parameters and create solid for all
 67 // vte daughters                                   65 // vte daughters
 68 {                                                  66 {
 69   if (vte->HasNegPars()) {                         67   if (vte->HasNegPars()) {
 70     G4cerr << " Warning:" << G4endl;               68     G4cerr << " Warning:" << G4endl;
 71     G4cerr << " G4ProcessDaughters: Ignored (v     69     G4cerr << " G4ProcessDaughters: Ignored (vte has negative parameters)." 
 72            << G4endl;                              70            << G4endl;
 73   }                                                71   }  
 74   else {                                           72   else {  
 75     for (G4int i=0; i<vte->GetNoDaughters(); i     73     for (G4int i=0; i<vte->GetNoDaughters(); i++) {
 76                                                    74    
 77       G3VolTableEntry* dvte = vte->GetDaughter     75       G3VolTableEntry* dvte = vte->GetDaughter(i);
 78                                                    76 
 79       if (dvte->HasNegPars()) {                    77       if (dvte->HasNegPars()) {
 80         if (dvte->GetDivision()) {                 78         if (dvte->GetDivision()) {
 81            // call division method for creatin     79            // call division method for creating solid and updating
 82            // dvte parameters                      80            // dvte parameters
 83            dvte->GetDivision()->UpdateVTE();       81            dvte->GetDivision()->UpdateVTE();
 84         }                                          82         }
 85         else {                                     83         else {
 86           // update negative parameters            84           // update negative parameters
 87           G4double* pars = dvte->GetRpar();        85           G4double* pars = dvte->GetRpar();
 88           G4int     npar = dvte->GetNpar();        86           G4int     npar = dvte->GetNpar();
 89           G4bool negpars                           87           G4bool negpars 
 90       = G3NegVolPars(pars,&npar, dvte, vte, "G     88       = G3NegVolPars(pars,&npar, dvte, vte, "GSPOS");
 91                                                    89 
 92           if (negpars) {                           90           if (negpars) {
 93             G4String text = "G3NegVolPars stil <<  91             G4String text = "    G4ProcessDaughter:\n"; 
 94             G4Exception("G4ProcessDaughters()" <<  92         text = text + "    G3NegVolPars still returns negative parameters!";
 95                         FatalException, text); <<  93             G4Exception(text);
 96             return;                            << 
 97       }                                            94       }  
 98                                                    95 
 99           // create solid                          96           // create solid
100           G4bool hasNegPars;                       97           G4bool hasNegPars;
101           G4bool deferred;                         98           G4bool deferred;   
102           G4bool okAxis[3];                        99           G4bool okAxis[3];
103           G4VSolid* solid                         100           G4VSolid* solid
104             = G3toG4MakeSolid(dvte->GetName(),    101             = G3toG4MakeSolid(dvte->GetName(), dvte->GetShape(), pars, npar, 
105                         hasNegPars, deferred,     102                         hasNegPars, deferred, okAxis);  
106           if (hasNegPars) {                       103           if (hasNegPars) {
107             G4String text = "G3toG4MakeSolid s << 104             G4String text = "    G4ProcessDaughter:\n"; 
108             G4Exception("G4ProcessDaughters()" << 105         text = text + "    G3toG4MakeSolid still returns negative parameters!";
109                         FatalException, text); << 106             G4Exception(text);
110             return;                            << 
111     }                                             107     }  
112                                                   108 
113           // update dvte                          109           // update dvte        
114           dvte->SetNRpar(npar, pars);             110           dvte->SetNRpar(npar, pars);
115           dvte->SetSolid(solid);                  111           dvte->SetSolid(solid);
116           dvte->SetHasNegPars(hasNegPars);        112           dvte->SetHasNegPars(hasNegPars);
117         }                                         113         }
118                                                   114 
119         // process daughters                      115         // process daughters
120   G4ProcessDaughters(dvte);                       116   G4ProcessDaughters(dvte);  
121       }                                           117       }   
122     }                                             118     }
123   }                                               119   }     
124 }                                                 120 }
125                                                   121     
126 void G4CloneDaughters(G3VolTableEntry* vte, G3    122 void G4CloneDaughters(G3VolTableEntry* vte, G3VolTableEntry* vteClone)
127 // copy vte daughters to vteClone                 123 // copy vte daughters to vteClone
128 // (in case of daughters with negative paramet    124 // (in case of daughters with negative parameters
129 // or with divisions new clone copies have to     125 // or with divisions new clone copies have to be created)
130 {                                                 126 {
131   G4int nofDaughters = vte->GetNoDaughters();     127   G4int nofDaughters = vte->GetNoDaughters();
132   if (nofDaughters>0)                             128   if (nofDaughters>0)
133     for (G4int id=0; id<nofDaughters; id++) {     129     for (G4int id=0; id<nofDaughters; id++) {   
134       G3VolTableEntry* dvte = vte->GetDaughter    130       G3VolTableEntry* dvte = vte->GetDaughter(id);
135                                                   131 
136       if (dvte->HasNegPars() || dvte->GetDivis    132       if (dvte->HasNegPars() || dvte->GetDivision()){
137         // create new dvteClone with Position/    133         // create new dvteClone with Position/Division
138   // and set it to vteClone                       134   // and set it to vteClone       
139                                                   135 
140         // get master of dvte                     136         // get master of dvte
141         G3VolTableEntry* dvteMaster = dvte->Ge    137         G3VolTableEntry* dvteMaster = dvte->GetMasterClone();
142                                                   138 
143         // generate vteClone name                 139         // generate vteClone name
144         G4int cloneNo = dvteMaster->GetNoClone    140         G4int cloneNo = dvteMaster->GetNoClones();
                                                   >> 141         char index[5]; sprintf(index,"%d",cloneNo);
145         G4String newName = dvteMaster->GetName    142         G4String newName = dvteMaster->GetName();
146         newName += gSeparator;                 << 143         newName.append(gSeparator); newName = newName + index;
147         newName = newName + std::to_string(clo << 
148                                                   144         
149         // create dvteClone                       145         // create dvteClone
150         G4String  dvteShape = dvte->GetShape()    146         G4String  dvteShape = dvte->GetShape();
151   G4double* dvteRpar  = dvte->GetRpar();          147   G4double* dvteRpar  = dvte->GetRpar();
152   G4int     dvteNpar  = dvte->GetNpar();          148   G4int     dvteNpar  = dvte->GetNpar();
153   G4int     dvteNmed  = dvte->GetNmed();          149   G4int     dvteNmed  = dvte->GetNmed();
154   G4bool   hasNegPars = dvte->HasNegPars();       150   G4bool   hasNegPars = dvte->HasNegPars();
155         G3VolTableEntry* dvteClone                151         G3VolTableEntry* dvteClone
156           = new G3VolTableEntry(newName, dvteS    152           = new G3VolTableEntry(newName, dvteShape, dvteRpar, dvteNpar,
157                            dvteNmed, 0, hasNeg    153                            dvteNmed, 0, hasNegPars);
158                                                   154          
159         // let dvte master and vol table know     155         // let dvte master and vol table know about it
160         G3Vol.PutVTE(dvteClone);                  156         G3Vol.PutVTE(dvteClone);
161         dvteMaster->AddClone(dvteClone);          157         dvteMaster->AddClone(dvteClone);
162                                                   158 
163         // set mother daughter                    159         // set mother daughter
164         vteClone->AddDaughter(dvteClone);         160         vteClone->AddDaughter(dvteClone);
165         dvteClone->AddMother(vteClone);           161         dvteClone->AddMother(vteClone);
166                                                   162   
167         // copy positions                         163         // copy positions
168         G4int nofPositions = dvte->NPCopies();    164         G4int nofPositions = dvte->NPCopies();
169   for (G4int ip=0; ip<nofPositions; ip++)         165   for (G4int ip=0; ip<nofPositions; ip++)
170     dvteClone->AddG3Pos(dvte->GetG3PosCopy(ip)    166     dvteClone->AddG3Pos(dvte->GetG3PosCopy(ip));
171                                                   167     
172         // copy division                          168         // copy division
173   G3Division* dvteDivision = dvte->GetDivision    169   G3Division* dvteDivision = dvte->GetDivision();
174   if (dvteDivision) {                             170   if (dvteDivision) {          
175     G3Division* dvteCloneDivision                 171     G3Division* dvteCloneDivision
176       = new G3Division(dvteClone, vteClone, *d    172       = new G3Division(dvteClone, vteClone, *dvteDivision);
177           dvteClone->SetDivision(dvteCloneDivi    173           dvteClone->SetDivision(dvteCloneDivision);
178           dvteCloneDivision->UpdateVTE();         174           dvteCloneDivision->UpdateVTE();
179   }                                               175   }  
180                                                   176                                 
181   // clone daughters recursively                  177   // clone daughters recursively
182   G4CloneDaughters(dvte, dvteClone);              178   G4CloneDaughters(dvte, dvteClone);
183       }                                           179       } 
184       else {                                      180       else {     
185         // set dvte to vteClone                   181         // set dvte to vteClone
186         vteClone->AddDaughter(dvte);              182         vteClone->AddDaughter(dvte);
187         dvte->AddMother(vteClone);                183         dvte->AddMother(vteClone);
188       }                                           184       } 
189     }                                             185     }
190 }                                                 186 }
191                                                   187 
192 void G4CreateCloneVTE(G3VolTableEntry* vte, G3    188 void G4CreateCloneVTE(G3VolTableEntry* vte, G3VolTableEntry* mvte,
193               G4double pars[], G4int npar, G4i    189               G4double pars[], G4int npar, G4int num,
194               G4double x, G4double y, G4double    190               G4double x, G4double y, G4double z, G4int irot, G4String vonly)
195 //                                                191 //
196 // create a new vte clone copy for each mother    192 // create a new vte clone copy for each mother
197 // and derive its parameters from the mother i    193 // and derive its parameters from the mother if possible
198 {                                                 194 {
199    // create a G3Pos                              195    // create a G3Pos
200    G4ThreeVector* offset = new G4ThreeVector(x    196    G4ThreeVector* offset = new G4ThreeVector(x*cm, y*cm, z*cm);
201    G3Pos* aG3Pos = new G3Pos(mvte->GetName(),     197    G3Pos* aG3Pos = new G3Pos(mvte->GetName(), num, offset, irot, vonly);
202                                                   198             
203    // loop over all mothers                       199    // loop over all mothers
204    for (G4int i=0; i<mvte->GetNoClones(); i++)    200    for (G4int i=0; i<mvte->GetNoClones(); i++) {
205                     // mvte was retrieved from    201                     // mvte was retrieved from its "master" name
206                     // -> there is no need to     202                     // -> there is no need to call GetMasterClone()
207       G3VolTableEntry* mvteClone = mvte->GetCl    203       G3VolTableEntry* mvteClone = mvte->GetClone(i);
208                                                   204         
209       G4String tmpName = "TRY";                   205       G4String tmpName = "TRY";
210       G4String vteShape = vte->GetShape();        206       G4String vteShape = vte->GetShape();
211       G3VolTableEntry* vteClone                   207       G3VolTableEntry* vteClone
212         = new G3VolTableEntry(tmpName, vteShap    208         = new G3VolTableEntry(tmpName, vteShape, pars, npar, vte->GetNmed(),
213                                0, true);          209                                0, true);
214                                                   210           
215       // negative parameters will be updated o    211       // negative parameters will be updated only 
216       // for vteClone, pars are unchanged         212       // for vteClone, pars are unchanged
217       G4double* clonePars = vteClone->GetRpar(    213       G4double* clonePars = vteClone->GetRpar();
218       G4int     cloneNpar = vteClone->GetNpar(    214       G4int     cloneNpar = vteClone->GetNpar();
219       G4bool negpars                              215       G4bool negpars
220         = G3NegVolPars(clonePars, &cloneNpar,     216         = G3NegVolPars(clonePars, &cloneNpar, vteClone, mvteClone, "GSPOS");
221       vteClone->SetHasNegPars(negpars);           217       vteClone->SetHasNegPars(negpars);
222                                                   218 
223       G3VolTableEntry* vteSameClone = 0;          219       G3VolTableEntry* vteSameClone = 0;
224       G4VSolid* solid = 0;                        220       G4VSolid* solid = 0;
225       if (!negpars) {                             221       if (!negpars) {
226         // check if vteClone with the same par    222         // check if vteClone with the same parameters exist
227         for (G4int ic=0; ic<vte->GetNoClones()    223         for (G4int ic=0; ic<vte->GetNoClones(); ic++) {
228           G3VolTableEntry* checkClone = vte->G    224           G3VolTableEntry* checkClone = vte->GetClone(ic);
229     G4int checkNpar = checkClone->GetNpar();      225     G4int checkNpar = checkClone->GetNpar();
230     G4double* checkPars = checkClone->GetRpar(    226     G4double* checkPars = checkClone->GetRpar();
231                                                   227     
232           G4bool isSame;                          228           G4bool isSame;
233           if (checkNpar != cloneNpar)             229           if (checkNpar != cloneNpar) 
234       isSame = false;                             230       isSame = false;
235     else {                                        231     else {  
236         isSame = true;                            232         isSame = true;
237       for (G4int ip=0; ip<cloneNpar; ip++)        233       for (G4int ip=0; ip<cloneNpar; ip++) 
238         if (checkPars[ip] != clonePars[ip]) {     234         if (checkPars[ip] != clonePars[ip]) {
239           isSame = false;                         235           isSame = false;
240     break;                                        236     break;  
241         }                                         237         }
242     }                                             238     } 
243     if (isSame) { vteSameClone = checkClone; b << 239     if (isSame) vteSameClone = checkClone;    
                                                   >> 240     break;
244         }                                         241         }
245                                                   242        
246         if (vteSameClone) {                       243         if (vteSameClone) {
247           delete vteClone;                        244           delete vteClone;
248                                                   245     
249           // add aG3Pos to the vteClone           246           // add aG3Pos to the vteClone  
250           vteSameClone->AddG3Pos(aG3Pos);         247           vteSameClone->AddG3Pos(aG3Pos);
251           mvteClone->AddDaughter(vteSameClone)    248           mvteClone->AddDaughter(vteSameClone);  
252           vteSameClone->AddMother(mvteClone);     249           vteSameClone->AddMother(mvteClone);
253         }                                         250         }
254   else {                                          251   else {
255           // create the solid                     252           // create the solid
256           G4bool hasNegPars;                      253           G4bool hasNegPars;
257           G4bool deferred;                        254           G4bool deferred;
258           G4bool okAxis[3];                       255           G4bool okAxis[3];
259           G4String vteName = vte->GetName();      256           G4String vteName = vte->GetName();
260           G4String cloneShape = vteClone->GetS    257           G4String cloneShape = vteClone->GetShape();
261           solid = G3toG4MakeSolid(vteName, clo    258           solid = G3toG4MakeSolid(vteName, cloneShape, clonePars, cloneNpar,
262                                   hasNegPars,     259                                   hasNegPars, deferred, okAxis);
263         }                                         260         }         
264       }                                           261       }
265                                                   262    
266       if ( negpars || !(vteSameClone)) {          263       if ( negpars || !(vteSameClone)) {
267         // generate vteClone name                 264         // generate vteClone name   
268         G4int cloneNo = vte->GetNoClones();       265         G4int cloneNo = vte->GetNoClones();
                                                   >> 266         char index[5]; sprintf(index,"%d",cloneNo);
269         G4String newName = vte->GetName();        267         G4String newName = vte->GetName();
270         newName += gSeparator;                 << 268         newName.append(gSeparator); newName = newName + index;
271         newName = newName + std::to_string(clo << 
272                                                   269         
273         // update vteClone                        270         // update vteClone
274         vteClone->SetName(newName);               271         vteClone->SetName(newName);
275         vteClone->SetSolid(solid);                272         vteClone->SetSolid(solid);
276         vteClone->SetHasNegPars(negpars);         273         vteClone->SetHasNegPars(negpars);
277                                                   274                                 
278         // let vte and vol table know about it    275         // let vte and vol table know about it
279         G3Vol.PutVTE(vteClone);                   276         G3Vol.PutVTE(vteClone);
280         vte->AddClone(vteClone);                  277         vte->AddClone(vteClone);
281                                                   278           
282         // add aG3Pos to the vteClone             279         // add aG3Pos to the vteClone  
283         vteClone->AddG3Pos(aG3Pos);               280         vteClone->AddG3Pos(aG3Pos);
284         mvteClone->AddDaughter(vteClone);         281         mvteClone->AddDaughter(vteClone);
285         vteClone->AddMother(mvteClone);           282         vteClone->AddMother(mvteClone);
286                                                   283            
287         // copy all daughters                     284         // copy all daughters
288         G4CloneDaughters(vte, vteClone);          285         G4CloneDaughters(vte, vteClone);
289                                                   286 
290         // retrieve daughters parameters          287         // retrieve daughters parameters
291         if (!negpars) G4ProcessDaughters(vteCl    288         if (!negpars) G4ProcessDaughters(vteClone);
292       }                                           289       }
293   }                                               290   }
294 }                                                 291 }
295                                                   292 
296 void G4gsposp(G4String vname, G4int num, G4Str    293 void G4gsposp(G4String vname, G4int num, G4String vmoth, G4double x,
297               G4double y, G4double z, G4int ir    294               G4double y, G4double z, G4int irot, G4String vonly,
298               G4double pars[], G4int npar)        295               G4double pars[], G4int npar)
299 {                                                 296 {
300   // find VTEs                                    297   // find VTEs
301   G3VolTableEntry* vte = G3Vol.GetVTE(vname);     298   G3VolTableEntry* vte = G3Vol.GetVTE(vname);
302   G3VolTableEntry* mvte = G3Vol.GetVTE(vmoth);    299   G3VolTableEntry* mvte = G3Vol.GetVTE(vmoth);
303                                                   300 
304   if (vte == 0) {                                 301   if (vte == 0) {
305     G4String err_message1 = "G4gsposp: '" + vn << 302     G4Exception("G4gsposp: '" + vname + "' has no VolTableEntry");
306     G4Exception("G4psposp()", "G3toG40021", Fa << 
307     return;                                    << 
308   }                                               303   } 
309   if (mvte == 0) {                                304   if (mvte == 0) {
310     G4String err_message2 = "G4gsposp: '" + vm << 305     G4Exception("G4gsposp: '" + vmoth + "' has no VolTableEntry");
311     G4Exception("G4psposp()", "G3toG40022", Fa << 
312     return;                                    << 
313   }                                               306   } 
314   else {                                          307   else { 
315     // a new vte clone copy is created for eac    308     // a new vte clone copy is created for each mother (clone copy)  
316     // and its parameters are derived from it     309     // and its parameters are derived from it if possible
317                                                   310     
318     G4CreateCloneVTE(vte, mvte, pars, npar, nu    311     G4CreateCloneVTE(vte, mvte, pars, npar, num, x, y, z, irot, vonly);
319   }                                               312   }
320 }                                                 313 }
321                                                   314