5 * Revision 1.1.1.1 1995/10/24 10:20:46 cernlib
9 #include "geant321/pilot.h"
10 *CMZ : 3.21/03 13/09/94 18.53.20 by S.Ravndal
12 SUBROUTINE GDEXCA(NAME,NBINS)
14 C. ******************************************************************
16 C. * Based on GDRAW, calculates parameters of each volume *
17 C. * Areas marked JV + NH *
19 C. * Called by GTXSET *
21 C. * Authors : R.Brun, A.McPherson, P.Zanarini, ********* *
22 C. * J.Salt, S.Giani , J. Vuoskoski, N. Hoimyr *
23 C. ******************************************************************
26 #include "geant321/gcsetf.inc"
28 #include "geant321/gcbank.inc"
29 #include "geant321/gcvolu.inc"
30 #include "geant321/gcunit.inc"
31 #include "geant321/gcdraw.inc"
32 #include "geant321/gconst.inc"
33 #include "geant321/gcnum.inc"
34 #include "geant321/gcdlin.inc"
35 #include "geant321/gcmutr.inc"
37 #include "geant321/gcgobj.inc"
39 #include "geant321/gchiln.inc"
40 #include "geant321/gcspee.inc"
45 DIMENSION PARMJV(9), POSJV(3)
46 C if volume is divided jdvinf(level) is 1
47 DIMENSION JDVINF(0:15)
48 CHARACTER*4 JVVOLU,JVVOLD, NAME,NAMEE2
50 DIMENSION X(3),ATT(10)
51 DIMENSION LVOLS(15),LINDX(15),LNAMES(15)
53 * INTEGER START, OLDOLD, PASS
56 CALL MZBOOK(IXSTOR,JCADNT,JCADNT,1,'CADI',1,1,0,2,-1)
57 CALL MZBOOK(IXSTOR,JBUF1,
58 + JCADNT,-1,'CAD1',0,0,NVOLUM,2,-1)
72 C Save /GCVOLU/ if necessary
79 IF (NLEVEL.LT.0) NLEVEL=IABS(NLEVEL)
81 C Start of general code
83 CALL GLOOK(NAME,IQ(JVOLUM+1),NVOLUM,IVO)
86 C Theta, phi and psi angles are normalized in [0-360[ range
91 C Initialize JIN to switch correctly CALL GFPARA/GFIPAR
97 IF (IDRNUM.NE.0) GO TO 30
99 C Initialize for new geometry structure
101 IF (JGPAR.EQ.0) CALL GMEDIN
102 CALL GLMOTH(NAME,1,NLEV,LVOLS,LINDX)
104 LNAMES(J)=IQ(JVOLUM+LVOLS(J))
107 CALL UCTOH(NAME,LNAMES(NLEV),4,4)
109 CALL GLVOLU(NLEV, LNAMES, LINDX, IER)
118 IF (IDRNUM.NE.0) GO TO 70
120 CALL GFPARA(NAME,1,1,NPAR,NATT,GPAR(1,NLEVEL),ATT)
122 IF (NPAR.LE.0) GO TO 220
138 C Ready for general case code
142 * Taking volume name and shape from Zebra Structure
144 IVOLNA=IQ(JVOLUM+IVO)
148 IF (IDRNUM.NE.0) GO TO 80
150 IF (NLEVEL.EQ.NLVTOP) GO TO 90
154 IF (IDRNUM.NE.0.AND.JIN.EQ.0) THEN
155 CALL UHTOC(NAMES(NLEVEL),4,NAMEE2,4)
156 CALL GFPARA(NAMEE2,NUMBER(NLEVEL),1,NPAR,
157 + NATT,GPAR(1,NLEVEL),ATT)
162 CALL UCOPY(Q(JATT),ATT,NATT)
175 CALL MVBITS(LINCOL,0,4,LINATT,7)
176 CALL MVBITS(LINWID,0,3,LINATT,11)
177 CALL MVBITS(LINSTY,0,3,LINATT,14)
178 CALL MVBITS(LINFIL,0,3,LINATT,17)
182 * New logic scanning the geometrical tree:
183 * A volume can set bounds OR be compared with bounds;
184 * this can happen only IF a relationship mother-daughters exists.
186 * Optimization for Hidden Volume Removal:
187 * POS and DIV cases are considered at the same time.
191 * IF(NLEVEL.GT.OLDOLD)THEN
202 * IF(SEEN.EQ.0.OR.SEEN.EQ.-1)PASS=1
206 * ELSE IF(NLEVEL.LE.OLDOLD)THEN
216 * IF(SEEN.EQ.0.OR.SEEN.EQ.-1)PASS=1
221 * IF(OLDOLD.EQ.0.AND.(SEEN.EQ.1.OR.SEEN.EQ.-2))THEN
227 C WORK attribute enabled ?
229 IF(WORK.LE.0.)GO TO 200
231 C SEEN attribute processing
233 IF (SEEN.LT.50.) GO TO 100
238 IF(NLEVEL.LE.LEVSEE)LEVSEE=1000
239 IF(SEEN.EQ.-1.)GO TO 200
240 IF (NLEVEL.GT.LEVSEE) GO TO 200
241 IF(SEEN.EQ.0.)GO TO 150
242 IF (SEEN.EQ.-2.) LEVSEE=NLEVEL
244 * Standard Mode: Output to SET
246 C-----------------------JV----Mod NH---------------------------
247 C Get positioning variables
249 IF(NLEVEL.LT.JLEVEL)THEN
250 CALL GSATT(JVVOLU,'SEEN',MYSEEN)
262 IF (JDVINF(NLEVEL-1).EQ.1) THEN
264 IF (IQ(JBUF1+IVO).LT.NBINS) THEN
266 PARMJV(JV)=GRMAT(JV,NLEVEL)
270 POSJV(JV)=GTRAN(JV,NLEVEL)
273 C Appends new name VOLNAM to each volume, with index.
275 IQ(JBUF1+IVO)=IQ(JBUF1+IVO)+1
276 WRITE(VOLNAM(1:5),10200)IVOLNA
277 WRITE(VOLNAM(6:10),'(I4.0)')IQ(JBUF1+IVO)
279 C Call SHAPE to SET routines
281 C Updates SET block sequence number:
283 CALL GETSHP(ISHAPE,GPAR(1,NLEVEL))
285 C Position the volumes
288 CALL GPOSI(PARMJV,POSJV,VOLNAM,LINCOL)
292 CALL UHTOC(IVOLNA,4,JVVOLU,4)
293 IF(JVVOLD.NE.JVVOLU)MYSEEN=ATT(2)
294 CALL GSATT(JVVOLU,'SEEN',-1)
303 PARMJV(JV)=GRMAT(JV,NLEVEL)
307 POSJV(JV)=GTRAN(JV,NLEVEL)
310 C Appends new name VOLNAM to each volume, with index.
312 IQ(JBUF1+IVO)=IQ(JBUF1+IVO)+1
313 WRITE(VOLNAM(1:5),10200)IVOLNA
314 WRITE(VOLNAM(6:10),'(I4.0)')IQ(JBUF1+IVO)
316 C Call SHAPE to SET routines
318 C Updates SET block sequence number:
320 CALL GETSHP(ISHAPE,GPAR(1,NLEVEL))
322 C Position the volumes
325 CALL GPOSI(PARMJV,POSJV,VOLNAM,LINCOL)
327 C------------------------------------------------------------------------
328 C Output of material list
330 IF (IQ(JBUF1+IVO).EQ.1) THEN
332 CALL GPTSET (IVOLNA, NTRMED)
334 C------------------------------END JV------------------------------------
338 * Logic has been modified >>>>>
342 IF(SEEN.EQ.-2.)GO TO 200
346 *** IF (IDRNUM.NE.0) GO TO 999
348 C Skip User shapes (not yet implemented)
352 C Now go down the tree
355 IF(NIN.EQ.0) GO TO 200
356 IF(NIN.LT.0) GO TO 170
358 C Contents placed by GSPOS
361 IF(NLMAX.GT.NLEVEL) IN=LINDEX(NLEVEL+1)
363 IF(IN.GT.NIN.AND.NLEVEL.EQ.NLMIN) GO TO 230
365 IF(IN.GT.NIN) GO TO 190
367 CALL GMEPOS(JVO,IN,X,0)
369 NPAR=IQ(JGPAR+NLEVEL)
371 GPAR(I,NLEVEL)=Q(LQ(JGPAR-NLEVEL)+I)
381 C Contents by division
384 IF(NLMAX.GT.NLEVEL) IN=LINDEX(NLEVEL+1)
386 CALL GMEDIV(JVO,IN,X,0)
388 IF (IN.EQ.0) GO TO 190
390 NPAR=IQ(JGPAR+NLEVEL)
392 GPAR(I,NLEVEL)=Q(LQ(JGPAR-NLEVEL)+I)
395 IF (IN.EQ.0) GO TO 190
406 IF(NLEVEL.LT.NLMIN) GO TO 230
411 210 WRITE(CHMAIL,10000)NAME
417 C TOP OF THE TREE HAS PARAMETERS SET BY GSPOSP.
418 C BUT GDRAW DOES NOT HAVE ACCESS TO THE IN BANK
419 C WHICH PLACED IT IN ITS MOTHER.
421 WRITE(CHMAIL,10100) NAME
431 IF(JCG.NE.0)CALL MZDROP(IXSTOR,JCG,' ')
432 IF(JCGOBJ.NE.0)CALL MZDROP(IXSTOR,JCGOBJ,' ')
434 IF(JCGCOL.NE.0)CALL MZDROP(IXSTOR,JCGCOL,' ')
436 CALL MZGARB(IXSTOR+1,0)
441 IF (IFCVOL.EQ.1) THEN
447 C Restore permanent value of color and return
452 10000 FORMAT(' *** GDEXCA *** : Volume ',A4,' does not exist')
453 10100 FORMAT(' *** GDEXCA *** : Top of tree ',A4,' parameters defined',
454 + ' by GSPOSP - info not available to GDEXCA.')