*-- Author : S.J. Maxfield
SUBROUTINE FPTRDT
*D: FPTRDT...... SM. New definition of dead wire flag. (Phase 2!)
**----------------------------------------------------------------------
**: FPTRDT 40000 SM. New definition of dead wire flag.
**----------------------------------------------------------------------
**: FPTRDT 30907 RP. Farm changes.
**----------------------------------------------------------------------
**: FPTRDT 30104 SM. reject bad hits flagged by FRLOCO.
**----------------------------------------------------------------------
* Unpack Digitisations from bank FRRE.
* Create intermediate bank FRLC containing local
* coordinates
*
* Store hits in IOS COMMONs for Pattern Recognition
*
* Called once per event. Needs previous call to FTCORG
* to create corrected geometry bank FRG1
*
*
*KEEP,BCS.
INTEGER NHROW,NHCOL,NHLEN
PARAMETER (NHROW = 2, NHCOL = 1, NHLEN=2)
INTEGER NBOSIW
PARAMETER (NBOSIW=1000000)
INTEGER IW(NBOSIW)
REAL RW(NBOSIW)
COMMON /BCS/ IW
EQUIVALENCE (RW(1),IW(1))
SAVE /BCS/
*KEEP,CNSTBF.
INTEGER LW(NBOSIW)
REAL SW(NBOSIW)
EQUIVALENCE (RW(1),IW(1),LW(1),SW(1))
*KEEP,FRDIMS.
PARAMETER (MAXHTS=200)
PARAMETER (NUMWPL=36)
PARAMETER (MAXTRK=200)
PARAMETER (MXTTRK=900)
PARAMETER (MAXTR3=200)
PARAMETER (MAXHPW=2)
PARAMETER (MAXDIG=2000)
PARAMETER (NUMRWR=1727)
PARAMETER (NUMPWR=1151)
*KEEP,FH1WORK.
COMMON/FGMIOS/
* Planar geometry
+ ZPP(140),C(140),S(140),ITYPE(140),WZERO(140),WSPACE,
*
* Radial geometry
+ ZP(36),PHW(36),WS(36)
*
COMMON/H1WORK/
* Radial data...
+ WW(MAXHTS,36),DRI(MAXHTS,36),RM(MAXHTS,36),
+ NDP(36), NW(MAXHTS,36), DWS(MAXHTS,36),
*
* Planar Data
+ NDPW(NUMWPL),DW(MAXHTS,NUMWPL),
+ DRIW(MAXHTS,NUMWPL),NDW(MAXHTS,NUMWPL),
+ WWP(MAXHTS,NUMWPL),
+ IPHOLE(MAXHTS,NUMWPL),
*
* Pointers into DIGI bank for IOS labelled hits
+ IPFRRE(MAXHTS,36),IPFRPE(MAXHTS,36),NFRRE,NFRPE,
+ IRPIOS(MAXDIG,2), IPPIOS(MAXDIG,2),
*
* Track segment data
+ NTRAKS(3),IRPT(12,MAXTRK,3),SDRFT(12,MAXTRK,3),
*
* Fit data
+ PCOSL(MAXTRK,3),PSINL(MAXTRK,3),PHZL(MAXTRK,3),
+ DPCOSL(MAXTRK,3),DPSINL(MAXTRK,3),
+ DPHZL(MAXTRK,3),CHSQ(MAXTRK,3),RZI(MAXTRK,3),
+ RPCOSG(MAXTRK),RPSING(MAXTRK),
+ PHZG(MAXTRK),CC(3,MAXTRK),ZIG(MAXTRK),
+ IRADG(36,MAXTRK),PHIG(36,MAXTRK),
+ IG,SDRADG(36,MAXTRK),
+ R1,Z1,RFIT(MAXTRK,3),
+ CHG(MAXTRK),
+ PPA(MAXTRK,3), ZZA(MAXTRK,3),
+ GPA(MAXTRK,3),GZA(MAXTRK,3)
*
*
*KEND.
COMMON/FERROR/ERRDR(MAXHTS, 36), ERRRM(MAXHTS, 36),
+ ERPDR(MAXHTS, 36), IERRF(MAXHTS, 36),
+ IERPF(MAXHTS, 36)
* Max allowable bad hit flag...(To be gotten from bank sometime)
PARAMETER(IFRBAD=128)
PARAMETER(NBN=0)
* Locators for FRG1 bank
PARAMETER(IPDEAD=1)
PARAMETER(IPRPHP=2)
PARAMETER(IPRSTP=3)
PARAMETER(IPRPHM=5)
PARAMETER(IPRSTM=6)
* Locators for FRLC bank
PARAMETER(IPRCLN=1)
PARAMETER(IPRDRF=2)
PARAMETER(IPRERD=3)
PARAMETER(IPRRAD=4)
PARAMETER(IPRERR=5)
PARAMETER(IPRSGW=6)
LOGICAL FIRST
DATA FIRST/.TRUE./
*KEEP,STFUNCT.
* index of element before row number IROW
INDR(IND,IROW)=IND+2+IW(IND+1)*(IROW-1)
* index of L'th element of row number IROW
INDCR(IND,L,IROW)=INDR(IND,IROW) + L
* L'th integer element of the IROW'th row of bank with index IND
IBTAB(IND,L,IROW)=IW(INDCR(IND,L,IROW))
* L'th real element of the IROW'th row of bank with index IND
RBTAB(IND,L,IROW)=RW(INDCR(IND,L,IROW))
*KEEP,FTFUNCT.
* Statement functions for RADIAL Chamber data access.
* Using Channel Number J
* Module, Wedge-pair and Z-plane numbers...
IRMOD(J) = J/288
IRWDP(J) = (J-IRMOD(J)*288)/12
IRZPL(J) = J-IRMOD(J)*288-IRWDP(J)*12
* Statement function for obtaining WEDGE numbers(0-47) of
* wires at plus and minus ends of Cell numbers
IRWPL(J) = (IRWDP(J)/2)*4 + (MOD(IRWDP(J),2))
IRWMI(J) = MOD(IRWPL(J) + 34,48)
* Statement function for obtaining IOS wire number (1-36)
IRIOSW(J) = IRMOD(J)*12 + IRZPL(J) + 1
* Statement functions for PLANAR Chamber data access.
* Using Channel Number J
* Module, orientation, W-cell and Z-plane numbers...
IPMOD(J) = J/384
IPORI(J) = (J-IPMOD(J)*384)/128
IPWCL(J) = (J-IPMOD(J)*384-IPORI(J)*128)/4
IPZPL(J) = (J-IPMOD(J)*384-IPORI(J)*128-IPWCL(J)*4)
* IPSMD in range 0:8 Planar module number.
IPSMD(J) = IPMOD(J)*3 + IPORI(J)
*
* IOS wire number (runs from 0 to 36)
IPIOSW(J) = IPSMD(J)*4 + IPZPL(J) + 1
* SB plane numbers (1-72) from cell number
IPSBW(J) = 24*IPMOD(J) + 4*IPORI(J) + IPZPL(J) + 1
IRSBW(J) = 24*IRMOD(J) + IRZPL(J) + 13
* Module, orientation, wire and (typical) cell number from plane
* number in the range 1-72 (planars, radials and combined)
IPMSB(J) = (J - 1)/24
IPOSB(J) = (J - 24*IPMSB(J) - 1)/4
IPZSB(J) = J - 24*IPMSB(J) - 4*IPOSB(J) - 1
IPCLSB(J) = 384*IPMSB(J) + 128*IPOSB(J) + IPZSB(J)
IRMSB(J) = (J - 1)/24
IRZSB(J) = J - 24*IRMSB(J) - 13
IRCLSB(J) = 288*IRMSB(J) + IRZSB(J)
IRADSB(J) = (J - 24*((J-1)/24) - 1)/12
ICELSB(J) = IRADSB(J)*IRCLSB(J) + (1 - IRADSB(J))*IPCLSB(J)
*KEEP,STFCLW.
* statement functions acting on the BOS COMMON LW
* index of element before row number LWROW
LNDR(LND,LWROW) = LND + 2 + LW(LND+1)*(LWROW-1)
* index of L-th element of row number LWROW
LNDCR(LND,L,LWROW)=LNDR(LND,LWROW)+L
* L-th integer element of the LWROW'th row in bank with index LND
LBTAB(LND,L,LWROW)=LW(LNDCR(LND,L,LWROW))
* L-th real element of the LWROW'th row in bank with index LND
SBTAB(LND,L,LWROW)=SW(LNDCR(LND,L,LWROW))
*
*KEND.
*
IF(FIRST) THEN
FIRST = .FALSE.
IQFRLC = NAMIND('FRLC')
IQFRG1 = NAMIND('FRG1')
ENDIF
*
IFRLC = NLINK('FRLC',NBN)
IFRG1= IW(IQFRG1)
IF(IFRG1.EQ.0) THEN
CALL ERRLOG(107,'S:FPTRDT: FRG1 bank not found')
RETURN
ENDIF
IF(IFRLC.EQ.0) THEN
RETURN
ENDIF
NFRLC = IW(IFRLC+2)
IF(NFRLC.LE.0) THEN
RETURN
ENDIF
* Extract Hits...
DO 300 K= 1, NFRLC
ICLNUM= IBTAB(IFRLC,IPRCLN,K)
IDEAD = LBTAB(IFRG1,IPDEAD,ICLNUM+1)
* Reject alleged hits from dead wires and hits marked bad
* in FRLOCO...
ISGNW = IBTAB(IFRLC,IPRSGW,K)
ISGTS = MOD(ISGNW,2)
* Is this end of the wire live?
IF(IDEAD.NE.1 .AND. IDEAD.NE.(ISGTS+2)) THEN
IF(ISGNW .LT. IFRBAD) THEN
DRIFT = RBTAB(IFRLC,IPRDRF,K)
RADIUS= RBTAB(IFRLC,IPRRAD,K)
ERRDRF= RBTAB(IFRLC,IPRERD,K)
ERRRAD= RBTAB(IFRLC,IPRERR,K)
KWIR = IRIOSW(ICLNUM)
* Increment number of hits in this wire plane...
NDP(KWIR) = NDP(KWIR) + 1
* Skip if maximum hits exceeded
IF(NDP(KWIR) .GT. MAXHTS) THEN
CALL ERRLOG(101,'W:FPTRDT: MAX HITS exceeded ')
NDP(KWIR) = NDP(KWIR) - 1
ELSE
RM ( NDP(KWIR), KWIR) = RADIUS
DRI( NDP(KWIR), KWIR) = DRIFT
ERRRM( NDP(KWIR), KWIR)= ERRRAD
ERRDR( NDP(KWIR), KWIR)= ERRDRF
IERRF( NDP(KWIR), KWIR)= ISGNW
* Wedge number of this hit, Phi and stagger
* of sense wire closest this hit.
IF(MOD(ISGNW,2).EQ.0) THEN
NW(NDP(KWIR),KWIR) = IRWPL(ICLNUM)+ 1
WW(NDP(KWIR),KWIR) = SBTAB(IFRG1,IPRPHP,ICLNUM+1)
DWS(NDP(KWIR), KWIR) = SBTAB(IFRG1,IPRSTP,ICLNUM+1)
ELSE
NW(NDP(KWIR),KWIR) = IRWMI(ICLNUM)+ 1
WW(NDP(KWIR),KWIR) = SBTAB(IFRG1,IPRPHM,ICLNUM+1)
DWS(NDP(KWIR), KWIR) = SBTAB(IFRG1,IPRSTM,ICLNUM+1)
ENDIF
* relations between IOS labelling and FRRE bank...
IPFRRE(NDP(KWIR),KWIR) = K
IF(K.LE.MAXDIG) THEN
IRPIOS(K,1) = KWIR
IRPIOS(K,2) = NDP(KWIR)
ENDIF
ENDIF
ENDIF
ENDIF
* Next HIT...
300 CONTINUE
RETURN
END
*