ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G3toG4MakeSolid.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G3toG4MakeSolid.cc
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 //
28 // modified by I.Hrivnacova, V.Berejnoi 27 Sep 99
29 
30 #include "globals.hh"
31 #include "G4Box.hh"
32 #include "G4Tubs.hh"
33 #include "G4Trd.hh"
34 #include "G4Trap.hh"
35 #include "G4Cons.hh"
36 #include "G4Sphere.hh"
37 #include "G3toG4.hh"
38 #include "G4Polycone.hh"
39 #include "G4Polyhedra.hh"
40 #include "G4Para.hh"
41 #include "G4Hype.hh"
42 #include "G4EllipticalTube.hh"
43 #include "G3toG4MakeSolid.hh"
44 #include "G4SystemOfUnits.hh"
45 
46 G4VSolid* G3toG4MakeSolid(const G4String& vname, const G4String& shape,
47  const G4double* rpar, const G4int npar,
48  G4bool& NegVolPars, G4bool& Deferred,
49  G4bool* OKAxis){
50 
51  // Create the solid if no negative length parameters
52  G4VSolid *solid = 0;
53 
54  NegVolPars = false;
55 
56  // if npar = 0 assume LV deferral
57  Deferred = (npar == 0);
58  // modified
59  if (Deferred) return solid;
60 
61  for (G4int i=0;i<3;i++){
62  OKAxis[i]=false;
63  };
64 
65  if ( shape == "BOX" ) {
66  G4double pX = rpar[0]*cm;
67  G4double pY = rpar[1]*cm;
68  G4double pZ = rpar[2]*cm;
69 
70  OKAxis[0]=OKAxis[1]=OKAxis[2]=true;
71 
72  NegVolPars = pX<0 || pY<0 || pZ<0;
73 
74  if (!(NegVolPars || Deferred)) {
75  solid = new G4Box(vname, pX, pY, pZ);
76  }
77 
78  } else if ( shape == "TRD1" ) {
79  G4double pdx1 = rpar[0]*cm;
80  G4double pdx2 = rpar[1]*cm;
81  G4double pdy1 = rpar[2]*cm;
82  G4double pdy2 = pdy1;
83  G4double pdz = rpar[3]*cm;
84 
85  OKAxis[1]=OKAxis[2]=true;
86 
87  NegVolPars = pdx1<0 || pdx2<0 || pdy1<0 || pdz<0;
88 
89  if (!(NegVolPars || Deferred)) {
90  solid = new G4Trd(vname, pdx1, pdx2, pdy1, pdy2, pdz);
91  }
92 
93  } else if ( shape == "TRD2" ) {
94  G4double pdx1 = rpar[0]*cm;
95  G4double pdx2 = rpar[1]*cm;
96  G4double pdy1 = rpar[2]*cm;
97  G4double pdy2 = rpar[3]*cm;
98  G4double pdz = rpar[4]*cm;
99 
100  OKAxis[2]=true;
101 
102  NegVolPars = pdx1<0 || pdx2<0 || pdy1<0 || pdy2<0 || pdz<0;
103 
104  if (!(NegVolPars || Deferred)) {
105  solid = new G4Trd(vname, pdx1, pdx2, pdy1, pdy2, pdz);
106  }
107 
108  } else if ( shape == "TRAP" ) {
109  G4double pDz = rpar[0]*cm;
110  G4double pTheta = rpar[1]*deg;
111  G4double pPhi = rpar[2]*deg;
112  G4double pDy1 = rpar[3]*cm;
113  G4double pDx1 = rpar[4]*cm;
114  G4double pDx2 = rpar[5]*cm;
115  G4double pAlp1 = rpar[6]*deg;
116  G4double pDy2 = rpar[7]*cm;
117  G4double pDx3 = rpar[8]*cm;
118  G4double pDx4 = rpar[9]*cm;
119  G4double pAlp2 = rpar[10]*deg;
120 
121  OKAxis[2]=true;
122 
123  NegVolPars= pDz<0 || pDy1<0 || pDx1<0 || pDx2<0 || pDy2<0 || pDx3<0 || pDx4<0;
124 
125  if (!(NegVolPars || Deferred)) {
126  // added for test only
127  if (!(pDz>0)) pDz += 0.001*cm;
128  if (!(pDy1>0)) pDy1 += 0.001*cm;
129  if (!(pDx1>0)) pDx1 += 0.001*cm;
130  if (!(pDx2>0)) pDx2 += 0.001*cm;
131  if (!(pDy2>0)) pDy2 += 0.001*cm;
132  if (!(pDx3>0)) pDx3 += 0.001*cm;
133  if (!(pDx4>0)) pDx4 += 0.001*cm;
134 
135  solid = new
136  G4Trap(vname, pDz, pTheta, pPhi, pDy1, pDx1, pDx2, pAlp1, pDy2, pDx3,
137  pDx4, pAlp2);
138  }
139 
140  } else if ( shape == "TUBE" ) {
141  G4double pRMin = rpar[0]*cm;
142  G4double pRMax = rpar[1]*cm;
143  G4double pDz = rpar[2]*cm;
144  G4double pSPhi = 0.*deg;
145  G4double pDPhi = 360.*deg;
146 
147  OKAxis[0]=OKAxis[1]=OKAxis[2]=true;
148 
149  NegVolPars = pRMin<0 || pRMax<0 || pDz<0;
150 
151  if (!(NegVolPars || Deferred)) {
152  solid = new G4Tubs(vname, pRMin, pRMax, pDz, pSPhi, pDPhi);
153  }
154 
155  } else if ( shape == "TUBS" ) {
156  G4double pRMin = rpar[0]*cm;
157  G4double pRMax = rpar[1]*cm;
158  G4double pDz = rpar[2]*cm;
159  G4double pSPhi = rpar[3]*deg;
160  G4double pDPhi = rpar[4]*deg - pSPhi;
161  if ( rpar[4]*deg <= pSPhi ) pDPhi = pDPhi + 360.*deg;
162 
163  OKAxis[0]=OKAxis[1]=OKAxis[2]=true;
164 
165  NegVolPars = pRMin<0 || pRMax<0 || pDz<0;
166 
167  if (!(NegVolPars || Deferred)){
168  solid = new G4Tubs(vname, pRMin, pRMax, pDz, pSPhi, pDPhi);
169  }
170 
171  } else if ( shape == "CONE" ) {
172  G4double pDz = rpar[0]*cm;
173  G4double pRmin1 = rpar[1]*cm;
174  G4double pRmax1 = rpar[2]*cm;
175  G4double pRmin2 = rpar[3]*cm;
176  G4double pRmax2 = rpar[4]*cm;
177  G4double pSPhi = 0.*deg;
178  G4double pDPhi = 360.*deg;
179 
180  OKAxis[0]=OKAxis[1]=OKAxis[2]=true;
181 
182  NegVolPars = pDz<0 || pRmin1<0 || pRmax1<0 || pRmin2<0 || pRmax2<0;
183 
184  if (!(NegVolPars || Deferred)){
185  solid = new
186  G4Cons(vname, pRmin1, pRmax1, pRmin2, pRmax2, pDz, pSPhi, pDPhi);
187  }
188 
189  } else if ( shape == "CONS" ) {
190  G4double pDz = rpar[0]*cm;
191  G4double pRmin1 = rpar[1]*cm;
192  G4double pRmax1 = rpar[2]*cm;
193  G4double pRmin2 = rpar[3]*cm;
194  G4double pRmax2 = rpar[4]*cm;
195  G4double pSPhi = rpar[5]*deg;
196  G4double pDPhi = rpar[6]*deg - pSPhi;
197  if ( rpar[6]*deg <= pSPhi ) pDPhi = pDPhi + 360.*deg;
198 
199  OKAxis[0]=OKAxis[1]=OKAxis[2]=true;
200 
201  NegVolPars = pDz<0 || pRmin1<0 || pRmax1<0 || pRmin2<0 || pRmax2<0;
202 
203  if (!(NegVolPars || Deferred)){
204  solid = new
205  G4Cons(vname, pRmin1, pRmax1, pRmin2, pRmax2, pDz, pSPhi, pDPhi);
206  }
207 
208  } else if ( shape == "SPHE" ) {
209  G4double pRmin = rpar[0]*cm;
210  G4double pRmax = rpar[1]*cm;
211  G4double pThe1 = rpar[2]*deg;
212  G4double pThe2 = rpar[3]*deg;
213  G4double pDThe = pThe2 - pThe1;
214  G4double pPhi1 = rpar[4]*deg;
215  G4double pPhi2 = rpar[5]*deg;
216  G4double pDPhi = pPhi2 - pPhi1;
217 
218  NegVolPars = pRmin<0 || pRmax<0;
219 
220  if (!(NegVolPars || Deferred)) {
221  solid = new G4Sphere(vname, pRmin, pRmax, pPhi1, pDPhi, pThe1, pDThe);
222  }
223 
224  } else if ( shape == "PARA" ) {
225  G4double pDx = rpar[0]*cm;
226  G4double pDy = rpar[1]*cm;
227  G4double pDz = rpar[2]*cm;
228  G4double pAlph = rpar[3]*deg;
229  G4double pThet = rpar[4]*deg;
230  G4double pPhi = rpar[5]*deg;
231 
232  OKAxis[0]=OKAxis[1]=OKAxis[2]=true;
233 
234  NegVolPars = pDx<0 || pDy<0 || pDz<0;
235 
236  if (!(NegVolPars || Deferred)){
237  solid = new G4Para(vname, pDx, pDy, pDz, pAlph, pThet, pPhi);
238  }
239 
240  } else if ( shape == "PGON" ) {
241  G4int i;
242  G4int npdv = G4int(rpar[2]);
243  G4int nz = G4int(rpar[3]);
244  G4double pPhi1 = rpar[0]*deg;
245  G4double dPhi = rpar[1]*deg;
246  G4double *DzArray = new G4double[nz];
247  G4double *Rmax = new G4double[nz];
248  G4double *Rmin = new G4double[nz];
249 
250  OKAxis[0]=OKAxis[1]=OKAxis[2]=true;
251 
252  NegVolPars = 0;
253 
254  for(i=0; i<nz; i++) {
255  G4int i4=3*i+4;
256  G4int i5=i4+1;
257  G4int i6=i4+2;
258  DzArray[i] = rpar[i4]*cm;
259  Rmin[i] = rpar[i5]*cm;
260  Rmax[i] = rpar[i6]*cm;
261  }
262  solid = new G4Polyhedra(vname, pPhi1, dPhi, npdv, nz, DzArray, Rmin, Rmax);
263  delete [] DzArray;
264  delete [] Rmin;
265  delete [] Rmax;
266 
267  } else if ( shape == "PCON" ) {
268  G4int i;
269  G4double pPhi1 = rpar[0]*deg;
270  G4double dPhi = rpar[1]*deg;
271  G4int nz = G4int(rpar[2]);
272  G4double *DzArray = new G4double[nz];
273  G4double *Rmax = new G4double[nz];
274  G4double *Rmin = new G4double[nz];
275 
276  OKAxis[0]=OKAxis[1]=OKAxis[2]=true;
277 
278  NegVolPars = 0;
279 
280  for(i=0; i<nz; i++){
281  G4int i4=3*i+3;
282  G4int i5=i4+1;
283  G4int i6=i4+2;
284  DzArray[i] = rpar[i4]*cm;
285  Rmin[i] = rpar[i5]*cm;
286  Rmax[i] = rpar[i6]*cm;
287  }
288  solid = new G4Polycone(vname, pPhi1, dPhi, nz, DzArray, Rmin, Rmax);
289  delete [] DzArray;
290  delete [] Rmin;
291  delete [] Rmax;
292 
293  } else if ( shape == "ELTU" ) {
294  G4double dX = rpar[0]*cm;
295  G4double dY = rpar[1]*cm;
296  G4double dZ = rpar[2]*cm;
297 
298  OKAxis[0]=OKAxis[1]=OKAxis[2]=true;
299 
300  NegVolPars = dX<0 || dY<0 || dZ<0;
301 
302  if (!(NegVolPars || Deferred)) {
303  solid = new G4EllipticalTube(vname, dX, dY, dZ);
304  }
305 
306  } else if ( shape == "HYPE" ) {
307  G4double pRmin = rpar[0]*cm;
308  G4double pRmax = rpar[1]*cm;
309  G4double pDz = rpar[2]*cm;
310  G4double pThet = rpar[3]*deg;
311 
312  NegVolPars = pRmin<0 || pRmax<0 || pDz<0;
313 
314  if (!(NegVolPars || Deferred)){
315  solid = new G4Hype(vname, pRmin, pRmax, pThet, pThet, pDz);
316  } else {
317  G4cerr << "Negative length parameters not supported for shape "
318  << shape << G4endl;
319  }
320 
321  } else if ( shape == "GTRA" ) {
322  // $$$ not implemented.
323  G4cerr << "GTRA not supported" << G4endl;
324 
325  } else if ( shape == "CTUB" ) {
326  // $$$ not implemented.
327  G4cerr << "CTUB not supported" << G4endl;
328  }
329  return solid;
330 }
331 
332 
333 
334 
335 
336 
337 
338 
339 
340