5 * Revision 1.1.1.1 1995/10/24 10:21:16 cernlib
9 #include "geant321/pilot.h"
10 *CMZ : 3.21/02 29/03/94 15.41.20 by S.Giani
12 SUBROUTINE GFIN(LUN,CHOBJ,NKEYS,IDVERS,CHOPT,IER)
14 C. ******************************************************************
16 C. * Routine to read GEANT object(s) fromin the FZ file *
17 C. * The data structures from disk are read in memory *
19 C. * LUN Logical unit *
21 C. * CHOBJ The type of data structure to be read: *
23 C. * TMED tracking medium *
25 C. * ROTM rotation matrix *
26 C. * SETS detector set *
29 C. * INIT read all above *
30 C. * KINE this keyword will trigger the read of *
31 C. * KINE and VERT unless the flag 'S' is set *
32 C. * DIGI digitisation *
34 C. * HEAD event header *
37 C. * STAK particle temporary stack *
38 C. * STAT volume statistic *
40 C. * JXYZ track points *
41 C. * TRIG this keyword will trigger the read of *
42 C. * DIGI, HEAD, HITS, KINE, VERT abd JXYZ *
43 C. * unless the 'S' flag is set *
45 C. * NKEYS number of keys in vector CHOBJ *
47 C. * IDVERS version of the data structure to be read in *
49 C. * CHOPT List of options *
50 C. * 'I' read only initialisation data *
52 C. * 'K' read only KINE and TRIG data *
54 C. * 'T' read only DIGI, HEAD, HITS, KINE, *
55 C. * VERT and JXYZ data structures *
56 C. * even if other keys are specified in CHOBJ *
58 C. * 'S' interpret KINE to mean only *
59 C. * KINE and TRIG and INIT to mean *
61 C. * 'Q' quiet option, no message is *
64 C. * IER error flag. <0 ZEBRA error flag as returned in *
66 C. * 0 read completed successfully *
67 C. * >0 if only IER structures read in *
69 C. * The FZ data base has been created via GOPEN/GFOUT *
74 C. * CALL GOPEN(1,'I',1024,IER) *
75 C. * CALL GFIN (1,'VOLU',1,0,' ',IER) *
76 C. * CALL GFIN (1,'MATE',1,0,' ',IER) *
77 C. * CALL GFIN (1,'TMED',1,0,' ',IER) *
78 C. * CALL GFIN (1,'ROTM',1,0,' ',IER) *
79 C. * CALL GFIN (1,'PART',1,0,' ',IER) *
80 C. * CALL GFIN (1,'SCAN',1,0,' ',IER) *
81 C. * CALL GFIN (1,'SETS',1,0,' ',IER) *
83 C. * ==>Called by : <USER> ,GOPEN *
84 C. * Author F.Carminati ******* *
86 C. ******************************************************************
88 #include "geant321/gcbank.inc"
89 #include "geant321/gcflag.inc"
90 #include "geant321/gconsp.inc"
91 #include "geant321/gcnum.inc"
92 #include "geant321/gccuts.inc"
93 #include "geant321/gcscal.inc"
94 #include "geant321/gcdraw.inc"
95 #include "geant321/gcvolu.inc"
96 #include "geant321/gcunit.inc"
97 #include "geant321/gctime.inc"
98 * COMMON/GCLINK/JDIGI ,JDRAW ,JHEAD ,JHITS ,JKINE ,JMATE ,JPART
99 * + ,JROTM ,JRUNG ,JSET ,JSTAK ,JGSTAT,JTMED ,JTRACK,JVERTX
100 * + ,JVOLUM,JXYZ ,JGPAR ,JGPAR2,JSKLT
101 COMMON/QUEST/IQUEST(100)
102 PARAMETER (NLINIT=9,NLKINE=2,NLTRIG=6,NMKEY=22)
103 DIMENSION JNAMES(20),LINIT(NLINIT),LKINE(NLKINE)
104 DIMENSION LTRIG(NLTRIG),IXD(NMKEY)
105 DIMENSION LINK(NMKEY),IVERSI(NMKEY),LDIV(2),IRESUL(NMKEY)
106 DIMENSION IDOLD(8), IDNEW(8), VEROLD(8), VERNEW(8)
107 DIMENSION IUHEAD(2),ITRAN(23)
108 EQUIVALENCE (JNAMES(1),JDIGI)
109 CHARACTER*4 KNAMES(NMKEY),CHOBJ(*)
111 DATA KNAMES/'DIGI','DRAW','HEAD','HITS','KINE','MATE','PART',
112 + 'ROTM','RUNG','SETS','STAK','STAT','TMED','NULL','VERT',
113 + 'VOLU','JXYZ','NULL','NULL','NULL','SCAN','NULL'/
114 DATA ITRAN/7,6,13,16,8,10,2,9,8*0,3,15,5,17,4,1,21/
115 DATA IXD/2,1,2,2,2,8*1,2,2,1,2,3*0,1,0/
116 DATA LINIT/2,6,7,8,9,10,13,16,21/
118 DATA LTRIG/1,3,4,5,15,17/
122 C. ------------------------------------------------------------------
130 IOPTI=INDEX(CHOPT,'i')+INDEX(CHOPT,'I')
131 IOPTT=INDEX(CHOPT,'t')+INDEX(CHOPT,'T')
132 IOPTK=INDEX(CHOPT,'k')+INDEX(CHOPT,'K')
133 IOPTS=INDEX(CHOPT,'s')+INDEX(CHOPT,'S')
134 IOPTQ=INDEX(CHOPT,'q')+INDEX(CHOPT,'Q')
136 * Save old JRUNG dates and versions
139 IDOLD(J) = IQ(JRUNG+10+J)
140 VEROLD(J) = Q(JRUNG+20+J)
147 IF(CHOBJ(JKEY).EQ.'INIT') THEN
150 IF(LINK(MLINK).EQ.LINIT(J)) GO TO 30
156 ELSEIF(CHOBJ(JKEY).EQ.'TRIG') THEN
159 IF(LINK(MLINK).EQ.LTRIG(J)) GO TO 50
165 ELSEIF(CHOBJ(JKEY).EQ.'KINE') THEN
168 IF(LINK(MLINK).EQ.LKINE(J)) GO TO 70
177 IF(CHOBJ(JKEY).EQ.KNAMES(J)) THEN
179 IF(LINK(MLINK).EQ.J) GO TO 100
186 WRITE(CHMAIL,10300) CHOBJ(JKEY)
187 IF(IOPTQ.EQ.0) CALL GMAIL(0,0)
193 IF(LINK(J).EQ.LINIT(K)) GO TO 120
195 WRITE(CHMAIL,10000) KNAMES(LINK(J))
196 IF(IOPTQ.EQ.0) CALL GMAIL(0,0)
199 ELSEIF(IOPTK.GT.0) THEN
202 IF(LINK(J).EQ.LKINE(K)) GO TO 140
204 WRITE(CHMAIL,10100) KNAMES(LINK(J))
205 IF(IOPTQ.EQ.0) CALL GMAIL(0,0)
208 ELSEIF(IOPTT.GT.0) THEN
211 IF(LINK(J).EQ.LTRIG(K)) GO TO 160
213 WRITE(CHMAIL,10200) KNAMES(LINK(J))
214 IF(IOPTQ.EQ.0) CALL GMAIL(0,0)
220 IF(LINK(J).EQ.0) THEN
229 IF(LINK(JL).EQ.9.OR.LINK(JL).EQ.3) THEN
238 IF(IOPTQ.EQ.0) CALL GMAIL(0,0)
243 IF(IOPTI+IOPTK+IOPTT.EQ.0) THEN
245 * We have to choose which event header to read, JRUNG or JHEAD
246 * If the banks list contains banks depending from both headers,
247 * the result is unpredictable. Error message to be inserted later.
250 IF(LINK(J).EQ.LINIT(L)) THEN
256 IF(LINK(J).EQ.LKINE(L)) THEN
262 IF(LINK(J).EQ.LTRIG(L)) THEN
276 * Go for next start of event data structure
277 190 IF(IOPTI.NE.0) THEN
278 IF(JRUNG.NE.0)CALL MZDROP(IXCONS,JRUNG,' ')
280 CALL FZIN(LUN,IXCONS,JRUNG,1,'E',NUH,IUHEAD)
281 IF(IQUEST(1).GE.2) THEN
286 IVERSI(NPOS)=IUHEAD(1)
289 ELSEIF(IOPTT+IOPTK.NE.0) THEN
290 IF(JHEAD.NE.0)CALL MZDROP(IXDIV,JHEAD,' ')
292 CALL FZIN(LUN,IXDIV,JHEAD,1,'E',NUH,IUHEAD)
293 IF(IQUEST(1).GE.2) THEN
298 IVERSI(NPOS)=IUHEAD(1)
304 IF(IDVERS.NE.0.AND.IDVERS.NE.IVERIN) THEN
306 LINK(I)=-ABS(LINK(I))
310 IF (IDVERS .EQ. 0) IDVERS = IVERIN
312 LINK(I)= ABS(LINK(I))
317 WRITE(CHMAIL,11100) NK
318 IF(IOPTQ.EQ.0) CALL GMAIL(0,0)
327 CALL FZIN(LUN,0,0,0,'S',NUH,IUHEAD)
328 IF(IQUEST(1).GT.2)GO TO 320
329 IKEY=ITRAN(IUHEAD(1))
335 IF(JNAMES(NKEY).NE.0)THEN
336 CALL MZDROP(IDIV,JNAMES(NKEY),'L')
339 CALL FZIN(LUN,IDIV,JNAMES(NKEY),1,'A',NUH,IUHEAD)
342 IF(ISLINK(NKL).NE.0)THEN
343 CALL MZDROP(IDIV,ISLINK(NKL),'L')
346 CALL FZIN(LUN,IDIV,ISLINK(NKL),1,'A',NUH,IUHEAD)
348 IF(IQUEST(1).LE.2.AND.IQUEST(1).GE.0) THEN
361 IF(IRESUL(I).EQ.1) THEN
362 WRITE(CHMAIL,10500) KNAMES(LINK(I)), IVERSI(I)
363 IF(IOPTQ.EQ.0) CALL GMAIL(0,0)
365 ELSEIF(LINK(I).GT.0) THEN
366 WRITE(CHMAIL,10600) KNAMES(LINK(I))
367 IF(IOPTQ.EQ.0) CALL GMAIL(0,0)
368 ELSEIF(LINK(I).LT.0) THEN
369 WRITE(CHMAIL,10700) KNAMES(-LINK(I)), IDVERS
370 IF(IOPTQ.EQ.0) CALL GMAIL(0,0)
376 IF(IOPTQ.EQ.0) CALL GMAIL(0,0)
379 ELSEIF(NIN.LT.NLINK) THEN
383 IF(KVOL.NE.JVOLUM)THEN
385 CALL MZGARB(IXCONS,0)
393 DO 260 J=1, IQ(JVOLUM-2)
394 IF(LQ(JVOLUM-J).EQ.0) GOTO 270
401 CALL UCOPY(Q(JTMED+1),CUTGAM,10)
405 IF(JPART.NE.0 ) NPART = IQ(JPART-2)
406 IF(JVERTX.NE.0) NVERTX = IQ(JVERTX+1)
407 IF(JKINE.NE.0) NTRACK = IQ(JKINE+1)
408 IF(JMATE.NE.0 ) NMATE = IQ(JMATE-2)
409 IF(JROTM.NE.0 ) NROTM = IQ(JROTM-2)
415 C Book JDRAW structure for view banks
417 CALL MZBOOK(IXCONS,JDRAW,JDRAW,1,'DRAW',0,0,0,3,0)
427 * Here we deal with version numbers If JRUNG has been read in,
428 * then save the version numbers of the new JRUNG and restore
429 * the current version number for KINE, HITS and DIGI
431 IF(IVERSI(J).GT.0) THEN
433 IF(KNAMES(NKEY).EQ.'RUNG') THEN
435 IDNEW(I) = IQ(JRUNG+10+I)
436 VERNEW(I) = Q(JRUNG+20+I)
439 * And we put back the old version numbers because,
440 * in principle, KINE, HITS and DIGI have not be read in
442 IQ(JRUNG+10+I) = IDOLD(I)
443 Q(JRUNG+20+I) = VEROLD(I)
449 * And here we do it again for KINE, HITS and DIGI
451 IF(IVERSI(J).GT.0) THEN
453 IF(KNAMES(NKEY).EQ.'KINE') THEN
454 IF(IDNEW(3).GT.0) THEN
455 IQ(JRUNG+13) = IDNEW(3)
456 IQ(JRUNG+14) = IDNEW(4)
457 Q(JRUNG+23) = VERNEW(3)
458 Q(JRUNG+24) = VERNEW(4)
460 ELSEIF(KNAMES(NKEY).EQ.'HITS') THEN
461 IF(IDNEW(5).GT.0) THEN
462 IQ(JRUNG+15) = IDNEW(5)
463 IQ(JRUNG+16) = IDNEW(6)
464 Q(JRUNG+25) = VERNEW(5)
465 Q(JRUNG+26) = VERNEW(6)
467 ELSEIF(KNAMES(NKEY).EQ.'DIGI') THEN
468 IF(IDNEW(7).GT.0) THEN
469 IQ(JRUNG+17) = IDNEW(7)
470 IQ(JRUNG+18) = IDNEW(8)
471 Q(JRUNG+27) = VERNEW(7)
472 Q(JRUNG+28) = VERNEW(8)
474 ELSEIF(KNAMES(NKEY).EQ.'MATE'.OR. KNAMES(NKEY) .EQ.'TMED'
476 IF(VERNEW(1).NE.0) THEN
477 * We know which version number we are reading
478 IF(VERNEW(1).LT.GVERSN) THEN
479 WRITE(CHMAIL,10900) KNAMES(NKEY),VERNEW(1),
481 IF(IOPTQ.EQ.0) CALL GMAIL(0,0)
483 IF(IOPTQ.EQ.0) CALL GMAIL(0,0)
492 10000 FORMAT(' *** GFIN *** Key ',A4,' ignored for initialization')
493 10100 FORMAT(' *** GFIN *** Key ',A4,' ignored for kinematics')
494 10200 FORMAT(' *** GFIN *** Key ',A4,' ignored for trigger')
495 10300 FORMAT(' *** GFIN *** Unknown key ',A4)
496 10400 FORMAT(' *** GFIN *** No valid key given')
497 10500 FORMAT(' *** GFIN *** Data structure ',A4,' version ',I10,
498 + ' successfully read in ')
499 10600 FORMAT(' *** GFIN *** Data structure ',A4,' was not found')
500 10700 FORMAT(' *** GFIN *** Data structure ',A4,' version ',I10,
502 10800 FORMAT(' *** GFIN *** Nothing found to read !')
503 10900 FORMAT(' *** GFIN *** ',A4,' data structure ',
504 + 'version ',F6.4,' current version is ',F6.4)
505 11000 FORMAT(' Please call subroutine GPHYSI before ',
507 11100 FORMAT(' *** GFIN *** Illegal number of links ',I10)