5 * Revision 1.1.1.1 1995/10/24 10:20:47 cernlib
9 #include "geant321/pilot.h"
10 *CMZ : 3.21/02 29/03/94 15.41.32 by S.Giani
12 SUBROUTINE GWEUCL (LUN,FILNAM,TOPVOL,NUMBER,NLEVEL)
15 * ******************************************************************
17 * * Write out the geometry of the detector in EUCLID file format *
19 * * filnam : will be with the extension .euclid *
20 * * topvol : volume name of the starting node *
21 * * number : copy number of topvol (relevant for gsposp) *
22 * * nlevel : number of levels in the tree structure *
23 * * to be written out, starting from topvol *
25 * * Author : M. Maire *
27 * ******************************************************************
30 #include "geant321/gcbank.inc"
31 #include "geant321/gcnum.inc"
32 #include "geant321/gcunit.inc"
38 CHARACTER*20 NATMED, NAMATE
39 CHARACTER*4 NAME, MOTHER, SHAPE(16), KONLY
41 DIMENSION PAR(50), ATT(20)
43 DATA SHAPE/'BOX ','TRD1','TRD2','TRAP','TUBE','TUBS','CONE',
44 + 'CONS','SPHE','PARA','PGON','PCON','ELTU','HYPE',
48 * *** The output filnam name will be with extension '.euclid'
49 IF(INDEX(FILNAM,'.').EQ.0) THEN
52 IT=INDEX(FILNAM,'.')-1
54 #if !defined(CERNLIB_IBM)
55 FILEXT=FILNAM(1:IT)//'.euclid'
57 #if defined(CERNLIB_IBM)
58 FILEXT='/'//FILNAM(1:MIN(IT,8))//' EUCLID A1'
62 OPEN (UNIT=LUN,FILE=FILEXT,STATUS='UNKNOWN',FORM='FORMATTED')
64 * *** Initialisation of the working space
66 IADTMD = IADVOL + NVOLUM
67 IADROT = IADTMD + NTMED
73 NWTOT = IADROT + NROTM
75 CALL VZERO (IWS(1),NWTOT)
77 IF (NLEVEL.LE.0) MLEVEL = 20
79 * *** find the top volume and put it in the stak
81 IF (NUMBER.LE.0) NUMBR = 1
82 CALL GFPARA (TOPVOL,NUMBR,1,NPAR,NATT,PAR,ATT)
84 WRITE (CHMAIL,11100) TOPVOL,NUMBR
90 CALL GLOOK (TOPVOL,IQ(JVOLUM+1),NVOLUM,IVO)
91 JVO = LQ(JVOLUM - IVO)
94 WRITE (CHMAIL,11100) TOPVOL,NUMBR
102 IWS(IADVOL+IVO) = LEVEL
105 * *** Flag all volumes and fill the stak
109 * pick the next volume in stak
111 IVO = ABS(IWS(IVSTAK))
112 JVO = LQ(JVOLUM - IVO)
114 * flag the tracking medium
116 IWS(IADTMD + NUMED) = 1
118 * get the daughters ...
119 LEVEL = IWS(IADVOL+IVO)
120 IF (LEVEL.LT.MLEVEL) THEN
130 IWS(IADVOL+IVIN) = LEVEL
133 ELSE IF (NIN.GT.0) THEN
137 JVIN = LQ(JVOLUM - IVIN)
142 IF (IWS(IADVOL+IVIN).EQ.0) THEN
145 IWS(IADVOL+IVIN) = LEVEL
147 * flag the rotation matrix
149 IF (IROT.GT.0) IWS(IADROT+IROT) = 1
155 * next volume in stak ?
156 IF (IVSTAK.LT.NVSTAK) GO TO 10
158 * *** Write down the tracking medium definition
160 CARD = '! Tracking medium'
161 WRITE (LUN,10000) CARD
164 IF (IWS(IADTMD+ITM).GT.0) THEN
166 CALL UHTOC (IQ(JTM+1),4,NATMED,20)
171 WRITE(CHMAIL,11300) ITM, NATMED(1:LNBLNK(NATMED))
174 CALL UHTOC (IQ(JMA+1),4,NAMATE,20)
177 WRITE (CARD,10100) ITM,NATMED,IMAT,NAMATE
178 WRITE (LUN,'(A)') CARD
182 * *** Write down the rotation matrix
185 WRITE (LUN,10000) CARD
188 IF (IWS(IADROT+IRM).GT.0) THEN
191 WRITE (CARD,10200) IRM,(Q(JRM+K),K=11,16)
192 WRITE (LUN,'(A)') CARD
196 * *** Write down the volume definition
199 WRITE (LUN,10000) CARD
201 DO 50 IVSTAK = 1,NVSTAK
204 CALL UHTOC (IQ(JVOLUM+IVO),4,NAME,4)
208 IF (IVSTAK.GT.1) NPAR = Q(JVO+5)
211 IF (IVSTAK.GT.1) CALL UCOPY (Q(JVO+7),PAR(1),NPAR)
212 CALL GCKPAR (ISH,NPAR,PAR)
213 WRITE (CARD,10300) NAME,SHAPE(ISH),NMED,NPAR
214 WRITE (LUN,'(A)') CARD
215 WRITE (LUN,10400) (PAR(K),K=1,NPAR)
217 WRITE (CARD,10300) NAME,SHAPE(ISH),NMED,NPAR
218 WRITE (LUN,'(A)') CARD
223 * *** Write down the division of volumes
226 WRITE (LUN,10000) CARD
228 DO 60 IVSTAK = 1,NVSTAK
229 IVO = ABS(IWS(IVSTAK))
233 * this volume is divided ...
241 JVIN = LQ(JVOLUM-IVIN)
243 CALL UHTOC (IQ(JVOLUM+IVO ),4,MOTHER,4)
244 CALL UHTOC (IQ(JVOLUM+IVIN),4,NAME ,4)
246 IF ((STEP.LE.0.).OR.(ISH.GE.11)) THEN
247 * volume with negative parameter or gsposp or PGON ...
248 WRITE (CARD,10500) NAME,MOTHER,NDIV,IAXE
249 ELSEIF ((NDIV.LE.0).OR.(ISH.EQ.10)) THEN
250 * volume with negative parameter or gsposp or PARA ...
252 WRITE (CARD,10600) NAME,MOTHER,STEP,IAXE,NMED,NDVMX
254 * normal volume : all kind of division are equivalent
255 WRITE (CARD,10700) NAME,MOTHER,STEP,IAXE,C0,NMED,NDIV
257 WRITE (LUN,'(A)') CARD
261 * *** Write down the the positionnement of volumes
263 card = '! Positionnements'
264 WRITE (LUN,10000) CARD
266 DO 80 IVSTAK = 1,NVSTAK
267 IVO = ABS(IWS(IVSTAK))
268 CALL UHTOC (IQ(JVOLUM+IVO ),4,MOTHER,4)
271 * this volume has daughters ...
282 IF (Q(JIN+8).NE.1.) KONLY = 'MANY'
283 CALL UHTOC (IQ(JVOLUM+IVIN),4,NAME ,4)
284 JVIN = LQ(JVOLUM-IVIN)
290 WRITE (CARD,10800) NAME,NUMB,MOTHER,X,Y,Z,IROT,KONLY
291 WRITE (LUN,'(A)') CARD
294 CALL UCOPY (Q(JIN+10),PAR(1),NPAR)
295 CALL GCKPAR (ISH,NPAR,PAR)
296 WRITE (CARD,10900) NAME,NUMB,MOTHER,X,Y,Z,IROT,KONLY,
298 WRITE (LUN,'(A)') CARD
299 WRITE (LUN,10400) (PAR(K),K=1,NPAR)
308 WRITE (CHMAIL,11200) FILEXT(1:IT+9)
311 10000 FORMAT (1H!,/,A,/,1H!)
313 10100 FORMAT ('TMED',2(1X,I3,1X,1H',A20,1H'))
314 10200 FORMAT ('ROTM',1X,I3,6(1X,F8.3))
315 10300 FORMAT ('VOLU',2(1X,1H',A4,1H'),2(1X,I3))
316 10400 FORMAT ( (5X,6(1X,F11.5)))
317 10500 FORMAT ('DIVN',2(1X,1H',A4,1H'),2(1X,I3))
318 10600 FORMAT ('DIVT',2(1X,1H',A4,1H'),1X,F11.5,3(1X,I3))
319 10700 FORMAT ('DVT2',2(1X,1H',A4,1H'),1X,F11.5,1X,I3,1X,F11.5,2(1X,I3))
320 10800 FORMAT ('POSI',1X,1H',A4,1H',1X,I3,1X,1H',A4,1H',3(1X,F11.5),1X,I3
322 10900 FORMAT ('POSP',1X,1H',A4,1H',1X,I3,1X,1H',A4,1H',3(1X,F11.5),1X,I3
323 & ,1X,1H',A4,1H',1X,I3)
326 11100 FORMAT (' *** GWEUCL *** top volume : ',A4,' number :',I3,
327 & ' can not be a valid root')
328 11200 FORMAT (' *** GWEUCL *** file: ',A,' is now written out')
329 11300 FORMAT (' *** GWEUCL *** material not defined for tracking ',
330 + 'medium ',I5,' ',A)