[KLOE] [Offline Doc] [TRK Files]

Track Reconstruction Library

argvtx.kloe


C   27/11/89 108291236  MEMBER NAME  VXMAIN   (ES)          FVS
C   22/06/84 512112012  MEMBER NAME  VXMAIN   (ES)          FORTRAN
      SUBROUTINE VXMAIN
C=====================================================================
C   MAIN (SUB)ROUTINE FOR FINDING VERTICES
C---------------------------------------------------------------------
C   INPUT : KLOE OFFICIAL TRACK BANKS
C           CFLAGS
C           CVXCUT
C   OUTPUT: TRACK BANKS, VERTEX BANKS, AND VERTEX PTRS
C---------------------------------------------------------------------
C   INTERMEDIATE STORAGE: APPROX 12.0K IN /CWORK/
C---------------------------------------------------------------------
C   AVAILABLE CUTS (FROM SUBROUTINE INCUTS) :
C
C     CMD     SUBROUTINE     ACTION IS TO CHANGE THE
C             AFFECTED
C     ITRF    VXXYZ          MAX NUM OF ITERATIONS FOR THE VERTEX FIT
C     ITRS    VXSWIM         MAX NUM OF ITERATIONS FOR SWIM TO A LINE
C     ICLL    VXMAIN         DEBUG OPTION TO RETURN AFTER ICLL = N
C                            CALLS TO VXXYZ.  NO DEBUG FOR ICLL=-1
C     IBRP    VXSWIM,VXTKIN  DEBUG OPTION TO SHOW ON IPS TERMINAL
C                            THE TRACK SWUM TO INNER DC WALL (IBRP=2)
C                            OR SWUM TO THE BEAM TUBE (IBRP=3)
C                            NO DEBUG FOR IBRP = -1
C XXX ITRK    VXSWIM         NO CURRENT FUNCTION
C
C     DRMX    VXMAIN         MAX R ALLOWED FROM INTERSECTION (RETURNED
C                            BY VXCRSS) FOR A TRK TO BE INCLUDED IN FIT
C     SWCR    VXMAIN         MAX R FROM BEAMLINE ALLOWED FOR COLINEAR
C                            TRK CANDIDATES GOING INTO CONSTRAINED FIT
C     SWCZ    VXMAIN         SAME AS ABOVE BUT FOR Z
C     CHGM    VXXYZ          MINIMUM MAGITUDE FOR CHISQ CORRECTION
C     DVMX    VXPREP         MAX DEVIATION  FOR A GOOD TRK
C                            CURRENT VALUE IS 7. (NOT STD BUT RELATED)
C     DLTR    VXXYZ          MAX SIZE FOR R CORRECTION VECTOR
C     DLTZ    VXXYZ          MAX SIZE FOR Z CORRECTION VECTOR
C     CTWR    VXPREP         R WEIGHT FOR CONSTRAINT TRK (CONSTR FIT)
C     CTWZ    VXPREP         Z WEIGHT FOR CONSTRAINT TRK (CONSTR FIT)
C     CRSZ    VXCRSS         Z CUT FOR REJECTING A POSSIBLE INTERSECTION
C     STEP    VXSWIM         STEP SIZE FOR TRACK SWIMMING(IN CM)
C     ACOL    VXMAIN         COS OF (PI-MAX DEV) FOR COLLINEAR TRKS
C                            WHERE MAX DEV IS ANGLE CUT FOR COLLINEARITY
C     CERR    VXXYZ          NEGATE THE FIT IF THE REPORTED ERRORS
C                            ARE TOO BIG. ERROR IN X OR Y .LT. CERR
C                            ERROR IN Z .LT. 6*CERR.
C     CTOL    VXCRSS         TOLERANCE FOR DECIDING WHEN TWO CIRCLES ARE
C                            TANGENT
C     DXY     VXMAIN         MAX R FROM BEAMLINE FOR RC VX 10
C     DZ      VXMAIN         MAX Z FROM BEAMLINE FOR RC VX 10
C---------------------------------------------------------------------
C --- D. COPPAGE --- VERSION 04.10.83 V3.00 (ARG05)
C                    REVISED 13.01.84 V3.01 (ARG06)NOW SWIMS 1 PRONGS
C                    REVISED 27.01.84 V3.02
C                    PROPOSD 15.04.84 V3.03 CHANGES IN CONV GAM PROC
C                    VERSION 18.05.84 V4.00 ARG07 (INCOMPATIBLE ARG06)
C                            27.06.84 V4.02 ARG07
C                            31.07.84 V4.03 ARG07
C                            22.01.85 V4.04 ARG08 NAT DEDX FOR CONV GMA
C                            24.04.85 V4.10 ARG09 MOD FOR VDC
C                            18.06.85 V4.11 UNDRFL IN BHBH SEC FIXED
C --- GILKINSON ---- CHANGED COTANGENT CALCULATION TO SIGN IF PZ = 0
C                            13/12/85
C --- HKAP --------- GENERAL CLEANUP & DEBUG                  07/11/90
C --- HKAP --------- MODIFY SWIM ONLY OPTION                  26/11/90
C=====================================================================
$$IMPLICIT
$$INCLUDE 'K$ITRK:CFLAGS.INC'
$$INCLUDE 'K$ITRK:CCONST.INC'
$$INCLUDE 'K$ITRK:CVXCUT.INC'
      REAL CUTR,SCUTR,SCUTZ,COSCOL
      EQUIVALENCE(CUTRVX,CUTR),(SCTRVX,SCUTR),(SCTZVX,SCUTZ)
      EQUIVALENCE (ACOLVX,COSCOL)
$$INCLUDE 'K$ITRK:CVXWORK.INC'
C
      INTEGER INDCTK,INDDATK
      INTEGER IHH,IVSAV,MTKSV,IV,MTKSVO,LTRN
      INTEGER ILIST,NB1,NBS,NTRS
      INTEGER KPTR,INUM,NMTRK,IVX,IVXS
      INTEGER KNUM1,KNUM2,IDMASS,MSS1,MSS2
      REAL COSPXP,EMMG
      REAL PHI,R,RSAV,AKUR1,AKUR2,FMSS,V1COT,V1PHI
      REAL X,VXERR,XCN,XBEAM,XINT,V2COT,V2PHI
      DIMENSION X(3),VXERR(6),XCN(3),XBEAM(3)
      DIMENSION XINT(3),ILIST(3)
      LOGICAL CONSTR,BHABHA
C
CC YBOS DECLARATIONS
C
$$INCLUDE 'K$INC:ERLEVL.INC'
$$INCLUDE 'YBOS$LIBRARY:ERRCOD.INC'
$$INCLUDE 'K$INC:BCS.INC'
$$INCLUDE 'K$ITRK:DTFS.INC'
$$INCLUDE 'K$ITRK:DVFS.INC'
$$INCLUDE 'K$ITRK:DCHD.INC'
      INTEGER STATUS,IND,INDDAT,I,INDH,INDATH
      INTEGER ICALL,NHDSTR,NPRIM,MXCHGD
      INTEGER INDC,IHDSIZ,MSFRCE,LTK,ITK
      INTEGER LERR,J,ITK1,NFLAG,MTK
      INTEGER JBIT,JMAX,NONLIN,MXBNK,MBNK
      INTEGER IFIT,KTK,KNDDAT
      INTEGER BLOCAT,BDATA,BNUMB,BNEXT
      INTEGER BTYMKG
      INTEGER BNKSIZ
      CHARACTER*32 BNKTYP
      DATA BNKTYP/'3I4,10R4,3I4,XXX(I4,16R4,2I4)'/
      INTEGER HDSIZ,BVER
      DATA HDSIZ/2/
      DATA BVER/1/
      REAL AM1,AM2,P1,P2,P1P2CS,FM,COS,E12
      REAL X0,XV,TY,Y0,YV,TX,TZ,ACUR,CTT
      REAL DR,VXDMIN,DIST,COSTHA,WR1,WR2
      REAL WZ1,WZ2,COSOPE,CHISQ
      REAL DBEAM,X1,Y1,Z1,X2,Y2,Z2 
      REAL PTAGLIO,TRKBUF(32)
      INTEGER IMODULO,IGENE
      CHARACTER*40 char_buf
      REAL    RDCMIN,DISMX1,DISMX2
      PARAMETER (RDCMIN=30.,DISMX1=40.,DISMX2=50.)

C --- STATEMENT FUNCTIONS:
C --- MOMENTUM
      REAL P,PTINV,COTTH
      P(PTINV,COTTH) = SQRT(1.+COTTH*COTTH)/PTINV
C --- ENERGY OF 2-PARTICLE SYSTEM ?????????????????????
      E12(AM1,P1,AM2,P2,P1P2CS) =
     = SQRT( AM1**2 + AM2**2 + 2.*(SQRT( (P1**2+AM1**2)*(P2**2+AM2**2) )
     -        - P1P2CS ) )
      EMMG(FM,P1,P2,COS) =
     + SQRT( 2.*(FM**2*(1.+0.5*(P2/P1+P1/P2))+P1*P2*(1.-COS)) )
C --- SIGNED DISTANCE X0 - XV PROJECTED INTO R-PHI-PLANE
      DIST(X0,Y0,XV,YV,TX,TY,TZ) =
     >                        ( (X0-XV)*TY-(Y0-YV)*TX )/SQRT(1.-TZ**2)
C
      DATA XBEAM/ 0.0,0.0,0.0/
C     DATA CUTR/2.0/,SCUTR,SCUTZ/1.5,7.0/ COS165/-0.9659258/=COSCOL
C
C --- CHECK WHETHER ANY FIT TRACKS
C  Now locate the drift chamber header bank
      STATUS = BLOCAT(IW,'DCHD',1,INDH,INDATH)
      IF (STATUS.EQ.YESUCC) THEN
        INDH = INDATH + IW(INDATH+DCHHDS)
      ELSE
        CALL ERLOGR('VXMAIN',ERWARN,0,0,
     +              'DC Header Bank DCHD not found!')
        RETURN
      ENDIF
      NHDTRK = IW(INDH+DCHTRK)
C
      NHDVTX = 0
      IF (NHDTRK.LE.0) RETURN

C
C Event type is obtained from the EVCL bank, which should be filled somewhere 
C by the online/offline data filtering and/or by GEANFI.

      BHABHA=.FALSE.
C Locate the Event Classification bank 
      STATUS = BLOCAT(IW,'EVCL',1,INDH,INDATH)
      IF (STATUS.EQ.YESUCC) THEN
        imodulo=mod(IW(INDATH+13),1000) ! 12th word=MC event type (start at 0)
        igene=( imodulo - mod(imodulo,100) )/100
C IGENE 1=Phi; 2=Bhabha; 3=Cosmics; 4=Machine background 
        if(igene.eq.2) BHABHA = .TRUE.
      ELSE
        CALL ERLOGR('VXMAIN',ERWARN,0,0,
     +              'Event Classification Bank EVCL not found!')
      ENDIF

      PTAGLIO=1.5
      IF(BHABHA) THEN
C Change default VERTEX CUTS for BHABHA events
         CUTRVX=4.0
         CUTZVX=5.0
         PTAGLIO=0.4
      ENDIF
C
C --- CHECK THAT THERE IS ENOUGH SPACE IN THE CVXWORK BUFFERS
      IF (NHDTRK .GT. MXTRVX) THEN
         WRITE (CHAR_BUF,'(''number of DTFS banks > '',I5)') MXTRVX
         CALL ERLOGR('VXMAIN',ERSEVR,0,0,CHAR_BUF)
         NHDTRK = MXTRVX
      ENDIF
C
C --- SET UP TRIAL VECTOR FOR PRIMARY VERTEX
C     AND POSSIBLE CONSTRAINT VECTOR
C
      ICALL  = 0
      NHDSTR = 0
      NPRIM  = 0
      CONSTR = .FALSE.
      X(1) = XBEAM(1)
      X(2) = XBEAM(2)
      X(3) = XBEAM(3)
      CALL VZERO(MSLIST,64)
C
C --- SET UP GOOD TRACKS
C
      MXCHGD = 0
C
C  LOOP OVER ALL FITTED TRACK CANDIDATES (ALL DTFS BANKS)
C
      STATUS = BLOCAT(IW,'DTFS',-1,IND,INDDAT)
      DO WHILE (IND.GT.0)
        INDDAT=INDDAT+IW(INDDAT+DTFHDS)
        MXCHGD = MXCHGD+1
        IGDTK(MXCHGD) = MXCHGD
        STATUS=BNUMB(IW,IND,DTFS_BNK_NUM_LIST(MXCHGD))
        IF (STATUS.NE.YESUCC) THEN
           CALL ERLOGR('VXMAIN',ERSEVR,0,0,
     +    'DTFS BANK NUMBER CANNOT BE EXTRACTED FOR LOCATED BANK.')
           RETURN
        ENDIF
        ACUR=ABS(RW(INDDAT+DTFCUR))
        CTT=RW(INDDAT+DTFCTT)
        IF (ABS(CTT).LT.1.E4) THEN
           QFAC(MXCHGD)  = P(ACUR,CTT)
           DRMIN(MXCHGD) = VXDMIN(INDDAT,X)
           IF (IW(INDDAT+DTFCEN) .EQ. 1) THEN
             NPRIM = NPRIM + 1
             JGDTK(NPRIM) = IGDTK(MXCHGD)
           ENDIF
        ENDIF
        STATUS=BNEXT(IW,IND,IND)
        STATUS=BDATA(IW,IND,INDDAT)
      ENDDO
C
C --- INITIALIZE TRACK BANKS, SWIM THROUGH WALLS
C
C--- KLOE code modification ----- begin ------ A.Andryakov----
C      Force PI-meson masshyp.
C
C      MSFRCE = -1
      MSFRCE = 2
C
C--- KLOE code modification ----- end -------- A.Andryakov----
C
      CALL VXTKIN (MXCHGD,MSFRCE)
      IF (MXCHGD.LT.2) GOTO 944
C
C --- SORT HIGH MOMENTUM TKS TO THE LEFT
C
      DO 32 I=1,MXCHGD-1
         DO 32 J=I+1,MXCHGD
            IF (QFAC(IGDTK(I)).LT.QFAC(IGDTK(J))) THEN
C ------------ INTERCHANGE TRACKS
               ITK1 = IGDTK(I)
               IGDTK(I) = IGDTK(J)
               IGDTK(J) = ITK1
            ENDIF
   32 CONTINUE

Crid In case of bhabha events, we CAN have 2 tracks. 
Crid Why apply this cut, anyway?
      IF (MXCHGD.GE.2 .AND. 
     >    (.NOT.BHABHA)) GOTO 666 ! FORCE to start from "PRIMARY VTX"
C
C === LOOK FOR BHABHAS AND COLLINEAR EVENTS ==========================
C
      NFLAG  = 2
      IF (NPRIM.NE.2 .AND.
     +(QFAC(IGDTK(1)).LT.PTAGLIO .OR. QFAC(IGDTK(2)).LT.PTAGLIO) ) GOTO 50
      IF (DRMIN(IGDTK(1)).GT.SCUTR .OR.
     +    DRMIN(IGDTK(2)).GT.SCUTR     ) GOTO 50
C --- IF HERE THEN
C     1. NPRIM = 2 OR BOTH HIGHEST MOMENTA >= 1.5 GEV/C
C     2. BOTH DISTANCES TO BEAM LINE <= SCUTR
C     NOW GET A BETTER D0 VALUE AND CHECK Z
      LTK = IGDTK(1)
      CALL VXSWIM (X,LTK,TRKBNK(1,4,LTK),LERR)
      IF (LERR.NE.0) GOTO 50
      DR = ABS(DIST(TRKBNK(2,4,LTK),TRKBNK(3,4,LTK),0.,0.,
     +     TRKBNK(5,4,LTK),TRKBNK(6,4,LTK),TRKBNK(7,4,LTK)))
      IF (DR.GT.SCUTR .AND. ABS(TRKBNK(4,4,LTK)).GT.SCUTZ) GOTO 50
C
      MTK = IGDTK(2)
      CALL VXSWIM(X,MTK,TRKBNK(1,4,MTK),LERR)
      IF (LERR.NE.0) GOTO 50
      DR = ABS(DIST(TRKBNK(2,4,MTK),TRKBNK(3,4,MTK),0.,0.,
     +     TRKBNK(5,4,MTK),TRKBNK(6,4,MTK),TRKBNK(7,4,MTK)))
      IF (DR.GT.SCUTR .AND. ABS(TRKBNK(4,4,MTK)).GT.SCUTZ) GOTO 50
C
      IF (.NOT.BHABHA) THEN
         COSTHA = TRKBNK(5,4,LTK) * TRKBNK(5,4,MTK) +
     +            TRKBNK(6,4,LTK) * TRKBNK(6,4,MTK) +
     +            TRKBNK(7,4,LTK) * TRKBNK(7,4,MTK)
         IF (COSTHA-COSCOL.GT.0.0) GOTO 50
      ENDIF
C
C === HERE WE HAVE A BHABHA EVENT OR TWO COLLINEAR TRACKS. ===========
C     SO TRY A CONSTRAINED FIT.
C
      WR1 = 1./TRKBNK(15,4,LTK)
      WR2 = 1./TRKBNK(15,4,MTK)
      WZ1 = 1./TRKBNK(20,4,LTK)
      WZ2 = 1./TRKBNK(20,4,MTK)
      XCN(1) = (TRKBNK(2,4,LTK)*WR1 + TRKBNK(2,4,MTK)*WR2)/(WR1+WR2)
      XCN(2) = (TRKBNK(3,4,LTK)*WR1 + TRKBNK(3,4,MTK)*WR2)/(WR1+WR2)
      XCN(3) = (TRKBNK(4,4,LTK)*WZ1 + TRKBNK(4,4,MTK)*WZ2)/(WZ1+WZ2)
      CALL UCOPY(XCN,XINT,3)
      CONSTR = .TRUE.
      JGDTK(1) = IGDTK(1)
      JGDTK(2) = IGDTK(2)
      JMAX = 2
      IF (BHABHA.OR.MXCHGD.LE.2) GOTO 42
      NONLIN = 0
C
      DO 40 ITK=3,MXCHGD
         STATUS = BLOCAT(IW,'DTFS',
     &     DTFS_bnk_num_list(IGDTK(ITK)),
     &     INDC,INDDAT)
         IHDSIZ=IW(INDDAT+DTFHDS)
         INDDAT=INDDAT+IHDSIZ
         IF (VXDMIN(INDDAT,XCN).GT.SCUTR) GOTO 40
         IF (ITKBNK(32,1,IGDTK(ITK)).LT.0) GOTO 40
         MXBNK = 3
C ------ IF VDC TRACK:
         IF (ITKBNK(32,4,IGDTK(ITK)).GE.100) MXBNK = 2
         MBNK = ITKBNK(32,2,IGDTK(ITK))
         IF (MBNK.NE.MXBNK) GOTO 40
         JMAX = JMAX + 1
         JGDTK(JMAX) = IGDTK(ITK)
C ------ FIND COS(OPENING ANGLE) WITH IGDTK(1)
         COSOPE = TRKBNK(5,4,IGDTK(1))*TRKBNK(5,MBNK,IGDTK(ITK))+
     +            TRKBNK(6,4,IGDTK(1))*TRKBNK(6,MBNK,IGDTK(ITK))+
     +            TRKBNK(7,4,IGDTK(1))*TRKBNK(7,MBNK,IGDTK(ITK))
         IF (ABS(COSOPE).GT.ABS(COSCOL)) GOTO 40
         NONLIN = NONLIN + 1
   40 CONTINUE
      IF (NONLIN.GT.0) GOTO 50
C
   42 CONTINUE
      CALL VXXYZ(JMAX,JGDTK,XINT,VXERR,CHISQ,IFIT,XCN,CONSTR)
C --- FOR DEBUG OF PROBLEM VERTICES
      ICALL = ICALL+1
      IF (ICALL.EQ.ICLLVX) GOTO 9999
C
      IF (IFIT.NE.0) GOTO 44
      CALL VXSTOR(JGDTK,JMAX,XINT,VXERR,CHISQ,NFLAG,IFIT)
      NHDSTR = NHDVTX
      NPRIM  = NPRIM-JMAX
      IF (MXCHGD.EQ.2) GOTO 900
   44 CONTINUE
      IF (MXCHGD.EQ.2) GOTO 100
C
C === LOOK FOR CONVERTED GAMMAS NOW ==================================
C
   50 CONTINUE
      CALL VXGMMA(MXCHGD,LERR)
C     IF(LERR.LT.0)GO TO 900
C
C === LOOK FOR PRIMARY NEXT ==========================================
C
 666  continue
      IF (NPRIM.LT.2) GOTO 70
      CONSTR = .FALSE.
      XINT(1) = 0.
      XINT(2) = 0.
      XINT(3) = 0.
C
      CALL VXXYZ(NPRIM,JGDTK,XINT,VXERR,CHISQ,IFIT,XCN,CONSTR)
                  IF(IFIT.NE.0
     &           .and.IFIT.NE.7
     &           .and.IFIT.NE.6
     &              ) GOTO 70
      DBEAM = SQRT( XINT(1)**2+XINT(2)**2 )
      IF (DBEAM.GT.3.5) GOTO 70
      NFLAG  = 1
      CALL VXSTOR(JGDTK,NPRIM,XINT,VXERR,CHISQ,NFLAG,IFIT)
      NHDSTR = NHDVTX
C
C === NOW LOOK FOR SECONDARY VERTICES ================================
C     TWO PRONG VTXS OF NET CHARGE 0 CAN HAVE ONE TRK ASSOCIATED WITH
C     PRIMARY
C
   70 CONTINUE
      CALL VXSCND(MXCHGD,NHDSTR,LERR)
C
C === TRY TO FIND START/STOP VERTICES NOW  ===========
C
      DO 85 ITK = 1,MXCHGD
         STATUS = BLOCAT(IW,'DTFS',
     &     DTFS_bnk_num_list(IGDTK(ITK)),
     &     INDC,INDDAT)
         IHDSIZ=IW(INDDAT+DTFHDS)
         INDDAT=INDDAT+IHDSIZ
         X1 = RW(INDDAT+DTFXLP)
         Y1 = RW(INDDAT+DTFYLP)
         Z1 = RW(INDDAT+DTFZLP)
         DO 82 KTK = 1,MXCHGD
            IF (KTK.EQ.ITK) GOTO 82
            IF (MSLIST(IGDTK(ITK)).NE.0 .AND. 
     +          MSLIST(IGDTK(KTK)).NE.0) GOTO 82
            STATUS = BLOCAT(IW,'DTFS',
     &        DTFS_bnk_num_list(IGDTK(KTK)),
     &        INDC,KNDDAT)
            IHDSIZ=IW(KNDDAT+DTFHDS)
            KNDDAT=KNDDAT+IHDSIZ
            X2 = RW(KNDDAT+DTFXCO)
            Y2 = RW(KNDDAT+DTFYCO)
            Z2 = RW(KNDDAT+DTFZCO)
            IF (SQRT((X1-X2)**2 + (Y1-Y2)**2).GT.DISMX1) GOTO 82
C --------- THERE EXISTS A CANDIDATE
            XINT(1) = 0.5*(X1+X2)
            XINT(2) = 0.5*(Y1+Y2)
            XINT(3) = 0.5*(Z1+Z2)
            ILIST(1) = IGDTK(ITK)
            ILIST(2) = IGDTK(KTK)
            IHH = 2
            CONSTR = .FALSE.
C --------- FIX TRACK BANK SO THAT TRACK CAN BE SWUM INTO DC PROPER
C           WITHOUT IMPROPER SWIM FLAG
            TRKBNK(32,3,ILIST(1)) = -1.0
            CALL VXXYZ(IHH,ILIST,XINT,VXERR,CHISQ,IFIT,XCN,CONSTR)
            TRKBNK(32,3,ILIST(1)) =  1.0
            IF (IFIT.NE.0 .AND. IFIT.NE.6 .AND. IFIT.NE.7) GOTO 82
            NFLAG = 15
            CALL VXSTOR(ILIST,2,XINT,VXERR,CHISQ,NFLAG,IFIT)
            GOTO 85
   82    CONTINUE
   85 CONTINUE
      GO TO 900
C
  100 CONTINUE
      IF (NHDVTX.GT.0) GOTO 900
      CALL INERR(510,1)
      GO TO 943
C
C === FIX UP VERTICES SO THAT ONE WITH MOST TKS IS PRIMARY. ==========
C     IF NO VERTEX HAS MORE THAN TWO TKS, PICK NEAREST TO
C     BEAM LINE ORIGIN.
C
  900 CONTINUE
      IF(NHDVTX.LE.0)GO TO 943
      IVSAV=1
      IF(NHDVTX.EQ.1)GO TO 915
      MTKSV=LV(KVX(1)+5)
      DO 905 IV=2,NHDVTX
            MTK=LV(KVX(IV)+5)
            IF(MTKSV.GT.MTK)GO TO 905
            MTKSVO=MTKSV
            MTKSV=MTK
            IVSAV=IV
 905  CONTINUE
      IF(IVSAV.EQ.1)GO TO 915
      IF(MTKSV.GT.MTKSVO)GO TO 912
C ----------------->>             ELSE HAVE AT LEAST 2 VTXS OF EQ MULT
C                                 LOOK FOR VERTEX CLOSEST TO BEAMLINE
      RSAV=SQRT(FV(KVX(1)+6)**2+FV(KVX(1)+7)**2+FV(KVX(1)+8)**2)
      IVSAV=1
      DO 910 IV=2,NHDVTX
            MTK=LV(KVX(IV)+5)
            IF(MTK .LT. MTKSV)GO TO 910
            R=SQRT(FV(KVX(IV)+6)**2+FV(KVX(IV)+7)**2+FV(KVX(IV)+8)**2)
            IF(R .GT. RSAV) GO TO 910
            RSAV=R
            IVSAV=IV
 910  CONTINUE
      IF(IVSAV.EQ.1)GO TO 915
 912  CONTINUE
      LTRN = KVX(IVSAV)
      KVX(IVSAV)= KVX(1)
      KVX(1)    = LTRN
 915  CONTINUE
      DO 920 ITK=1,MXCHGD
            NB1 = JBIT(MSLIST(IGDTK(ITK)),   1 )
            NBS = JBIT(MSLIST(IGDTK(ITK)),IVSAV)
            IF( NB1 .EQ. NBS )GO TO 920
            IF( NBS .EQ. 0 )GO TO 918
            CALL SBIT0(MSLIST(IGDTK(ITK)),IVSAV)
            CALL SBIT1(MSLIST(IGDTK(ITK)),   1 )
            GO TO 920
 918       CONTINUE
            CALL SBIT0(MSLIST(IGDTK(ITK)),   1 )
            CALL SBIT1(MSLIST(IGDTK(ITK)),IVSAV)
 920  CONTINUE
C ----------------->>             FILL PRIMARY VERTEX
C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      NTRS=LV(KVX(1)+5)
      WRITE(BNKTYP(14:16),'(I3)') NTRS
C
C       Create the vertex track bank
C       ============================
      STATUS = BTYMKG(IW,'DVFS',1,BNKTYP,BNKSIZ, IND, INDDAT)
      IF (STATUS.NE.YESUCC) THEN
              RETURN
      ENDIF
      IW(INDDAT+DVFHDS)=HDSIZ
      IW(INDDAT+DVFVRN)=BVER
      INDDAT=INDDAT+HDSIZ
      IW(INDDAT+DVFQFL)=LV(KVX(1)+4)
      CALL UCOPY(FV(KVX(1)+6),RW(INDDAT+DVFXCO),3)
      RW(INDDAT+DVFCHI)=FV(KVX(1)+15)
      CALL UCOPY(FV(KVX(1)+9),RW(INDDAT+DVFCVV),6)
      IW(INDDAT+DVFIDF)=LV(KVX(1)+1)
      IW(INDDAT+DVFMTR)=0
      IW(INDDAT+DVFNTR)=NTRS

C ----------------->>             FIX UP AD TRACK BANKS
      KPTR = KVX(1)
      INUM = LV(KPTR+5)
      DO 930 ITK=1,INUM
            KPTR = KPTR + 17
            NMTRK = LV(KPTR + 1)
            STATUS = BLOCAT(IW,'DTFS',
     &        DTFS_bnk_num_list(NMTRK),
     &        INDCTK,INDDATK)
            IHDSIZ=IW(INDDATK+DTFHDS)
            INDDATK=INDDATK+IHDSIZ
            IW(INDDAT+DVFNTR+DVFTRA+19*(ITK-1))=DTFS_bnk_num_list(NMTRK)
            CALL UCOPY(FV(KPTR+2),RW(INDDAT+DVFNTR+DVFCRV+19*(ITK-1)), 9)
            IF(RW(INDDATK+DTFCUR).LT.0.)
     +                           RW(INDDAT+DVFNTR+DVFCRV+19*(ITK-1))=
     +                          -RW(INDDAT+DVFNTR+DVFCRV+19*(ITK-1))
            RW(INDDAT+DVFNTR+DVFCHV+19*(ITK-1)) = FV(KPTR+17)
            RW(INDDAT+DVFNTR+DVFLNV+19*(ITK-1)) = FV(KPTR+11)
CC STORE THE PACKED LIST OF VERTICES
            IW(INDDATK+DTFPVM)=MSLIST(NMTRK)
            IW(INDDAT+DVFNTR+DVFPVM+19*(ITK-1))=MSLIST(NMTRK)
            CALL UCOPY(LV(KPTR+12),RW(INDDAT+DVFNTR+DVFD0V+19*(ITK-1)),5)
C                                 IF CHRGD DECAY, FIX LENGTH
            IVX = IW(INDDATK+DTFPVS)
            IF(IVX.EQ.0)GO TO 930
CCC VERIFICARE SE FV(+28) E' UNA CORREZIONE ALL LUNGHEZZA
            IF(LV(KVX(IVX)+18).EQ.NMTRK)
     +      RW(INDDAT+DVFNTR+DVFLNV+19*(ITK-1)) = 
     +      RW(INDDAT+DVFNTR+DVFLNV+19*(ITK-1))+FV(KVX(IVX)+28)
CC DA CAPIRE???
CCC            IF(LV(KVX(IVX)+35).EQ.ITK)
CCC     +      AD(JTK(NMTRK)+16) = AD(JTK(NMTRK)+16)+FV(KVX(IVX)+45)
 930        CONTINUE
C ----------------->>             STORE REST OF VERTICES (IF ANY)
      IF(NHDVTX .LE. 1)GO TO 942
      IF(NHDVTX.LT.20)GO TO 932
      CALL INERR(518,1)
      NHDVTX = 20
 932  CONTINUE
      DO 936 IVX=2,NHDVTX
            IF(LV(KVX(IVX)+1).EQ.1 .OR. LV(KVX(IVX)+1).EQ.2 .OR.
     +         LV(KVX(IVX)+1).EQ.15 )GO TO 935
            IF(LV(KVX(IVX)+5) .NE. 2)GO TO 935
            KNUM1 = LV(KVX(IVX)+18)
            KNUM2 = LV(KVX(IVX)+35)
            STATUS = BLOCAT(IW,'DTFS',
     &        DTFS_bnk_num_list(KNUM1),
     &        IND,INDDAT)
            IHDSIZ=IW(INDDAT+DTFHDS)
            INDDAT=INDDAT+IHDSIZ
            AKUR1=RW(INDDAT+DTFCUR)
            STATUS = BLOCAT(IW,'DTFS',
     &        DTFS_bnk_num_list(KNUM2),
     &        IND,INDDAT)
            IHDSIZ=IW(INDDAT+DTFHDS)
            INDDAT=INDDAT+IHDSIZ
            AKUR2=RW(INDDAT+DTFCUR)
            IF(AKUR1*AKUR2.GT.0.0)GO TO 935
C ----------------->>             NEW TRK BNKS WANTED?
C                                 CHECK INV MASS
            P1 = P(FV(KVX(IVX)+19),FV(KVX(IVX)+20))
            P2 = P(FV(KVX(IVX)+36),FV(KVX(IVX)+37))
            FMSS = E12(PION_MASS,P1,PION_MASS,P2,FV(KVX(IVX)+17))
            IF( FMSS .LT. 0.460 .OR. FMSS .GT. 0.540 )GO TO 931
            IDMASS = 20
            MSS1 = 1
            MSS2 = 1
            GO TO 934
 931        CONTINUE
            IF(FV(KVX(IVX)+16) .GT. .120)GO TO 935
            IF(FV(KVX(IVX)+16) .LT. .020)GO TO 933
            IDMASS = 84
            MSS1 = 1
            MSS2 = 29
            FMSS = E12(PION_MASS,P1,PROTON_MASS,P2,FV(KVX(IVX)+17))
            IF( FMSS .GT. 1.075 .AND. FMSS .LT. 1.155 )GO TO 934
            MSS1 = 29
            MSS2 = 1
            FMSS = E12(PROTON_MASS,P1,PION_MASS,P2,FV(KVX(IVX)+17))
            IF( FMSS .GT. 1.075 .AND. FMSS .LT. 1.155 )GO TO 934
 933        CONTINUE
            IF( FV(KVX(IVX)+17)/(P1*P2) .LT. 0.951)GO TO 935
C                            COS(OPENING ANGLE = 18 DEG) = 0.951
            IDMASS = 10
            MSS1 = 22
            MSS2 = 22
            V1COT = FV(KVX(IVX)+20)
            V1PHI = FV(KVX(IVX)+21)
            V2COT = FV(KVX(IVX)+37)
            V2PHI = FV(KVX(IVX)+38)
            COSPXP = (COS(V1PHI-V2PHI)+V1COT*V2COT)/
     +              SQRT( (1.+V1COT**2)*(1.+V2COT**2) )
            FMSS = EMMG(ELEC_MASS,P1,P2,COSPXP)
            IF( FMSS.GT.0.05 )GO TO 935
C
C    >>>>>>>>>>>>>>>>             OPEN A NEW BANK
 934        CONTINUE
CCC INSERIRE LA BANCA DEI NEUTRI
CC            NHDTRK = NHDTRK + 1
CCC            CALL ZBOOK(ID,JTK(NHDTRK),24)
C-----------EXIT IF /CADATA/ FULL (HKAP 27/05/91)
CC            IF (JTK(NHDTRK).EQ.0) THEN
CC               CALL INERR (25,3)
CC               RETURN
CC            ENDIF
CC            MPTR = JTK(NHDTRK)
CC            ID(MPTR+1) = IDMASS + 500
CC            ID(MPTR+2) = 1
CC            ID(MPTR+3) = IVX
CC            AD(MPTR+4) = 0.0
CC            AD(MPTR+5) = 0.0
CC            CALL VXDIFF(IVX,MSS1,MSS2,FMSS,AD(MPTR+6),AD(MPTR+7),
CC     +       AD(MPTR+8),AD(MPTR+9),AD(MPTR+23),AD(MPTR+16),AD(MPTR+15) )
CC            CALL VZERO(AD(MPTR+17),5)
CC            ID(MPTR+17) = -1
CC            AD(MPTR+22) = FMSS
CC            AD(MPTR+24) = 0.0
CC            LV(KVX(IVX)+2)  = NHDTRK
 935        CONTINUE
C-
C------------------------------------------------------------------
C-  Very important changes.     A.Andryakov   16-SEP-1994
C-
C- ****  Multiple vertecies case  *****
C-
C-  Original VXMAIN:
C-  ----------------
C-    Track parameters in the vtx. fit part of the output track bank
C-    are taken at the vertex point only for tracks from the MAIN vertex.
C-    All other charged tracks are propogated back to the point of this
C-    MAIN vtx. Their parameters at the corresponding secondary vertex
C-    are used only for V0 vertecies to calculate the 4-momenta
C-    of the neutral particles and then they are lost.
C-
C-  Present version of VXMAIN:
C-  --------------------------
C-    Track parameters in the vtx. fit part of the output track bank
C-    correspond to the proper vertex point for any track from any vertex.
C-
C-------------------------------------- begin  A.A. ---------------
C ----------------->>             FILL SECONDARY VERTEX
C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      KPTR = KVX(ivx)
      NTRS=LV(KPTR+5)
      WRITE(BNKTYP(14:16),'(I3)') NTRS
C
C       Create the vertex track bank
C       ============================
      STATUS = BTYMKG(IW,'DVFS',IVX,BNKTYP,BNKSIZ, IND, INDDAT)
      IF (STATUS.NE.YESUCC) THEN
              RETURN
      ENDIF
      IW(INDDAT+DVFHDS)=HDSIZ
      IW(INDDAT+DVFVRN)=BVER
      INDDAT=INDDAT+HDSIZ
      IW(INDDAT+DVFQFL)=LV(KPTR+4)
      CALL UCOPY(FV(KPTR+6),RW(INDDAT+DVFXCO),3)
      RW(INDDAT+DVFCHI)=FV(KPTR+15)
      CALL UCOPY(FV(KPTR+9),RW(INDDAT+DVFCVV),6)
      IW(INDDAT+DVFIDF)=LV(KPTR+1)
      IW(INDDAT+DVFMTR)=0
      IW(INDDAT+DVFNTR)=NTRS
C
C IN CASE OF KINK DELETE THE MOTHER TRACK FROM THE LIST LV(KPTR+3)
C
cc      IF(LV(KPTR+1).EQ.15)THEN
cc        IW(INDDAT+DVFMTR)=LV(KPTR+2)
cc        CALL SBIT0(LV(KPTR+3),LV(KPTR+2))
cc      ENDIF

      IW(INDDAT+DVFNTR)=NTRS

C ----------------->>     FIX UP AD TRACK BANKS for current vtx
      DO 1930 ITK=1,NTRS
            KPTR = KPTR + 17
            NMTRK = LV(KPTR + 1)
            STATUS = BLOCAT(IW,'DTFS',
     &        DTFS_bnk_num_list(NMTRK),
     &        INDCTK,INDDATK)
            IHDSIZ=IW(INDDATK+DTFHDS)
            INDDATK=INDDATK+IHDSIZ
            IW(INDDAT+DVFNTR+DVFTRA+19*(ITK-1))=DTFS_bnk_num_list(NMTRK)
            CALL UCOPY(FV(KPTR+2),RW(INDDAT+DVFNTR+DVFCRV+19*(ITK-1)), 9)
            IF(RW(INDDATK+DTFCUR).LT.0.)
     +                           RW(INDDAT+DVFNTR+DVFCRV+19*(ITK-1))=
     +                          -RW(INDDAT+DVFNTR+DVFCRV+19*(ITK-1))
            RW(INDDAT+DVFNTR+DVFCHV+19*(ITK-1)) = FV(KPTR+17)
            RW(INDDAT+DVFNTR+DVFLNV+19*(ITK-1)) = FV(KPTR+11)
            IW(INDDATK+DTFPVM)=MSLIST(NMTRK)
            IW(INDDAT+DVFNTR+DVFPVM+19*(ITK-1))=MSLIST(NMTRK)
            CALL UCOPY(LV(KPTR+12),RW(INDDAT+DVFNTR+DVFD0V+19*(ITK-1)),5)
            IVXS = IW(INDDATK+DTFPVS)
            IF(IVXS.EQ.0)GO TO 1930
CCC VERIFICARE SE FV(+28) E' UNA CORREZIONE ALL LUNGHEZZA
            IF(LV(KVX(IVXS)+18).EQ.NMTRK)
     +       RW(INDDAT+DVFNTR+DVFLNV+19*(ITK-1)) = 
     +       RW(INDDAT+DVFNTR+DVFLNV+19*(ITK-1))+FV(KVX(IVXS)+28)
CC DA CAPIRE???
CCC            IF(LV(KVX(IVXS)+35).EQ.ITK)
CCC     +       AD(JTK(NMTRK)+16) = AD(JTK(NMTRK)+16)+FV(KVX(IVXS)+45)
 1930       CONTINUE

936        CONTINUE
C ----------------->>             SWIM ALL TKS NOT INCLUDED IN FITS TO
C                                 CLOSEST APPROACH TO THE BEAM LINE
 942  CONTINUE
C
      IF(KLKS_SWIM.NE.1) GO TO 9999  !  IF SWIMMING HAS BEEN ASKED
C
      STATUS = BLOCAT(IW,'DVFS',1,INDC,INDDAT)
      IHDSIZ=IW(INDDAT+DVFHDS)
      INDDAT=INDDAT+IHDSIZ
      X(1) = RW(INDDAT+DVFXCO)
      X(2) = RW(INDDAT+DVFYCO)
      X(3) = RW(INDDAT+DVFZCO)
      IF(NHDVTX .GT. 0)GO TO 944
 943  X(1) = XBEAM(1)
      X(2) = XBEAM(2)
      X(3) = XBEAM(3)
 944  CONTINUE
      DO 945 LTK=1,MXCHGD
            ITK = IGDTK(LTK)
            STATUS = BLOCAT(IW,'DTFS',
     &        DTFS_bnk_num_list(ITK),
     &        INDC,INDDAT)
            IHDSIZ=IW(INDDAT+DTFHDS)
            INDDAT=INDDAT+IHDSIZ
            MBNK = 3
            ITKBNK(32,1,ITK) = MBNK
            CALL VXSWIM( X, ITK, TRKBUF, LERR)
C
            IF( LERR .NE. 0 )GO TO 945   !   SWIM ERROR
            IF( MSLIST(ITK) .NE. 0 )GO TO 945
C
            RW(INDDAT+DTFCUS) = TRKBUF(30)
C    DAVE-- PROTECT AGAINST PZ = 0
            RW(INDDAT+DTFCTS) = TRKBUF(7)
            IF( ABS(TRKBUF(7)) .GT. 1.0E-5 )
     +      RW(INDDAT+DTFCTS) =
     +        SIGN(1./SQRT(1./TRKBUF(7)**2-1.),TRKBUF(7))
            PHI = ATAN2(TRKBUF(6),TRKBUF(5))
            RW(INDDAT+DTFPHS) = PHI
            IF(PHI.LT.0.)RW(INDDAT+DTFPHS)=PI2+PHI
            CALL UCOPY(TRKBUF(2),RW(INDDAT+DTFXSW),3)
C?          CALL UCOPY(TRKBUF(24),RW(INDDAT+DTFCOV),6)
            RW(INDDAT+DTFLNG) = TRKBUF(1)
 945  CONTINUE
 9999 CONTINUE
C
      RETURN
      END
C   27/11/89            MEMBER NAME  VXCOVR   (ES)          FVS
      REAL FUNCTION VXCOVR(D,COV1,COV2,E)
$$IMPLICIT
C
C     DIMENSION D(6),E(6),COV(12)
      REAL D,E,COV1,COV2
      DIMENSION D(6),E(6),COV1(6),COV2(6)
C
      VXCOVR = (COV1(1)*E(1)+COV1(2)*E(2)+COV1(3)*E(3))*D(1)
     +        +(COV1(2)*E(1)+COV1(4)*E(2)+COV1(5)*E(3))*D(2)
     +        +(COV1(3)*E(1)+COV1(5)*E(2)+COV1(6)*E(3))*D(3)
     +        +(COV2(1)*E(4)+COV2(2)*E(5)+COV2(3)*E(6))*D(4)
     +        +(COV2(2)*E(4)+COV2(4)*E(5)+COV2(5)*E(6))*D(5)
     +        +(COV2(3)*E(4)+COV2(5)*E(5)+COV2(6)*E(6))*D(6)
C
      RETURN
      END
C   27/11/89 102071907  MEMBER NAME  VXSWIM   (ES)          FVS
C   17/04/84            MEMBER NAME  VXSWIM   (S)           FORTRAN
      SUBROUTINE VXSWIM(WVTX,ITRK,TRKOUT,LERR)
$$IMPLICIT
C
C=====================================================================
C  SUBROUTINE FOR SWIMMING TRACKS
C  --- CALLED FROM VXMAIN, VXPREP, VXTKIN, VDTKIN
C---------------------------------------------------------------------
C  INPUT : WVTX(2)= X,Y SWIM END POINT
C          ITRK   = NUMBER OF TRACK TO BE SWUM
C          TRKBNK(*,N,ITRK) = TRACKBNK IN COMMON/CWORK/
C
C  OUTPUT: TRKOUT = TRKBNK(32,REGION,TRACK NUMBER)
C                             1 - 4     1 - 64
C---------------------------------------------------------------------
C  DESCRIPTION OF WORKING TRACK BANK TRKBNK( N , I , J ):
C  N=
C    1        TRACK LENGTH
C    2,3,4    X,Y,Z
C    5,6,7    VTNG X,Y,Z
C    8,9,10   VNORM X,Y,Z (UNNORMALIZED)
C    11,12,13 VH X,Y,Z (UNIT VECTOR IN DIR OF MAG FIELD)
C    14       1/VHMAG  (MAGNITUDE OF MAG FIELD)
C    15 - 29  COVARIANCE MATRIX FOR REGION I
C    30       SIGNED VALUE OF K
C    31       ABS(DP/DX)  (DEFAULT MASS = PI MASS. K FROM REGION 1)
C    32, I=1  STATUS WORD = 1 OR 2: INPUT BNK FROM VXTKIN/VDTKIN
C                         = 3  INIT TRKOUT FROM BEST BNK
C                         = 4  USE TRKOUT WITH MODIFICATION
C        I=2  STATUS WORD = NUMBER OF LAST FILLED BANK
C                         = -1 NO BANKS FILLED
C        I=3  STATUS WORD = +1.0 FOR NEGATIVE SWIMS (NORMAL)
C                         = -1.0 FOR POSITIVE SWIMS (MUST BE
C                                          SET WHEN NEEDED)
C        I=4  STATUS WORD = NUMBER OF BANK USED TO INITIALIZE
C                                   THE WORKING BANK WHEN LAST INIT +
C                                   100 IF VDC HITS IN FIT
C---------------------------------------------------------------------
C  ---  D.L. COPPAGE              21/07/83 V3.00  (ARG05)
C                                 20/01/84 V3.01  (ARG06)
C                                 21/03/84 V3.02  (ARG06) FIXED ERROR
C                                 AFFECTING LEGALITY OF SWIM (LERR 2)
C                                 17.04.84 V3.03  (ARG06) FIXED CONVERG
C                                 FOR VERY LOW PT TRKS
C                                 14.05.84 V4.00  (ARG07) DKDX IN DC
C                                 29.07.84 V5.00  (ARG08) NEW MGFLD
C                                 30.08.84 V5.10  (ARG08) NTIFLD 3 MAGFL
C                                 11.11.84 V5.20  (ARG08) FIXED MAG FLD
C                                 MAP. BAD FOR INNER DC AND COMPENSATION
C                                 COILS FOR EXPT 2 DATA.  FIXED SWIM TO
C                                 HOLD PTOT FIXED INSTEAD OF K
C                                 12.12.84 V5.30  (ARG08) SINL PROB FIX
C                                 19.04.85 V6.00 MOD FOR VDC FITS
C  ---  HKAP                      25/10/90 CLEAN UP
C---------------------------------------------------------------------
$$INCLUDE 'K$ITRK:CCONST.INC'
$$INCLUDE 'K$ITRK:CFLAGS.INC'
$$INCLUDE 'K$ITRK:CTIDRI.INC'
$$INCLUDE 'K$ITRK:CVXCUT.INC'
$$INCLUDE 'K$ITRK:CVXWORK.INC'
$$INCLUDE 'YBOS$LIBRARY:ERRCOD.INC'
$$INCLUDE 'K$INC:BCS.INC'
C
      REAL    WVTX,TRKOUT(32)
      INTEGER ITRK,LERR
C
      INTEGER LBNK,ITERMX,NDXSV,IBNK,MXBNK,I,L,KK
      INTEGER IVOL
      INTEGER ITER,NDX
      REAL    COEFF,STEPLG,SWLNGH,COSPHI,SINPHI,SINGMA
      REAL    COSDLT,RELERR,COSGMA,GMA,DIRSWM
      REAL    FRAC,COSLAM,RHO,DLTIV,DWW
      REAL    arcl,turn,sintrn,costrn,sinlh,hn,hz,tinv
C
      REAL      VH,DELT,WWVTX,TRKSP,SRFVDC
      DIMENSION VH(3),DELT(2),WVTX(2),WWVTX(2),TRKSP(3),
     +          SRFVDC(2)
      LOGICAL FLGVDC
      REAL BRADL/0.000/
C     DATA STEPLG/4.0/
C     DATA ITERMX/5/
      REAL EBYCIV
      DATA EBYCIV /3.33567E+3/
c      call vzero(TRKOUT,32)  !  clear TRKOUT befor using (Andryakov)
c                                When I thoght a little bit and looked in
c                                the code of this routine I've understood that
c                                nobody should touch TRKOUT
C
C  ----------------->>            SET VDC FLAG AND APPROPRIATE SURFACES
C                                 RSRFCO(1) = DC(RAD) ALWAYS
C                                 RSRFCO(2) = BT(RAD) ALWAYS
      LBNK = ITKBNK(32,4,ITRK)
      FLGVDC = LBNK.GE.100
c      FLGVDC = .TRUE.
      SRFVDC(1) = RSRFCO(1)
      SRFVDC(2) = RSRFCO(2)
      IF(.NOT.FLGVDC)GO TO 6
      SRFVDC(1) = RSRFCO(2)
      SRFVDC(2) = 0.0
 6    CONTINUE
C
C  ----------------->>            LOOP OVER BANKS TO FIND BEST ONE
C                                 UNLESS ALREADY USING WORKSPACE (=4)
      ITERMX = ITRSVX
      FRAC = STEPVX/40.0
      NDXSV = 9999
      IBNK = ITKBNK(32,1,ITRK)
      MXBNK = ITKBNK(32,2,ITRK)
      IF( MXBNK .LT. 0 )GO TO 996
      DO 7 I=1,MXBNK
 7        TRKSP(I) = 1./(SQRT(1.-TRKBNK(7,I,ITRK)**2)*TRKBNK(30,I,ITRK))
      IF( IBNK .NE. 4 )GO TO 8
         LBNK = MOD(ITKBNK(32,4,ITRK),100)
         IBNK = LBNK
         GO TO 15
 8    IF( IBNK .EQ. 1 .OR. IBNK .EQ. 2 )GO TO 10
C                       WHICH BANK IS CLOSEST
      IBNK   = 1
      IF(MXBNK.EQ.1)GO TO 10
      L = IBNK
      DO 9 KK=1,2
          COSLAM = SQRT(1.-TRKBNK(7,L,ITRK)**2)
C         RHO    = TRKBNK(14,L,ITRK)/(EBYC*TRKBNK(30,L,ITRK)*COSLAM)
          RHO    = TRKBNK(14,L,ITRK)*TRKSP(L)*EBYCIV
          DELT(1) = TRKBNK(2,L,ITRK) + RHO*TRKBNK(6,L,ITRK) - WVTX(1)
          DELT(2) = TRKBNK(3,L,ITRK) - RHO*TRKBNK(5,L,ITRK) - WVTX(2)
          DLTIV   = SIGN(1./SQRT(DELT(1)**2 + DELT(2)**2),RHO)
          WWVTX(1) = WVTX(1) + (1.-RHO*COSLAM*DLTIV)*DELT(1)
          WWVTX(2) = WVTX(2) + (1.-RHO*COSLAM*DLTIV)*DELT(2)
          DWW    = WWVTX(1)**2+WWVTX(2)**2
          IF(DWW.LT.SRFVDC(1)**2 )IBNK=2
          IF(DWW.LT.SRFVDC(2)**2 )IBNK=MIN(3,MXBNK)
          IF(IBNK .EQ. 1)GO TO 10
          L = IBNK
  9   CONTINUE
 10   CALL UCOPY(TRKBNK(1,IBNK,ITRK),TRKOUT,30)
      LBNK = IBNK
      IF(FLGVDC)LBNK = LBNK + 100
      ITKBNK(32,4,ITRK) = LBNK
 15   CONTINUE
C
C  ----------------->>            NOW CALCULATE SWIM DISTANCE
C                                 TO SAVE TIME, USE RHO/COSLAM I.E.
C                                 RHO = RHO(SPACE)
C                                     = Q*P/((E/C)*B)
      COSLAM = SQRT(1. - TRKOUT(7)**2)
C     RHO = TRKOUT(14)/(CONVERS*TRKOUT(30)*COSLAM)
      RHO = TRKOUT(14)*TRKSP(IBNK)*EBYCIV
      COEFF = AMAX1(COSLAM,0.1)
      STEPLG = AMIN1( STEPVX*COEFF , FRAC*ABS(RHO)*COSLAM*COEFF )
      LERR = 0
      SWLNGH = ( (WVTX(1) - TRKOUT(2)) * TRKOUT(5) +
     +           (WVTX(2) - TRKOUT(3)) * TRKOUT(6) )/COSLAM**2
      IF( ABS(SWLNGH) .LT. 0.1 )GO TO 998
C
      COSPHI = TRKOUT(5)/COSLAM
      SINPHI = TRKOUT(6)/COSLAM
C
      DELT(1) = TRKOUT(2) + RHO*TRKOUT(6) - WVTX(1)
      DELT(2) = TRKOUT(3) - RHO*TRKOUT(5) - WVTX(2)
      DLTIV   = SIGN(1./SQRT(DELT(1)**2 + DELT(2)**2),RHO)
      SINGMA  = (DELT(1)*COSPHI + DELT(2)*SINPHI)*DLTIV
      IF( ABS(SINGMA) .GT. 0.7 )GO TO 90
      COSDLT  =          SWLNGH*COSLAM
     +         /SQRT( (TRKOUT(2)-WVTX(1))**2+(TRKOUT(3)-WVTX(2))**2 )
      IF(ABS(COSDLT) .GT. 1. )COSDLT = 1.
C  ---------------->>             RELATIVE ERR = TAN(DLT)*TAN(GMA) WHEN
C                                 USING SWLNGH FROM TANGENT APPROX
      RELERR  = SQRT( (1./COSDLT**2-1.)/(1./SINGMA**2-1.) )
      IF( RELERR .LT. 0.005 )GO TO 100
      WWVTX(1) = WVTX(1) + (1.-RHO*COSLAM*DLTIV)*DELT(1)
      WWVTX(2) = WVTX(2) + (1.-RHO*COSLAM*DLTIV)*DELT(2)
      SWLNGH    = ( (WWVTX(1)-TRKOUT(2))*TRKOUT(5) +
     +              (WWVTX(2)-TRKOUT(3))*TRKOUT(6) )/COSLAM**2
      COSDLT  =          SWLNGH*COSLAM
     +         /SQRT( (TRKOUT(2)-WWVTX(1))**2+(TRKOUT(3)-WWVTX(2))**2 )
      IF(ABS(COSDLT) .GT. 1. )COSDLT = 1.
      RELERR  = SQRT( (1./COSDLT**2-1.)/(1./SINGMA**2-1.) )
      IF( RELERR .LT. 0.005 )GO TO 100
 90   COSGMA = (DELT(1)*SINPHI - DELT(2)*COSPHI)*DLTIV
      GMA    = ATAN2(SINGMA,COSGMA)
      SWLNGH = -GMA*RHO
C
 100  IF( ABS(SWLNGH) .LT. 0.1 )GO TO 998
C
C  ==================>>            ENTER SWIM SECTION
C
      LBNK = MOD(ITKBNK(32,4,ITRK),100)
C??      LERR = 9
C??      IF( LBNK .LT. MXBNK .AND.
C??     +    TRKOUT(1)-SWLNGH .GT. TRKBNK(1,LBNK+1,ITRK) + 8.0 )GO TO 998
C??      LERR = 6
      DIRSWM = TRKBNK(32,3,ITRK)
C??      IF( TRKOUT(1)-SWLNGH .LT. 0.85*DIRSWM*TRKBNK(1,1,ITRK) )GO TO 998
      DO 300 ITER = 1,ITERMX
C --- # TRACING STEPS AND ARC LENGTH
            NDX  = MAX0( IFIX( ABS(SWLNGH/STEPLG)) , 1 )
            ARCL = SIGN( STEPLG, SWLNGH)
            IF( ABS(SWLNGH) .LT. STEPLG ) ARCL = SWLNGH
            LERR = 7
            IF( NDX .GT. NDXSV + 4 )GO TO 998
            NDXSV = NDX
C --- TRACE THE TRACK
            DO 200 I = 1,NDX
C --- TURNING ANGLE
                  TURN   = ARCL/RHO
C  ----------------->>            CHANGE IN POSITION AND TANGENT
C                                 (CONSISTENT WITH MARK2 PAPER)
C --- APPROX SIN(TURN)            (CONSISTENT WITH MARK2 PAPER)
                  SINTRN = TURN*(1.-TURN**2*0.16666667*
     +                          (1.-TURN**2*0.05))
C --- APPROX COS(TURN) = SQRT(1-SIN(TURN)**2)
                  COSTRN = 1. - 0.5*SINTRN**2
                  COSTRN = 0.5*(COSTRN + (1.-SINTRN**2)/COSTRN)
                  COSTRN = 0.5*(COSTRN + (1.-SINTRN**2)/COSTRN)
C --- SIN(LAMBDA)
                  SINLH = TRKOUT(5)*TRKOUT(11)+TRKOUT(6)*TRKOUT(12)+
     +                    TRKOUT(7)*TRKOUT(13)
C --- NEW STARTING POINT
                  HN = 1. - COSTRN
                  HZ = (TURN - SINTRN)*SINLH
                  TRKOUT(2) = TRKOUT(2) +
     +            RHO*(SINTRN*TRKOUT(5) + HN*TRKOUT( 8) + HZ*TRKOUT(11))
                  TRKOUT(3) = TRKOUT(3) +
     +            RHO*(SINTRN*TRKOUT(6) + HN*TRKOUT( 9) + HZ*TRKOUT(12))
                  TRKOUT(4) = TRKOUT(4) +
     +            RHO*(SINTRN*TRKOUT(7) + HN*TRKOUT(10) + HZ*TRKOUT(13))
C --- NEW TANGENT
                  HN = HN*SINLH
                  TRKOUT(5) =
     +            COSTRN*TRKOUT(5) + SINTRN*TRKOUT( 8) + HN*TRKOUT(11)
                  TRKOUT(6) =
     +            COSTRN*TRKOUT(6) + SINTRN*TRKOUT( 9) + HN*TRKOUT(12)
                  TRKOUT(7) =
     +            COSTRN*TRKOUT(7) + SINTRN*TRKOUT(10) + HN*TRKOUT(13)
C
                  IF(ABS(TRKOUT(7)) .GE. 1.)GO TO 995
C
C--- KLOE code modification ----- begin ------ A.Andryakov----
C  We have an uniform magnetic field and so don't need any corr. on VH
C
      VH(1) = 0.
      VH(2) = TIFLAV*BRADL/CONVERS
      VH(3) = TIFLAV*(1.-0.5*BRADL*BRADL)/CONVERS
C
C--- KLOE code modification ----- end -------- A.Andryakov----
C
C  ----------------->>            NOW UPDATE VH AND VNORM
C    At present in KLOE magnetic field is uniform
C
C --- NORMAL VECTOR N = T X H
                  TRKOUT( 8) = TRKOUT(6)*TRKOUT(13)-TRKOUT(7)*TRKOUT(12)
                  TRKOUT( 9) = TRKOUT(7)*TRKOUT(11)-TRKOUT(5)*TRKOUT(13)
                  TRKOUT(10) = TRKOUT(5)*TRKOUT(12)-TRKOUT(6)*TRKOUT(11)
                  COSLAM = SQRT(1. - TRKOUT(7)**2)
C  ----------------->>            UPDATE K FROM RIGHT REGION
                  IBNK = 3
c                  IF( DR0 .GT. SRFVDC(2) )IBNK=2
c                  IF( DR0 .GT. SRFVDC(1) )IBNK=1
                  IF(IBNK.GT.MXBNK)IBNK = MXBNK
C --  ADDED  -- 3.05.84 --- CHANGED 08.11.84
                  TRKSP(IBNK) =
     +            SIGN(ABS(TRKSP(IBNK))-ARCL*TRKBNK(31,IBNK,ITRK),
     +                 TRKSP(IBNK))
                  RHO = TRKOUT(14)*TRKSP(IBNK)*EBYCIV
C
 200         CONTINUE
C  ----------------->>            INSURE THAT TANGENT IS NORMALIZED
      TINV = 1./SQRT(TRKOUT(5)**2+TRKOUT(6)**2+TRKOUT(7)**2)
      IF( ABS(TINV-1.) .LT. 0.0001 )GO TO 210
      TRKOUT(5) = TRKOUT(5)*TINV
      TRKOUT(6) = TRKOUT(6)*TINV
      TRKOUT(7) = TRKOUT(7)*TINV
 210  CONTINUE
C  ----------------->>            UPDATE TRACK LENGTH AND
C                                 GET NEW ESTIMATE OF SWIM DISTANCE
             TRKOUT(1) = TRKOUT(1) - ARCL*FLOAT(NDX)
             SWLNGH    = ( (WVTX(1)-TRKOUT(2))*TRKOUT(5) +
     +                     (WVTX(2)-TRKOUT(3))*TRKOUT(6) )/COSLAM**2
C --- EXIT IF TRACK SWUM
             IF( ABS(SWLNGH) .LT. 0.1 ) GO TO 400
C  ----------------->>            OTHERWISE TRY A MORE REFINED CALC
C                                 FOR LOW PT TRACKS
C
             DELT(1) = TRKOUT(2) + RHO*TRKOUT(6) - WVTX(1)
             DELT(2) = TRKOUT(3) - RHO*TRKOUT(5) - WVTX(2)
             DLTIV   = SIGN(1./SQRT(DELT(1)**2 + DELT(2)**2),RHO)
             WWVTX(1) = WVTX(1) + (1.-RHO*COSLAM*DLTIV)*DELT(1)
             WWVTX(2) = WVTX(2) + (1.-RHO*COSLAM*DLTIV)*DELT(2)
             SWLNGH    = ( (WWVTX(1)-TRKOUT(2))*TRKOUT(5) +
     +                     (WWVTX(2)-TRKOUT(3))*TRKOUT(6) )/COSLAM**2
 300  CONTINUE
C                                  IF HERE, TOO MANY ITERATIONS
      CALL INERR(571,1)
      LERR = 1
      GO TO 998
C
 400  CONTINUE
C
C  ----------------->>            FIND CORRECT COVARIANCE MATRIX
C                IF FLGVDC = TRKBNK(32,4,*).GE.100, THEN VDC HITS IN FIT
      IVOL = 3
      IF(FLGVDC)IVOL = 2
C
      IF( IBNK.EQ.IVOL )GO TO 450
C  -----------------  A SWIM ENDING IN REGION 3(IVOL) IS ALWAYS LEGAL
C
c      IF( IBNK.EQ.IVOL-1 .AND. ABS(DR0-RSRFCO(2)).LT.1. )GO TO 450
C  -----------------  A SWIM ENDING IN REGION 2 AND HAVING BEEN SWUM
C                     THRU REGION 3 IS DECLARED LEGAL IF WITHIN 1 CM
C                     OF THE DC SIDE OF THE BEAM TUBE SURFACE (IN ORDER
C                     TO AVOID DISCARDING GOOD TRACKS IF THE VTX
C                     APPROXIMATION IS A LITTLE WRONG)
C                     IF FLGVDC , REPLACE 3 BY IVOL ETC...
C
C                                  NEED TO SEE WHETHER LEGAL IF HERE
      LERR = 2
      IF( (IBNK .LT. MXBNK .AND.
     +     (TRKOUT(1).GT.TRKBNK(1,IBNK+1,ITRK))
     +  .OR. TRKOUT(1).LT.0.85*DIRSWM*TRKBNK(1,1,ITRK))   )GO TO 998
C  -----------------  A SWIM ENDING IN REGION 1(2) MUST NOT HAVE PASSED
C                     THRU REGION 2(3) (EXCEPT FOR THE ABOVE EXCEPTION)
C                     THE CHECK IS MADE AGAINST THE TRK LENGTH TO THE
C                     NEXT LOWEST REGION (I.E. CLOSEST TO THE BEAM LINE)
C                     A SWIM IN REGION 1 ALONG THE DIRECTION
C                     OF PARTICLE MOTION MUST BE EXPRESSLY ENABLED
C                     WITH DIRSWM SET TO -1.0 BEFORE THE CALL TO VXSWIM
C
 450  CONTINUE
C --  ADDED  -- 3.05.84 ::  CHANGED 9.11.84  CONVERT TO K FROM P,COSLAM
C ----------------------::  IF NO SWIM ITERATION THEN FILLED ON ENTRY
      TRKOUT(30) = 1./(TRKSP(IBNK)*COSLAM)
C-----------------------
C
      CALL VXERRC(TRKBNK(1,IBNK,ITRK),TRKOUT)
      LERR = 10
      IF(AMIN1(TRKOUT(15),TRKOUT(20),TRKOUT(24),TRKOUT(27),TRKOUT(29))
     +   .LE.0.0)GO TO 998
      LERR = 0
      RETURN
C
 995  CONTINUE
      LERR = 5
      GO TO 998
 996  CONTINUE
      LERR = 4
      GO TO 998
 998  CONTINUE
C     LERR =0,1,2,3,4,5,6,7,8,9,10
      IF (LERR.EQ.4.OR.LERR.EQ.5.OR.LERR.EQ.7)
     >    CALL INERR(572,1)
      IF (LERR.EQ.10) CALL INERR(515,1)
 999  CONTINUE
C
      RETURN
      END
C   27/11/89            MEMBER NAME  VXCRSS   (ES)          FVS
C   26/07/84            MEMBER NAME  VXCRSS   (MAR85)       FORTRAN
      SUBROUTINE VXCRSS(ILIST,XINT,LERRC,CNVGMA)
$$IMPLICIT
C
C     SUBROUTINE FOR FINDING APPROXIMATE INTERSECTION OF TWO TRACKS
C     --- CALLED FROM VXMAIN AND VXSCND
C
C     ORIGINAL VERSION BY D.COPPAGE FOR ARGUS (QUITE POORLY CODED).   
C     REVISED BY A.CALCATERRA FOR KLOE ON 20 NOV 96                  
C
C     INPUT :
C             ILIST(2) = LIST OF A PAIR OF TRACK NUMBERS
C     OUTPUT:
C             XINT(3)  = APPROXIMATE X,Y,Z INTERSECTION OF TRACK PAIR
C             LERRCR   = 0 UNLESS TRACK SWIM REFUSED IN VXTKIN (LERRC=6)
C                          OR THE MAGNETIC FIELD IS *VERY* SMALL (LERRC=7)
C             CNVGMA   = LOGICAL VARIABLE TELLING WHETHER TRACKS IN THE PAIR
C                        ARE TANGENT WITHIN CUTS DRIVEN BY TOLER (SEE BELOW)
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
      LOGICAL CNVGMA
      INTEGER ILIST(2),LERRC
      REAL    XINT(3)
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
$$INCLUDE 'K$ITRK:CCONST.INC'
$$INCLUDE 'K$ITRK:CVXWORK.INC'
C
      REAL PROXIM
C
      LOGICAL EXTCRC,INTCRC
      INTEGER LSTRG1,LSTRG2,INRMST,REG,REGION,NDX
      INTEGER IL,IG
      REAL    RRMIN,RR,TRMIV
      REAL    DCC,RLCOS,ARGMNT,A_HALF
      REAL    DLTZ,SGNIL,SGNIG,DLTCPL,DLTCMN,ANGNW
      REAL    VS(3,2),TS(3,2),VH(3),RHO(2)
      REAL    ANGSTR(2),XCTR(2,2),CTGTHE(2),U(2),ANG(2),ZPL(2),ZMN(2)
      REAL    SGNQB(2),ANGCTR(2),TURNPL(2),TURNMN(2)
C
      REAL    TOLER /0.10/
C
      LERRC = 0
C
C  Find the innermost region in which both tracks have been swum
      LSTRG1 = ITKBNK(32,2,ILIST(1))
      IF (LSTRG1 .LT. 0) THEN
        LERRC = 6
        RETURN
      ENDIF
C
      LSTRG2 = ITKBNK(32,2,ILIST(2))
      IF (LSTRG2 .LT. 0) THEN
        LERRC = 6
        RETURN
      ENDIF
C
      INRMST = MIN0(LSTRG1,LSTRG2)
C
      RRMIN = 1.E38
      DO REG=1,INRMST
        RR = (TRKBNK(2,REG,ILIST(1))-TRKBNK(2,REG,ILIST(2)))**2
     +      +(TRKBNK(3,REG,ILIST(1))-TRKBNK(3,REG,ILIST(2)))**2
     +      +(TRKBNK(4,REG,ILIST(1))-TRKBNK(4,REG,ILIST(2)))**2
        IF (RR .LT. RRMIN) THEN
          RRMIN = RR
          REGION = REG
        ENDIF
      ENDDO
C
      DO NDX=1,2
        VS(1,NDX) = TRKBNK(2,REGION,ILIST(NDX))
        VS(2,NDX) = TRKBNK(3,REGION,ILIST(NDX))
        VS(3,NDX) = TRKBNK(4,REGION,ILIST(NDX))
        TS(1,NDX) = TRKBNK(5,REGION,ILIST(NDX))
        TS(2,NDX) = TRKBNK(6,REGION,ILIST(NDX))
        TS(3,NDX) = TRKBNK(7,REGION,ILIST(NDX))
        CALL MGFLD(TRKBNK(2,REGION,ILIST(NDX)),VH)
        IF (ABS(VH(3)) .LE. 1.0E-4) THEN
          LERRC = 7
          RETURN
        ELSE
C
C  KLOE convention: RHO is >0 for a positive particle, turning CLOCKWISE.
          RHO(NDX) = 1./(CONVERS*VH(3)*TRKBNK(30,REGION,ILIST(NDX)))
          SGNQB(NDX) = SIGN(1.0,RHO(NDX))
C
C  This is the angle from the center of curvature to the starting point
          ANGSTR(NDX)=
     +     ATAN2(SGNQB(NDX)*TS(1,NDX), -SGNQB(NDX)*TS(2,NDX))
C
C  These are the coordinates of the center of curvature
          TRMIV = 1./SQRT(TS(1,NDX)**2+TS(2,NDX)**2)
          XCTR(1,NDX) = VS(1,NDX) + RHO(NDX)*TS(2,NDX)*TRMIV
          XCTR(2,NDX) = VS(2,NDX) - RHO(NDX)*TS(1,NDX)*TRMIV
C
C  This is the cotangent of theta (or the tangent of lambda, the dip angle)
          CTGTHE(NDX) = TS(3,NDX)/SQRT(1.0-TS(3,NDX)*TS(3,NDX))
          RHO(NDX) = ABS(RHO(NDX))
        ENDIF
      ENDDO
C ----------------->>            ASSURE THAT RHO(IG) .GT. RHO(IL)
      IF (RHO(1) .LT. RHO(2)) THEN
        IL=1
        IG=2
      ELSE
        IL=2
        IG=1
      ENDIF
C
C  U is the vector joining the centers of the two circles in the tr. plane
      U(1) = XCTR(1,IG)-XCTR(1,IL)
      U(2) = XCTR(2,IG)-XCTR(2,IL)
      DCC  = SQRT(U(1)**2+U(2)**2)
C
C ----------------->>              TEST FOR ALMOST TANGENT CIRCLES
C
      EXTCRC = DCC .GT. (RHO(1)+RHO(2))
      INTCRC = DCC .LT. (RHO(IG)-RHO(IL))
C
      IF (EXTCRC .OR. INTCRC) THEN
C
C  The two circles have *NO* intersections. Use the point of closest 
C  approach to both helices. 
C  Finally, if the circles are "tangent within cuts", flag CNVGMA = .true.
        ANGCTR(IL) = ATAN2(U(2),U(1))
        ANGCTR(IG) = ATAN2(-U(2),-U(1))
        IF (INTCRC) ANGCTR(IL) = ANGCTR(IG)
C
        TURNPL(IL) = PROXIM(ANGCTR(IL)-ANGSTR(IL),0.)
        ZPL(IL) = VS(3,IL) - SGNQB(IL)*TURNPL(IL)*RHO(IL)*CTGTHE(IL)
C
        TURNPL(IG) = PROXIM(ANGCTR(IG)-ANGSTR(IG),0.)
        ZPL(IG) = VS(3,IG) - SGNQB(IG)*TURNPL(IG)*RHO(IG)*CTGTHE(IG) 
C
        DLTZ = ABS(ZPL(IG)-ZPL(IL))
        IF (INTCRC) THEN
          A_HALF = (RHO(IG)-RHO(IL)-DCC)/2.
        ELSE
          A_HALF = (DCC-RHO(IG)-RHO(IL))/2.
        ENDIF
        XINT(1) = XCTR(1,IL) + (RHO(IL)+A_HALF)*COS(ANGCTR(IL))
        XINT(2) = XCTR(2,IL) + (RHO(IL)+A_HALF)*SIN(ANGCTR(IL))
        XINT(3) = 0.5*(ZPL(IG)+ZPL(IL))
C      
        IF (INTCRC) THEN
          CNVGMA = RHO(IG)-DCC-RHO(IL) .LT. TOLER*DCC
        ELSE
          CNVGMA = DCC-RHO(1)-RHO(2) .LT. TOLER*(RHO(1)+RHO(2))
        ENDIF
      ELSE
C
C  The two circles have exactly two intersections
        CNVGMA = .FALSE.
C
C  This is the distance from the center of circle IL to the chord
C  between the two intersections.
        RLCOS  = ((DCC**2-RHO(IG)**2)+RHO(IL)**2)/(2.*DCC)
        ARGMNT = RLCOS/RHO(IL)
        IF (ABS(ARGMNT) .GT. 1.) THEN
          ARGMNT = SIGN(1.,ARGMNT)
        ENDIF
C
C  This is a half of the chord angle, defined positive
        ANG(IL) = ACOS(ARGMNT)
C
C  Same for circle IG....
        ARGMNT = (DCC-RLCOS)/RHO(IG)
        IF (ABS(ARGMNT) .GT. 1.) THEN
          ARGMNT = SIGN(1.,ARGMNT)
        ENDIF
        ANG(IG) = ACOS(ARGMNT)
C
C  This is the angle of center IG seen from IL, correctly in (-PI,PI)
        ANGCTR(IL) = ATAN2(U(2),U(1))
        SGNIL = SIGN(1.0,ANGCTR(IL))
C
C  And here is the angle of center IL seen from IG, also in (-PI,PI)
        ANGCTR(IG) = ATAN2(-U(2),-U(1))
        SGNIG = SIGN(1.0,ANGCTR(IG))
C
C  These 4 TURNs are the ang.distances from the 2 starting points up to the
C  intersections (2 for each track). Signs are geometric: clockwise --> < 0
        TURNPL(IL) = PROXIM(ANGCTR(IL)+SGNIL*ANG(IL)-ANGSTR(IL),0.)
C
C  The 4 - signs below take into account the KLOE convention above
        ZPL(IL) = VS(3,IL) - SGNQB(IL)*TURNPL(IL)*RHO(IL)*CTGTHE(IL)
C
        TURNPL(IG) = PROXIM(ANGCTR(IG)+SGNIG*ANG(IG)-ANGSTR(IG),0.)
        ZPL(IG) = VS(3,IG) - SGNQB(IG)*TURNPL(IG)*RHO(IG)*CTGTHE(IG)
C
        TURNMN(IL) = PROXIM(ANGCTR(IL)-SGNIL*ANG(IL)-ANGSTR(IL),0.)
        ZMN(IL) = VS(3,IL) - SGNQB(IL)*TURNMN(IL)*RHO(IL)*CTGTHE(IL)
C
        TURNMN(IG) = PROXIM(ANGCTR(IG)-SGNIG*ANG(IG)-ANGSTR(IG),0.)
        ZMN(IG) = VS(3,IG) - SGNQB(IG)*TURNMN(IG)*RHO(IG)*CTGTHE(IG)
C
C  The good intersection is the closest one to both points.
        DLTCPL = TURNPL(IL)**2+TURNPL(IG)**2
        DLTCMN = TURNMN(IL)**2+TURNMN(IG)**2
        IF (DLTCPL .GT. DLTCMN) THEN
          ANGNW   = ANGCTR(IL) - SGNIL*ANG(IL)
          XINT(3) = 0.5*(ZMN(IG)+ZMN(IL))
        ELSE
          ANGNW   = ANGCTR(IL) + SGNIL*ANG(IL)
          XINT(3) = 0.5*(ZPL(IG)+ZPL(IL))
        ENDIF
        XINT(1) = XCTR(1,IL) + RHO(IL)*COS(ANGNW)
        XINT(2) = XCTR(2,IL) + RHO(IL)*SIN(ANGNW)
      ENDIF
C
      RETURN
      END
C   27/11/89 911301527  MEMBER NAME  VXDIFF   (ES)          FVS
C   10/05/84 512092236  MEMBER NAME  VXDIFF   (NOV85)       FORTRAN
      SUBROUTINE VXDIFF(IVTX,M1,M2,TMV0,P,TANL,PHI,COV,DELMSS,R3,CHI2)
$$IMPLICIT
C
C --- D. COPPAGE --- VERSION 18.05.84 V1.0  (ARG07)
C                            25.06.84 V2.01 (ARG07)
C                            26.10.84 V2.02 (ARG07) CALC XI2P FROM BL
C                                            IF IVXT = 1
C                            10.01.85 V2.03 (ARG08) FIX COT SING PROB
C                            09.12.85 V3.00 (ARG08) FIX SING TAN AND
C                                           FIX SIGN MISTAKE IN PHI DERV
C
C     SUBROUTINE FOR CALCULATING PARAMETERS FOR A NEUTRAL TRACK
C     --- CALLED FROM VXMAIN
C
C     INPUT  :
C              IVTX   = VERTEX NUMBER
C              NHDVTX = MAXIMUM NUMBER OF FOUND VERTICES
C              M1,M2  = PARTICLE IDS FOR V0 DAUGHTERS
C              TMV0   = CALCULATED V0 INV MASS
C              ALMOST EVERYTHING IN /CWORK/
C     OUTPUT :
C              P      = TOTAL MOMENTUM OF DECAYING NEUTRAL
C              TANL   = COTANGENT(POLAR ANGLE) OF THE DIRECTION OF P
C              PHI    = X,Y ANGLE OF DIRECTION OF P
C              COV    = COVARIANCE MATRIX FOR P,TANL,PHI
C              DELMSS = ERROR IN INV MASS CALC
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
$$INCLUDE 'K$ITRK:CCONST.INC'
$$INCLUDE 'K$ITRK:CFLAGS.INC'
$$INCLUDE 'K$ITRK:CVXWORK.INC'
C
      INTEGER IVTX,M1,M2
      REAL    TMV0,P,TANL,PHI,COV,DELMSS,R3,CHI2
C
      INTEGER LPTR,MPTR
      REAL CSL2,GTANLM,GPHI
      REAL VRGPHI,VRGTLM,COTNLP,WTL,WTP
      REAL FNORM,WTLP,CHI2L,CHI2P
      REAL VXCOVR
C
      REAL PDF,SDF,PHIDF,FMDF,GPHIDF
      REAL GTNLDF,COVPNT
      DIMENSION COV(6),PDF(6),SDF(6),PHIDF(6),FMDF(6),GPHIDF(6)
     +          ,GTNLDF(6),COVPNT(3)
      LOGICAL LINVR
      REAL PTOT,SK1,S1,PHI1,CL1,SK2,S2,PHI2,CL2
      REAL STOT
      REAL PHITOT
      REAL PSK,CSL1
      REAL PS
      REAL PPHI
      REAL SSK,PSK1
      REAL SS
      REAL SPHI,XXXX,PPHI1
      REAL PHISK,PTOTX,PTOTY
      REAL PHIS
      REAL FMSK,P1,FM1,P2,FM2
      REAL FMS
      REAL FMPH
      REAL GPHIX,X1,XN,SINGPH,COSGPH
      REAL GPHIY
      REAL GTNLMX,Z1,ZN,RTWO
      REAL GTNLMY,YN,Y1
      REAL GTNLMZ
      PTOT(SK1,S1,PHI1,CL1,SK2,S2,PHI2,CL2) =
     +     SQRT( 1./(SK1*CL1)**2 + 1./(SK2*CL2)**2 +
     +     2.*(COS(PHI1-PHI2)+S1*S2)/(SK1*SK2) )
      STOT(SK1,S1,SK2,S2,P) =
     +     (S1/SK1+S2/SK2)/SQRT(P**2-(S1/SK1+S2/SK2)**2)
      PHITOT(SK1,PHI1,SK2,PHI2) =
     +    ATAN2(SIN(PHI1)/SK1+SIN(PHI2)/SK2,COS(PHI1)/SK1+COS(PHI2)/SK2)
C
      PSK(SK1,S1,PHI1,CSL1,SK2,S2,PHI2,P) =
     +    -(1./(CSL1*SK1)**2+(COS(PHI1-PHI2)+S1*S2)/(SK1*SK2))/(P*SK1)
      PS(SK1,S1,SK2,P) = S1/(SK1*SK2*P)
      PPHI(SK1,PHI1,SK2,PHI2,P) = -SIN(PHI1-PHI2)/(SK1*SK2*P)
C
      SSK(SK1,S1,SK2,S2,P,PSK1) =
     +    -(S1*(P/SK1)**2+P*PSK1*(S1/SK1+S2/SK2))/
     +    SQRT((P**2-(S1/SK1+S2/SK2)**2)**3)
      SS(SK1,S1,SK2,S2,P) =
     +    (P**2/SK1-S1/(SK1*SK2)*(S1/SK1+S2/SK2))/
     +    SQRT((P**2-(S1/SK1+S2/SK2)**2)**3)
C --- STOT IS A STATEMENT FUNCTION!!! NOT GOOD AS ARGUMENT!!!
CCC   SPHI(SK1,S1,SK2,S2,STOT,P,PPHI1) =
CCC  +    -STOT*P*PPHI1/(P**2-(S1/SK1+S2/SK2)**2)
      SPHI(SK1,S1,SK2,S2,XXXX,P,PPHI1) =
     +    -XXXX*P*PPHI1/(P**2-(S1/SK1+S2/SK2)**2)
C
      PHISK(SK1,PHI1,SK2,PHI2,PTOTX,PTOTY) =
     +    SIN(PHI2-PHI1)/(SK1**2*SK2*(PTOTX**2+PTOTY**2))
      PHIS(SK1,PHI1,SK2,PHI2,PTOTX,PTOTY) =
     +    (1./SK1 + COS(PHI1-PHI2)/SK2)/(SK1*(PTOTX**2+PTOTY**2))
C
CR    PHISK(SK1,PHI1,SK2,PHI2,PHITOT) =
CR   +    (TAN(PHITOT)*COS(PHI1)-SIN(PHI1))/
CR   +   ((SK1**2*(1.+TAN(PHITOT)**2))*(COS(PHI1)/SK1+COS(PHI2)/SK2))
CR    PHISKI(SK1,PHI1,SK2,PHI2,PHITOT) =
CR   +  - (1./TAN(PHITOT)*SIN(PHI1)-COS(PHI1))/
CR   +   ((SK1**2*(1.+1./TAN(PHITOT)**2))*(SIN(PHI1)/SK1+SIN(PHI2)/SK2))
CR    PHISI(SK1,PHI1,SK2,PHI2,PHITOT) =
CR   +    (  SIN(PHI1)-1./TAN(PHITOT)*COS(PHI1))/
CR   +    ( (1.+1./TAN(PHITOT)**2)*SK1*(SIN(PHI1)/SK1+SIN(PHI2)/SK2))
CR    PHIS(SK1,PHI1,SK2,PHI2,PHITOT) =
CR   +    ( COS(PHI1)-TAN(PHITOT)*SIN(PHI1))/
CR   +    ( (1.+TAN(PHITOT)**2)*SK1*(COS(PHI1)/SK1+COS(PHI2)/SK2))
C
      FMSK(SK1,S1,PHI1,P1,FM1,SK2,S2,PHI2,P2,FM2,TMV0) =
     +    (-P1**2*SQRT( (P2**2+FM2**2)/(P1**2+FM1**2) )
     +   +( COS(PHI1-PHI2) +S1*S2 )/( SK1*SK2 ) )/( SK1*TMV0)
      FMS(SK1,S1,P1,FM1,SK2,S2,P2,FM2,TMV0) =
     +     ( S1*SQRT( (P2**2+FM2**2)/(P1**2+FM1**2) )/SK1**2
     +     - S2/(SK1*SK2) ) /TMV0
      FMPH(SK1,PHI1,SK2,PHI2,TMV0) = -SIN(PHI1-PHI2)/(SK1*SK2*TMV0)
C
      GPHIX(X1,XN,SINGPH,COSGPH) = SINGPH*COSGPH/(XN-X1)
      GPHIY(X1,XN,COSGPH) = -COSGPH**2/(XN-X1)
      GTNLMX(X1,Z1,XN,ZN,RTWO) = (ZN-Z1)*(XN-X1)/RTWO**3
      GTNLMY(Y1,Z1,YN,ZN,RTWO) = (ZN-Z1)*(YN-Y1)/RTWO**3
      GTNLMZ(Z1,RTWO) =  -1./RTWO
C

      LPTR = KVX(IVTX)+19
      SK1   = FV(LPTR)
      S1    = FV(LPTR+1)
      CSL1  = 1./SQRT(1.+S1**2)
      PHI1  = FV(LPTR+2)
      LPTR = LPTR + 17
      SK2   = FV(LPTR)
      S2    = FV(LPTR+1)
      CSL2  = 1./SQRT(1.+S2**2)
      PHI2  = FV(LPTR+2)
      P = PTOT(SK1,S1,PHI1,CSL1,SK2,S2,PHI2,CSL2)
      TANL = STOT(SK1,S1,SK2,S2,P)
      PHI = PHITOT(SK1,PHI1,SK2,PHI2)
      LINVR = .FALSE.
      IF( ABS(ABS(PHI)-PIBY2).LT.PIBY4 )LINVR = .TRUE.
      PDF(1) = PSK(SK1,S1,PHI1,CSL1,SK2,S2,PHI2,P)
      PDF(2) = PS(SK1,S1,SK2,P)
      PDF(3) = PPHI(SK1,PHI1,SK2,PHI2,P)
      PDF(4) = PSK(SK2,S2,PHI2,CSL2,SK1,S1,PHI1,P)
      PDF(5) = PS(SK2,S2,SK1,P)
      PDF(6) = -PDF(3)
C
      SDF(1) = SSK(SK1,S1,SK2,S2,P,PDF(1))
      SDF(2) = SS(SK1,S1,SK2,S2,P)
      SDF(3) = SPHI(SK1,S1,SK2,S2,TANL,P,PDF(3))
      SDF(4) = SSK(SK2,S2,SK1,S1,P,PDF(4))
      SDF(5) = SS(SK2,S2,SK1,S1,P)
      SDF(6) = SPHI(SK2,S2,SK1,S1,TANL,P,PDF(6))
C
      PTOTX = COS(PHI1)/SK1 + COS(PHI2)/SK2
      PTOTY = SIN(PHI1)/SK1 + SIN(PHI2)/SK2
      PHIDF(1) = PHISK(SK1,PHI1,SK2,PHI2,PTOTX,PTOTY)
      PHIDF(2) = PHISK(SK2,PHI2,SK1,PHI1,PTOTX,PTOTY)
      PHIDF(3) = 0.
      PHIDF(4) = PHIS(SK1,PHI1,SK2,PHI2,PTOTX,PTOTY)
      PHIDF(5) = PHIS(SK2,PHI2,SK1,PHI1,PTOTX,PTOTY)
      PHIDF(6) = 0.
CR    IF(LINVR)GO TO 50
CR    PHIDF(1) = PHISK(SK1,PHI1,SK2,PHI2,PHI)
CR    PHIDF(2) = PHIS(SK1,PHI1,SK2,PHI2,PHI)
CR    PHIDF(3) = 0.0
CR    PHIDF(4) = PHISK(SK2,PHI2,SK1,PHI1,PHI)
CR    PHIDF(5) = PHIS(SK2,PHI2,SK1,PHI1,PHI)
CR    PHIDF(6) = 0.0
CR    GO TO 100
C
C50   CONTINUE
CR    PHIDF(1) = PHISKI(SK1,PHI1,SK2,PHI2,PHI)
CR    PHIDF(2) = PHISI(SK1,PHI1,SK2,PHI2,PHI)
CR    PHIDF(3) = 0.0
CR    PHIDF(4) = PHISKI(SK2,PHI2,SK1,PHI1,PHI)
CR    PHIDF(5) = PHISI(SK2,PHI2,SK1,PHI1,PHI)
CR    PHIDF(6) = 0.0
C100  CONTINUE
C
      MPTR = LPTR-17
      COV(1) = VXCOVR(PDF,FV(MPTR+3),FV(LPTR+3),PDF)
      COV(2) = VXCOVR(PDF,FV(MPTR+3),FV(LPTR+3),SDF)
      COV(3) = VXCOVR(PDF,FV(MPTR+3),FV(LPTR+3),PHIDF)
      COV(4) = VXCOVR(SDF,FV(MPTR+3),FV(LPTR+3),SDF)
      COV(5) = VXCOVR(SDF,FV(MPTR+3),FV(LPTR+3),PHIDF)
      COV(6) = VXCOVR(PHIDF,FV(MPTR+3),FV(LPTR+3),PHIDF)
C
      P1 =1./(SK1*CSL1)
      P2 =1./(SK2*CSL2)
      IF (M1.EQ.1) THEN
        FM1 = PION_MASS
      ELSEIF (M1.EQ. 4) THEN
        FM1 = KAON_MASS
      ELSEIF (M1.EQ.22) THEN
        FM1 = ELEC_MASS
      ELSEIF (M1.EQ.29) THEN
        FM1 = PROTON_MASS
      ENDIF
      IF (M2.EQ.1) THEN
        FM2 = PION_MASS
      ELSEIF (M2.EQ. 4) THEN
        FM2 = KAON_MASS
      ELSEIF (M2.EQ.22) THEN
        FM2 = ELEC_MASS
      ELSEIF (M2.EQ.29) THEN
        FM2 = PROTON_MASS
      ENDIF
      FMDF(1) = FMSK(SK1,S1,PHI1,P1,FM1,SK2,S2,PHI2,P2,FM2,TMV0)
      FMDF(4) = FMSK(SK2,S2,PHI2,P2,FM2,SK1,S1,PHI1,P1,FM1,TMV0)
      FMDF(2) = FMS(SK1,S1,P1,FM1,SK2,S2,P2,FM2,TMV0)
      FMDF(5) = FMS(SK2,S2,P2,FM2,SK1,S1,P1,FM1,TMV0)
      FMDF(3) = FMPH(SK1,PHI1,SK2,PHI2,TMV0)
      FMDF(6) =-FMDF(3)
C
      DELMSS = VXCOVR(FMDF,FV(MPTR+3),FV(LPTR+3),FMDF)
C
      IF(DELMSS .LT. 0.0)DELMSS = 0.0
      IF(DELMSS .GT. 0.0)DELMSS = SQRT(DELMSS)
C
C ----------------->>   IF JVX(1) IS SECONDARY, THEN CALCULATE
C                       XI2(POINTING) FROM BEAM LINE I.E. (0.,0.,0.)
C-OBSOLETE      IF( ID(JVX(1)+2) .EQ. 0 )GO TO 150
      LPTR = KVX(NHDVTX)
      LPTR = LPTR +LV(LPTR)
      IF(LPTR + 15 .GT. 2040 )GO TO 150
      CALL VZERO(FV(LPTR+6),9)
      GO TO 160
C
 150  LPTR = KVX(1)
 160  MPTR = KVX(IVTX)
      RTWO = SQRT((FV(LPTR+6)-FV(MPTR+6))**2+(FV(LPTR+7)-FV(MPTR+7))**2)
        R3 =  RTWO
        CHI2 = -999.
        IF(RTWO.LT.0.2)RETURN
C
      R3   = SQRT((FV(LPTR+8)-FV(MPTR+8))**2+RTWO**2)
      GTANLM = (FV(MPTR+8)-FV(LPTR+8))/RTWO
      SINGPH = (FV(MPTR+7)-FV(LPTR+7))/RTWO
      COSGPH = (FV(MPTR+6)-FV(LPTR+6))/RTWO
      GPHI   = ATAN2(SINGPH,COSGPH)
      GPHIDF(1) =
     +     GPHIX(FV(LPTR+6),FV(MPTR+6),SINGPH,COSGPH)
      GPHIDF(4) = -GPHIDF(1)
      GPHIDF(2) =
     +     GPHIY(FV(LPTR+6),FV(MPTR+6),COSGPH)
      GPHIDF(5) = -GPHIDF(2)
      GPHIDF(3) = 0.0
      GPHIDF(6) = 0.0
      GTNLDF(1) = GTNLMX(FV(LPTR+6),FV(LPTR+8),FV(MPTR+6),FV(MPTR+8)
     +            ,RTWO)
      GTNLDF(4) = -GTNLDF(1)
      GTNLDF(2) = GTNLMY(FV(LPTR+7),FV(LPTR+8),FV(MPTR+7),FV(MPTR+8)
     +            ,RTWO)
      GTNLDF(5) = -GTNLDF(2)
      GTNLDF(3) = 1./RTWO
      GTNLDF(6) = -GTNLDF(3)
      VRGPHI = VXCOVR(GPHIDF,FV(LPTR+9),FV(MPTR+9),GPHIDF)
      VRGTLM = VXCOVR(GTNLDF,FV(LPTR+9),FV(MPTR+9),GTNLDF)
      COTNLP = VXCOVR(GTNLDF,FV(LPTR+9),FV(MPTR+9),GPHIDF)
C
      COVPNT(1) = COV(4)+VRGTLM
      COVPNT(2) = COV(5)+COTNLP
      COVPNT(3) = COV(6)+VRGPHI
C
      WTL = 1./COVPNT(1)
      WTP = 1./COVPNT(3)
      FNORM = 1. - COVPNT(2)**2*WTL*WTP
      WTLP = -2.*COVPNT(2)*WTL*WTP
      CHI2L = (TANL-GTANLM)**2*WTL
      CHI2P = (PHI-GPHI)**2*WTP
      CHI2  = CHI2L + CHI2P +WTLP*(GTANLM-TANL)*(GPHI-PHI)
C
      RETURN
      END
C   27/11/89 011011806  MEMBER NAME  VXDMIN   (ES)          FVS
C
      REAL FUNCTION VXDMIN(INDDAT,X)
C---------------------------------------------------------------------
C   FUNCTION TO RETURN ESTIMATE OF THE UNSIGNED DISTANCE OF CLOSEST
C   APPROACH OF THE TRACK IN TRACKBANK AD TO THE LINE THROUGH
C
C   --- CALLED FROM VXMAIN
C
C   X  = (X,Y) ALONG Z
C   VX = (X,Y,Z) OF TRACK
C
C   USE DELTA**2=R**2+RHO**2-2*R*RHO*SIN(Q*BETA) AND |RHO-DELTA|=DMIN
C   TO GET ESTIMATE OF CLOSEST APPROACH TO BEAM LINE
C   I.E. SEE ARGUS SOFTWARE NOTE #1
C---------------------------------------------------------------------
$$IMPLICIT
$$INCLUDE 'K$INC:BCS.INC'
$$INCLUDE 'K$ITRK:CCONST.INC'
$$INCLUDE 'K$ITRK:DTFS.INC'
C
      INTEGER I,INDDAT
      REAL    X(3),VX(3),V(3),VHFLD(3)
      REAL    R,PHI,SINBTA,HMAG,SGNH,ACUR,SGNC,RHO,RATIO,DELTA2
C
      VXDMIN = 1.0E+30
C
C --- DISTANCE X0 - XBEAM
      VX(1) = RW(INDDAT+DTFXCO)-X(1)
      VX(2) = RW(INDDAT+DTFYCO)-X(2)
      VX(3) = 0.
      R = SQRT(VX(1)**2+VX(2)**2)
C
C --- CLOSE ENOUGH ALREADY
      IF (R.LT.0.001) THEN
        VXDMIN = R
        RETURN
      ENDIF
C
C --- BETA = ANGLE(T0,VX)
      PHI = RW(INDDAT+DTFPHI)
      SINBTA = (COS(PHI)*VX(2)-SIN(PHI)*VX(1))/R
C
C --- AVERAGE MAGNETIC FIELD
      DO I=1,3
        V(I)=0.5*VX(I)+X(I)
      END DO
      CALL MGFLD(V,VHFLD)
      HMAG = ABS(VHFLD(3))
C
C --- NO FIELD --> STRAIGHT TRACK
      IF (HMAG.LT.1.E-3) THEN
         VXDMIN = ABS(R*SINBTA)
         RETURN
      ENDIF
C
      SGNH   = SIGN(1.0,VHFLD(3))
      ACUR   = ABS(RW(INDDAT+DTFCUR))
      SGNC   = SIGN(1.,RW(INDDAT+DTFCUR))
      RHO    = 1./(CONVERS*HMAG*ACUR)
      RATIO  = R/RHO
      DELTA2 = RHO**2*(1.0+RATIO**2-2.0*RATIO*SGNC*SGNH*SINBTA)
      VXDMIN = ABS(SQRT(DELTA2)-RHO)
C
      RETURN
      END
C   10/01/91 101151157  MEMBER NAME  VXERRC   (ES)          FVS
      SUBROUTINE VXERRC(TRKB,TRKE)
$$IMPLICIT
C
C  ---   D. COPPAGE               22/07/83  V 3.00  (ARG05)
C                        REVISED  27/01/84  V 3.1   (ARG06)
C                        REVISED  13.10.84  V 3.2   XJ(2),XJ(5) MODIF
C  ---   H. KAPITZA      COMPLETE REVISION OF DERIVATIVES 13.11.86
C                        (HANDLE BOTH ORIENTATIONS OF MAG. FIELD)
C
C     SUBROUTINE FOR CALCULATING THE JACOBIAN AND THEN CALCULATING
C     THE COVARIANCE MATRIX AT A NEW POINT ON THE TRACK TRAJECTORY.
C
C     --- CALLED FROM VXSWIM
C
C  INPUT: TRKB,TRKE (=BEGINING TRKBNK AND END TRKBNK)
C  OUTPUT: COVARIANCE MATRIX INTO TRKE
C             TRKBNK( N , I , J ):
C  N=
C    1        TRACK LENGTH
C    2,3,4    X,Y,Z
C    5,6,7    VTNG X,Y,Z
C    8,9,10   VNORM X,Y,Z (UNNORMALIZED)
C    11,12,13 VH X,Y,Z (UNIT VECTOR IN DIR OF MAG FIELD)
C    14       1./VHMAG  (MAGNITUDE OF MAG FIELD)
C    15 - 29  COVARIANCE MATRIX FOR REGION I
C    30       SIGNED VALUE OF K
C    31       ABS(DK/DX)  (DEFAULT MASS = PI MASS. K FROM REGION 1)
C    32 >     FOR I=1, STATUS WORD; = 1  COPY BNK 1 TO TRKOUT
C                                   = 2  COPY BNK 2 TO TRKOUT
C                                   = 3  INIT TRKOUT FROM BEST BNK
C                                   = 4  USE TRKOUT WITH MODIFICATION
C       >     FOR I=2, STATUS WORD; NUMBER OF LAST FILLED BANK
C                                   =-1  NO BANKS FILLED
C       >     FOR I=3, STATUS WORD; = +1.0 FOR NEGATIVE SWIMS (NORMAL)
C                                   = -1.0 FOR POSITIVE SWIMS (MUST BE
C                                          SET WHEN NEEDED)
C       >     FOR I=4, STATUS WORD; NUMBER OF BANK USED TO INITIALIZE
C                                   THE WORKING BANK WHEN LAST INIT.
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
$$INCLUDE 'K$ITRK:CCONST.INC'
$$INCLUDE 'K$ITRK:CFLAGS.INC'
      REAL TRKB,TRKE,XJ
      DIMENSION TRKB(31),TRKE(31),XJ(5)
      REAL COSLAM,COSLAB,VNXB,VNYB,VNXE,VNYE,VDFX,VDFY,SWMLGH
C
C ----------------->>             WE MUST NOT USE VN = H (X) T
C                                 BUT VN = EZ (X) T
      COSLAM = SQRT(1.-TRKE(7)**2)
      COSLAB = SQRT(1.-TRKB(7)**2)
      VNXB = -TRKB(6)/COSLAB
      VNYB =  TRKB(5)/COSLAB
      VNXE = -TRKE(6)/COSLAM
      VNYE =  TRKE(5)/COSLAM
      VDFX =  TRKE(2)-TRKB(2)
      VDFY =  TRKE(3)-TRKB(3)
C
C -----  XJ(1,1) = VNE * VNB
C
      XJ(1) = VNXE*VNXB + VNYE*VNYB
C
C -----  XJ(1,3) = (VXB - VXE) * VNE / KAPPA
C
      XJ(2) = - (VDFX*VNXE + VDFY*VNYE) / TRKB(30)
CCC   XJ(2) = -0.5*(VDFX**2 + VDFY**2) * CONVERS / TRKE(14)
C
C -----  XJ(1,5) = ( (VXE-VXB) (X) VNE ) (Z-COMP)
C
      XJ(3) = VDFX*VNYE - VDFY*VNXE
C
C -----  XJ(2,4) = SWMLGH * COSLAM
C
      SWMLGH = TRKB(1) - TRKE(1)
      XJ(4) = SWMLGH * COSLAM
C
C -----  XJ(5,3) = - SIGN(HZ) * SWMLGH * COSLAM * E/C*H
C
      XJ(5) = -SIGN(1.,TRKE(13)) * SWMLGH * COSLAM * CONVERS / TRKE(14)
C
C ----------------->>             NOW GET NEW COVARIANCE MATRIX
C
      TRKE(15) = XJ(1) * (TRKB(15)*XJ(1)+TRKB(17)*XJ(2)+TRKB(19)*XJ(3))
     *          +XJ(2) * (TRKB(17)*XJ(1)+TRKB(24)*XJ(2)+TRKB(26)*XJ(3))
     *          +XJ(3) * (TRKB(19)*XJ(1)+TRKB(26)*XJ(2)+TRKB(29)*XJ(3))
      TRKE(16) = XJ(1) * (TRKB(16) + TRKB(18)*XJ(4))
     *          +XJ(2) * (TRKB(21) + TRKB(25)*XJ(4))
     *          +XJ(3) * (TRKB(23) + TRKB(28)*XJ(4))
      TRKE(17) = XJ(1)*TRKB(17) + XJ(2)*TRKB(24) + XJ(3)*TRKB(26)
      TRKE(18) = XJ(1)*TRKB(18) + XJ(2)*TRKB(25) + XJ(3)*TRKB(28)
      TRKE(19) = XJ(1)*(TRKB(17)*XJ(5) + TRKB(19))
     *          +XJ(2)*(TRKB(24)*XJ(5) + TRKB(26))
     *          +XJ(3)*(TRKB(26)*XJ(5) + TRKB(29))
      TRKE(20) = TRKB(20) + TRKB(22)*XJ(4)
     *           +XJ(4)*(TRKB(22) + TRKB(27)*XJ(4))
      TRKE(21) = TRKB(21) + XJ(4)*TRKB(25)
      TRKE(22) = TRKB(22) + XJ(4)*TRKB(27)
      TRKE(23) = TRKB(23) + TRKB(21)*XJ(5)
     *           +XJ(4)*(TRKB(28) + TRKB(25)*XJ(5))
      TRKE(24) = TRKB(24)
      TRKE(25) = TRKB(25)
      TRKE(26) = TRKB(24)*XJ(5) + TRKB(26)
      TRKE(27) = TRKB(27)
      TRKE(28) = TRKB(25)*XJ(5) + TRKB(28)
      TRKE(29) = XJ(5)*(TRKB(24)*XJ(5) + TRKB(26))
     *                +(TRKB(26)*XJ(5) + TRKB(29))
C
      RETURN
      END
C   27/11/89            MEMBER NAME  VXGMMA   (ES)          FVS
      SUBROUTINE VXGMMA(MXCHGD,LERR)
$$IMPLICIT
C
C --- D. COPPAGE --- VERSION 18.05.84 V1.0  (ARG07)
C --- A. PHILLIP --- VERSION 04.07.84 V2.0  ARG07-SPEC FOR CONV GMMA
C                            01.08.84 V2.01 ERR IN BNK DET FIXED
C                            22.03.85 V2.02 INIT OF ILIST FIXED
C                            26.04.85 V3.00 MOD FOR VDC - REMOVED DEDX
C                                           ADJUSTMENT AT BOUNDRY
C
C     CODING CONNECTED WITH CONVERTED GAMMAS REMOVED FROM VXMAIN
C     --- CALLED FROM VXMAIN
C
C     INPUT  :
C              MXCHGD = MAX NUMBER OF CHARGED TRKS UNDER CONSIDERATION
C              KLOE TRACK BANKS
C              ALMOST EVERYTHING IN /CWORK/
C     OUTPUT :
C              VERTEX BANKS IN /CWORK/
C              LERR = ERROR FLAG (IF LT 0 EVENT PROCESSING TERMINATED)
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
$$INCLUDE 'K$ITRK:CVXCUT.INC'
$$INCLUDE 'K$ITRK:CFLAGS.INC'
$$INCLUDE 'K$ITRK:CVXWORK.INC'
$$INCLUDE 'YBOS$LIBRARY:ERRCOD.INC'
$$INCLUDE 'K$INC:BCS.INC'
$$INCLUDE 'K$ITRK:DTFS.INC'
      INTEGER MXCHGD,LERR
      INTEGER STATUS,IND,INDDAT,NFLAG
      INTEGER BLOCAT
      REAL VXERR,XCN
      DIMENSION VXERR(6),XCN(3)
      INTEGER ILIST,IXVDC
      INTEGER IHIPR,IHDSIZ,IHIPR1,J,JX1,JX2,IBNK,LWBK
      INTEGER JJBNK,JJB1,JJB2,LERRCR,IHH,IFIT,ICALL
      REAL AKUR2,AKUR1,TANL1,TANL2,CTCUT,DBEAM,CHISQ
      REAL XINT
      DIMENSION XINT(3),ILIST(3),
     +          IXVDC(3,2)
      LOGICAL CONSTR
      DATA IXVDC / 1, 2, 3, 0, 1, 2/
C
      NFLAG = 3
      DO 120 IHIPR=2,MXCHGD
C           IF(MSLIST(IGDTK(IHIPR)).NE.0)GO TO 120
            ILIST(2)=IGDTK(IHIPR)
            STATUS = BLOCAT(IW,'DTFS',
     &        DTFS_bnk_num_list(ILIST(2)),
     &        IND,INDDAT)
            IHDSIZ=IW(INDDAT+DTFHDS)
            INDDAT=INDDAT+IHDSIZ
            AKUR2=RW(INDDAT+DTFCUR)
            IF(ITKBNK(32,2,ILIST(2)) .LT. 0)GO TO 120
                       IHIPR1=IHIPR-1
            DO 115 J=1,IHIPR1
C                 IF(MSLIST(IGDTK(J)).NE.0)GO TO 115
                  ILIST(2)=IGDTK(IHIPR)
                  ILIST(1)=IGDTK(J)
                  STATUS = BLOCAT(IW,'DTFS',
     &              DTFS_bnk_num_list(ILIST(1)),
     &              IND,INDDAT)
                  IHDSIZ=IW(INDDAT+DTFHDS)
                  INDDAT=INDDAT+IHDSIZ
                  AKUR1=RW(INDDAT+DTFCUR)
                  IF( IAND(MSLIST(ILIST(1)),MSLIST(ILIST(2))) .NE. 0 )
     +                               GO TO 115
                  IF(ITKBNK(32,2,ILIST(1)) .LT. 0)GO TO 115
                  IF( AKUR1*AKUR2.GT.0.0 )GO TO 115
                  IF(TRKBNK(27,1,ILIST(1)).LT.0.0 ) GO TO 119
                  IF(TRKBNK(27,1,ILIST(2)).LT.0.0 ) GO TO 114
C ----------------->>             FIND APPROPIATE BANK LEVEL
                  JX1 = 1
                  JX2 = 1
                  IBNK=MIN0(ITKBNK(32,2,ILIST(1)),ITKBNK(32,2,ILIST(2)))
                  LWBK = 1
                  IF(IABS(ITKBNK(32,4,ILIST(1))-ITKBNK(32,4,ILIST(2)))
     +                     .LT. 10)GO TO 90
C                                 ELSE ONE VDC FIT AND ONE DC FIT
                  LWBK = 2
                  JX1 = 1
                  JX2 = 2
                  IBNK=
     +             MIN0(ITKBNK(32,2,ILIST(1)),ITKBNK(32,2,ILIST(2))+1)
                  IF(ITKBNK(32,4,ILIST(2)).GE.100)GO TO 90
                  JX1 = 2
                  JX2 = 1
                  IBNK=
     +             MIN0(ITKBNK(32,2,ILIST(1))+1,ITKBNK(32,2,ILIST(2)))
 90               CONTINUE
                  IF(LWBK.GT.IBNK)GO TO 115
C ----------------->>             LOOP OVER AVAILABLE SURFACES
                   DO 110 JJBNK=LWBK,IBNK
                        JJB1 = IXVDC(JJBNK,JX1)
                        JJB2 = IXVDC(JJBNK,JX2)
                        TANL1 = TRKBNK(7,JJB1 ,ILIST(1))
                        IF( ABS(TANL1) .GT. 0.02 )
     +                    TANL1=SIGN( 1.0/SQRT(1.0/TANL1**2-1.0),TANL1 )
                        TANL2 = TRKBNK(7,JJB2 ,ILIST(2))
                        IF( ABS(TANL2) .GT. 0.02 )
     +                    TANL2=SIGN( 1.0/SQRT(1.0/TANL2**2-1.0),TANL2 )
                        CTCUT = ABS(TANL1-TANL2)/SQRT
     +           ( TRKBNK(27,JJB1 ,ILIST(1))+TRKBNK(27,JJB2 ,ILIST(2)) )
                        IF( CTCUT .LT. 15.)GO TO 111
 110              CONTINUE
C ----------------->>             NO CUT PASSED IF HERE -> EXIT
                  GO TO 115
 111              CONTINUE
C                 PULL1 = (TANL1-TANL2)/SQRT(TRKBNK(27,JJB1 ,ILIST(1))+
C    +                                       TRKBNK(27,JJB2 ,ILIST(2)))
                  CONSTR = .TRUE.
                  CALL VXCRSS(ILIST,XINT,LERRCR,CONSTR)
C
                  IF( LERRCR.NE.0 )GO TO 115
C
                  DBEAM = SQRT( XINT(1)**2 + XINT(2)**2 )
                  IF( .NOT.CONSTR .OR. DBEAM .LT. 0.75)GO TO 115
C                                  OTHERWISE TRY A FIT
                  CALL UCOPY(XINT,XCN,3)
                  IHH=2
C
                  CALL VXXYZ(IHH,ILIST,XINT,VXERR,CHISQ,IFIT,XCN,CONSTR)
C
C ----------------->>             FOR DEBUG OF PROBLEM VERTICES
                  ICALL=ICALL+1
                  IF(ICALL.EQ.ICLLVX)RETURN
                  IF(IFIT.NE.0)GO TO 115
C ----------------->>             STORE VERTEX
C                                 COME BACK AND LOOK FOR MORE
C===================>>THE FOLLOWING CODE TO MODIFY DEDX AT BOUNDARIES
C                     REMOVED 26.04.85 BECAUSE OF CONFLICT WHEN ONE OF
C                     THESE TRACKS ALSO CAN BELONG TO THE PRIMARY.
CC                                AFTER MAKING DEDX CORRECTION FOR
CC                                MIDDLE OF CORRECT CONVERTER
CC                IF(ID(JTK(ILIST(1))+3).GT.200 .OR.
CC   +               ID(JTK(ILIST(2))+3).GT.200 )GO TO 112
CC                RVXY = SQRT(XINT(1)**2+XINT(2)**2)
CC                LBNK = 99
CC                IF(ABS(RVXY-14.5).LT.2.5)LBNK = 2
CC                IF(ABS(RVXY-6.0).LT.6.0)LBNK = 3
CC                MXBNK1 = ITKBNK(32,2,ILIST(1))
CC                MXBNK2 = ITKBNK(32,2,ILIST(2))
CC                IBNK = MIN0(MXBNK1,MXBNK2)
CC                IF(LBNK .GT. IBNK)GO TO 112
CC                TRKBNK(30,4,ILIST(1)) =
CC   +          SIGN(ABS(TRKBNK(30,LBNK,ILIST(1)))+DEDK(ILIST(1),LBNK-1)
CC   +                  ,TRKBNK(30,LBNK,ILIST(1)))
CC                TRKBNK(30,4,ILIST(2)) =
CC   +          SIGN(ABS(TRKBNK(30,LBNK,ILIST(2)))+DEDK(ILIST(2),LBNK-1)
CC   +                  ,TRKBNK(30,LBNK,ILIST(2)))
C112            CONTINUE
                  CALL VXSTOR(ILIST,2,XINT,VXERR,CHISQ,NFLAG,IFIT)
                  COTCUT(NHDVTX) = CTCUT
                  GO TO 115
 114              CALL INERR(515,1)
 115        CONTINUE
            GO TO 120
 119        CALL INERR(515,1)
 120  CONTINUE
C
 130  CONTINUE
C
      LERR = 0
      RETURN
      END
C   27/11/89 911301534  MEMBER NAME  VXPREP   (ES)          FVS
C   28/06/84            MEMBER NAME  VXPREP   (ES)          FORTRAN
      SUBROUTINE VXPREP(MAX,ILIST,X,XGA,XGB,CSQ,IBADTK,XCN,CONSTR)
$$IMPLICIT
C
C     SERVICE ROUTINE FOR VXXYZ FOR INITIALIZING MATRICES AND CHISQ
C     AND DRIVER FOR SWIM ROUTINES
C     --- CALLED FROM VXXYZ
C
$$INCLUDE 'K$ITRK:CVXCUT.INC'
$$INCLUDE 'K$ITRK:CVXWORK.INC'
C
      LOGICAL CONSTR
      INTEGER MAX,ILIST(64),IBADTK
      REAL    X(3),XGA(3,3),XGB(3),CSQ,XCN(3)
C
      INTEGER JMAX,ITK,LTK,LERR,KTK
      REAL    GRDDR(2),GRDDZ(2)
      REAL    DEVMAX,VMIV,DR,TANLAM,DZ,WR,WZ,WRZ,DENOM
      REAL    DEV,TAUX,TAUY,DR0C,GRDDRX,GRDDRY
      REAL    WWR,WWZ
C     DATA    WWR,WWZ/12.0,1.2/
C ----------------->>             INIT
C
      WWR = WWRVX
      WWZ = WWZVX
      DEVMAX=0.0
      CSQ=0.0
      CALL VZERO(XGA,12)
      CALL VZERO(XGB,3)
C
      JMAX=MAX
      DO 50 ITK=1,MAX
           IF(ITK.GT.JMAX)GO TO 52
 12        CONTINUE
           LTK = ILIST(ITK)
           CALL VXSWIM( X, LTK, TRKBNK(1,4,LTK), LERR)
           IF(LERR.EQ.0)GO TO 40
C                                 ELSE BAD TRACK
           IF(ITK.LT.JMAX)GO TO 15
C ----------------->>             ELSE NO TRKS LEFT - SO DECREMENT
C                                 JMAX AND EXIT
           JMAX=JMAX-1
           IF( ITK .GE. 2 ) GO TO 52
           GO TO 60
C
 15        CONTINUE
C ----------------->>             REMOVE BAD TRACK
           LTK=ILIST(ITK)
           JMAX=JMAX-1
           DO 20 KTK=ITK,JMAX
 20             ILIST(KTK)=ILIST(KTK+1)
           ILIST(JMAX+1)=LTK
           GO TO 12
C
 40        CONTINUE
C ----------------->>             GET DERIVATIVES,DISTANCES, AND WTS
C
           VMIV = 1./SQRT(TRKBNK(5,4,LTK)**2 + TRKBNK(6,4,LTK)**2)
           DR   = ( (TRKBNK(2,4,LTK)-X(1)) * TRKBNK(6,4,LTK) +
     +              (X(2)-TRKBNK(3,4,LTK)) * TRKBNK(5,4,LTK) ) * VMIV
           GRDDR(1) = -SIGN( VMIV , DR) * TRKBNK(6,4,LTK)
           GRDDR(2) =  SIGN( VMIV , DR) * TRKBNK(5,4,LTK)
           TANLAM = TRKBNK(7,4,LTK)
           IF( ABS(TANLAM) .GT. 0.01 )TANLAM =
     +           SIGN(1./SQRT(1./TRKBNK(7,4,LTK)**2-1.),TRKBNK(7,4,LTK))
           DZ = TRKBNK(4,4,LTK) - X(3)
           GRDDZ(1) = -TRKBNK(5,4,LTK) * TANLAM * VMIV
           GRDDZ(2) =  TRKBNK(6,4,LTK) * TANLAM * VMIV
           WR = 1./TRKBNK(15,4,LTK)
           WZ = 1./TRKBNK(20,4,LTK)
C
C ----------------->>             GET CSQ
C
C     QUESTION ABOUT SIGN OF DR REMAINS  -  26.07.84
           WRZ = -2.0*TRKBNK(16,4,LTK)*WR*WZ
           DENOM = 1. - TRKBNK(16,4,LTK)**2*WR*WZ
           DEV = ( DR**2*WR + DR*DZ*WRZ + DZ**2*WZ ) / DENOM
           IF(DEV .LT. 0.0)DEV = 9999.
           CSQ=CSQ+WR*DR**2 + WZ*DZ**2
           IF(DEV.LT.DEVMAX)GO TO 45
           DEVMAX=DEV
           IBADTK=ITK
 45        CONTINUE
C
           DR = ABS(DR)
           XGB(1)=XGB(1)+WR*DR*GRDDR(1)+WZ*DZ*GRDDZ(1)
           XGB(2)=XGB(2)+WR*DR*GRDDR(2)+WZ*DZ*GRDDZ(2)
           XGB(3)=XGB(3)               -WZ*DZ
           XGA(1,1)=XGA(1,1)+WR*GRDDR(1)*GRDDR(1)+WZ*GRDDZ(1)*GRDDZ(1)
           XGA(1,2)=XGA(1,2)+WR*GRDDR(1)*GRDDR(2)+WZ*GRDDZ(1)*GRDDZ(2)
           XGA(1,3)=XGA(1,3)                     -WZ*GRDDZ(1)
           XGA(2,2)=XGA(2,2)+WR*GRDDR(2)*GRDDR(2)+WZ*GRDDZ(2)*GRDDZ(2)
           XGA(2,3)=XGA(2,3)                     -WZ*GRDDZ(2)
           XGA(3,3)=XGA(3,3)                     +WZ
 50   CONTINUE
 52   CONTINUE
      DEVMAX = SQRT(DEVMAX)
      IF( DEVMAX .LT. DVMXVX ) IBADTK = 0
C ----------------->>             IF CONSTRAINT ,FIX UP
      IF(.NOT.CONSTR)GO TO 57
C                                 ELSE
      TAUX =  TRKBNK(6,4,LTK)/VMIV
      TAUY = -TRKBNK(5,4,LTK)/VMIV
      DR0C = (XCN(1)-X(1))*TAUY+(X(2)-XCN(2))*TAUX
      IF(ABS(DR0C) .LT. 1.0E-6)DR0C = 1.0E-6
      GRDDRX = -SIGN(1.,DR0C)*TAUY
      GRDDRY =  SIGN(1.,DR0C)*TAUX
      XGA(1,1)=XGA(1,1)+WWR*GRDDRX**2
      XGA(2,2)=XGA(2,2)+WWR*GRDDRY**2
      XGA(1,2)=XGA(1,2)+WWR*GRDDRX*GRDDRY
      XGB(1)=XGB(1)+WWR*DR0C*GRDDRX
      XGB(2)=XGB(2)+WWR*DR0C*GRDDRY
      CSQ=CSQ+WWR*DR0C**2
 57   CONTINUE
      XGA(2,1)=XGA(1,2)
      XGA(3,1)=XGA(1,3)
      XGA(3,2)=XGA(2,3)
C
 60   CONTINUE
      MAX=JMAX
C
      RETURN
      END
C   27/11/89 911301535  MEMBER NAME  VXSCND   (ES)          FVS
C   07/05/84 412072217  MEMBER NAME  VXSCND   (NOV84)       FORTRAN
      SUBROUTINE VXSCND(MXCHGD,NHDSTR,LERR)
$$IMPLICIT
C
C --- D. COPPAGE --- VERSION 18.05.84 V1.0  (ARG07)
C                            19.06.84 V1.01 (ARG07)
C                            07.12.84 V1.10 (ARG08) SQRT(-|X|) FIXED
C
C     CODING CONNECTED WITH SECONDARY VERTICES REMOVED FROM VXMAIN
C     --- CALLED FROM VXMAIN
C
C     INPUT  :
C              MXCHGD = MAX NUMBER OF CHARGED TRKS UNDER CONSIDERATION
C              NHDSTR = VALUE OF NHDVTX AT WHICH ALL FLAG 1,2, & 3
C                       FITS FINISHED
C              KLOE TRACK BANKS
C              ALMOST EVERYTHING IN /CWORK/
C     OUTPUT :
C              VERTEX BANKS IN /CWORK/
C              LERR = ERROR FLAG (IF LT 0 EVENT PROCESSING TERMINATED)
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
      INTEGER MXCHGD,NHDSTR,LERR
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
$$INCLUDE 'K$INC:BCS.INC'
$$INCLUDE 'YBOS$LIBRARY:ERRCOD.INC'
$$INCLUDE 'K$ITRK:CVXWORK.INC'
C
      LOGICAL IN_DC,ACCEPT,CONSTR,FREETR,ANOTHR
      INTEGER NFLAG,IHIPR,IHIPR1,J,LERRCR,NTKFIT,ILIST(3)
      INTEGER K,IFIT
      REAL    XINT(3),VXERR(6),XCN(3)
      REAL    X1,Y1,D1INT,D2INT,TOTCHG,CHISQ
C
      REAL    RDCMIN,DISMX1,DISMX2
      PARAMETER (RDCMIN=30.,DISMX1=40.,DISMX2=50.)
C
C
C =================>>             STARTING WITH PAIR (1,2) AND
C                                 CONTINUING, IF NECESSARY, WITH (1,3),
C                                 (2,3),(1,4),(2,4),... , FIND 1ST PAIR
C                                 THAT INTERSECTS WITHIN CUTS AND ALL
C                                 TRACKS WHICH COME CLOSE TO THIS
C                                 INTERSECTION (WITHIN CUTS)
      LERR = 0
C
      DO 200 IHIPR=2,MXCHGD
        ILIST(2) = IGDTK(IHIPR)
        IHIPR1 = IHIPR-1
        DO 180 J=1,IHIPR1
          IF (MSLIST(IGDTK(IHIPR)) .NE. 0) GO TO 200
          IF (MSLIST(IGDTK(J)) .NE. 0) GO TO 180
          ILIST(1) = IGDTK(J)
C        
          CALL VXCRSS(ILIST,XINT,LERRCR,CONSTR)
          IF (LERRCR.NE.0) GO TO 180
C
C  DO NOT ATTEMPT THIS FIT IF THE TWO START POINTS ARE TOO FAR AWAY IN R-PHI
          IN_DC = SQRT(XINT(1)**2+XINT(2)**2) .GT. RDCMIN
          IF (IN_DC) THEN
            X1 = TRKBNK(2,1,ILIST(1))-TRKBNK(2,1,ILIST(2))
            Y1 = TRKBNK(3,1,ILIST(1))-TRKBNK(3,1,ILIST(2))
            D1INT = SQRT(X1*X1+Y1*Y1)
            IF (D1INT .GT. DISMX1) GO TO 180
          ELSE
            X1 = TRKBNK(2,1,ILIST(1))-XINT(1)
            Y1 = TRKBNK(3,1,ILIST(1))-XINT(2)
            D1INT = SQRT(X1*X1+Y1*Y1)
            X1 = TRKBNK(2,1,ILIST(2))-XINT(1)
            Y1 = TRKBNK(3,1,ILIST(2))-XINT(2)
            D2INT = SQRT(X1*X1+Y1*Y1)
            IF (D1INT.GT.DISMX2 .AND. D2INT.GT.DISMX2) GOTO 180
          ENDIF
C
C ----------------->> FOUND INTERSECTION - LOOK FOR OTHER CLOSE TRACKS
C
          NTKFIT = 2
          JGDTK(1)=ILIST(1)
          JGDTK(2)=ILIST(2)
          TOTCHG = SIGN(1.,TRKBNK(30,1,ILIST(1)))+
     +             SIGN(1.,TRKBNK(30,1,ILIST(2)))
          DO K=1,MXCHGD
            FREETR = MSLIST(IGDTK(K)) .EQ. 0
            ANOTHR = (IGDTK(K).NE.JGDTK(1)) .AND. (IGDTK(K).NE.JGDTK(2))
            IF (FREETR .AND. ANOTHR) THEN
              X1 = TRKBNK(2,1,IGDTK(K))-XINT(1)
              Y1 = TRKBNK(3,1,IGDTK(K))-XINT(2)
              D1INT = SQRT(X1*X1+Y1*Y1)
              IF (IN_DC) THEN
                IF (D1INT .LE. DISMX1) THEN
                  NTKFIT = NTKFIT+1
                  JGDTK(NTKFIT)=IGDTK(K)
                  TOTCHG = TOTCHG + SIGN(1.,TRKBNK(30,1,IGDTK(K)))
                ENDIF
              ELSE
                IF (D1INT .LE. DISMX2) THEN
                  NTKFIT = NTKFIT+1
                  JGDTK(NTKFIT)=IGDTK(K)
                  TOTCHG = TOTCHG + SIGN(1.,TRKBNK(30,1,IGDTK(K)))
                ENDIF
              ENDIF
            ENDIF
          ENDDO
C
C ----------------->> TRY A FIT, IF THE TOTAL CHARGE IS NOT TOO IMBALANCED
C
          IF (ABS(TOTCHG) .LE. 1.) THEN
            CALL VXXYZ(NTKFIT,JGDTK,XINT,VXERR,CHISQ,IFIT,XCN,CONSTR)
            ACCEPT = IFIT.EQ.0 .OR. IFIT.EQ.6 .OR. IFIT.EQ.7
            IF (ACCEPT) THEN
              NFLAG = 4
              CALL VXSTOR(JGDTK,NTKFIT,XINT,VXERR,CHISQ,NFLAG,IFIT)
            ENDIF
          ENDIF
 180    CONTINUE
 200  CONTINUE
C
      RETURN
      END
C   27/11/89 911301536  MEMBER NAME  VXSTOR   (ES)          FVS
C   04/07/83 512092357  MEMBER NAME  VXSTOR   (DEC85)       FORTRAN
      SUBROUTINE VXSTOR(ILIST,MAX,XINT,VXERR,CHISQ,IFLAG,IFIT)
$$IMPLICIT
C
C --- D. COPPAGE --- VERSION 19.01.84 V4.0  (ARG07)
C                            18.01.84 V4.01 (ARG07)
C                            11.06.85 V4.02 (ARG09)NHDVTX=20 PROB
C                            09.12.85 V4.03 (ARG09)PROTECT SINLAM = 0.
C
C     SUBROUTINE FOR STORING THE RESULTS OF A SUCCESSFUL FIT INTO
C     THE SAVE BANKS IN CWORK
C     --- CALLED FROM VXMAIN
C
C     INPUT :
C             ILIST(64) = TRACK NUMBERS OF TRACKS IN FIT
C             MAX       = NUMBER OF TRACKS IN FIT
C             XINT(3)   = (X,Y,Z) OF FIT VERTEX
C             VXERR(6)  = X,Y,Z COVARIANCE MATRIX
C             CHISQ     = CHI SQUARED OF FIT
C             IFLAG     = CURRENTLY FLAG FOR INTERNAL INFORMATION
C                         1 - FIT FROM PRIMARY SECTION
C                         2 - FIT FROM COLINEAR SECTION (BHABHAS, ETC.)
C                         3 - FIT FROM TANGENT TRACKS ( GAMMAS, ETC)
C                         4 - FIT FROM SECONDARY SECTION
C                         5 - FIT FROM SECONDARY SECTION(2 PRONG WITH
C                             NET 0 IS PERMITTED ONE PRIMARY ASSOC TRK
C                        15 - FIT FROM DECAYING CHARGED TRACKS
C
C     OUTPUT: NHDVTX     = CURRENT VERTEX NUMBER
C             TEMPORARY VERTEX BANKS IN CWORK ACCORDING TO THE FOLLOWING
C             SCHEME.
C             LV(LTR   ) = LENGTH
C             LV(LTR+ 1) = IFLAG (DEFINED ABOVE)
C             LV(LTR+ 2) =  0 (MAIN VERTEX)
C                          -1 (SECONDARY VERTEX)
C                           NTK (NEUTRAL TRACK POINTING TO THIS VERTEX)
C             FV(LTR+ 3) =  TRACK LIST ( BITS 1 32 = TRACKS  1-32 )
C             FV(LTR+ 4) =  TRACK LIST ( BITS 1 32 = TRACKS 33-64 )
C             LV(LTR+ 5) =  NUMBER OF TRACKS
C             FV(LTR+ 6) =  X (OF VERTEX)
C             FV(LTR+ 7) =  Y (OF VERTEX)
C             FV(LTR+ 8) =  Z (OF VERTEX)
C             FV(LTR+ 9) =  VAR(X,X)
C             FV(LTR+10) =  VAR(X,Y)
C             FV(LTR+11) =  VAR(X,Z)
C             FV(LTR+12) =  VAR(Y,Y)
C             FV(LTR+13) =  VAR(Y,Z)
C             FV(LTR+14) =  VAR(Z,Z)
C             FV(LTR+15) =  CHISQ OF FIT
C             FV(LTR+16) =  FREE(|P-TRANS| IF MAX=2 & Q1.NE.Q2)
C             FV(LTR+17) =  FREE( P1 * P2  IF MAX=2 & Q1.NE.Q2)
C         1   LV(LTR+18) =  TRK NUMBER (FOR TRACKS BELONGING TO FIT)
C         2   FV(LTR+19) =  K
C         3   FV(LTR+20) =  COT(THETA) ( = S )
C         4   FV(LTR+21) =  PHI
C         5   FV(LTR+22) =  VAR(K,K)
C         6   FV(LTR+23) =  VAR(K,S)
C         7   FV(LTR+24) =  VAR(K,PHI)
C         8   FV(LTR+25) =  VAR(S,S)
C         9   FV(LTR+26) =  VAR(S,PHI)
C        10   FV(LTR+27) =  VAR(PHI,PHI)
C        11   FV(LTR+28) =  TRK LENGTH
C        12   FV(LTR+29) =  D0 ( DISTANCE OF CLOSEST APPROACH IN R-PHI )
C        13   FV(LTR+30) =  DZ ( DISTANCE OF CLOSEST APPROACH IN Z     )
C        14   FV(LTR+31) =  VAR(D0,D0)
C        15   FV(LTR+32) =  VAR(D0,DZ)
C        16   FV(LTR+33) =  VAR(DZ,DZ)
C        17   FV(LTR+34) =  TRK CHISQ(R,Z) FOR BELONGING TO THIS VTX
C         1   LV(LTR+35) =  TRK NUMBER (FOR TRACK BELONGING TO VTX)
C             ...           REPEAT 1 - 17 FOR REMAINING TRACKS
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
$$INCLUDE 'K$INC:BCS.INC'
$$INCLUDE 'K$INC:ERLEVL.INC'
$$INCLUDE 'YBOS$LIBRARY:ERRCOD.INC'
C
$$INCLUDE 'K$ITRK:CFLAGS.INC'
$$INCLUDE 'K$ITRK:CCONST.INC'
$$INCLUDE 'K$ITRK:CVXWORK.INC'
$$INCLUDE 'K$ITRK:DTFS.INC'
C
      INTEGER IFIT
      INTEGER ILIST,MAX,IFLAG
      REAL    XINT,VXERR,CHISQ
C
      INTEGER STATUS,INDDAT,LTR,LTRS,I,K
      INTEGER INDC,IHDSIZ
      INTEGER JBIT
      INTEGER BLOCAT
      REAL CROSS,DEN,PHI,PROXIM
      DIMENSION XINT(3),VXERR(6),ILIST(64)
      REAL P1,P2,DOT
      REAL FPMG,FK,SINL
      REAL FDR0,X,Y,VX,VY,TX,TY,TZ
      FPMG(FK,SINL) = ABS(1./(FK*SQRT(1.-SINL**2)))
      FDR0(X,Y,VX,VY,TX,TY,TZ) = ( (X-VX)*TY+(VY-Y)*TX )/SQRT(1.-TZ**2)
C
      IF (NHDVTX.GE.20) THEN
        CALL ERLOGR('VXSTOR',ERWARN,0,0,
     +              'Vertex internal banks full.')
        RETURN
      ENDIF
C
      NHDVTX = NHDVTX+1
      IF(NHDVTX .EQ. 1)KVX(1) = 1
      LTR = KVX(NHDVTX)
      IF( LTR + (MAX+1)*17  .LT. 2040 )GO TO 806
      CALL INERR(519,1)
      RETURN
C
 806  CONTINUE
      LV(LTR   ) = (MAX+1)*17
      LV(LTR +  1) = IFLAG
CC      LV(LTR +  2) = -1
      LV(LTR +  2) = ILIST(1)
CC MODIFICATO AA 3/APR/95 LV(LTR+2) NON E' USATO QUINDI CI IMMAGAZZIONO LA
CC MADRE PER I KINK CHE UTILIZZO IN VXMAIN
      LV(LTR +  5) = MAX
      FV(LTR +  6) = XINT(1)
      FV(LTR +  7) = XINT(2)
      FV(LTR +  8) = XINT(3)
      FV(LTR +  9) = VXERR(1)
      FV(LTR + 10) = VXERR(2)
      FV(LTR + 11) = VXERR(3)
      FV(LTR + 12) = VXERR(4)
      FV(LTR + 13) = VXERR(5)
      FV(LTR + 14) = VXERR(6)
      FV(LTR + 15) = CHISQ
      IF( MAX .NE. 2 .OR.
     +    TRKBNK(30,4,ILIST(1))*TRKBNK(30,4,ILIST(2)) .GT. 1. )GO TO 810
C ----------------->>             CALC P1*P2 AND P1XP2/|P1+P2|
      P1 = FPMG(TRKBNK(30,4,ILIST(1)),TRKBNK(7,4,ILIST(1)))
      P2 = FPMG(TRKBNK(30,4,ILIST(2)),TRKBNK(7,4,ILIST(2)))
      DOT = TRKBNK(5,4,ILIST(1))*TRKBNK(5,4,ILIST(2))+
     +      TRKBNK(6,4,ILIST(1))*TRKBNK(6,4,ILIST(2))+
     +      TRKBNK(7,4,ILIST(1))*TRKBNK(7,4,ILIST(2))
      FV(LTR + 17) = P1*DOT*P2
C
      FV(LTR + 16) = 0.
C     PTOT = SQRT( P1**2 + P2**2 +2*FV(LTR+16) )
 810  CONTINUE
C ----------------->>             FIX UP TRACK LIST
      LV(LTR +  3)=0
c      LV(LTR +  4)=0
      LV(LTR +  4)=IFIT
      LTRS = LTR
      DO 830 I=  1,MAX
c
c   Pack into LV(LTR +  3) GEANT track number
c
            K = ILIST(I)
            IF(ILIST(I).LE.32)CALL SBIT1(LV(LTRS+3),K)
c original code --------------- beg. ----
c            IF(ILIST(I).LE.32)CALL SBIT1(LV(LTRS+3),ILIST(I))
c            IF(ILIST(I).GT.32)CALL SBIT1(LV(LTRS+4),ILIST(I)-32)
c            K = ILIST(I)
c original code --------------- end -----
            LTR = KVX(NHDVTX) + I*17
            LV(LTR +  1) = K
            FV(LTR +  2) = ABS(TRKBNK(30,4,K))
C    TRKBNK(.+3) CAN BE ZERO WITH VD ON SO PROTECT -
            FV(LTR +  3) = TRKBNK(7,4,K)
            IF( ABS(TRKBNK(7,4,K)) .GT. 1.0E-5 )
     +      FV(LTR +  3) =
     +               SIGN(1./SQRT(1./TRKBNK(7,4,K)**2-1.),TRKBNK(7,4,K))
C
C THE FOLLOWING SHOULD NEVER HAPPEN!!
            IF (TRKBNK(6,4,K).EQ.0. .AND. TRKBNK(5,4,K).EQ.0.) THEN
              CALL ERLOGR('VXSTOR',ERWARN,0,0,
     +                    'Impossible tangent. Phi set=0.')
              FV(LTR +  4) = 0.
            ELSE
              FV(LTR +  4) = ATAN2(TRKBNK(6,4,K),TRKBNK(5,4,K))
            ENDIF
            IF (IFLAG.EQ.15 .AND. I.EQ.1) THEN
              FV(LTR +  3) = -FV(LTR+3)
              FV(LTR+4)    = FV(LTR+4)+ PI
            ENDIF
            FV(LTR+4) = PROXIM(FV(LTR+4),PI)
            CALL UCOPY(TRKBNK(24,4,K),FV(LTR+5),6)
            FV(LTR + 11) = TRKBNK(1,4,K)
            IF( I.NE.1 .OR. IFLAG .NE. 15 )GO TO 820
            STATUS = BLOCAT(IW,'DTFS',DTFS_bnk_num_list(K),INDC,INDDAT)
            IHDSIZ=IW(INDDAT+DTFHDS)
            INDDAT=INDDAT+IHDSIZ
            IW(INDDAT+DTFPVS)=NHDVTX
 820        CONTINUE
C ----------------->>             SET DR,DZ,<RR>,<RZ>,AND <ZZ>
C                                 INTO VERTEX BANK
            FV(LTR + 12) =
     +             FDR0(TRKBNK(2,4,K),TRKBNK(3,4,K),XINT(1),XINT(2),
     +             TRKBNK(5,4,K),TRKBNK(6,4,K),TRKBNK(7,4,K))
            FV(LTR + 13) = TRKBNK( 4,4,K) - XINT(3)
            FV(LTR + 14) = TRKBNK(15,4,K)
            FV(LTR + 15) = TRKBNK(16,4,K)
            FV(LTR + 16) = TRKBNK(20,4,K)
C ----------------->>             CALCULATE TRK CHISQ(R,Z) FOR THIS VTX
C
CDBG
C
C THE FOLLOWING SHOULD NEVER HAPPEN!!
            IF (FV(LTR+14)*FV(LTR+16).EQ.0.) THEN
              CALL ERLOGR('VXSTOR',ERWARN,0,0,
     +                    'Null division!')
              FV(LTR+14) = 1.
              FV(LTR+16) = 1.
            ENDIF
            CROSS = -FV(LTR+15)/(FV(LTR+14)*FV(LTR+16))
            DEN   =  1. + CROSS*FV(LTR+15)
            FV(LTR + 17) = ( FV(LTR+12)**2/FV(LTR+14) +
     +                       FV(LTR+13)**2/FV(LTR+16) +
     +                       2.*FV(LTR+12)*FV(LTR+13)*CROSS )/DEN
C
            IF( JBIT(LFLVXR,8) .EQ. 0 )GO TO 830
C ----------------->>        REFILL TRKBNK FOR DEBUG
            RW(INDDAT+DTFLNG) = TRKBNK(1,4,K)
            RW(INDDAT+DTFXCO) = TRKBNK(2,4,K)
            RW(INDDAT+DTFYCO) = TRKBNK(3,4,K)
            RW(INDDAT+DTFZCO) = TRKBNK(4,4,K)
C
C THE FOLLOWING SHOULD NEVER HAPPEN!!
            IF (TRKBNK(6,4,K).EQ.0. .AND. TRKBNK(5,4,K).EQ.0.) THEN
              CALL ERLOGR('VXSTOR',ERWARN,0,0,
     +                    'Impossible tangent. Phi set=0.')
              PHI = 0.
            ELSE
              PHI = ATAN2(TRKBNK(6,4,K),TRKBNK(5,4,K))
            ENDIF
            RW(INDDAT+DTFPHI) = PHI
            IF(PHI .LT. 0.)
     +                          RW(INDDAT+DTFPHI) = PHI + PI2
            RW(INDDAT+DTFCTT) =
     +               SIGN(1./SQRT(1./TRKBNK(7,4,K)**2-1.),TRKBNK(7,4,K))
C ----------------->>        END OF DEBUG
 830  CONTINUE
C
C ----------------->>             SET MSLIST TRK POINTERS
      DO 840 I=1,MAX
 840         CALL SBIT1( MSLIST(ILIST(I)),NHDVTX)
      IF( NHDVTX .LT. 20 )KVX( NHDVTX+1 ) = LTR + 18
C
      RETURN
      END
C   27/11/89 004101023  MEMBER NAME  VXTADE   (ES)          FVS
C
      SUBROUTINE VXTADE(P,D,RM,DZAR,RMBPOT,POUT)
$$IMPLICIT
C
C   NUMERICAL INTEGRATION ROUTINE
C   CALCULATES ENERGY LOSS OF CHARGED PARTICLES
C
C   INPUT:
C   P      = PARTICLE MOMENTUM
C   D      = TRAVELLED DISTANCE IN MATTER (NEGATIVE: ENERGY WIN DURING
C            TRACEBACK)
C   RM     = REST MASS OF PARTICLE
C   DZAR   = 0.3070E-3*Z/A*RHO OF MEDIUM WANTED  FROM CTIDRI
C   MSBPOT = 2*RM(E)/POT                         FROM CTIDRI
C
C   OUTPUT:
C   POUT   = MOMENTUM AFTER (OR IF D NEGATIVE BEFORE) ENERGY LOSS
C
C --- ROLAND WALDI --- 05/84 --- VERSION 1-05/84
C     D. COPPAGE       11.11.84  VERSION 1.1
C                      23.03.85  VERSION 1.2   DP FOR G VARIABLES
C     HKAP             10.04.90  VERSION 1.3   PO = PI IF D = 0.0
C
      REAL P,D,RM,DZAR,RMBPOT,POUT
      DOUBLE PRECISION A,B,G,X,H,H1,H2,H3,H4,H5,H6,DERIV
      DOUBLE PRECISION G2,G3,G4,G5,G6
C --- STATEMENT FUNCTION
      DERIV(G) = A * (G/(G-1.D0)*DLOG(B*(G-1.D0))-1.D0)
C
C --- SKIP IF NO MATTER
C
      IF (D.EQ.0.0) GOTO 700
C
C --- G = GAMMA
      G = DSQRT(1.D0+DBLE(P/RM)**2)
C
C --- SOLVE DIFF. EQU. DG = A ( G**2/G**2-1 LN B(G**2-1) - 1 ) DX
C
      A = DZAR / RM
      B = RMBPOT
C
C --- INTEGRATE RUNGE/KUTTA 5TH ORDER
C
      X = ABS(D)
  100 CONTINUE
      IF (G.LT.1.0001 .AND. D.GT.0.) GOTO 800
      H = (G-1.)*0.2 / DERIV (G**2)
      H = DSIGN(H,DBLE(D))
      IF (DABS(H).GT.X) H = SIGN(SNGL(X),D)
      H1 = DERIV(G**2)
      G2 = DMAX1(1.00001D00,G-0.25*H*H1)
      H2 = DERIV(G2**2)
      G3 = DMAX1(1.00001D00,G-0.125*H*(H1+H2))
      H3 = DERIV(G3**2)
      G4 = DMAX1(1.00001D00,G-H*(H3-0.5*H2))
      H4 = DERIV(G4**2)
      G5 = DMAX1(1.00001D00,G-3.*H*(H1+3.*H4)/16.)
      H5 = DERIV(G5**2)
      G6 = DMAX1(1.00001D00,G-H*(8.*H5-3.*H1+2.*H2+12.*(H3-H4))/7.)
      H6 = DERIV(G6**2)
      G = G-H*(7.*(H1+H6)+32.*(H3+H5)+12.*H4)/90.
      X = X-DABS(H)
      IF (X.GT.0.) GOTO 100
      POUT = DSQRT(G**2-1.D0)*RM
      RETURN
  700 CONTINUE
      POUT = P
      RETURN
  800 CONTINUE
      POUT = 0.
      RETURN
      END
C   27/11/89 010291746  MEMBER NAME  VXTKIN   (ES)          FVS
C   31/07/83 703021751  MEMBER NAME  VXTKIN   (DS)          FORTRAN
C
      SUBROUTINE VXTKIN(MAX,MSFRCE)
$$IMPLICIT
C---------------------------------------------------------------------
C   SUBROUTINE TO INITIALIZE THE WORKING TRACK BANKS FOR THE VERTEX
C   ROUTINES.
C   CALLED FROM VXMAIN.
C---------------------------------------------------------------------
C --- D. COPPAGE : VERSION  1.08.83 V3.01 (ARG06)
C                  REVISED 29.01.84 V3.1
C                  REVISED 24.03.84 V3.11 CHANGED RSURF(I,J)
C                  VERSION 14.05.84 V4.00 MASS FROM <DEDX>
C                                         ARG07 EXPANDED CTIDRI
C                  REVISED 27.06.84 V4.01 CSOMGA -> |CSOMGA|
C                          07.07.84 V4.03 NEW E- DEDX (A.PHILIPP)
C                          CTIDRI EXPNDED - NEW CALL SEQ NOT BKWRDS COMP
C                          07.09.84 V4.04 VDC CONSTANTS ADDED
C                          11.11.84 V4.04 DK/DX->DP/DX IN TRKOUT(31,I,K)
C                          27.01.85 V4.10 MSFRCE 1-> 5
C                                         DP/DX CALC IN MODIFIED
C                                         TADE1 BY R. WALDI
C                          31.01.85 V4.20 FIX DEDX LOW PT TRKS-
C                                         BAD DUE TO WRONG BNDRY
C                                         INTERSECTION.
C                          23.03.85 V4.21 DEDK INIT FOR ELEC
C                          19.04.85 V5.00 MOD FOR VDC FITS
C                          08.10.85 V5.00 FIXED BUG IN INTERCEPT
C                                         CALCULATION
C                          13.11.85 V4.30 VH3 DEF FIXED
C                          02.12.85 V4.40 REV SGN D COV MAT
C                                         INTRSCT ALG IMPROVD
C                          10.10.86 V4.50 COUL SCATT BOOSTED BY
C                                         SCS(THETA)**2
C                  REVISED 14.11.85 V4.60 VXERRC NOW IN DF COORD
C                                         SYS. COV MAT->DF COORD
C   HKAP                   10.04.90       NEW CTIDRI STRUCTURE
C---------------------------------------------------------------------
C   IMPORTANT NOTE:
C   THE DISTANCE IN THE R-THETA PLANE PERPENDICULAR TO THE TRACK IS
C   MEASURED POSITIVE ALONG THE DIRECTION  K X T  WHERE T IS THE
C   TANGENT TO THE TRACK POINTING AWAY FROM THE INTERACTION REGION,
C   X INDICATES VECTOR CROSS PRODUCT, AND K IS THE UNIT VECTOR IN THE
C   ARGUS Z-DIRECTION. THE ERROR SWIM ROUTINE NOW IS CORRECT FOR
C   MAGNETIC FIELDS IN THE -Z DIRECTION, I.E. THE VX COVARIANCE
C   MATRIX IS IN THE DF COORDINATE SYSTEM.
C---------------------------------------------------------------------
C   INPUT: IGDTK  = LIST OF TRACK TO BE INITIALIZED
C          MAX    = NUMBER OF TRACKS IN IGDTK TO INITIALIZE
C          MSFRCE = -1 : USE DEDX TO DECIDE MASS HYP
C                        IN CASE OF AMBIGUITIES, LIGHTEST HADRON
C                        MASS WITH <DEDX> LIKELIHOOD RATIO .GT. 0.05
C                        IS TAKEN (ONLY 1,2,3,4 POSSIBLE)
C                 =  1 : FORCE ELECTRON MASS HYP (IONIZATION ONLY)
C                 =  2 : FORCE PI       MASS HYP
C                 =  3 : FORCE K        MASS HYP
C                 =  4 : FORCE P        MASS HYP
C
C   OUTPUT: TRKBNK(32,4,64) IN COMMON/CWORK/
C---------------------------------------------------------------------
C   DESCRIPTION OF WORKING TRACK BANK TRKBNK(N,I,J):
C                                     *************
C   I = REGION NUM (1=DC, 2=BETWEEN DC AND BT, 3=INSIDE BT, 4=CURRENT)
C   J = TRACK NUMBER
C   N = 1        TRACK LENGTH
C       2,3,4    X,Y,Z
C       5,6,7    VTNG X,Y,Z
C       8,9,10   VNORM X,Y,Z (UNNORMALIZED)
C       11,12,13 VH X,Y,Z (UNIT VECTOR IN DIR OF MAG FIELD)
C       14       1/VHMAG  (MAGNITUDE OF MAG FIELD)
C       15 - 29  COVARIANCE MATRIX FOR REGION I (IN DF COORDINATE SYS)
C       30       SIGNED VALUE OF K
C       31       ABS(DP/DX)  (DEFAULT MASS = SEE ABOVE. K FROM REGION 1)
C       USE OF STATUS WORDS IN THIS ROUTINE:
C       32, I=1: 1 OR 2 = INPUT BNK FOR VXSWIM
C                     3 = SIGNAL VXTKIN FINISHED
C           I=2:        = NUMBER OF LAST FILLED BANK
C                       = -1 IF NO BANKS FILLED
C           I=3:        = +1.0 FOR NEGATIVE SWIMS (NORMAL)
C                       = -1.0 FOR POSITIVE SWIMS (MUST BE
C                                                    SET WHEN NEEDED)
C           I=4: 0/100  = DC/VDC TRACK
C---------------------------------------------------------------------
C   BETA**2 = 1./(1.+(M/P)**2) = 1./(1.+(M*K*COSLAM)**2)
C             M TAKEN FROM <DEDX> : DEFAULT = SEE ABOVE
C
C   DE/DX = C1*(1./BETA**2)*(ALOG(C2*(P/MASS)**2)-BETA**2)
C
C   C1,C2 = MATERIAL CONSTANTS STORED IN TIDEVX IN COMMON CTIDRI.
C           C1 IS IN UNITS OF GEV/(G/CM**2).
C
C   INNER RADIUS OF MDC RELATED MATERIALS = TIRGVX(1)
C   INNER RADIUS OF VDC RELATED MATERIALS = TIRGVX(2)
C   THICKNESSES (IN G/CM**2) FOR THESE MATERIALS ARE STORED IN TIRGVX.
C---------------------------------------------------------------------
C   A.PHILIPP DE/DX FOR ELECTRONS:
C
C   DE/DX = ((CA1 + CA2/ENRGY**CA3)*CORR + 1 + FAC*LOG(ENRGY))*XRAD
C
C   WHERE THE CONSTANTS CA(I), CORR AND FAC HAVE BEEN CHECKED WITH
C   THE EFF MASS FOR PI0'S FROM CONV GAMMAS.
C
C   TICAVX(1-3) = CA(1-3) ; TICAVX(4) = CORR (=1 FOR AL):DRIFT CH
C   TIALVX(1-3) = AL(1-3) ; TICAVX(4) = FAC:BEAMTUBE
C---------------------------------------------------------------------
C
$$INCLUDE 'K$ITRK:CCONST.INC'
$$INCLUDE 'K$ITRK:CFLAGS.INC'
$$INCLUDE 'K$ITRK:CTIDRI.INC'
$$INCLUDE 'K$ITRK:CVXCUT.INC'
$$INCLUDE 'K$ITRK:CVXWORK.INC'
$$INCLUDE 'YBOS$LIBRARY:ERRCOD.INC'
$$INCLUDE 'K$INC:BCS.INC'
$$INCLUDE 'K$ITRK:DTFS.INC'
C
      INTEGER MAX,MSFRCE
C
      INTEGER IHYPSV,IHYP,ISM,JHYP,MH,NRMX,ISURF
      INTEGER NR,JSURF,IFLG,NUM,NDX
      INTEGER LERR,KSURF
      REAL    RCK,DMAG,BETA2,CSOMGA,RMAG,DPHI2
      REAL    DCTGT2,BG2,ERG,DK,DMAT,PO
      REAL PX,FMASS,CHIMN,PXI2TO,PT1,VH3,RHO,CSLMIV,D1,D2
      INTEGER STATUS,INDDAT
      INTEGER BLOCAT
C
      REAL CA,AL
      DIMENSION CA(3),AL(3)
c      EQUIVALENCE (TICAVX(1),CA(1)),(TICAVX(4),CORR)
c      EQUIVALENCE (TIALVX(1),AL(1)),(TIALVX(4),FAC)
C ASSUME NEW ORGANIZATION OF CTIDRI AS BELOW
      REAL DEPXY,EPXYI,XREPXY,DAL,ALI,XRAL
      REAL DFE,FEI,XRFE,DCU,CUI,XRCU,DAG,AGI,XRAG
      REAL DPBO,PBOI,XRPBO,DBE,BEI,XRBE
      EQUIVALENCE
     +(TIDEVX(1,1),DEPXY),(TIDEVX(2,1),EPXYI),(TIDEVX(3,1),XREPXY),
     +(TIDEVX(1,2),DAL),  (TIDEVX(2,2),ALI),  (TIDEVX(3,2),XRAL),
     +(TIDEVX(1,3),DFE),  (TIDEVX(2,3),FEI),  (TIDEVX(3,3),XRFE),
     +(TIDEVX(1,4),DCU),  (TIDEVX(2,4),CUI),  (TIDEVX(3,4),XRCU),
     +(TIDEVX(1,5),DAG),  (TIDEVX(2,5),AGI),  (TIDEVX(3,5),XRAG),
     +(TIDEVX(1,6),DPBO), (TIDEVX(2,6),PBOI), (TIDEVX(3,6),XRPBO),
     +(TIDEVX(1,7),DBE),  (TIDEVX(2,7),BEI),  (TIDEVX(3,7),XRBE)
      REAL RMN1,RMN2,XEPXY1,XFE1,XAG1,XAL1,XEPXY2,XAL2,XCU2,XPBO2,XBE2
      EQUIVALENCE
     +(TIRGVX( 1),RMN1),(TIRGVX( 2),RMN2),(TIRGVX( 3),XEPXY1),
     +(TIRGVX( 4),XFE1),(TIRGVX( 5),XAG1),(TIRGVX( 6),XAL1),
     +(TIRGVX( 7),XEPXY2),(TIRGVX( 8),XAL2),(TIRGVX( 9),XCU2),
     +(TIRGVX(10),XPBO2),(TIRGVX(11),XBE2)
C
      INTEGER L,K,NSURF,INDC,IHDSIZ
      REAL PHI,CTT,SINPHI,COSPHI,COSLAM
      REAL XINT,CIRCL,VH,XRAD,RSURF,PXI2
      INTEGER IDTEIL,LIST
      DIMENSION XINT(5),CIRCL(3,2),VH(3),XRAD(2),RSURF(2),
     +          IDTEIL(5),LIST(5),PXI2(4)
      DATA IDTEIL/22,24,1,4,29/, LIST/1,3,4,5,1/
      DATA CIRCL(2,1),CIRCL(3,1)/2*0.0/
      LOGICAL FLGVDC,FLGDCW,FLGEE2
      REAL FAC,CORR
      data fac/0./, corr/0./
C
C --- INITIALIZE
C
      RSRFCO(1) = RMN1
      RSRFCO(2) = RMN2
      XRAD(1) = XEPXY1/XREPXY + XAG1/XRAG + XFE1/XRFE + XAL1/XRAL
      XRAD(2) = XEPXY2/XREPXY + XCU2/XRCU + XBE2/XRBE + XAL2/XRAL +
     +          XPBO2/XRPBO
C
C --- LOOP OVER TRACKS
C
      DO 400 L=1,MAX
         K = IGDTK(L)
CC         LTR = JTK(K)
C ------ SET UP INIT FOR NO VDC HITS
         RSURF(1) = RMN1
         RSURF(2) = RMN2
         NSURF  = 2
         FLGVDC = .FALSE.
         ITKBNK(32,4,K) = 0
C ------ IF VDC HITS, CHANGE BANKS FILLED
CCC         IF (ID(LTR+26).GE.1000000) THEN
CCC            FLGVDC = .TRUE.
CCC            ITKBNK(32,4,K) = 100
CCC            NSURF = 1
CCC            RSURF(1) = RMN2
CCC            RSURF(2) = 0.0
CCC         ENDIF
C
C ------ FILL TRACK BUFFER
C
         STATUS = BLOCAT(IW,'DTFS',DTFS_bnk_num_list(K),INDC,INDDAT)
         IHDSIZ=IW(INDDAT+DTFHDS)
         INDDAT=INDDAT+IHDSIZ
         ITKBNK(32,2,K) = -1
         TRKBNK( 1,1,K) = RW(INDDAT+DTFLNG)
         TRKBNK( 2,1,K) = RW(INDDAT+DTFXCO)
         TRKBNK( 3,1,K) = RW(INDDAT+DTFYCO)
C
C--- KLOE code modification ----- begin ------ A.Andryakov----
C      I don't understand why fid. vol. is 100 cm along z.
CCC METTERE IL VALORE DAL DATA BASE IN 200.1
C
         IF (ABS(RW(INDDAT+DTFZCO)).GT.200.1) GOTO 400
C
C--- KLOE code modification ----- end -------- A.Andryakov----
C
         TRKBNK( 4,1,K) = RW(INDDAT+DTFZCO)
         CALL MGFLD(TRKBNK(2,1,K),VH)
         TRKBNK(14,1,K) = 1./SQRT(VH(1)**2+VH(2)**2+VH(3)**2)
         TRKBNK(11,1,K) = VH(1)*TRKBNK(14,1,K)
         TRKBNK(12,1,K) = VH(2)*TRKBNK(14,1,K)
         TRKBNK(13,1,K) = VH(3)*TRKBNK(14,1,K)
         PHI=RW(INDDAT+DTFPHI)
         CTT=RW(INDDAT+DTFCTT)
         SINPHI = SIN(PHI)
         COSPHI = COS(PHI)
         COSLAM = 1./SQRT(1.+CTT**2)
         TRKBNK( 5,1,K) = COSLAM * COSPHI
         TRKBNK( 6,1,K) = COSLAM * SINPHI
         TRKBNK( 7,1,K) = SIGN(SQRT(1.-COSLAM**2),CTT)
         TRKBNK( 8,1,K) =
     +         TRKBNK(6,1,K)*TRKBNK(13,1,K)-TRKBNK(7,1,K)*TRKBNK(12,1,K)
         TRKBNK( 9,1,K) =
     +         TRKBNK(7,1,K)*TRKBNK(11,1,K)-TRKBNK(5,1,K)*TRKBNK(13,1,K)
         TRKBNK(10,1,K) =
     +         TRKBNK(5,1,K)*TRKBNK(12,1,K)-TRKBNK(6,1,K)*TRKBNK(11,1,K)
C ------ COVARIANCE MATRIX
         CALL UCOPY(RW(INDDAT+DTFCVM),TRKBNK(15,1,K),15)
         TRKBNK(30,1,K) = RW(INDDAT+DTFCUR)
C
C ------ IDENTIFY PARTICLE USING DE/DX (UNLESS MSFRCE > 0)
C
CCC QUESTA PARTE DEL CODICE E SALTATA DA RIVEDERE
CCC        SE SI HA LA MASSA CON IL DE/DX
         IHYPSV = 2
         IF (MSFRCE.GT.0) IHYPSV = MSFRCE
         IF (IDTEIL(LIST(IHYPSV)).EQ.1) THEN
           FMASS = PION_MASS
         ELSEIF (IDTEIL(LIST(IHYPSV)).EQ. 4) THEN
           FMASS = KAON_MASS
         ELSEIF (IDTEIL(LIST(IHYPSV)).EQ.22) THEN
           FMASS = ELEC_MASS
         ELSEIF (IDTEIL(LIST(IHYPSV)).EQ.29) THEN
           FMASS = PROTON_MASS
         ENDIF
         TRKBNK(31,1,K) = 0.0
C-OBSOLETE         IF (ID(LTR+63).LE.0 .OR. MSFRCE.GT.0) GOTO 110
         IF (MSFRCE.GT.0) GOTO 110
C-OBSOLETE         CHIMN = AMIN1(AD(LTR+66),AD(LTR+68),AD(LTR+69),AD(LTR+70))
         IF (CHIMN.GT.50.) GOTO 110
C ------ CALCULATE PROBABILITIES
C         DO 100 IHYP=1,4
C            PXI2(IHYP) = 0.0
C  100       IF (AD(LTR+65+LIST(IHYP)).LT.140.)
C     +                   PXI2(IHYP) = EXP(-AD(LTR+65+LIST(IHYP)))
C ------ WEIGHT 5 FOR PI'S
         PXI2(2) = 5.*PXI2(2)
         PXI2TO = PXI2(1)+PXI2(2)+PXI2(3)+PXI2(4)
C ------ NORMALIZED PROBABILITIES
         DO 102 IHYP=1,4
  102       PXI2(IHYP) = PXI2(IHYP)/PXI2TO
         ISM = -1
C ------ CHECK HYPOTHESES > 5 %
         DO 104 IHYP=1,4
            IF (PXI2(5-IHYP).LT.0.05) GOTO 104
            ISM = ISM + 1
            IF (IHYP.LT.4 .OR. ISM.EQ.0) JHYP = 5-IHYP
  104       CONTINUE
         IF (ISM.LT.0) GOTO 110
         IHYPSV = JHYP
         IF (IDTEIL(LIST(IHYPSV)).EQ.1) THEN
           FMASS = PION_MASS
         ELSEIF (IDTEIL(LIST(IHYPSV)).EQ. 4) THEN
           FMASS = KAON_MASS
         ELSEIF (IDTEIL(LIST(IHYPSV)).EQ.22) THEN
           FMASS = ELEC_MASS
         ELSEIF (IDTEIL(LIST(IHYPSV)).EQ.29) THEN
           FMASS = PROTON_MASS
         ENDIF
C ------ MOMENTUM LOSS IN GEV/CM
C         TRKBNK(31,1,K) = SQRT((FMASS*AD(LTR+30)*COSLAM)**2+1.)*
C     +                    0.5*AD(LTR+64)*1.E-6
 110     CONTINUE
         MH = 1
         IF (IHYPSV.GT.1) MH = IHYPSV + 1
C         IW(INDDAT+DTFPID)=MH
         ITKBNK(32,2,K) = 1
C
C ------ NOW FIND INTERSECTIONS OF TRACK WITH
C        DC INNER WALL AND BEAM TUBE
C
         TRKBNK(32,3,K) = 1.0
         PT1  = 1./ABS(TRKBNK(30,1,K))
C ------ FOR LOW MOMENTUM SWIM TWICE
         NRMX = 2
         IF (PT1.GT.0.3) NRMX = 1
C
C ------ LOOP OVER SCATTERING SURFACES
C
         DO 300 ISURF=1,NSURF
            DO 200 NR=1,NRMX
               JSURF = ISURF + NR - 1
               VH3 = TRKBNK(13,JSURF,K)/TRKBNK(14,JSURF,K)
               RHO = 1./(CONVERS*VH3*TRKBNK(30,JSURF,K))
               IF (ABS(RHO).LE.3000.) THEN
C --------------- TRACK IS CIRCLE
                  CSLMIV =
     +              1./SQRT(TRKBNK(5,JSURF,K)**2+TRKBNK(6,JSURF,K)**2)
                  COSPHI = TRKBNK(5,JSURF,K)*CSLMIV
                  SINPHI = TRKBNK(6,JSURF,K)*CSLMIV
                  CIRCL(1,2) = ABS(RHO)
                  CIRCL(2,2) = TRKBNK(2,JSURF,K) + RHO * SINPHI
                  CIRCL(3,2) = TRKBNK(3,JSURF,K) - RHO * COSPHI
                  IFLG = 0
               ELSE
C --------------- TRACK APPROXIMATED AS STRAIGHT LINE
                  CIRCL(1,2) =  SINPHI
                  CIRCL(2,2) = -COSPHI
                  CIRCL(3,2) =  COSPHI*TRKBNK(3,JSURF,K)-
     +                          SINPHI*TRKBNK(2,JSURF,K)
                  IFLG = 2
               ENDIF
               CIRCL(1,1) = RSURF(ISURF)
               CALL VXXFND(CIRCL,XINT,IFLG)
C ------------ CHECK # INTERSECTIONS
               NUM = XINT(1) + 0.01
               IF (NUM.LT.1 .AND. NR.EQ.2) GOTO 350
               IF (NUM .GT. 0) GOTO 230
               XINT(1) = 0.0
               XINT(2) = 0.0
               NDX = 1
               GOTO 250
C ------------ AT LEAST ONE INTERSECTION
  230          CONTINUE
               NDX = 2
               IF (NUM .EQ. 1) GOTO 240
C ------------ FIND CLOSEST INTERSECTION IF MORE THAN ONE
               D1 =(XINT(2)-TRKBNK(2,ISURF,K))**2 +
     +             (XINT(3)-TRKBNK(3,ISURF,K))**2
               D2 =(XINT(4)-TRKBNK(2,ISURF,K))**2 +
     +             (XINT(5)-TRKBNK(3,ISURF,K))**2
               IF (D2.LT.D1) NDX = 4
C ------------ CHECK FOR BAD SOLUTION
  240          CONTINUE
               RCK = SQRT(XINT(NDX)**2+XINT(NDX+1)**2)
               IF (ABS(RCK-RSURF(ISURF)).LT.2.0) GOTO 250
               CALL INERR(573,1)
               GOTO 350
C ------------ SWIM TRACK
  250          CONTINUE
               ITKBNK(32,1,K) = ISURF
               CALL VXSWIM( XINT(NDX), K, TRKBNK(1,ISURF+1,K), LERR)
               IF (LERR.NE.0) GOTO 350
               IF (NUM .GT. 0) GOTO 200
               DMAG =
     +              SQRT(TRKBNK(2,ISURF+1,K)**2+TRKBNK(3,ISURF+1,K)**2)
               IF (DMAG.GT.RSURF(ISURF) .OR. NRMX.EQ.1) GOTO 350
  200       CONTINUE
            ITKBNK(32,2,K) = ISURF+1
C
C --------- NOW ADD COULOMB SCATTERING FOR APPROPRIATE BOUNDARY
C
            COSLAM = SQRT(1.-TRKBNK(7,ISURF+1,K)**2)
            BETA2  = 1./(1. + (FMASS*TRKBNK(30,ISURF+1,K)*COSLAM)**2)
C
C --------- OMEGA = SPATIAL ANGLE BETWEEN TRACK AND MATERIAL SURFACE
C           COS(OMEGA) = (P(X)*T(X)+P(Y)*T(Y))/SQRT(P(X)**2+P(Y)**2)
C     WHERE P(I) = POSITION VECTOR OF TRACK AT SURFACE INTERSECTION
C           T(I) = UNIT TANGENT VECTOR OF TRACK AT P(I)
C             I  = 1,2,3
C
            CSOMGA = TRKBNK(2,ISURF+1,K) * TRKBNK(5,ISURF+1,K) +
     +               TRKBNK(3,ISURF+1,K) * TRKBNK(6,ISURF+1,K)
            RMAG = SQRT( TRKBNK(2,ISURF+1,K)**2 +
     +                   TRKBNK(3,ISURF+1,K)**2 )
            CSOMGA = ABS(CSOMGA / RMAG)
C
C --------- <DPHI,DPHI> = (0.0141/P/BETA)**2 * X/XRAD / COSLAM**2
C
            KSURF = ISURF
            IF (FLGVDC) KSURF = 2
CNOV 86     DPHI2 = (0.0141*TRKBNK(30,ISURF+1,K)*COSLAM)**2
            DPHI2 = (0.0141*TRKBNK(30,ISURF+1,K)       )**2
     +               * XRAD(KSURF) / (CSOMGA * BETA2 )
C
C --------- <DCTGT,DCTGT> = (0.0141/P/BETA)**2 * X/XRAD / COSLAM**4
C
            DCTGT2 = DPHI2 / (COSLAM)**2
            TRKBNK(27,ISURF+1,K) = TRKBNK(27,ISURF+1,K) + DCTGT2
            TRKBNK(29,ISURF+1,K) = TRKBNK(29,ISURF+1,K) + DPHI2
C
C --------- DK/DX = DE/DX * K**2 * COS(LAMBDA) / BETA
C           DE/DX = CONST1(I) / BETA**2 *
C                   (ALOG(CONST2(I)*(P/MASS)**2) - BETA**2)
C                 = BETHE-BLOCH-FORMULA
C
            BG2 = 1./(TRKBNK(30,ISURF+1,K)*COSLAM*FMASS)**2
            ERG = SQRT(BG2/BETA2)*ELEC_MASS
            FLGDCW = ISURF.EQ.1 .AND. .NOT.FLGVDC
            FLGEE2 = IHYPSV.EQ.5 .AND. XFE1+XAL1.LT.1E-5
C
            IF (FLGDCW) THEN
C ------------ NOW AT DC WALL
               IF (FLGEE2) THEN
C --------------- NOW ELECTRONS EXP 2
                  DK = ( (CA(1)-CA(2)/ERG**CA(3))*CORR +
     +                   (1.+FAC*ALOG(ERG))*ERG)*XRAD(1)
               ELSE
C --------------- NOW ALL OTHER CASES
                  PX = ABS(1./(TRKBNK(30,ISURF+1,K)*COSLAM))
                  DMAT = -XEPXY1/CSOMGA
                  CALL VXTADE(PX,DMAT,FMASS,DEPXY,EPXYI,PO)
                  DMAT = -XAG1/CSOMGA
                  CALL VXTADE(PO,DMAT,FMASS,DAG,AGI,PO)
                  DMAT = -XFE1/CSOMGA
                  CALL VXTADE(PO,DMAT,FMASS,DFE,FEI,PO)
                  DMAT = -XAL1/CSOMGA
                  CALL VXTADE(PO,DMAT,FMASS,DAL,ALI,PO)
               ENDIF
            ELSE
C ------------ NOW AT BEAM TUBE WALL
               IF (FLGEE2) THEN
C --------------- NOW ELECTRONS EXP 2
                  DK =(AL(1)-AL(2)/ERG**AL(3) + (1.+FAC*ALOG(ERG))*ERG)
     +                 *XRAD(2)
               ELSE
C --------------- NOW ALL OTHER CASES
                  PX = ABS(1./(TRKBNK(30,ISURF+1,K)*COSLAM))
                  DMAT = -XEPXY2/CSOMGA
                  CALL VXTADE(PX,DMAT,FMASS,DEPXY,EPXYI,PO)
                  DMAT = -XPBO2/CSOMGA
                  CALL VXTADE(PO,DMAT,FMASS,DPBO,PBOI,PO)
                  DMAT = -XAL2/CSOMGA
                  CALL VXTADE(PX,DMAT,FMASS,DAL,ALI,PO)
                  DMAT = -XBE2/CSOMGA
                  CALL VXTADE(PO,DMAT,FMASS,DBE,BEI,PO)
                  DMAT = -XCU2/CSOMGA
                  CALL VXTADE(PO,DMAT,FMASS,DCU,CUI,PO)
               ENDIF
            ENDIF
C
            IF (FLGEE2) THEN
               DK  = DK * TRKBNK(30,ISURF+1,K)**2 * COSLAM /
     +               ( SQRT( BETA2 ) * CSOMGA )
               DEDK(K,ISURF) = 0.5*DK
               TRKBNK(30,ISURF+1,K) =
     +         SIGN(ABS(TRKBNK(30,ISURF+1,K))-DK,TRKBNK(30,ISURF+1,K))
            ELSE
               DEDK(K,ISURF) = 0.0
               TRKBNK(30,ISURF+1,K) =
     +            SIGN(1.0/(PO*COSLAM),TRKBNK(30,ISURF+1,K))
            ENDIF
            TRKBNK(31,ISURF+1,K) = 0.0
  300    CONTINUE
C ------ MARK VXTKIN FINISHED (FOR VXSWIM)
  350    ITKBNK(32,1,K) = 3
  400 CONTINUE
C
C --- IF DEBUG, FILL FOR GRAPHICS
C     USE IBRPVX TO PICK BANKS
C
      IF (IBRPVX.LT.1 .OR. IBRPVX.GT.4) RETURN
      DO 500 L=1,MAX
         K = IGDTK(L)
         IF (ITKBNK(32,2,K).LT.IBRPVX) GOTO 500
         STATUS = BLOCAT(IW,'DTFS',DTFS_bnk_num_list(K),INDC,INDDAT)
         IHDSIZ=IW(INDDAT+DTFHDS)
         INDDAT=INDDAT+IHDSIZ
C ------ REFILL TRKBNK FOR DEBUG
         RW(INDDAT+DTFLNG) = TRKBNK(1,IBRPVX,K)
         RW(INDDAT+DTFXCO) = TRKBNK(2,IBRPVX,K)
         RW(INDDAT+DTFYCO) = TRKBNK(3,IBRPVX,K)
         RW(INDDAT+DTFXCO) = TRKBNK(4,IBRPVX,K)
         RW(INDDAT+DTFPHI) =
     +        ATAN2(TRKBNK(6,IBRPVX,K),TRKBNK(5,IBRPVX,K))
         PHI = RW(INDDAT+DTFPHI)
         IF (PHI.LT.0.)
     +       RW(INDDAT+DTFPHI) = RW(INDDAT+DTFPHI) + PI2
         RW(INDDAT+DTFCTT) =
     +     SIGN(1./SQRT(1./TRKBNK(7,IBRPVX,K)**2-1.),TRKBNK(7,IBRPVX,K))
  500 CONTINUE
C
      RETURN
      END
C   27/11/89            MEMBER NAME  VXXFND   (ES)          FVS
      SUBROUTINE VXXFND(CIRCL,XINT,IFLG)
$$IMPLICIT
C
C  ---  D. COPPAGE                25/07/83 V1.0
C                         REVISED 19.05.84 V1.01 (ARG07) F15PPP FIXED
C                                          WRONG SNG. ONLY LOW PT AFFCTD
C                         REVISED 10.07.84 V1.02 FIXED FOR ABS(B) APRX 0
C                         REVISED 30.07.84 V1.03 FIXED FOR IFLG=2
C
C       SUBROUTINE TO CALCULATE THE INTERSECTION OF TWO CIRCLES
C       IF ONE OR BOTH DEGENERATE, IFLG CONTROLS PROGRAM FLOW
C       --- CALLED FROM VXTKIN
C
C  INPUT:
C        CIRCL(3,2)
C        CIRCL(*,1)        1                2               3
C  IFLG=0          UNSIGNED RADIUS   X-COORD CENTER  Y-COORD CENTER
C  IFLG=1 (SAY)        TANGENT(Y)      -TANGENT(X)   T(X)*Y(0)-T(Y)*X(0)
C  IFLG=      0            1                2               3
C        2 CIRCLES  CIRCL(*,1)=LINE   CIRCL(*,2)=LINE  BOTH LINES
C  OUTPUT:
C         XINT(5)
C  XINT(*)    1            2          3          4          5
C        #INTERSECTS   X-COORD(1) Y-COORD(1) X-COORD(2) Y-COORD(2)
C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C
      REAL CIRCL,XINT,XM,XMB
      INTEGER NDX,MDX,IFLG,ISM,NERROR,IREVRS,J2,J3
      REAL A,B,C,SAV,AA,BB,CC,DISC
      DIMENSION CIRCL(3,2),XINT(5),XM(2,2),NDX(2),xmb(2)
      DIMENSION MDX(4,2)
      DATA MDX/2,3,4,5,3,2,5,4/
C
      IF(IFLG.EQ.0)GO TO 300
      IF(IFLG.EQ.3)GO TO 200
      XINT(1)=0.
      IF(IFLG.GT.3)RETURN
C ----------------->>        CIRCLE AND LINE
      A = CIRCL(1,IFLG)
      B = CIRCL(2,IFLG)
      C = CIRCL(3,IFLG)
      ISM = 3 - IFLG
      GO TO 305
C ----------------->>        LINE AND LINE
 200  CONTINUE
      XM(1,1) = CIRCL(2,1)
      XM(1,2) = CIRCL(3,1)
      XM(2,1) = CIRCL(2,2)
      XM(2,2) = CIRCL(3,2)
      xmb(1) =-CIRCL(1,1)
      xmb(2) =-CIRCL(1,2)
                 CALL reqn(2,XM,2,NDX,NERROR,1,xmb)
      XINT(1) = 0.
      IF(NERROR.NE.0)GO TO 900
      XINT(1) = 1.
      XINT(2) = xmb(1)
      XINT(3) = xmb(2)
      GO TO 900
C ----------------->>        CASE OF TWO CIRCLES
 300  CONTINUE
      A = 2. * (CIRCL(2,2) - CIRCL(2,1))
      B = 2. * (CIRCL(3,2) - CIRCL(3,1))
      C =   CIRCL(2,1)**2 - CIRCL(2,2)**2
     +    + CIRCL(3,1)**2 - CIRCL(3,2)**2
     +    - CIRCL(1,1)**2 + CIRCL(1,2)**2
      ISM = 1
      IF(CIRCL(1,1) .GT. CIRCL(1,2))ISM=2
C
 305  CONTINUE
      IREVRS = 1
      IF( ABS(B).GT.ABS(A) )GO TO 310
      IREVRS = 2
      SAV = A
      A = B
      B = SAV
 310  CONTINUE
      J2 = MDX(1,IREVRS)
      J3 = MDX(2,IREVRS)
      AA = 1. + (A/B)**2
      BB = 2 * (A/B * (C/B + CIRCL(J3,ISM)) - CIRCL(J2,ISM))
      CC = CIRCL(J2,ISM)**2 + (C/B+CIRCL(J3,ISM))**2 - CIRCL(1,ISM)**2
      DISC = BB**2 - 4. * AA * CC
      XINT(1) = 0.
      IF(DISC .LT. 0. )GO TO 900
      XINT(1) = 1.
      IF( ABS(DISC) .GT. 1.E-2 )GO TO 350
      XINT(MDX(1,IREVRS)) = -0.5 * BB / AA
      XINT(MDX(2,IREVRS)) = -0.5 * (A * XINT(MDX(1,IREVRS)) + C)/B
      GO TO 900
 350  CONTINUE
      XINT(1) = 2.
      DISC = SQRT(DISC)
      XINT(MDX(1,IREVRS)) = 0.5 * (DISC - BB) / AA
      XINT(MDX(3,IREVRS)) = 0.5 * (-DISC - BB) / AA
      XINT(MDX(2,IREVRS)) = - (A * XINT(MDX(1,IREVRS)) + C) / B
      XINT(MDX(4,IREVRS)) = - (A * XINT(MDX(3,IREVRS)) + C) / B
C
 900  CONTINUE
      RETURN
      END
C   27/11/89            MEMBER NAME  VXXYZ    (ES)          FVS
C   15/02/83 407102203  MEMBER NAME  VXXYZ    (DS)          FORTRAN

      SUBROUTINE VXXYZ(MAX,ILIST,X,VXERR,CSQO,IFIT,XCN,CONSTR)
$$IMPLICIT
C
C **********************************************************************
C *     SUBROUTINE FOR ITERATING TO FIND A FIT VALUE FOR A VERTEX      *
C *     --- CALLED FROM VXMAIN                                         *
C *                                                                    *
C * --- D. COPPAGE --- VERSION 15/02/83 V1.00                          *
C *                            17/07/83 V2.00 (NOT ARGNEW COMPATIBLE)  *
C *                            04/10/83 V3.00 (ARG05)                  *
C *                            27/06/84 V3.01 (ARG07)                  *
C *                                                                    *
C *     VXXYZ I/O DESCRIPTION                                          *
C *     INPUT:                                                         *
C *           MAX       = NUMBER OF TRACKS INPUT TO THE FIT            *
C *           ILIST(64) = LIST OF INPUT TRACKS OF WHICH THERE ARE 'MAX'*
C *           X(3)      = INPUT APPROXIMATION TO THE VERTEX            *
C *           XCN(3)    = CONSTRAINT POSITION WHICH WILL BE SET UP LIKE*
C *                       AN EXTRA TRACK WHEN CONSTRA = .TRUE.         *
C *           CONSTR    = LOGICAL VARIABLE WHICH WILL FORCE A          *
C *                       CONSTRAINED FIT TO XCN(3) WHEN SET TRUE      *
C *     OUTPUT:                                                        *
C *            MAX       = NUMBER OF TRACKS FIT (CAN BE DIFFERENT FROM *
C *                       MAX OF INPUT)                                *
C *            ILIST(64) = LIST OF 'MAX' TRACKS WHICH ARE INCLUDED IN  *
C *                        THE FINAL FIT                               *
C *            X(3)      = X,Y,Z OF FINAL FIT                          *
C *            VXERR(6)  = COVARIANCE MATRIX OF THE VERTEX FIT         *
C *            CSQ       = CHI SQUARED OF THE FIT                      *
C *            IFIT      = FLAG FOR THE FIT                            *
C *                         = 0 -> FIT GOOD                            *
C *                        <> 0 -> FIT NOT GOOD                        *
C *                                                                    *
C *                           2 number of iterations is too small      *
C *                           3 dchsq less than zero                   *
C *                           4 error from matin1                      *
C *                           5 don't have 2 trks to start with because*
C *                             of vxprep in primer to vtx fit loop    *
C *                           6 errors on x,y,z > cut values           *
C *                           7 dchsq > dchssv                         *
C *                           8 too few tracks to continue because of  *
C *                             vxprep in interations for fit          *
C *                           9 labelled bad track                     *
C *                          10 error matrix has neg diag elements     *
C *                                                                    *
C **********************************************************************
$$INCLUDE 'K$ITRK:CVXCUT.INC'
$$INCLUDE 'K$ITRK:CVXWORK.INC'
$$INCLUDE 'K$ITRK:CFLAGS.INC'
      LOGICAL CONSTR
      INTEGER MAX,ILIST(64),IFIT
      REAL    X(3),VXERR(6),CSQO,XCN(3)
C
      INTEGER IDBGSV
      REAL    SCALE,CTERR2
      INTEGER NDX(3),MXITR
      INTEGER MTKS,NUMTKS,IBADTK,NUMT,IAVAIL,ITER,NERROR
      REAL    DCHMIN,CTR,CTZ,CTRM2,DEVOLD,DCHSSV,DCHSQ,CSQTST
      REAL    XSV(3),DV(3)
      REAL    VY(3),XGA(3,3),XGB(3),DENOM
C
C ----------------->>             INIT
      MXITR=ITRXVX
      DCHMIN=CHGMVX
      CTR=CTRVX
      CTZ=CTZVX
      CTRM2=(CTR**2)*.75
      DEVOLD = -1.
      XSV(1) = X(1)
      XSV(2) = X(2)
      XSV(3) = X(3)
      DO MTKS= 1,MAX
        ITKBNK(32,1,ILIST(MTKS)) = 3
      ENDDO
C
      NUMTKS=MAX
      CALL VXPREP(NUMTKS,ILIST,X,XGA,XGB,CSQO,IBADTK,XCN,CONSTR)
      IF(NUMTKS.LT.2)GO TO 510
      DO MTKS= 1,MAX
        TRKBNK(32,1,ILIST(MTKS)) = 4
      ENDDO
      NUMT=NUMTKS
      DO 500 IAVAIL=2,NUMT
            IF( NUMTKS .LT. 2  ) GO TO 510
            DCHSSV = 1.0E7
C
            DO 200 ITER=1,MXITR
                  VY(1)=XGB(1)
                  VY(2)=XGB(2)
                  VY(3)=XGB(3)
C
                  CALL REQINV(3,XGA,3,NDX,NERROR,1,XGB)
                  IF (NERROR.GT.0) THEN
                    IFIT=4
                    RETURN
                  ENDIF
C
                  IF( AMIN1(XGA(1,1),XGA(2,2),XGA(3,3)) .LT. 0.0)GO TO 529
                  DV(1)=XGB(1)
                  DV(2)=XGB(2)
                  DV(3)=XGB(3)
                  DCHSQ=VY(1)*DV(1)+VY(2)*DV(2)+VY(3)*DV(3)
C
                  IF(DCHSQ.LT.0.)GO TO 40
                  IF(DCHSQ.GT.DCHSSV)GO TO 380
                  DCHSSV = DCHSQ
                  MAX = NUMTKS
C
C ----------------->>             DONT PERMIT CORRECTIONS TOO LARGE
 36               DENOM=AMAX1(DV(1)/CTR,DV(2)/CTR,DV(3)/CTZ)
                  IF (ABS(DENOM).LT.1.E+6) GOTO 38
                  SCALE=0.3*ABS(1./AMAX1(DV(1)/CTR,DV(2)/CTR,DV(3)/CTZ))
                  IF( SCALE .GT. 1. )GO TO 38
                  DV(1) = DV(1)*SCALE
                  DV(2) = DV(2)*SCALE
                  DV(3) = DV(3)*SCALE
  38              CONTINUE
                  X(1)=X(1)-DV(1)
                  X(2)=X(2)-DV(2)
                  X(3)=X(3)-DV(3)
C
C =================>>             CONVERGENCE DECIDED HERE
                  IF(DCHSQ.LT.DCHMIN)GO TO 300
c
                  CALL VXPREP
     +                 (NUMTKS,ILIST,X,XGA,XGB,CSQTST,IBADTK,XCN,CONSTR)
                  IF(NUMTKS.LT.2)GO TO 510
                  CSQO=CSQTST
                  GO TO 200
C
 40               CONTINUE
                  IFIT=3
                  CALL INERR(522,1)
C 0522 1  10VXXYZ : INCOMPLETE CHISQ CONVERGENCE IN MXITR ITERATIONS
                  GO TO 999
 200       CONTINUE
C ----------------->>             IF HERE, THEN NUMBER OF ITERATIONS
C                                 (ITER) IS TOO SMALL.
           IFIT=2
           CALL INERR(522,1)
C 0522 1  10VXXYZ : INCOMPLETE CHISQ CONVERGENCE IN MXITR ITERATIONS
           GO TO 999
 300       CONTINUE
C
C =================>>             IF HERE, THEN PREDICTED CHANGE IN
C                                 CHISQ ACCEPTABLY SMALL. CHECK FOR
C                                 BAD TRACKS AND IF NONE , RETURN
C                                 WITH GOOD FIT.
           IF(IBADTK .NE. 0)GO TO 380
C ----------------->>             UPDATE EVERYTHING
           VXERR(1)=XGA(1,1)
           VXERR(2)=XGA(1,2)
           VXERR(3)=XGA(1,3)
           VXERR(4)=XGA(2,2)
           VXERR(5)=XGA(2,3)
           VXERR(6)=XGA(3,3)
C ----------------->>             PERMIT A CUT ON MAX ERRS FROM FIT
           CTERR2=CERRVX**2
           IF(  XGA(1,1) .GT. CTERR2  .OR.
     +          XGA(2,2) .GT. CTERR2  .OR.
     +          XGA(3,3) .GT. 36.0*CTERR2  ) GO TO 370
C ----------------->>             FIT OK IF HERE
           IFIT=0
           GO TO 999
 370       CALL INERR(526,1)
C 0526 1  10VXXYZ : VERTEX FIT FAILED - ERRORS ON X,Y,Z .GT. CUTOFF
           IFIT=6
           GO TO 999
C
 380       CONTINUE
C ----------------->>             TRK DV TOO LARGE - TRY TO REMOVE WORST
C                                 TRACK
           IDBGSV = ILIST(IBADTK)
c           IF(NUMTKS.LE.2)GO TO 510
           IF(NUMTKS.LE.2)GO TO 522
           IF(NUMTKS.EQ.IBADTK)GO TO 400
           IDBGSV = ILIST(IBADTK)
           ILIST(IBADTK)=ILIST(NUMTKS)
 400       NUMTKS=NUMTKS-1
C
           DO 415 MTKS= 1,NUMTKS
 415             ITKBNK(32,1,ILIST(MTKS)) = 4
C
           X(1) = XSV(1)
           X(2) = XSV(2)
           X(3) = XSV(3)
           CALL VXPREP(NUMTKS,ILIST,X,XGA,XGB,CSQO,IBADTK,XCN,CONSTR)
                         IF(NUMTKS.LT.2)GO TO 510
           DO 420 MTKS= 1,NUMTKS
 420             ITKBNK(32,1,ILIST(MTKS)) = 4
           MAX=NUMTKS
 500  CONTINUE
C
 510  CONTINUE
C ----------------->>             IF HERE, TOO FEW TRACKS TO CONTINUE
      IFIT=5
C     CALL INERR(525,1)
C 0525 1  10VXXYZ : TOO FEW TRACKS TO CONTINUE
      GO TO 999
 522  continue            ! tried to remove a track since dchsq > dchssv
      ifit=7              ! have too few tracks now
C ----------------->>             UPDATE EVERYTHING
           VXERR(1)=XGA(1,1)
           VXERR(2)=XGA(1,2)
           VXERR(3)=XGA(1,3)
           VXERR(4)=XGA(2,2)
           VXERR(5)=XGA(2,3)
           VXERR(6)=XGA(3,3)
      go to 999
 529  CONTINUE
      IFIT=-99
      CALL INERR(529,1)
C 0529 2  10VXXYZ : ERR MATRIX HAS NEG DIAG ELEMENTS
 999  CONTINUE
      RETURN
      END
[KLOE] [Offline Doc] [TRK Files]
Generated with Light on Thu Apr 8 13:00:16 MET DST 1999 .
Mail comments and suggestions.