5 * Revision 1.1.1.1 1995/10/24 10:21:10 cernlib
9 #include "geant321/pilot.h"
10 *CMZ : 3.21/02 29/03/94 15.41.20 by S.Giani
12 SUBROUTINE GGDETV (ISET, IDET)
14 C. ******************************************************************
16 C. * Routine - to compute and store the list of volumes which *
17 C. * permit to identify uniquely any detector volume specified *
18 C. * by the set number ISET, the detector number IDET and the *
19 C. * corresponding list of volume copy numbers *
20 C. * - to compute and store the physical path(s) through *
21 C. * the JVOLUM data structure down to the given detector volume *
23 C. * ==>Called by : GHCLOS *
24 C. * Author F.Bruyant ********* *
26 C. ******************************************************************
28 #include "geant321/gcbank.inc"
29 #include "geant321/gcflag.inc"
30 #include "geant321/gcnum.inc"
31 #include "geant321/gcunit.inc"
33 PARAMETER (NLVMAX=15,NSKMAX=20,NVMAX=20)
34 INTEGER IVOSK(NSKMAX,NLVMAX-1), LIMUL(NLVMAX), LINAM(NLVMAX)
35 +, LIST(2), NSK(NLVMAX-1)
36 EQUIVALENCE (LINAM(1),WS(1)), (LIMUL(1),WS(NLVMAX+1)), (IVOSK(1,1)
37 +, WS(2*NLVMAX+1)), (NSK(1),WS((NSKMAX+2)*(NLVMAX-1)+3))
38 +, (LIST(1),WS((NSKMAX+3)*(NLVMAX-1)+3))
40 C. -------------------------------------------------------------
45 C Check that JD bank has been created by GSDETV (not GSDET)
46 C or has not been already processed.
48 IF (IQ(JD+9).NE.-1) GO TO 999
52 WRITE (CHMAIL, 1001) IHDET
54 1001 FORMAT (' GGDETV : Detector ',A4)
57 C Check that current detector is not an alias
60 IF (IALI.NE.0) GO TO 200
65 CALL VZERO (NSK, NLVMAX-1)
69 10 IVOS = IUCOMP (LINAM(NLEV), IQ(JVOLUM+1), NVOLUM)
71 C Search for detector parents up to top of tree
73 20 IF (IVOS.EQ.1) GO TO 60
76 IF (IVO.EQ.IVOS) GO TO 40
79 IF (NIN.EQ.0) GO TO 40
81 C Skip mother banks already found
82 IF (IUCOMP (IVO, IVOSK(1,NLEV), NSK(NLEV)) .NE. 0) GO TO 40
88 IF (IFIX(Q(JDIV+2)).NE.IVOS) GO TO 40
89 MULTI = ABS(Q(JDIV+3))
90 IF (MULTI.EQ.0) MULTI = 255
96 IF (IFIX(Q(JIN+2)).NE.IVOS) GO TO 30
97 MULTI = MAX(MULTI, IFIX(Q(JIN+3)))
99 IF (MULTI.EQ.0) GO TO 40
105 IF (NLEV.EQ.NLVMAX) GO TO 920
106 IF (NSK(NLEV).EQ.NSKMAX) GO TO 930
107 NSK(NLEV) = NSK(NLEV) +1
108 IVOSK(NSK(NLEV),NLEV) = IVO
110 LINAM(NLEV) = IQ(JVOLUM+IVO)
116 C No more path found at current level
118 IF (NSK(NLEV).EQ.0) GO TO 910
119 IF (NSK(NLEV).GT.1.OR.LIMUL(NLEV+1).GT.1) THEN
120 DO 50 N = 1,NSK(NLEV)
122 NANEW = IQ(JVOLUM+IVO)
126 IF (NANEW.EQ.IQ(IPJD+1)) GO TO 50
130 IF (NV.EQ.NVMAX) GO TO 940
137 C Store current solution
141 IF (LIMUL(1).GT.MULT1) MULT1 = LIMUL(1)
142 #if defined(CERNLIB_DEBUGG)
143 IF (IDEBUG.NE.0) THEN
144 WRITE (CHMAIL, 1002) NSOL, NLEV
146 WRITE (CHMAIL, 1012) (LINAM(I),LIMUL(I),I=1,NLEV)
148 1002 FORMAT (' GGDETV DEBUG : NSOL,NLEV ',2I3)
149 1012 FORMAT (15(1X,A4,I3))
154 LIST(NLIST+1) = LINAM(N)
155 LIST(NLIST+2) = LIMUL(N)
156 IF (N.EQ.NLEV) LIST(NLIST+2) = NLEV
159 IF (NLEV.LT.3) GO TO 100
164 IF (NLEV.GT.0) GO TO 10
166 100 IF (MULT1.GT.1) THEN
168 IQ(JD+9+2*NV) = LINAM(1)
171 C Perform final operations on JD bank
174 IF (NV.EQ.0) GO TO 150
176 C Compute maximum multiplicities
181 IF (IQ(IPJD+1).EQ.LIST(N))
182 + IQ(IPJD+2)=MAX(IQ(IPJD+2),LIST(N+1))
187 IF (IDEBUG.NE.0) THEN
191 IF (I2.GT.NV) I2 = NV
192 WRITE (CHMAIL, 1003) (IQ(JD+10+I),I=2*I1-1,2*I2)
194 IF (I2.LT.NV) GO TO 125
195 1003 FORMAT (10X,15(1X,A4,I3))
198 C Compute corresponding bit numbers for packing
205 IF (IQ(IPJD+2).GT.2**NBITS-1) GO TO 130
206 IF (NBITS.GE.32) NBITS = 0
214 IF (K.LE.32) GO TO 140
224 NDATA = 10 +2*NV +NLIST
226 CALL MZPUSH (IXCONS, JD, 0, NDATA-ND, 'I')
227 CALL UCOPY (LIST, IQ(JD+2*NV+11), NLIST)
228 #if defined(CERNLIB_DEBUGG)
229 IF (IDEBUG.NE.0) THEN
231 WRITE (CHMAIL, 1004) NDATA,(IQ(JD+I),I=1,ND1)
233 DO 160 II=ND1+1,NDATA,10
235 WRITE (CHMAIL, 1005) (IQ(JD+I),I=II,ND2)
238 1004 FORMAT (' GGDETV DEBUG : NDATA ',I3,' JD --> ',10I4)
239 1005 FORMAT (10(1X,A4,I4))
244 C Current detector IDET is an alias
247 IF (IDEBUG.NE.0) THEN
249 WRITE (CHMAIL, 1006) IHALI
251 1006 FORMAT (' Alias of detector ',A4)
258 CALL MZPUSH (IXCONS, JD, 0, NDM-ND, 'I')
263 CALL UCOPY (IQ(JDM+1), IQ(JD+1), NDM)
271 910 WRITE (CHMAIL, 1000) LINAM(NLEV)
273 1000 FORMAT (' GGDETV : Hanging volume ',A4)
275 920 CHMAIL=' GGDETV : Parameter NLVMAX too small'
278 930 CHMAIL=' GGDETV : Parameter NSKMAX too small'
281 940 CHMAIL=' GGDETV : NVMAX (= size of NUMBV) too small'