5 * Revision 1.1.1.1 1995/10/24 10:20:50 cernlib
9 #include "geant321/pilot.h"
10 *CMZ : 3.21/02 29/03/94 15.41.28 by S.Giani
11 *FCA : 05/01/99 10:04:28 by Federico Carminati
12 * Added the possibility to put TRD1's in TRD1's with
15 SUBROUTINE GGPPAR (JVOM, IN, NVAR, LVAR, LVOM, NPAR, PAR)
17 C. ******************************************************************
19 C. * SUBR. GGPPAR (JVOM,IN,NVAR,LVAR,LVOM,NPAR*,PAR*) *
21 C. * Computes the actual parameters for the INth content inside *
22 C. * the mother volume at address JVOM *
23 C. * Returns them in NPAR, PAR *
25 C. * Called by : GGDVLP *
26 C. * Authors : F.Bruyant, S.Banerjee *
27 C. * (original algorithms from A.McPherson) *
29 C. ******************************************************************
31 #include "geant321/gcbank.inc"
32 #include "geant321/gcflag.inc"
33 #include "geant321/gcunit.inc"
37 DIMENSION LVAR(*), PAR(*)
38 DIMENSION DXYZ(3), PARM(NPAMAX)
42 DATA IOPT / 1 ,1 ,1 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
43 + 0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
44 + 0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
45 + 0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
46 + 0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,
47 + 0 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,
48 + 0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,
49 + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 ,
50 + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,
51 + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,
52 + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,
53 + 0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 /
55 C. ------------------------------------------------------------------
66 CALL UCOPY (Q(JIN+10), PAR, NPAR)
67 IF (NVAR.LT.0) GO TO 999
69 CALL UCOPY (Q(JVO+7), PAR, NPAR)
80 IF(ISH.GT.12.OR.ISHM.GT.12.OR.IOPT(ISHM, ISH).EQ.0) THEN
81 WRITE (CHMAIL, 10400) ISH, ISHM
86 * *** Prepares parameters for mother, in PARM, for content, in PAR
87 * and the translation DXYZ (position of content inside mother)
89 IF (LQ(JVOM).EQ.LVOM) THEN
91 * Case when current volume is source of local development
94 CALL UCOPY (Q(JVOM+7), PARM, NPARM)
100 CALL UCOPY (Q(LVOM+6), PARM, NPARM)
107 * *** Compute the actual parameters
117 PAR(IAX) = PARM(IAX) -ABS(DXYZ(IAX))
118 IF (PAR(IAX).LT.0.) THEN
119 WRITE (CHMAIL, 10500) ISH, ISHM, IAX
124 ELSE IF (ISHM.EQ.2) THEN
130 IF (DZ.LT.0.) DZ = PARM(4)
131 DXDZ = 0.5*(PARM(2)-PARM(1))/PARM(4)
132 DXME = 0.5*(PARM(2)+PARM(1)) +DXDZ*DXYZ(3)
133 DX = DXME -ABS(DXDZ*DZ)
134 PAR(IAX) = DX -ABS(DXYZ(1))
135 IF (PAR(IAX).LT.0.) THEN
136 WRITE (CHMAIL, 10500) ISH, ISHM, IAX
141 PAR(IAX) = PARM(IAX+1) -ABS(DXYZ(IAX))
143 DXDZ = 0.5*(PARM(2)-PARM(1))/PARM(4)
144 DX0 = 0.5*(PARM(2)+PARM(1)) -ABS(DXYZ(1))
145 DZ = (DX0 -PAR(1))/ABS(DXDZ)
147 WRITE (CHMAIL, 10600) ISH, ISHM, IAX, DZ
151 IF (PAR(3).GT.DZ) PAR(3) = DZ
156 ELSE IF (ISHM.EQ.3) THEN
163 IF (DZ .LT. 0.) DZ = PARM(5)
164 DXDZ = 0.5*(PARM(IP+1) - PARM(IP))/PARM(5)
165 DXME = 0.5*(PARM(IP+1) + PARM(IP)) + DXDZ*DXYZ(3)
166 DX = DXME - ABS(DXDZ*DZ)
167 PAR(IAX) = DX - ABS(DXYZ(IAX))
169 PAR(3) = PARM(5) - ABS(DXYZ(3))
170 DXDZ = 0.5*(PARM(2) - PARM(1))/PARM(5)
171 DX0 = 0.5*(PARM(2) + PARM(1)) - ABS(DXYZ(1))
172 DZ = (DX0 - PAR(1))/ABS(DXDZ)
174 WRITE (CHMAIL, 10600) ISH, ISHM, IAX, DZ
178 IF (PAR(IAX).GT.DZ) PAR(IAX) = DZ
180 DXDZ = 0.5*(PARM(4) - PARM(3))/PARM(5)
181 DX0 = 0.5*(PARM(4) + PARM(3)) - ABS(DXYZ(2))
182 DZ = (DX0 - PAR(2))/ABS(DXDZ)
184 WRITE (CHMAIL, 10600) ISH, ISHM, IAX, DZ
188 IF (PAR(IAX).GT.DZ) PAR(IAX) = DZ
192 ELSE IF (ISHM.EQ.4) THEN
195 * Case of box in trap. Let's keep it simple: we just deal with
196 * the case in which phi=0 or 180. If theta .ne. 0, the position along
197 * x-axis, and the angles parm(7) and parm(11) must be 0.
199 IF(ABS(PARM(3)).GT.0.1E-5) THEN
200 WRITE(CHMAIL,10000) IQ(JVOLUM+IVO)
202 + (' GGPPAR : Cannot use negative parameters for box ',A4)
205 10100 FORMAT(' in a trap if PAR(2) .ne. 0 or 180')
208 ELSEIF(PARM(7).NE.PARM(11)) THEN
209 WRITE(CHMAIL,10000) IQ(JVOLUM+IVO)
212 10200 FORMAT(' in a trap if PAR(7) .ne. PAR(11)')
219 IF(LVAR(J).EQ.1) THEN
221 ELSEIF(LVAR(J).EQ.2) THEN
223 ELSEIF(LVAR(J).EQ.3) THEN
229 PAR(3) = DZM-ABS(DXYZ(3))
231 DYDZ=0.5*(PARM(8)-PARM(4))/PARM(1)
232 DYM =0.5*(PARM(8)+PARM(4))
233 DY1 = DYM+(DXYZ(3)+PAR(3))*DYDZ
234 DY2 = DYM+(DXYZ(3)-PAR(3))*DYDZ
236 PAR(2) = MIN(DY1,DY2)-ABS(DXYZ(2))
239 IF(PARM(7).EQ.0.0.AND.ABS(PARM(2)).LT..1E-5) THEN
240 DXDZL = 0.5*(PARM(9)-PARM(5))/PARM(1)
241 DXDZH = 0.5*(PARM(10)-PARM(6))/PARM(1)
242 DXML = 0.5*(PARM(9)+PARM(5))
243 DXMH = 0.5*(PARM(10)+PARM(6))
244 DXL1 = DXML+(DXYZ(3)+PAR(3))*DXDZL
245 DXL2 = DXML+(DXYZ(3)-PAR(3))*DXDZL
246 DXH1 = DXMH+(DXYZ(3)+PAR(3))*DXDZH
247 DXH2 = DXMH+(DXYZ(3)-PAR(3))*DXDZH
248 DXDY1 = 0.5*(DXH1-DXL1)/DY1
249 DXDY2 = 0.5*(DXH2-DXL2)/DY2
250 DXM1 = 0.5*(DXH1+DXL1)
251 DXM2 = 0.5*(DXH2+DXL2)
252 DX1 = DXM1+(DXYZ(2)+PAR(2))*DXDY1
253 DX2 = DXM1+(DXYZ(2)-PAR(2))*DXDY1
254 DX3 = DXM2+(DXYZ(2)+PAR(2))*DXDY2
255 DX4 = DXM2+(DXYZ(2)-PAR(2))*DXDY2
256 PAR(1) = MIN(DX1,DX2,DX3,DX4)-ABS(DXYZ(1))
257 * Note; position along x-axis should be 0, when theta .ne. 0:
258 ELSE IF(PARM(7).EQ..0.AND.ABS(PARM(2)).GT..1E-5)THEN
259 * the maximum length of the lower (DX2) and upper (DX1) lines along x
260 DXDZ= 0.5*(PARM(9)-PARM(5))/PARM(1)
261 DXM = 0.5*(PARM(9)+PARM(5))
262 DX1 = DXM+(DXYZ(3)+PAR(3))*DXDZ
263 DX2 = DXM+(DXYZ(3)-PAR(3))*DXDZ
265 * the shift in the endpoints caused by theta angle compared with
266 * the symmetrical case when theta = 0
268 SHFX1 = TANTHE*(DXYZ(3)+PAR(3))
269 SHFX2 = TANTHE*(DXYZ(3)-PAR(3))
276 * DXP is the lenght of the box that fits in the positive side
277 * DXN is the one in the negative side
282 PAR(1) = .5*(DXP+DXN)
285 DXDZL = 0.5*(PARM(9)-PARM(5))/PARM(1)
286 DXDZH = 0.5*(PARM(10)-PARM(6))/PARM(1)
287 DXML = 0.5*(PARM(9)+PARM(5))
288 DXMH = 0.5*(PARM(10)+PARM(6))
289 DXL1 = DXML+(DXYZ(3)+PAR(3))*DXDZL
290 DXL2 = DXML+(DXYZ(3)-PAR(3))*DXDZL
291 DXH1 = DXMH+(DXYZ(3)+PAR(3))*DXDZH
292 DXH2 = DXMH+(DXYZ(3)-PAR(3))*DXDZH
305 DXDY1P = 0.5*(DXH1P-DXL1P)/DY1
306 DXDY2P = 0.5*(DXH2P-DXL2P)/DY2
307 DXDY1N = 0.5*(DXH1N-DXL1N)/DY1
308 DXDY2N = 0.5*(DXH2N-DXL2N)/DY2
310 DXM1P = 0.5*(DXH1P+DXL1P)
311 DXM2P = 0.5*(DXH2P+DXL2P)
312 DXM1N = 0.5*(DXH1N+DXL1N)
313 DXM2N = 0.5*(DXH2N+DXL2N)
315 DX1P = DXM1P+(DXYZ(2)+PAR(2))*DXDY1P
316 DX2P = DXM1P+(DXYZ(2)-PAR(2))*DXDY1P
317 DX3P = DXM2P+(DXYZ(2)+PAR(2))*DXDY2P
318 DX4P = DXM2P+(DXYZ(2)-PAR(2))*DXDY2P
319 DX1N = DXM1N+(DXYZ(2)+PAR(2))*DXDY1N
320 DX2N = DXM1N+(DXYZ(2)-PAR(2))*DXDY1N
321 DX3N = DXM2N+(DXYZ(2)+PAR(2))*DXDY2N
322 DX4N = DXM2N+(DXYZ(2)-PAR(2))*DXDY2N
324 PAR(1) =MAX(0.,MIN( MIN(DX1P,DX2P,DX3P,DX4P)-
325 + DXYZ(1), MIN(DX1N,DX2N,DX3N,DX4N)+DXYZ(1)))
330 ELSE IF (ISH.EQ.2) THEN
334 IF (PAR(4).EQ.PARM(4)) THEN
342 IF (IZCUT.EQ.0) GO TO 51
344 DZ = DXYZ(3) +PARM(4) -PAR(4)
345 DPDZ = 0.5*(PARM(2) -PARM(1))/PARM(4)
346 PAR(IAX) = PARM(1) + DPDZ*DZ
347 ELSE IF (IAX.EQ.2) THEN
348 DZ = DXYZ(3) +PARM(4) +PAR(4)
349 DPDZ = 0.5*(PARM(2) -PARM(1))/PARM(4)
350 PAR(IAX) = PARM(1) + DPDZ*DZ
356 ELSE IF (ISH.EQ.4) THEN
360 IF (ISHM.EQ.ISH) THEN
362 IF (PAR(1).EQ.PARM(1)) THEN
370 IF (IZCUT.EQ.0) GO TO 50
371 IF (IAX.NE.1.AND.IAX.LE.6) THEN
372 DZ = DXYZ(3) +PARM(1) -PAR(1)
373 DPDZ = 0.5*(PARM(IAX+4) -PARM(IAX))/PARM(1)
374 PAR(IAX) = PARM(IAX) + DPDZ*DZ
375 ELSE IF (IAX.GT.6) THEN
376 DZ = DXYZ(3) +PARM(1) +PAR(1)
377 DPDZ = 0.5*(PARM(IAX) -PARM(IAX-4))/PARM(1)
378 PAR(IAX) = PARM(IAX-4) + DPDZ*DZ
382 HTAH = PARM(8)*PARM(11)
383 HTAL = PARM(4)*PARM(7)
384 ZZ1 = 0.5*(DXYZ(3) +PARM(1) -PAR(1))/PARM(1)
385 PAR(7) = (HTAL*(1.-ZZ1) + HTAH*ZZ1)/PAR(4)
386 ZZ2 = 0.5*(DXYZ(3) +PARM(1) +PAR(1))/PARM(1)
387 PAR(11)= (HTAL*(1.-ZZ2) + HTAH*ZZ2)/PAR(8)
389 IF(IAX.EQ.2.AND.IZCUT.EQ.0) THEN
390 DXDY1 = 0.5*(PARM(6)-PARM(5))/PARM(4)
391 DXDY2 = 0.5*(PARM(10)-PARM(9))/PARM(8)
392 DXM1 = 0.5*(PARM(6)+PARM(5))
393 DXM2 = 0.5*(PARM(10)+PARM(9))
394 DXH1 = DXM1+(DXYZ(2)+PAR(2))*DXDY1
395 DXH2 = DXM2+(DXYZ(2)+PAR(2))*DXDY2
396 DXL1 = DXM1+(DXYZ(2)-PAR(2))*DXDY1
397 DXL2 = DXM2+(DXYZ(2)-PAR(2))*DXDY2
406 ELSE IF (ISH.EQ.5) THEN
415 IF(LVAR(JVAR).EQ.1) IRMIN=1
416 IF(LVAR(JVAR).EQ.2) IRMAX=1
417 IF(LVAR(JVAR).EQ.3) IDZED=1
419 RPOS = SQRT(DXYZ(1)**2+DXYZ(2)**2)
422 * Here we settle the minimum radius.
424 IF(PARM(1).GT.0.) THEN
425 PAR(1) = PARM(1)+RPOS
432 * Case in which the max radius is variable.
434 IF(PAR(1).LE.RPOS-PARM(1).AND.PARM(1).GT.0.) THEN
436 * This is the case in which the 'hole' in the tube does not
437 * intersect the 'hole' in the mother.
439 PAR(2) = MIN(PARM(2)-RPOS,RPOS-PARM(1))
440 ELSEIF(PAR(1).GE.RPOS+PARM(1).OR.PARM(1).EQ.0.) THEN
442 * This is the case in which the 'hole' in the tube contains the
443 * 'hole' in the mother, or there is no 'hole' in the mother.
445 PAR(2) = PARM(2)-RPOS
448 * And this is the error condition. The inner tube protrudes in the empty
449 * space inside the outer one.
451 WRITE(CHMAIL,11100) IQ(JVOLUM+IVO)
457 PAR(3) = PARM(3)-ABS(DXYZ(3))
459 IF(PAR(1).GE.PAR(2).OR.PAR(2).GT.PARM(2)
460 + .OR.PAR(3).LE.0.) THEN
461 WRITE(CHMAIL,11000) IQ(JVOLUM+IVO)
466 WRITE (CHMAIL, 10900) ISH, ISHM
470 ELSE IF (ISH.LE.10) THEN
472 * TRD1,TRD2,TUBE,TUBS,CONE,CONS,SPHE,PARA
474 IF (ISHM.EQ.ISH) THEN
475 * in TRD1,TRD2,TUBE,TUBS,CONE,CONS,SPHE,PARA
476 IF (DXYZ(1).NE.0..OR.DXYZ(2).NE.0..OR.DXYZ(3).NE.0.)
478 WRITE (CHMAIL, 10700) ISH, ISHM
489 ELSE IF (ISH.LE.12) THEN
493 IF (ISHM.EQ.ISH) THEN
502 IF (NZ.NE.2 .OR. NZ1.NE.2) THEN
503 WRITE (CHMAIL, 10900) ISH, ISHM
510 TANLOW = (PARM(IPNZ+5)-PARM(IPNZ+2))/DZ
511 TANHIG = (PARM(IPNZ+6)-PARM(IPNZ+3))/DZ
512 Z1 = DXYZ(3) + PAR(IPNZ+1) - PARM(IPNZ+1)
513 Z2 = DXYZ(3) + PAR(IPNZ+4) - PARM(IPNZ+1)
514 PAR(IPNZ+2) = PARM(IPNZ+2) + TANLOW * Z1
515 PAR(IPNZ+3) = PARM(IPNZ+3) + TANHIG * Z1
516 PAR(IPNZ+5) = PARM(IPNZ+2) + TANLOW * Z2
517 PAR(IPNZ+6) = PARM(IPNZ+3) + TANHIG * Z2
523 10300 FORMAT (' GGPPAR : Rotations not accepted at the moment')
524 10400 FORMAT (' GGPPAR : Shape association not accepted', 2I5)
525 10500 FORMAT (' GGPPAR : PAR(IAX) negative, ISH,ISHM,IAX=',3I5)
526 10600 FORMAT (' GGPPAR : DZ negative, ISH,ISHM,IAX,DZ=',3I5,G12.4)
527 10700 FORMAT (' GGPPAR : Not yet coded for ISH,ISHM=',2I5)
528 10800 FORMAT (' GGPPAR : PARM error for ISH,ISHM,IAX=',3I5)
529 10900 FORMAT (' GGPPAR : Configuration not accepted, ISH,ISHM=',2I5)
530 11000 FORMAT (' GGPPAR : Tube ',A4,' has inconsistent parameters')
531 11100 FORMAT (' GGPPAR : Tube ',A4,' protrudes into the inner space ',