C =================================================================
C DCONVR - A dummy module for time->distance conversion of DC hits
C =================================================================
C
C Language:-
C ==========
C KLOE Fortran
C
C Modulename:-
C ============
C DCONVR.KLOE
C
C Description:-
C =============
C This is an A_C Normal Module which contains all entries to run
C the Drift Chamber conversion code in the A_C environment.
C
C DCOINI Initialize input program at start of job.
C DCORIN Run Initialization Entry.
C DCOEVT Event Entry.
C DCORFI Run End Entry.
C DCOFIN Cleanup for job termination.
C DCOBOO Histogram/ntuple booking
C DCOTLK Talk module
C
C Author:-
C ========
C F. Donno & F. Pelucchi
C KLOE Computing Group
C LNF Frascati
C
C Revision History:-
C ==================
C 10 Nov 1995 Original Creation
C
SUBROUTINE DCOINI
C =================
$$IMPLICIT
C
C Description:-
C =============
C This routine is called at program initialisation time.
C
C Call Parameters:-
C ================
C None
C
C Return Parameters:-
C ===================
C None
C
C Function Value:-
C ================
C None
C
C Global Declarations:-
C =====================
C
C External Functions:-
C ====================
C
C Local Declarations:-
C ====================
C
C Executable Code:-
C =================
C
RETURN
END
C
SUBROUTINE DCORIN
C =================
$$IMPLICIT
C
C Description:-
C =============
C This routine is called at run initialisation time.
C No actions at present
C
C Call Parameters:-
C ================
C None
C
C Return Parameters:-
C ===================
C None
C
C Function Value:-
C ================
C None
C
C Global Declarations:-
C =====================
$$INCLUDE 'K$INC:JOBSTA.INC'
C
C
C External Functions:-
C ====================
INTEGER INITRST,INITFST,INITRSIG,INITFSIG
C
C
C Local Declarations:-
C ====================
INTEGER STATUS
C
C Executable Code:-
C =================
C
C Initialize drift chamber database
C =================================
STATUS = INITRST(NRUN,EXPTYP,RUNTYP) ! Init Raw s-t relations
STATUS = INITFST(NRUN,EXPTYP,RUNTYP) ! Init Fine s-t relations
STATUS = INITRSIG(NRUN,EXPTYP,RUNTYP) ! Init Raw s-t error tables
STATUS = INITFSIG(NRUN,EXPTYP,RUNTYP) ! Init Fine s-t error tables
C
RETURN
END
C
SUBROUTINE DCOEVT
C =================
$$IMPLICIT
C
C Description:-
C =============
C This routine applies the actual conversion algorythm for each event
C
C Call Parameters:-
C ================
C None
C
C Return Parameters:-
C ===================
C None
C
C Function Value:-
C ================
C None
C
C Global Declarations:-
C =====================
$$INCLUDE 'K$INC:BCS.INC'
$$INCLUDE 'K$INC:JOBSTA.INC'
$$INCLUDE 'K$INC:RUNTYP.INC'
$$INCLUDE 'K$INC:BPOYBS.INC'
$$INCLUDE 'YBOS$LIBRARY:ERRCOD.INC'
$$INCLUDE 'K$INC:ERLEVL.INC'
$$INCLUDE 'K$ITRK:CFLAGS.INC'
$$INCLUDE 'K$ITRK:CDFCUT.INC'
$$INCLUDE 'K$ITRK:DHRE.INC'
C
C External Functions:-
C ====================
C
INTEGER BLOCAT,BTYMKG
INTEGER RAWST
C
C Local Declarations:-
C ====================
C
INTEGER STATUS,INDC,INDDATC,NHITC,DHITNCO,DTCENCO
INTEGER IND,INDR,INDH,INDDAT,INDDATR,INDDATH,DHRENCO
INTEGER BNKSIZ,LOOP,IHIT,KPLA,KWIR
C
REAL DRIFTT,DRIFTR,ERRD
REAL VINV,ALENGBY2
DATA VINV/0.035/,ALENGBY2/155./
C
REAL RAND_R(1)
C
CHARACTER*21 BNKTYP
DATA BNKTYP/'4I4,XXXXX(2I4,2R4,I4)'/
C
C Executable Code:-
C =================
C
C To begin, let's find out if we are reading Monte Carlo or real data.
MONTECARLO = EXPTYP .EQ. EXOFSI
C
C================================================================
C The calls to REKINE and CLEANUP must be done at the first
C module that is called: for now, here in DCOEVT.
IF (MONTECARLO) THEN
CALL REKINE
CALL CLEANUP
ENDIF
CALL CLEANUP_DATA
C================================================================
C
C Locate bank DTCE
STATUS = BLOCAT(IW,'DTCE',1,INDC,INDDATC)
IF (STATUS.NE.YESUCC) THEN
C There are no hits in the DC, no clusters, no nothing. Signal this and exit.
CALL HFILL(1,0.,0.,1.)
CALL HFILL(2,0.,0.,1.)
RETURN
ENDIF
NHITC = IW(INDDATC+DTCNRO)
DTCENCO = IW(INDDATC+DTCNCO)
C
C Make first version of bank DHRE
WRITE (BNKTYP(5:9),'(I5)') NHITC
STATUS = BTYMKG(IW,'DHRE',1,BNKTYP,BNKSIZ,INDR,INDDATR)
IF (STATUS.NE.YESUCC) THEN
CALL ERLOGR('DCOEVT',ERWARN,0,STATUS,
+ 'Error creating bank DHRE!')
RETURN
ENDIF
C
C Fill the header of DHRE .....
IW(INDDATR+DHRHDS) = 4
IW(INDDATR+DHRVRN) = 1
IW(INDDATR+DHRNRO) = NHITC
IW(INDDATR+DHRNCO) = 5
DHRENCO = IW(INDDATR+DHRNCO)
C
C And now fill the point data.
INDC = INDDATC+IW(INDDATC+DTCHDS)
INDR = INDDATR+IW(INDDATR+DHRHDS)
DO LOOP=1,NHITC
C
C Convert address from DTCE which follows the GEANFI convention, in which
C sense layer 1 is INNERMOST, to the ARGUS one in which it is the OUTERMOST
KPLA = IW(INDC+DTCADR)/2**9
KWIR = IW(INDC+DTCADR) - KPLA*2**9
KPLA = 59-KPLA
IW(INDR+DHRSLR) = KPLA
IW(INDR+DHRWNR) = KWIR
C
C Correct times in DTCE, cutting 5.43 ns to each. This -on the average-
C takes into account a time for signal propagation along the wires,
C corresponding to a half of the drift chamber length and will help
C Pattern Recognition, marginally though.
IF (RW(INDC+DTCTIM) .LT. 0.) THEN
DRIFTT = ABS(AMIN1(RW(INDC+DTCTIM)+VINV*ALENGBY2,0.))
ELSE
DRIFTT = ABS(AMAX1(RW(INDC+DTCTIM)-VINV*ALENGBY2,0.))
ENDIF
C
C Invert here a time-to-distance relation averaged over all crossing angles
IF (KPLA.GT.46) THEN
STATUS = RAWST(2,DRIFTT,DRIFTR,ERRD)
ELSE
STATUS = RAWST(3,DRIFTT,DRIFTR,ERRD)
ENDIF
RW(INDR+DHRRAD) = DRIFTR
RW(INDR+DHRERR) = ERRD
IW(INDR+DHRTRN) = 0
INDC = INDC + DTCENCO
INDR = INDR + DHRENCO
ENDDO
C
C Now a bank of pointers will be created, to allow traversing the DTCE,
C DTHA, DHRE banks (if desired) in the order of 1) increasing phi and 2)
C decreasing radius. Many ARGUS original algorythms need this.
C
CALL MAKEDHPT
C
C Now a bank of clusters will be created: this may be useful
CALL MAKEDHCL
C
C This was for real data. For Monte Carlo, we may want to bypass space-time
C inversion, recovering the true drift distance and smearing it somewhat.
C This is done here through the links in DTHA. Later, after construction
C of the DPRS banks, either by a pattern algorythm or by DPRBYPASS,
C the last information (the track candidate) will be added.
IF (MONTECARLO .AND. .NOT. TS_RAWREL) THEN
STATUS = BLOCAT(IW,'DHIT',1,IND,INDDAT)
IF (STATUS.NE.YESUCC) THEN
CALL ERLOGR('DCOEVT',ERWARN,0,STATUS,
+ 'Bank DHIT not found!')
RETURN
ENDIF
DHITNCO = IW(INDDAT+DHINCO)
C
STATUS = BLOCAT(IW,'DTHA',1,INDH,INDDATH)
IF (STATUS.NE.YESUCC) THEN
CALL ERLOGR('DCOEVT',ERWARN,0,STATUS,
+ 'Bank DTHA not found!')
RETURN
ENDIF
INDH = INDDATH + IW(INDDATH+DTHHDS)
C
INDR = INDDATR+IW(INDDATR+DHRHDS)
CALL NORRIN(NRUN,NEV)
DO LOOP=1,NHITC
C
C Recover pointer into DHIT from bank DTHA with index INDH
IHIT = IW(INDH+LOOP-1)
IND = INDDAT + IW(INDDAT+DHIHDS) + (IHIT-1)*DHITNCO
C
C Do a simple smearing of the true distance, starting from d.d.'s in DHIT
CALL RNORML(RAND_R,1)
RW(INDR+DHRRAD) = RW(IND+DHIDIS) + RAND_R(1)*DRFDER
RW(INDR+DHRERR) = DRFDER
INDR = INDR + DHRENCO
ENDDO
ENDIF
C
C Do some control histograms
CALL DCOHIS
C
RETURN
END
C
SUBROUTINE DCORFI
C =================
$$IMPLICIT
C
C Description:-
C =============
C This routine is called at run termination.
C It does any necessary cleanup.
C
C Call Parameters:-
C ================
C None
C
C Return Parameters:-
C ===================
C None
C
C Function Value:-
C ================
C None
C
C Global Declarations:-
C =====================
C
C External Functions:-
C ====================
C
C Local Declarations:-
C ====================
C
C Executable Code:-
C =================
C
RETURN
END
C
SUBROUTINE DCOFIN
C =================
$$IMPLICIT
C
C Description:-
C =============
C This routine is called at program termination.
C It does any necessary cleanup.
C
C Call Parameters:-
C ================
C None
C
C Return Parameters:-
C ===================
C None
C
C Function Value:-
C ================
C None
C
C Global Declarations:-
C =====================
C
C
C External Functions:-
C ====================
C
C Local Declarations:-
C ====================
C
C Executable Code:-
C =================
C
RETURN
END
C
SUBROUTINE DCOBOO
C =================
$$IMPLICIT
C
C Description:-
C =============
C This routine is called at run initialisation.
C
C Call Parameters:-
C ================
C None
C
C Return Parameters:-
C ===================
C None
C
C Function Value:-
C ================
C None
C
C Global Declarations:-
C =====================
$$INCLUDE 'K$ITRK:CCONST.INC'
C
C External Functions:-
C ====================
C
C Local Declarations:-
C ====================
C
C Executable Code:-
C =================
CALL HBOOK1(1,'Number of DC hits',100,0.,500.,0.)
CALL HBOOK1(2,'Number of DC clusters',100,0.,250.,0.)
CALL HBOOK1(3,'Width of DC clusters',30,0.,30.,0.)
CALL HBOOK2(4,'Phi of DC clusters/layer',50,0.,PI2,60,0.,60.,0.)
CALL HBPRO(0,0.)
C
RETURN
END
C
SUBROUTINE DCOTLK
C =================
$$IMPLICIT
C
C Description:-
C =============
C
C Call Parameters:-
C ================
C None
C
C Return Parameters:-
C ===================
C None
C
C Function Value:-
C ================
C None
C
C Global Declarations:-
C =====================
C
C External Functions:-
C ====================
C
C Local Declarations:-
C ====================
C
C Executable Code:-
C =================
C
C
RETURN
END
C
SUBROUTINE CLEANUP
C =================
$$IMPLICIT
C
C Description:-
C =============
C This routine is a place where all sort of ugly stuff is segregated
C
C Call Parameters:-
C ================
C None
C
C Return Parameters:-
C ===================
C None
C
C Function Value:-
C ================
C None
C
C Global Declarations:-
C =====================
$$INCLUDE 'K$INC:BCS.INC'
$$INCLUDE 'K$INC:BPOYBS.INC'
C Following excerpt is from 'GEAPACK$LIBRARY:GEAPAK.INC'
INTEGER Part,Mate,TMed,Volu,RotM,
& Sets,Draw,RunG,Head,Vert,
& Kine,XYZ, Hits,Digi
PARAMETER (Part=1, Mate=2, TMed=3, Volu=4, RotM=5,
& Sets=6, Draw=7, RunG=8, Head=9, Vert=10,
& Kine=11,XYZ=12, Hits=13,Digi=14)
$$INCLUDE 'YBOS$LIBRARY:BNKTYP.INC'
$$INCLUDE 'YBOS$LIBRARY:ERRCOD.INC'
$$INCLUDE 'K$INC:ERLEVL.INC'
$$INCLUDE 'K$INC:RUNTYP.INC'
$$INCLUDE 'K$ITRK:CFLAGS.INC'
C
C External Functions:-
C ====================
C
INTEGER GCOUNT
INTEGER BLOCAT,BMAKEG,BDROP
C
C Local Declarations:-
C ====================
C
INTEGER STATUS,IND,INDDAT,INDH,INDDATH
INTEGER I1,I2,IND1,IND2,BLKSIZ,NHITS,NODUP,DTHSIZ
INTEGER ADDR1,ADDR2,ITRA1,ITRA2
INTEGER NAUX
C
REAL TIME1,TIME2
REAL DHITMAX, DIFPMAX
PARAMETER (DHITMAX = 5.5)
PARAMETER (DIFPMAX = 1.)
REAL PREVPT,PREVPZ,PREVP,THISPT,THISPZ,THISP
REAL DHIT2D,DIFPMEV
LOGICAL GAP_IN_SEQ,DIFFMOM
C
C Executable Code:-
C =================
C
STATUS = BLOCAT(IW,'DHIT',1,IND,INDDAT)
IF (STATUS.NE.YESUCC) RETURN
C
NHITS = IW(INDDAT+DHINRO)
BLKSIZ = IW(INDDAT+DHINCO)
IND = INDDAT+IW(INDDAT+DHIHDS)
C
C In the MC data of summer 95 a cleanup was done to eliminate hit duplicates
C in the same cell: only the first hit on the wire was kept when passing
C from DHIT to DTCE. But the bank DTHA, containing pointers from DTCE to DHIT
C was not written. So, for those data only, it has to be done now. To avoid
C scanning hits twice, the number of no-dup hits in DTHA is taken from DTCE.
C NOTE ANYHOW: Since in the summer 95 data the times were wrong, the
C selection of duplicate hits will be more or less random in any case.
C
STATUS = BLOCAT(IW,'DTHA',1,INDH,INDDATH)
IF (STATUS .NE. YESUCC) THEN
STATUS = BLOCAT(IW,'DTCE',1,INDH,INDDATH)
IF (STATUS .NE. YESUCC) THEN
RETURN
ENDIF
NODUP = IW(INDDATH+DTCNRO)
C
C Let's make DTHA and write the header
DTHSIZ = 3 + NODUP
STATUS = BMAKEG(IW,'DTHA',1,DTHSIZ,BNKTI4,INDH,INDDATH)
IF (STATUS .NE. YESUCC) THEN
CALL ERLOGR('CLEANUP',ERWARN,0,STATUS,
+ 'Error creating bank DTHA')
RETURN
ENDIF
IW(INDDATH+DTHHDS) = 3
IW(INDDATH+DTHVRN) = 1
IW(INDDATH+DTHNRO) = NODUP
INDH = INDDATH + IW(INDDATH+DTHHDS)
C
C Now let's scan hits and mark duplicates.
IND = INDDAT + IW(INDDAT+DHIHDS)
DO I1=1,NHITS-1
IND1 = IND + (I1-1)*BLKSIZ
ADDR1 = IW(IND1+DHIADR)
DO I2=I1+1,NHITS
IND2 = IND + (I2-1)*BLKSIZ
ADDR2 = IW(IND2+DHIADR)
IF (ADDR1 .EQ. ADDR2) THEN
TIME1 = ABS(RW(IND1+DHITOF)) + ABS(RW(IND1+DHITIM))
TIME2 = ABS(RW(IND2+DHITOF)) + ABS(RW(IND2+DHITIM))
IF (TIME1.LE.TIME2) THEN
RW(IND2+DHIDIS) = 999999.
ELSE
RW(IND1+DHIDIS) = 999999.
ENDIF
ENDIF
ENDDO
ENDDO
C
C Finally, let's fill in the pointers and check that DTCE and DTHA
C have the same length.
IND = INDDAT + IW(INDDAT+DHIHDS)
DO I1=1,NHITS
IND1 = IND + (I1-1)*BLKSIZ
IF (RW(IND1+DHIDIS) .LT. 999999.) THEN
IW(INDH) = I1
INDH = INDH+1
ENDIF
ENDDO
IF (INDH-INDDATH-IW(INDDATH+DTHHDS) .NE. NODUP) THEN
CALL ERLOGR('CLEANUP',ERWARN,0,STATUS,
+ 'DTCE/DTHA inconsistency')
C
C There is apparently no other clean way to abort this event. So do this!
STATUS = BDROP(IW,'DTCE')
RETURN
ENDIF
ENDIF
C
C If the user requested DPRBYPASS to run, still more cleanup has to be made
C to separate hits belonging to tracks from nuclear interactions and to
C tracks passing through a wall. This separation is made incrementing the
C pointer to KINE beyond the total number of KINE tracks: ATTENTION!
IF (.NOT. PTRN_REC) THEN
NAUX = GCOUNT(KINE)
IND1 = INDDAT+IW(INDDAT+DHIHDS)
DO I1=1,NHITS-1
ITRA1 = IW(IND1+DHITRA)
IND2 = IND1+BLKSIZ
ITRA2 = IW(IND2+DHITRA)
IF (ITRA1.EQ.ITRA2) THEN
DHIT2D = SQRT((RW(IND2+DHIXCO)-RW(IND1+DHIXCO))**2+
+ (RW(IND2+DHIYCO)-RW(IND1+DHIYCO))**2+
+ 0.0001)
PREVPT = SQRT(RW(IND1+DHIPPX)**2 + RW(IND1+DHIPPY)**2)
THISPT = SQRT(RW(IND2+DHIPPX)**2 + RW(IND2+DHIPPY)**2)
PREVPZ = RW(IND1+DHIPPZ)
THISPZ = RW(IND2+DHIPPZ)
PREVP = SQRT(PREVPT**2 + PREVPZ**2)
THISP = SQRT(THISPT**2 + THISPZ**2)
DIFPMEV= THISP-PREVP
GAP_IN_SEQ = DHIT2D.GT.DHITMAX
DIFFMOM = ABS(DIFPMEV).GT.DIFPMAX
IF (GAP_IN_SEQ .OR. DIFFMOM) THEN
NAUX = NAUX+1
DO WHILE (IW(IND2+DHITRA) .EQ. ITRA2)
IW(IND2+DHITRA) = NAUX
IND2 = IND2+BLKSIZ
ENDDO
ENDIF
ENDIF
IND1 = IND1 + BLKSIZ
ENDDO
ENDIF
C
RETURN
END
C
C
SUBROUTINE CLEANUP_DATA
C =======================
$$IMPLICIT
C
C Description:-
C =============
C This routine is a place where all sort of ugly stuff is segregated
C
C Call Parameters:-
C ================
C None
C
C Return Parameters:-
C ===================
C None
C
C Function Value:-
C ================
C None
C
C Global Declarations:-
C =====================
$$INCLUDE 'K$INC:BCS.INC'
$$INCLUDE 'K$INC:BPOYBS.INC'
$$INCLUDE 'YBOS$LIBRARY:ERRCOD.INC'
$$INCLUDE 'K$INC:ERLEVL.INC'
$$INCLUDE 'K$ITRK:CFLAGS.INC'
C
C External Functions:-
C ====================
C
INTEGER BLOCAT,BDROP
C
C Local Declarations:-
C ====================
C
INTEGER STATUS,IND,INDDAT
INTEGER I1,I2,IND1,IND2,BLKSIZ,NHITS
INTEGER ADDR1,ADDR2,LOOP,NSHIFT
C
C
C Executable Code:-
C =================
C
STATUS = BLOCAT(IW,'DTCE',1,IND,INDDAT)
IF (STATUS.NE.YESUCC) RETURN
C
NHITS = IW(INDDAT+DTCNRO)
BLKSIZ = IW(INDDAT+DTCNCO)
IND = INDDAT+IW(INDDAT+DTCHDS)
C
C The ARGUS pattern recognition code can go belly-up if duplicate hits
C are found in the same cell: this may happen by bugs either in the MC
C generation or in the online software. The solution to this problem is to
C suppress the SECOND hit(s) and proceed, but it is important to scream
C our disappointment: so please nobody suppress the call to ERLOGR!.
C .AC 1/15/97
C NOTE: in the MC case, to avoid the reshuffling of banks DTHA and DTKA,
C which should remain aligned to DTCE, for now I just suppress the
C whole event, by dropping DTCE.
IND1 = IND
I1 = 1
DO WHILE (I1 .LE. NHITS-1)
IND1 = IND + (I1-1)*BLKSIZ
ADDR1 = IW(IND1+DTCADR)
I2 = I1+1
DO WHILE (I2 .LE. NHITS)
IND2 = IND + (I2-1)*BLKSIZ
ADDR2 = IW(IND2+DTCADR)
IF (ADDR1 .EQ. ADDR2) THEN
CALL ERLOGR('CLNDTA',ERWARN,0,STATUS,
+ 'Duplicate hit rejected!')
IF (MONTECARLO) THEN
CALL ERLOGR('CLNDTA',ERWARN,0,STATUS,
+ 'Event dropped!')
STATUS = BDROP(IW,'DTCE')
RETURN
ELSE
C Shift down all subsequent hits in the bank DTCE
NSHIFT = (NHITS-I2)*BLKSIZ
DO LOOP=0,NSHIFT-1
IW(IND2+LOOP) = IW(IND2+LOOP+BLKSIZ)
ENDDO
C Zero-bomb the gap at the end (to shorten the bank is hard...)
DO LOOP=0,BLKSIZ-1
IW(IND2+NSHIFT+LOOP) = 0
ENDDO
C Reduce NHITS both in this loop and in bank DTCE
NHITS = NHITS-1
IW(INDDAT+DTCNRO) = IW(INDDAT+DTCNRO)-1
C Reduce the running index to re-scan the new hit
I2 = I2-1
ENDIF
ENDIF
I2 = I2 + 1
ENDDO
I1 = I1+1
ENDDO
C
RETURN
END
C
*******************************************************************************
SUBROUTINE MAKEDHPT
$$IMPLICIT
*******************************************************************************
C
C Author: A. Calcaterra
C =======
C
C Date: 30 Apr. 96
C ====
C
$$INCLUDE 'K$INC:BCS.INC'
$$INCLUDE 'K$INC:BPOYBS.INC'
$$INCLUDE 'YBOS$LIBRARY:BNKTYP.INC'
$$INCLUDE 'YBOS$LIBRARY:ERRCOD.INC'
$$INCLUDE 'K$INC:ERLEVL.INC'
$$INCLUDE 'K$ITRK:DHPT.INC'
C
C External Functions:-
C ====================
C
INTEGER BLOCAT,BMAKEG,WBANK,WDATA,WDROP
C
C Local Declarations:-
C ====================
C
INTEGER STATUS,INDC,INDDATC,NHITC,DTCENCO
INTEGER INDP,INDDATP,INDTMP,INDDATTMP
INTEGER BNKSIZ,LOOP,KPLA,KWIR,KPLPRV,KPLCUR,DHPBPT
C
C Locate bank DTCE
STATUS = BLOCAT(IW,'DTCE',1,INDC,INDDATC)
IF (STATUS.NE.YESUCC) THEN
CALL ERLOGR('MKDHPT',ERWARN,0,STATUS,
+ 'Missing bank DTCE')
RETURN
ENDIF
NHITC = IW(INDDATC+DTCNRO)
DTCENCO = IW(INDDATC+DTCNCO)
C
C Now a bank of pointers will be created, to allow traversing the DTCE,
C DTHA, DHRE banks (if desired) in the order of 1) increasing phi and 2)
C decreasing radius. Many ARGUS original algorythms need this.
C The bank contains:
C
C 0) A 3-word header
C A) 58 pointers to the FIRST hit in every layer, to be used in part C)
C B) 58 pointers to the LAST hit in every layer, to be used in part C)
C C) the pointers themselves, to be used in DHRE.
C D) the back-pointers, to be used in part C).
C
BNKSIZ = 2 + 116 + 2*NHITC
STATUS = BMAKEG(IW,'DHPT',1,BNKSIZ,BNKTI4,INDP,INDDATP)
IF (STATUS.NE.YESUCC) THEN
CALL ERLOGR('MKDHPT',ERWARN,0,STATUS,
+ 'Error creating bank DHPT!')
RETURN
ENDIF
C
C Fill the header of DHPT .....
IW(INDDATP+DHPHDS) = 2
IW(INDDATP+DHPVRN) = 1
INDP = INDDATP+IW(INDDATP+DHPHDS)
DHPBPT = DHPAPT+NHITC
C
C Create a working bank for sorting points
INDTMP = 0
STATUS = WBANK(IW,INDTMP,NHITC)
IF (STATUS.NE.YESUCC) THEN
CALL ERLOGR('MKDHPT',ERWARN,0,STATUS,
+ 'Error creating temporary bank !')
RETURN
ENDIF
STATUS = WDATA(IW,INDTMP,INDDATTMP)
C
INDC = INDDATC+IW(INDDATC+DTCHDS)
DO LOOP=0,NHITC-1
KPLA = IW(INDC+DTCADR)/2**9
KWIR = IW(INDC+DTCADR) - KPLA*2**9
KPLA = 59-KPLA
IW(INDDATTMP+LOOP) = KPLA*2**9 + KWIR
INDC = INDC + DTCENCO
ENDDO
C
C Do the sorting, from the temporary bank directly into DHPT
CALL SORTZV(IW(INDDATTMP),IW(INDP+DHPAPT),NHITC,-1,0,0)
C
C The pointers are made. Now build the (first,last) pairs
DO LOOP=0,57
IW(INDP+DHPPT1+LOOP) = 0
IW(INDP+DHPPTL+LOOP) =-1
ENDDO
KPLPRV = 0
DO LOOP = 0,NHITC-1
KPLCUR = IW(INDDATTMP+IW(INDP+DHPAPT+LOOP)-1)/2**9
IF (KPLCUR.EQ.KPLPRV)THEN
IW(INDP+DHPPTL+KPLCUR-1) = LOOP+1
ELSEIF (KPLCUR.LE.58) THEN
IW(INDP+DHPPT1+KPLCUR-1) = LOOP+1
IW(INDP+DHPPTL+KPLCUR-1) = LOOP+1
KPLPRV = KPLCUR
ENDIF
ENDDO
C
C Fill the back-pointers, needed in DFNEWW
DO LOOP = 0,NHITC-1
IW(INDP+DHPBPT+IW(INDP+DHPAPT+LOOP)-1) = LOOP+1
ENDDO
C
C Drop the intermediate bank
STATUS = WDROP(IW,INDTMP,1)
C
RETURN
END
*******************************************************************************
SUBROUTINE MAKEDHCL
$$IMPLICIT
*******************************************************************************
C
C Author: A. Calcaterra
C =======
C
C Date: 20 Nov. 96
C ====
C
$$INCLUDE 'K$INC:BCS.INC'
$$INCLUDE 'K$INC:BPOYBS.INC'
$$INCLUDE 'YBOS$LIBRARY:BNKTYP.INC'
$$INCLUDE 'YBOS$LIBRARY:ERRCOD.INC'
$$INCLUDE 'K$INC:ERLEVL.INC'
$$INCLUDE 'K$ITRK:CCONST.INC'
$$INCLUDE 'K$ITRK:CTIDRI.INC'
$$INCLUDE 'K$ITRK:DHPT.INC'
$$INCLUDE 'K$ITRK:DHCL.INC'
C
C External Functions:-
C ====================
C
INTEGER BLOCAT,BTYMKG
C
C Local Declarations:-
C ====================
C
LOGICAL ONCE,DISAST
INTEGER STATUS,INDC,INDDATC,NHITC,DTCENCO
INTEGER INDP,INDDATP,INDL,INDDATL,DHCENCO
INTEGER BNKSIZ,LOOP,LAYER,LFRST,LLAST
INTEGER INDAR,INDTC,KWIPRV,KWICUR,INCLUS,NCLTOT
INTEGER PTLINK,PTLNK1,PTLNKL
INTEGER IND1ST,KWI1ST,INDLST,KWILST,INCLS1,INCLSL
INTEGER SHIFT,START1,START2,START3
REAL*4 PHICLS,PHILST,PHI1ST
C
CHARACTER*32 BNKTYP
DATA BNKTYP/'120I4,XXXXX(R4,2I4)'/
C
C Locate bank DTCE
STATUS = BLOCAT(IW,'DTCE',1,INDC,INDDATC)
IF (STATUS.NE.YESUCC) THEN
CALL ERLOGR('MKDHCL',ERWARN,0,STATUS,
+ 'Missing bank DTCE')
RETURN
ENDIF
NHITC = IW(INDDATC+DTCNRO)
DTCENCO = IW(INDDATC+DTCNCO)
C
C Locate bank DHPT
STATUS = BLOCAT(IW,'DHPT',1,INDP,INDDATP)
IF (STATUS.NE.YESUCC) THEN
CALL ERLOGR('MKDHCL',ERWARN,0,STATUS,
+ 'Error creating bank DHPT!')
RETURN
ENDIF
C
C Make bank DHCL, allowing space for NHITC clusters (cannot be more!)
C The bank contains:
C
C 0) A 4-word header
C A) 58 pointers to the FIRST cluster in every layer, to be used in part C)
C B) 58 pointers to the LAST cluster in every layer, to be used in part C)
C C) 3 infos for every cluster: average phi, cluster size and the pointer
C to the first hit
WRITE (BNKTYP(7:11),'(I5)') NHITC
STATUS = BTYMKG(IW,'DHCL',1,BNKTYP,BNKSIZ,INDL,INDDATL)
IF (STATUS.NE.YESUCC) THEN
CALL ERLOGR('MKDHCL',ERWARN,0,STATUS,
+ 'Error creating bank DHCL!')
RETURN
ENDIF
C
C Fill the header of DHCL .....
IW(INDDATL+DHCHDS) = 4
IW(INDDATL+DHCVRN) = 1
IW(INDDATL+DHCNRO) = 0
IW(INDDATL+DHCNCO) = 3
DHCENCO = IW(INDDATL+DHCNCO)
C
C Scan DTCE in the ARGUS order, given in DHPT
INDC = INDDATC+IW(INDDATC+DTCHDS)
INDP = INDDATP+IW(INDDATP+DHPHDS)
INDL = INDDATL+IW(INDDATL+DHCHDS)
NCLTOT = 0
DO LAYER=1,58
C
C First, set the pointers to the first and last cluster in this plane
IW(INDL+DHCPT1+LAYER-1) = 0
IW(INDL+DHCPTL+LAYER-1) =-1
LFRST = IW(INDP+DHPPT1+LAYER-1)
LLAST = IW(INDP+DHPPTL+LAYER-1)
KWIPRV = -999
ONCE = .TRUE.
DO LOOP = LFRST,LLAST
INDAR = IW(INDP+DHPAPT+LOOP-1)
INDTC = INDC+(INDAR-1)*DTCENCO
KWICUR = IW(INDTC+DTCADR) - (59-LAYER)*2**9
C
C At the first iteration, open the cluster in any case
IF (LOOP .EQ. LFRST) THEN
INCLUS = 1
PHICLS = (KWICUR-1)*TIDDP(LAYER)
PTLINK = INDAR
ELSE
C
C Look if the old cluster is still running (n.wire increased by one)
IF (KWICUR .EQ. KWIPRV+1) THEN
INCLUS = INCLUS+1
PHICLS = PHICLS+0.5*TIDDP(LAYER)
ELSE
C
C If there is a gap in the sequence, close the cluster and open a new one.
NCLTOT = NCLTOT+1
IW(INDL+DHCPTL+LAYER-1) = NCLTOT
RW(INDL+DHCDTA+(NCLTOT-1)*DHCENCO+DHCAVF) = PHICLS
IW(INDL+DHCDTA+(NCLTOT-1)*DHCENCO+DHCNCL) = INCLUS
IW(INDL+DHCDTA+(NCLTOT-1)*DHCENCO+DHCLNK) = PTLINK
C
C Store the pointer to the first cluster only once for every layer
IF (ONCE) THEN
IW(INDL+DHCPT1+LAYER-1) = NCLTOT
ONCE = .FALSE.
ENDIF
C
C Open a new cluster
INCLUS = 1
PHICLS = (KWICUR-1)*TIDDP(LAYER)
PTLINK = INDAR
ENDIF
ENDIF
KWIPRV = KWICUR
ENDDO
C
C If the above loop executed at all, the last cluster is open: so, close it
IF (LLAST .GE. LFRST) THEN
NCLTOT = NCLTOT+1
IF (ONCE) IW(INDL+DHCPT1+LAYER-1) = NCLTOT
IW(INDL+DHCPTL+LAYER-1) = NCLTOT
RW(INDL+DHCDTA+(NCLTOT-1)*DHCENCO+DHCAVF) = PHICLS
IW(INDL+DHCDTA+(NCLTOT-1)*DHCENCO+DHCNCL) = INCLUS
IW(INDL+DHCDTA+(NCLTOT-1)*DHCENCO+DHCLNK) = PTLINK
ENDIF
C
C Now check if two clusters join at phi=0! This is QUITE annoying.
IF (LLAST .GT. LFRST) THEN
IND1ST = IW(INDP+DHPAPT+LFRST-1)
IND1ST = INDC+(IND1ST-1)*DTCENCO
KWI1ST = IW(IND1ST+DTCADR) - (59-LAYER)*2**9
C
C This may ONLY happen if the 1st wire is n.1, and the last wire...the last!
IF (KWI1ST .EQ. 1) THEN
INDLST = IW(INDP+DHPAPT+LLAST-1)
INDLST = INDC+(INDLST-1)*DTCENCO
KWILST = IW(INDLST+DTCADR) - (59-LAYER)*2**9
PHILST = (KWILST-1)*TIDDP(LAYER)
C
C Let us add one more cell, see if we arrive to 6.28
DISAST = ABS(PHILST+TIDDP(LAYER)-PI2) .LT. 1.E-5
IF (DISAST) THEN
C
C And here falls the donkey...let's find out where the average phi is.
IND1ST = IW(INDL+DHCPT1+LAYER-1)
PHI1ST = RW(INDL+DHCDTA+(IND1ST-1)*DHCENCO+DHCAVF)
INCLS1 = IW(INDL+DHCDTA+(IND1ST-1)*DHCENCO+DHCNCL)
PTLNK1 = IW(INDL+DHCDTA+(IND1ST-1)*DHCENCO+DHCLNK)
INDLST = IW(INDL+DHCPTL+LAYER-1)
PHILST = RW(INDL+DHCDTA+(INDLST-1)*DHCENCO+DHCAVF)
INCLSL = IW(INDL+DHCDTA+(INDLST-1)*DHCENCO+DHCNCL)
PTLNKL = IW(INDL+DHCDTA+(INDLST-1)*DHCENCO+DHCLNK)
IF (INCLS1 .GT. INCLSL) THEN
C
C The 1st cluster wins, so just kill the last one, and fix the 1st one.
NCLTOT = NCLTOT-1
IW(INDL+DHCPTL+LAYER-1) = NCLTOT
RW(INDL+DHCDTA+(IND1ST-1)*DHCENCO+DHCAVF) =
+ (INCLS1-INCLSL-1)*TIDDP(LAYER)/2.
IW(INDL+DHCDTA+(IND1ST-1)*DHCENCO+DHCNCL) = INCLS1+INCLSL
IW(INDL+DHCDTA+(IND1ST-1)*DHCENCO+DHCLNK) = PTLNKL
ELSE
C
C This is a... a... a MESS! Kill the FIRST cluster, shift everyone down!
SHIFT = INDLST-IND1ST
START1 = INDL+DHCDTA+(IND1ST-1)*DHCENCO+DHCAVF
START2 = INDL+DHCDTA+(IND1ST-1)*DHCENCO+DHCNCL
START3 = INDL+DHCDTA+(IND1ST-1)*DHCENCO+DHCLNK
DO LOOP=1,SHIFT
RW(START1) = RW(START1+DHCENCO)
IW(START2) = IW(START2+DHCENCO)
IW(START3) = IW(START3+DHCENCO)
START1 = START1+DHCENCO
START2 = START2+DHCENCO
START3 = START3+DHCENCO
ENDDO
C
C Youpi... now fix the last cluster, possibly in the right place.
NCLTOT = IW(INDL+DHCPTL+LAYER-1)-1
IW(INDL+DHCPTL+LAYER-1) = NCLTOT
RW(INDL+DHCDTA+(NCLTOT-1)*DHCENCO+DHCAVF) =
+ PI2 - (INCLSL-INCLS1+1)*TIDDP(LAYER)/2.
IW(INDL+DHCDTA+(NCLTOT-1)*DHCENCO+DHCNCL) = INCLS1+INCLSL
IW(INDL+DHCDTA+(NCLTOT-1)*DHCENCO+DHCLNK) = PTLNKL
ENDIF
ENDIF
ENDIF
ENDIF
C
ENDDO
C
C Save the total n. of clusters, get outa here.
IW(INDDATL+DHCNRO) = NCLTOT
C
RETURN
END
*******************************************************************************
INTEGER FUNCTION RAWST(KEY14,DRIFTT,DRIFTR,ERRD)
*******************************************************************************
C
C Description:
C ============
C Function which translates the measured drift time
C in a drift distance using the raw cell response
C parametrizations, and assigns the raw error to DRIFTR
C
C Input Parameter
C ==============
C INTEGER KEY14 ! key to select the parametrizations:
C ! KEY14 = 2 cells 2X2 cm2
C ! KEY14 = 3 cells 3X3 cm2
C REAL*4 DRIFTT ! measured drift time in [ns]
C
C Output parameter
C ================
C REAL*4 DRIFTR ! raw drift distance in [cm]
C REAL*4 ERRD ! raw error on DRIFTR in [cm]
C
C Author: P. de Simone
C =======
C
C Date: 15-1-96
C ====
C
$$IMPLICIT
C
INTEGER KEY14
REAL*4 DRIFTT, DRIFTR, ERRD
C
REAL*4 U2_0, U2_LINEAR, U2_QUAD
REAL*4 W3_0, W3_LINEAR, W3_QUAD
REAL*4 RAWS_2, RAWS_3
C
COMMON/RAWPAR/U2_0, U2_LINEAR, U2_QUAD,
& W3_0, W3_LINEAR, W3_QUAD
COMMON/RAWSIG/ RAWS_2(15), RAWS_3(15)
C
INTEGER I,STATUS
REAL*4 RADICE
C
STATUS = 0
C
C 2X2 raw cell parametrizations
C
IF (KEY14.EQ.2) THEN
C
RADICE = U2_LINEAR*U2_LINEAR - 4.*U2_QUAD*(U2_0 - DRIFTT)
IF ( RADICE.LE.1.E-8 ) THEN
DRIFTR = U2_0
ELSE
DRIFTR = (- U2_LINEAR + SQRT(RADICE))/(2.*U2_QUAD)
ENDIF
IF (DRIFTR.LE.0.) DRIFTR = 0.0020
C
DO I = 1,13,2
IF( (DRIFTR.GE.RAWS_2(I).AND.DRIFTR.LT.RAWS_2(I+2)).OR.
& (DRIFTR.GE.RAWS_2(15).AND.I.EQ.13) ) THEN
ERRD = RAWS_2(I+1)/10000.
ENDIF
ENDDO
C
ENDIF
C
C 3X3 raw cell parametrizations
C
IF (KEY14.EQ.3) THEN
C
RADICE = W3_LINEAR*W3_LINEAR - 4.*W3_QUAD*(W3_0 - DRIFTT)
IF ( RADICE.LE.1.E-8 ) THEN
DRIFTR = W3_0
ELSE
DRIFTR = (- W3_LINEAR + SQRT(RADICE))/(2.*W3_QUAD)
ENDIF
IF (DRIFTR.LE.0.) DRIFTR = 0.0020
C
DO I = 1,13,2
IF( (DRIFTR.GE.RAWS_3(I).AND.DRIFTR.LT.RAWS_3(I+2)).OR.
& (DRIFTR.GE.RAWS_3(15).AND.I.EQ.13) ) THEN
ERRD = RAWS_3(I+1)/10000.
ENDIF
ENDDO
C
ENDIF
C
RAWST = STATUS
C
RETURN
END
C
*******************************************************************************
REAL FUNCTION FINEST(KEY14,DRIFTT,BETA,PHI,DRIFTR,ERRD)
*******************************************************************************
C
C Description:
C ============
C Routine which translates the measured drift time
C in a drift distance using the fine cell response
C parametrizations, and assigns the raw error to DRIFTR
C
C Input Parameter
C ==============
C INTEGER KEY14 ! key to select the parametrizations:
C ! KEY14 = 2 cells 2X2 cm2
C ! KEY14 = 3 cells 3X3 cm2
C REAL*4 DRIFTT ! measured drift time in [ns]
C REAL*4 BETA ! angle in degrees which identifies the
C ! shape of the hitted cell
C REAL*4 PHI ! angle in degrees which gives the
C ! orientation of the point of closest approach
C ! in the local cell reference system
C
C Output parameter
C ================
C REAL*4 DRIFTR ! raw drift distance in [cm]
C REAL*4 ERRD ! raw error on DRIFTR in [cm]
C ********************************************************************
C Returned value of ERRD : if DRIFTR < R_LIMIT --> ERRD from physical
C sigma parametrization
C if DRIFTR > R_LIMIT --> ERRD from raw sigma
C table
C ********************************************************************
C Returned value of FINEST : FINEST = 0. --> DRIFTR from fine
C parametrizations and
C ERRD from physical sigma
C parametrization
C FINEST = 1. --> DRIFTR from fine
C parametrizations and
C ERRD from raw sigma table
C FINEST = 2. --> DRIFTR from raw
C parametrization and
C ERRD from raw sigma table
C
C Author: P. de Simone
C =======
C
C Date: 15-1-96
C ====
C
$$IMPLICIT
C
C Function declaration
C =====================
REAL FUNCTINV
REAL SIGMA
REAL RAWST
C
C Local declaration
C ==================
INTEGER KEY14
INTEGER IBE, IPHI
REAL*4 DRIFTT, DRIFTR, ERRD
REAL*4 BETA, PHI
REAL*4 R_LIMIT
REAL*4 STATUS
C
C Global declaration
C ====================
REAL*4 RAWS_2, RAWS_3
REAL*4 WA1, WA2, WA3, WA4, WA5, RRLA
REAL*4 UA1, UA2, UA3, UA4, UA5, RLA
C
COMMON/RAWSIG/ RAWS_2(15), RAWS_3(15)
COMMON/PARAMETRI3/WA1(6,36),WA2(6,36),WA3(6,36),
+ WA4(6,36),WA5(6,36),RRLA(6,36)
COMMON/PARAMETRI2/UA1(6,36),UA2(6,36),UA3(6,36),
+ UA4(6,36),UA5(6,36),RLA(6,36)
C
IF (( BETA.GT.115. ).AND.( BETA.LE.130. )) THEN
IBE = 6
ELSEIF (( BETA.GE.65. ).AND.( BETA.LE.115. )) THEN
IBE = INT((BETA-65.)/10.) + 1
ENDIF
C
IPHI = INT(PHI/10.) + 1
C
DRIFTR = FUNCTINV(DRIFTT,KEY14,IPHI,IBE)
C
IF( DRIFTR.EQ.9999. ) THEN
STATUS = RAWST(KEY14,DRIFTT,DRIFTR,ERRD)
FINEST = 2.
RETURN
ENDIF
C
ERRD = SIGMA(DRIFTR,KEY14)
C
IF ( KEY14.EQ.2 ) THEN
R_LIMIT = RLA(IBE,IPHI)
ELSE
R_LIMIT = RRLA(IBE,IPHI)
ENDIF
C
IF( DRIFTR.LE.R_LIMIT ) THEN
FINEST = 0.
ELSE
FINEST = 1.
ENDIF
C
RETURN
END
C
C----------------------------------------------------------
REAL FUNCTION FUNCTINV(DRIFTT,KEY14,IPHI,IBE)
C----------------------------------------------------------
C The original form of the polynomials, "contracted" here to save CPU time,
C was like this:
C
C FITDR = UA1(IBE,IPHI)*1. +
C + UA2(IBE,IPHI)*( 2.*A - 1.) +
C + UA3(IBE,IPHI)*( 8.*A*A - 8.*A + 1.) +
C + UA4(IBE,IPHI)*( 32.*A*A*A - 48.*A*A + 18.*A -1.) +
C + UA5(IBE,IPHI)*( 128.*A*A*A*A - 256.*A*A*A +
C + 160.*A*A - 32.*A + 1.)
C
$$IMPLICIT
REAL*4 DRIFTT
INTEGER KEY14, IPHI, IBE
C
REAL*4 RLO,RHI,RMID,STEP,TLO,THI,TMID,RR
REAL*4 KDIFF, LAMBDA, SIG_TD
COMMON/FINESIG/ KDIFF, LAMBDA, SIG_TD
C
REAL*4 A,A2,A3,A4
REAL*4 UA1, UA2, UA3, UA4, UA5, RLA
REAL*4 WA1, WA2, WA3, WA4, WA5, RRLA
COMMON/PARAMETRI3/WA1(6,36),WA2(6,36),WA3(6,36),
+ WA4(6,36),WA5(6,36),RRLA(6,36)
COMMON/PARAMETRI2/UA1(6,36),UA2(6,36),UA3(6,36),
+ UA4(6,36),UA5(6,36),RLA(6,36)
REAL*4 CWA,CUA
COMMON/STCOEFFS/CWA(5,6,36),CUA(5,6,36)
C
IF ( KEY14.EQ.2 ) THEN
RLO = 0.
TLO = CUA(1,IBE,IPHI)
RHI = 1.4
A = RHI/RLA(IBE,IPHI)
A2 = A*A
A3 = A2*A
A4 = A3*A
THI = CUA(1,IBE,IPHI)+CUA(2,IBE,IPHI)*A+CUA(3,IBE,IPHI)*A2
+ +CUA(4,IBE,IPHI)*A3+CUA(5,IBE,IPHI)*A4
STEP = RHI/2.
IF (DRIFTT.LT.TLO) THEN
RR = RLO
ELSEIF (DRIFTT.LT.THI) THEN
DO WHILE (STEP.GT.0.0010)
RMID = RLO + STEP
A = RMID/RLA(IBE,IPHI)
A2 = A*A
A3 = A2*A
A4 = A3*A
TMID = CUA(1,IBE,IPHI)+CUA(2,IBE,IPHI)*A+CUA(3,IBE,IPHI)*A2
+ +CUA(4,IBE,IPHI)*A3+CUA(5,IBE,IPHI)*A4
IF (DRIFTT.GT.TMID) RLO = RMID
STEP = STEP/2.
ENDDO
RR = RLO + STEP/2.
ELSE
RR = -9999.
ENDIF
ELSEIF ( KEY14.EQ.3 ) THEN
RLO = 0.
TLO = CWA(1,IBE,IPHI)
RHI = 2.1
A = RHI/RRLA(IBE,IPHI)
A2 = A*A
A3 = A2*A
A4 = A3*A
THI = CWA(1,IBE,IPHI)+CWA(2,IBE,IPHI)*A+CWA(3,IBE,IPHI)*A2
+ +CWA(4,IBE,IPHI)*A3+CWA(5,IBE,IPHI)*A4
STEP = RHI/2.
IF (DRIFTT.LT.TLO) THEN
RR = RLO
ELSEIF (DRIFTT.LT.THI) THEN
DO WHILE (STEP.GT.0.0010)
RMID = RLO + STEP
A = RMID/RRLA(IBE,IPHI)
A2 = A*A
A3 = A2*A
A4 = A3*A
TMID = CWA(1,IBE,IPHI)+CWA(2,IBE,IPHI)*A+CWA(3,IBE,IPHI)*A2
+ +CWA(4,IBE,IPHI)*A3+CWA(5,IBE,IPHI)*A4
IF (DRIFTT.GT.TMID) RLO = RMID
STEP = STEP/2.
ENDDO
RR = RLO + STEP/2.
ELSE
RR = -9999.
ENDIF
ENDIF
C
IF( RR.EQ.-9999. ) THEN
FUNCTINV = 9999.
ELSEIF( RR.GT.LAMBDA ) THEN
FUNCTINV = SQRT(RR*RR - LAMBDA*LAMBDA)
ELSE
FUNCTINV = RR
ENDIF
C
RETURN
END
C
C-------------------------------------------------------------
REAL FUNCTION FITDR(R,KEY14,IPHI,IBE)
C-------------------------------------------------------------
C
$$IMPLICIT
C
INTEGER KEY14,IPHI,IBE
REAL*4 A,R
REAL*4 UA1, UA2, UA3, UA4, UA5, RLA
REAL*4 WA1, WA2, WA3, WA4, WA5, RRLA
COMMON/PARAMETRI3/WA1(6,36),WA2(6,36),WA3(6,36),
+ WA4(6,36),WA5(6,36),RRLA(6,36)
COMMON/PARAMETRI2/UA1(6,36),UA2(6,36),UA3(6,36),
+ UA4(6,36),UA5(6,36),RLA(6,36)
C
C choose the space time relation 3X3 case
C
IF(KEY14.EQ.3) THEN
A = R/RRLA(IBE,IPHI)
FITDR = WA1(IBE,IPHI)*1. +
+ WA2(IBE,IPHI)*( 2.*A - 1.) +
+ WA3(IBE,IPHI)*( 8.*A*A - 8.*A + 1.) +
+ WA4(IBE,IPHI)*( 32.*A*A*A - 48.*A*A + 18.*A -1.) +
+ WA5(IBE,IPHI)*( 128.*A*A*A*A - 256.*A*A*A +
+ 160.*A*A - 32.*A + 1.)
ELSE
C
C 2X2 case
C
A = R/RLA(IBE,IPHI)
FITDR = UA1(IBE,IPHI)*1. +
+ UA2(IBE,IPHI)*( 2.*A - 1.) +
+ UA3(IBE,IPHI)*( 8.*A*A - 8.*A + 1.) +
+ UA4(IBE,IPHI)*( 32.*A*A*A - 48.*A*A + 18.*A -1.) +
+ UA5(IBE,IPHI)*( 128.*A*A*A*A - 256.*A*A*A +
+ 160.*A*A - 32.*A + 1.)
ENDIF
C
RETURN
END
C
C-------------------------------------------------------------
REAL FUNCTION FITDRDT(R,KEY14,IPHI,IBE)
C-------------------------------------------------------------
C
$$IMPLICIT
C
INTEGER KEY14,IPHI,IBE
REAL*4 A,R
REAL*4 UA1, UA2, UA3, UA4, UA5, RLA
REAL*4 WA1, WA2, WA3, WA4, WA5, RRLA
COMMON/PARAMETRI3/WA1(6,36),WA2(6,36),WA3(6,36),
+ WA4(6,36),WA5(6,36),RRLA(6,36)
COMMON/PARAMETRI2/UA1(6,36),UA2(6,36),UA3(6,36),
+ UA4(6,36),UA5(6,36),RLA(6,36)
C
C choose the space time relation 3X3 case
C
IF(KEY14.EQ.3) THEN
A = R/RRLA(IBE,IPHI)
FITDRDT= WA2(IBE,IPHI)*( 2.) +
+ WA3(IBE,IPHI)*( 16.*A - 8.) +
+ WA4(IBE,IPHI)*( 96.*A*A - 96.*A + 18.) +
+ WA5(IBE,IPHI)*( 512.*A*A*A - 768.*A*A +
+ 320.*A - 32.)
FITDRDT= FITDRDT/RRLA(IBE,IPHI)
ELSE
C
C 2X2 case
C
A = R/RLA(IBE,IPHI)
FITDRDT= UA2(IBE,IPHI)*( 2.) +
+ UA3(IBE,IPHI)*( 16.*A - 8.) +
+ UA4(IBE,IPHI)*( 96.*A*A - 96.*A + 18.) +
+ UA5(IBE,IPHI)*( 512.*A*A*A - 768.*A*A +
+ 320.*A - 32.)
FITDRDT= FITDRDT/RRLA(IBE,IPHI)
ENDIF
C
RETURN
END
C
C-----------------------------------------------------
REAL FUNCTION SIGMA(X,KEY14)
C------------------------------------------------------
C
$$IMPLICIT
C
C Function declaration
C =====================
C
INTEGER KEY14,BIN
REAL*4 X
REAL*4 A, B
REAL*4 KDIFF, LAMBDA, SIG_TD
REAL*4 U2_0, U2_LINEAR, U2_QUAD
REAL*4 W3_0, W3_LINEAR, W3_QUAD
C
COMMON/FINESIG/ KDIFF, LAMBDA, SIG_TD
COMMON/RAWPAR/U2_0, U2_LINEAR, U2_QUAD,
& W3_0, W3_LINEAR, W3_QUAD
REAL*4 SIGPIT,RSTEP
COMMON/SIGPIT/SIGPIT(1500),RSTEP
C
IF( KEY14.EQ.2 ) THEN
A = U2_LINEAR
B = U2_QUAD
ELSE
A = W3_LINEAR
B = W3_QUAD
ENDIF
C
BIN = INT(0.5+(X/RSTEP))
IF (BIN.LT.1) BIN = 1
IF (BIN.GT.1500) BIN = 1500
SIGMA = 0
& +KDIFF*X
& +SIGPIT(BIN)
& +(SIG_TD/(A+2.*B*X))**2
C
SIGMA = SQRT(SIGMA)
C
RETURN
END
C
C=======================================================================
C
SUBROUTINE DCOHIS
$$IMPLICIT
C----------------------------------------------------------------------
C-
C- Purpose and Methods : Do some control histograms.
C-
C----------------------------------------------------------------------
$$INCLUDE 'K$INC:BCS.INC'
$$INCLUDE 'K$INC:BPOYBS.INC'
$$INCLUDE 'YBOS$LIBRARY:ERRCOD.INC'
C
$$INCLUDE 'K$ITRK:DHCL.INC'
C
INTEGER BLOCAT
INTEGER STATUS,INDC,INDDATC,INDL,INDDATL
INTEGER NCLTOT,DHCENCO,LAYER,LOOP,LFRST,LLAST
INTEGER NINCLS
REAL*4 PHIAVE
C
C Start locating bank DTCE
STATUS = BLOCAT(IW,'DTCE',1,INDC,INDDATC)
IF (STATUS .NE. YESUCC) THEN
RETURN
ENDIF
C
C Histogram the total n.of hits in the DC
CALL HFILL(1,FLOAT(IW(INDDATC+DTCNRO)),0.,1.)
C
C Now go find bank DHCL
STATUS = BLOCAT(IW,'DHCL',1,INDL,INDDATL)
IF (STATUS .NE. YESUCC) THEN
RETURN
ENDIF
NCLTOT = IW(INDDATL+DHCNRO)
DHCENCO = IW(INDDATL+DHCNCO)
C
C Histogram the total n.of clusters in the DC
CALL HFILL(2,FLOAT(NCLTOT),0.,1.)
C
INDL = INDDATL+IW(INDDATL+DHCHDS)
DO LAYER=1,58
LFRST = IW(INDL+DHCPT1+(LAYER-1))
LLAST = IW(INDL+DHCPTL+(LAYER-1))
DO LOOP=LFRST,LLAST
NINCLS = IW(INDL+DHCDTA+DHCENCO*(LOOP-1)+DHCNCL)
CALL HFILL(3,FLOAT(NINCLS),0.,1.)
PHIAVE = RW(INDL+DHCDTA+DHCENCO*(LOOP-1)+DHCAVF)
CALL HFILL(4,PHIAVE,FLOAT(LAYER),1.)
ENDDO
ENDDO
C
RETURN
END
C
[KLOE]
[Offline Doc]
[TRK Files]
Generated with Light on Thu Apr 8 13:00:16 MET DST 1999
.
Mail comments and suggestions.