[KLOE] [Offline Doc] [TRK Files]

Track Reconstruction Library

dtptrns.kloe


      subroutine prmain(ndig) 
$$IMPLICIT
C----------------------------------------------------------------------
C-
C-   Purpose and Methods :  Main routine to call pattern recognition
C-
C-   Controls:                                                          
C-                                                                      
C-                                              
C-                                                            
C-
C-   Created  20-DEC-1994   Alexander Andryakov
C-
C----------------------------------------------------------------------
      INTEGER NDIG
c
c   Prepare data for the p.r. package 
c
      call ptrnprep(ndig)
c
c   1-st stereo view ( + )
c
      call dtptrn(1)
      call dtsort(1)
c
c   2-nd stereo view ( - )
c
      call dtptrn(2)
      call dtsort(2)
      call dtdist
c
c   create YBOS banks for each t.c. (temporary put here, will go inside p.r)
c
        CALL DPRARG
c
c   merge results of 1-view p.r. to get space cand.
c
      call v_merge
c
c   0-approximation fit to get z0 and cot(theta)
c      
      call z0_ctgth
c      call ch_restor
      end
      SUBROUTINE PTRNPREP(n_hits)
$$IMPLICIT
C----------------------------------------------------------------------
C-
C-   Created  21-APR-1993   Alexander Andryakov
C-
C----------------------------------------------------------------------
$$INCLUDE 'K$ITRK:CTIDRI.INC'
$$INCLUDE 'K$ITRK:CDTHIT.INC'
$$INCLUDE 'K$ITRK:CTRACK.INC'
$$INCLUDE 'K$ITRK:MCKINE.INC'
      INTEGER N_HITS
      INTEGER IHIT_N,IHITS_CH,NLAYER_C
      INTEGER I_ST_SIGN,I_LAY,NLAY_C
      INTEGER ibuf,ibufidt,IBUFHIT_N
      REAL bufp,bufd,bufe
      DIMENSION ibuf(numhit),bufp(numhit),bufd(numhit),bufe(numhit),
     &  ibufidt(numhit),ibufhit_n(numhit)
      integer old_hit_num
      REAL btidra,btiddp,btidst,btidsc
      common/chorod/
     & btidra(nlayero),btiddp(nlayero),btidst(nlayero),btidsc(nlayero)
C
C---- Clean CWORK working area again ----------------
C
             call clean_cwork
C
C----------------------------------------------------
c
c   Prepare key-list for sorting
c
      ihit_n=0
      do ihits_ch=1,n_hits
        if(LDT(ihits_ch).lt.1) then
          call INERR(210,1)
          ibuf(ihits_ch)=3*10**5
          go to 23
        endif
c        LDT(ihits_ch)=NLAYER-LDT(ihits_ch)+1
        nlayer_c=LDT(ihits_ch)
        if(TIDST(nlayer_c).lt.0) then
          i_st_sign=1
        else
          i_st_sign=2
        endif
        ibuf(ihits_ch)=i_st_sign*10**5+LDT(ihits_ch)*1000+n_wir(ihits_ch)
        ihit_n=ihit_n+1
        ibufidt(ihits_ch)=IDT(ihits_ch)
        bufd(ihits_ch)=DTD(ihits_ch)
        bufe(ihits_ch)=DTE(ihits_ch)
        bufp(ihits_ch)=DTP(ihits_ch)
        ibufhit_n(ihits_ch)=MDT(ihits_ch)
  23  continue
      enddo
      call sortzv(ibuf,list_hit,n_hits,-1,0,0)
c
c   Fill or refill array with new order
c
      do ihits_ch=1,ihit_n
        old_hit_num=list_hit(ihits_ch)
        idtr(ihits_ch)=ibufidt(old_hit_num)
c        IDT(old_hit_num)=-999
        IDT(ihits_ch)=-999
        dtdsr(ihits_ch)=bufd(old_hit_num)
        LDT(ihits_ch)=mod(ibuf(old_hit_num),100000)/1000
        DTD(ihits_ch)=abs(dtdsr(ihits_ch))
        DTE(ihits_ch)=bufe(old_hit_num)
        DTP(ihits_ch)=bufp(old_hit_num)
        dtds(ihits_ch)=-5000.
        MDT(ihits_ch)=ibufhit_n(old_hit_num)
      enddo
c
c   Fill NLDTB-array
c
      do i_lay=1,nlayer
        NLDTB(1,i_lay)=1
        NLDTB(2,i_lay)=0
      enddo
      nlay_c=1
      do ihits_ch=1,ihit_n
        if(LDT(ihits_ch).ne.nlay_c) then
           NLDTB(1,LDT(ihits_ch))=ihits_ch
           NLDTB(2,LDT(ihits_ch))=ihits_ch
           nlay_c=LDT(ihits_ch)
        else
           NLDTB(2,LDT(ihits_ch))=ihits_ch
        endif
      enddo
c
c   Check if NLDTB has been filled correctly
c
*       write(6,'(''1 layer  first wire  last wire'')')
*     do ipr=1,nlayer
*       write(6,'(3x,i2,7x,i3,8x,i3))') ipr,NLDTB(1,ipr),NLDTB(2,ipr)
*     enddo
c      if(n_hits.gt.ihit_n) then
        CALL VZERO(IDT(ihit_n+1),numhit-ihit_n) 
        CALL VZERO(LDT(ihit_n+1),numhit-ihit_n) 
        CALL VZERO(DTP(ihit_n+1),numhit-ihit_n) 
        CALL VZERO(DTD(ihit_n+1),numhit-ihit_n) 
        n_hits=ihit_n
c      endif
c
c   Erase all arrays which have to be filled in DTPTRN
c
      LWMDTC = 0     !    current position in MB
      LWMDTL = 0     !    last usable position in MB
      LWKDTC = 0     !    last bank in KB
      LWIDTC = 0     !    last bank in IB
      LWIDT1 = 0     !    pointer to 1st track in IB
      LWIDTL = 0     !    pointer to last track in IB
      LWJDTC = 0     !    last bank in JB
      call vzero(KB(1,1),4*LWKDT)
      call vzero(IB(1,1),8*LWIDT)
      call vzero(JB(1,1),10*LWJDT)
      END
      subroutine clean_cwork
$$IMPLICIT
C----------------------------------------------------------------------
C-
C-   Purpose and Methods : clean CWORK area
C-
C-   Created  11-JUL-1994   Alexander Andryakov
C-
C----------------------------------------------------------------------
$$INCLUDE 'K$ITRK:CDTWORK.INC'
      call vzero(MB,18000)
      end
      SUBROUTINE CH_RESTOR
$$IMPLICIT
C----------------------------------------------------------------------
C-
C-   Created  26-APR-1993   Alexander Andryakov
C-
C----------------------------------------------------------------------
$$INCLUDE 'K$ITRK:CTIDRI.INC'
      INTEGER INOR
      REAL BTIDRA,BTIDDP,BTIDST,BTIDSC
      common/chorod/
     & btidra(nlayero),btiddp(nlayero),btidst(nlayero),btidsc(nlayero)
c
c   Restore original order of the chamber constant arrays
c
      do inor=1,NLAYER
        tidra(inor)=btidra(inor)
        tiddp(inor)=btiddp(inor)
        tidst(inor)=btidst(inor)
        tidsc(inor)=btidsc(inor)
      enddo
      END
C   27/11/89            MEMBER NAME  DTPTRN   (ES)          FVS
C   13/03/81            MEMBER NAME  DTPTRN   (ES)          FORTRAN
C
      SUBROUTINE DTPTRN(i_view)
$$IMPLICIT
C
C PATTERN RECOGNITION
C
C --- HARTWIG ALBRECHT --- 80-04 --- VERSION 82-10-11
C
$$INCLUDE 'K$INC:ERLEVL.INC'
$$INCLUDE 'K$ITRK:CDTHIT.INC'
$$INCLUDE 'K$ITRK:CTRACK.INC'
$$INCLUDE 'K$ITRK:CDTWORK.INC'
$$INCLUDE 'K$ITRK:CDTCUT.INC'
$$INCLUDE 'K$ITRK:CTIDRI.INC'
$$INCLUDE 'K$ITRK:CCONST.INC'
$$INCLUDE 'K$ITRK:CFLAGS.INC'
      INTEGER I_VIEW
      INTEGER MOPT,MN1,MN0,LABELT,JJ,JM,NB3,NY3,NT3,NT2,NUSED
      INTEGER NT1,LABEL8,NTX,NTX2,NTD,NTA,LABELX
      REAL CH
      REAL PB,RT2,RT3,B2,B3,GB1,GB2,DT1,DT2,DT3,V1,V2
      REAL CUR1,CUR2
      REAL CUTV0,CUTV1,CUTV2,CUTC
      INTEGER LABELM,MAZ,MR,L,NY,NZ,M,LXTR,LXT2,LXT3
C ------------------ my changes ---- A.Andryakov ----------------
C    Continuous fraction presentation of sqrt is used in original
C    code. I've changed it to standard call to intrinsic fortran 
C    function sqrt. But of course I keep the old presentation as well.
C    Logical variable cont_fract control the usage of these two poss.
C    cont_fract = .true.  - continuous fraction presentation
C               = .false. - standard fortran
C
      logical cont_fract
      data cont_fract /.false./
C
C ------------------ my changes ---- A.Andryakov ----------------
C
      REAL G1_cut,G2_cut
      REAL PD2,PD3,D1,F1,G2,F2,R4,R2,RD,B1,SDP
      REAL SDPT,CDP,CUTV,S1,G1,CHIM,C1,S1T
      REAL PD,R,RSQ,CUTP0,CUTP3,CUTPS,CUTP,CUTPHI,PIADD
      INTEGER N1,NX,ND,K2,N2,K3,N3,N4
      INTEGER NB,J,J2,LPREV,MAA,MAC,MZC,MC,LABELA,NY2,NB2
      INTEGER MMAIN,MTRACK,MDISCO,MPREV,MCURR,INEXT,IDTFL,LABELY
      LOGICAL FLSOL,FLSOL1,FLAGT
      DIMENSION GB1(2),GB2(2),MAZ(4,5)
      DIMENSION JJ(64),PB(64),CUTP(5)
      DATA CUTV0,CUTV1,CUTV2 /0.0,-1.0,-4.0/,
     +     CUTC /-0.02/
      logical entry_flag
C     ------------------------------------------------------------------
C     -------------------------------------------------  INITIALIZATION
C     ------------------------------------------------------------------
      entry_flag=.true.
      LABELM = 1
      MAZ(1,1) = 0
      MAZ(1,2) = 0
      MAZ(1,3) = 0
      MAZ(1,4) = 0
      MAZ(1,5) = 0
      MAZ(2,1) = 0
      MAZ(2,2) = 0
      MAZ(2,3) = 0
      MAZ(2,4) = 0
      MAZ(2,5) = 0
      MAZ(3,1) = 0
      MAZ(3,2) = 0
      MAZ(3,3) = 0
      MAZ(3,4) = 0
      MAZ(3,5) = 0
      LWMDTL = LWMDT
      MR = 0
      L = i_view-2
      NY = 0
      NZ = 0
      M = 1
c      CUTDNB = DTCDNB   !  0.4(7) * cell_size
c      CUTDNB = 0.477777 * cell_size
c         CUTD1 = cell_size - 0.01
c      CUTD1 = cell_size - 0.01
      LXTR = LDTXTR
      LXT2 = LDTXT2
      LXT3 = LDTXT3
      CUR1 = DTXUR1
      CUR2 = DTXUR2
C     ------------------------------------------------------------------
C     --------------------------------------------  LOOP OVER ALL WIRES
C     ------------------------------------------------------------------
 100  NB = NY + 1
      IF (NB.LE.NZ)                                GO TO 130
C     ------------------------------------------------------------------
C     ------------------------------------------------------  NEW LAYER
C     ------------------------------------------------------------------
 110  IF (L.EQ.NLAYER) RETURN    !   stereo chamber
      L = L + 2
      IF (L.gt.NLAYER) RETURN
      MAZ(2,5) = MAZ(2,4)
      MAZ(2,4) = MAZ(2,3)
      MAZ(2,3) = MAZ(2,2)
      MAZ(2,2) = MAZ(2,1)
      MAZ(3,5) = MAZ(3,4)
      MAZ(3,4) = MAZ(3,3)
      MAZ(3,3) = MAZ(3,2)
      MAZ(3,2) = MAZ(3,1)
      MAZ(4,5) = MAZ(4,4)
      MAZ(4,4) = MAZ(4,3)
      MAZ(4,3) = MAZ(4,2)
      MAZ(4,2) = MAZ(4,1)
      NZ = NLDTB(2,L)
      IF (NZ.GE.NLDTB(1,L))                        GO TO 120
      MAZ(2,1) = 0
              GO TO 110
C-----
 120  ny=nldtb(1,l)-1
c      if(entry_flag) then
c         entry_flag=.false.
         nb=ny+1
c      endif
c       write(6,'(''  l,nb,ny: '',3i4)') l,nb,ny
      MAZ(2,1) = M
      MAZ(3,1) = M
      MAZ(2,2) = MAZ(3,2)
      MAZ(2,3) = MAZ(3,3)
      MAZ(2,4) = MAZ(3,4)
      MAZ(2,5) = MAZ(3,5)
      PD = TIDDP(L)
      R = TIDRA(L)
      RSQ = R * R
C     -----------------------------------------------------------  CUTS
      CUTP0 = PD * DTXPN0
      CUTP3 = PD * DTXPN3
      CUTPS = PD * 1.1
      CUTP(1) = PD * DTXPN1
      CUTP(2) = PD * DTXPN2
      CUTP(3) = CUTP(2)
      CUTP(4) = CUTP(3)
      CUTP(5) = CUTP(4)
C     ------------------------------------------------------------------
C     -------------------------------------------  GET CLUSTER OF WIRES
C     ------------------------------------------------------------------
 130  NY = NY + 1
      IF (DTP(NY+1)-DTP(NY).GE.CUTP0
     +    . OR . NY.EQ.NZ . OR.NY.GE.NB+15)        GO TO 150
      IF (DTP(NY+1)-DTP(NY).GE.CUTPS)              GO TO 130
      IF (DTD(NY+1)+DTD(NY).GE.
     + max(cell_size(ldt(ny)),cell_size(ldt(ny+1))) - 0.01) GO TO 135
      IF (DTD(NY).LT.0.477777 * cell_size(ldt(ny)) . OR .
     +    DTD(NY+1).LT.0.477777 * cell_size(ldt(ny+1))) GO TO 130
 135  IF (DTD(NY).GT.DTD(NY+1))                    GO TO 140
      IDT(NY+1) = 0
              GO TO 130
C-----
 140  IDT(NY) = 0
              GO TO 130
C-----
 150  J = 0
      J2 = 0
      LPREV = 1
C     -------------------------------------------  SET POINTERS IN MBUF
c        write(6,'(''  l,nb,ny: '',3i4)') l,nb,ny
      MAZ(4,1) = M
      MB(1,M) = NB
      MB(2,M) = NY
      MB(1,M+2) = 0
      MB(2,M+2) = 0
      LWMDTC = M + 3
      IF (LWMDTC.LT.LWMDTL)                        GO TO 210
              GO TO 910
C
C-----------------------------------------------------------------------
C-------------------------------------------  LOOP OVER PREVIOUS LAYERS
C-----------------------------------------------------------------------
 200  MAZ(2,LPREV+1) = MAA
      IF (LPREV.EQ.LXTR)                         GO TO 600
      LPREV = LPREV + 1
 210  CUTPHI = CUTP(LPREV)
      MAA = MAZ(2,LPREV+1)
C                                                         EMPTY LAYER ?
      IF (MAA.EQ.0)                                GO TO 200
      MAC = MAZ(3,LPREV+1)
      MZC = MAZ(4,LPREV+1)
      IF (MAC.NE.MAA)                              GO TO 260
C     ------------  NEIGHBOURS IN THE PREVIOUS LAYERS AT PHI = 0 / 2*PI
      MC = MZC
      PIADD = -PI2
      ASSIGN 580 TO LABELA
 220  NY2 = MB(2,MC)
      IF (DTP(NB) - DTP(NY2) + PI2 . GT . CUTPHI)  GO TO 260
      NB2 = MB(1,MC)
              GO TO 300
C-----
 230  IF (MAC.EQ.MZC)                              GO TO 200
      MC = MAC
 240  NB2 = MB(1,MC)
      IF (DTP(NB2) - DTP(NY) + PI2 . GT . CUTPHI)  GO TO 200
      NY2 = MB(2,MC)
      PIADD = PI2
      ASSIGN 590 TO LABELA
              GO TO 300
C
C---------------------------------------------------------  NO ACTION :
C                                                          DELTAPHI = 0
 260  PIADD = 0.
      ASSIGN 570 TO LABELA
C                                                       1ST NEIGHBOUR :
      MC = MAA
 270  NB2 = MB(1,MC)
      NY2 = MB(2,MC)
      IF (DTP(NB)-DTP(NY2).LE.CUTPHI)              GO TO 280
      IF (MC.EQ.MZC)                               GO TO 230
      MC = MB(1,MC+1)
      MAA = MC
              GO TO 270
C-----
 280  IF (DTP(NB2)-DTP(NY).GT.CUTPHI)              GO TO 200
C     ------------------------------------------------------------------
C     ---------------------------------------------------------  TRACKS
C     ------------------------------------------------------------------
 300  MMAIN = MC + 2
      MTRACK = MB(1,MMAIN)
      IF (MTRACK.EQ.0)                             GO TO 550
 310  MDISCO = MMAIN
      MPREV = MTRACK
      MCURR = MTRACK
      INEXT = -1
      IDTFL = -2
      FLSOL = .FALSE.
      FLAGT = .TRUE.
C     ------------------------------------------------------------------
C     ---------------------------------  LOOP OVER WIRES OF THE CLUSTER
C     ------------------------------------------------------------------
 320  ASSIGN 420 TO LABELY
      IF (BM(2,MPREV+2).LT.0.)                     GO TO 321
      N1 = NY
      NX = NB
      ND = -1
              GO TO 330
C-----
 321  N1 = NB
      NX = NY
      ND = 1
 330  IF (IDT(N1).GE.0)  GO TO LABELY,             (420,430,440)
      K2 = MB(2,MPREV)
      N2 = KB(2,K2)
 340  PD = DTP(N2) - DTP(N1) + PIADD
      IF (ABS(PD).GT.CUTPHI)                       GO TO 410
      PD2 = BM(2,MPREV+1)
      PD3 = PD + PD2
      D1 = DTD(N1)
      K3 = KB(1,K2)
      F1 = D1 - BK(3,K2)
      G2 = BK(4,K2) + BK(4,K3)
      N3 = KB(2,K3)
      K3 = KB(1,K3)
      F2 = BK(3,K2) - BK(3,K3)
      N4 = KB(2,K3)
      R4 = TIDRA(LDT(N4))
      R2 = TIDRA(LDT(N2))
      RD = R2 - R
      IF (RD.EQ.0.)                                GO TO 350
C     --------------------------------  W1 AND W2 NOT IN THE SAME LAYER
      B1 = RD * RD + R * R2 * (PD * PD)
      SDP = B1 * BM(1,MPREV+2)
      sdpt=sqrt(SDP)
      CDP = ((R - R4)**2 + R * R4 * (PD3 * PD3) -
     +       B1 - BM(1,MPREV+2)) * 0.5 / SDP
      IF (CDP.LE.0.)                               GO TO 410
      SDP = (R  * R2 * PD  * (1. - (PD  * PD ) * .177778) +
     +       R2 * R4 * PD2 * (1. - (PD2 * PD2) * .177778) -
     +       R  * R4 * PD3 * (1. - (PD3 * PD3) * .177778)) / SDP
      CUTV = CUTV1
      IF (RD.GT.4.)  CUTV = CUTV2
      S1 = B1 - F1 * F1
      G1 = 0.5 * (RD + S1 / RD)
              GO TO 360
C
C-----------------------------------------  W1 AND W2 IN THE SAME LAYER
 350  CONTINUE
      B1 = (R * PD) * (R * PD)
      SDP = B1 * BM(1,MPREV+2)
      sdpt=sqrt(SDP)
      if (abs(sdp).lt.1.e-10) then
         write(6,1000)
     &     sdp, b1, bm(1,mprev+2), pd,
     &     n1, ldt(n1), dtp(n1),
     &     n2, ldt(n2), dtp(n2)
 1000 FORMAT(' sdp, b1, bm(1,mprev+2), pd:',4g13.5/
     &     ' n1, ldt(n1), dtp(n1): ',2i5,g13.5/
     &     ' n2, ldt(n2), dtp(n2): ',2i5,g13.5)
         go to 410
      endif
      CDP = ((R - R4)**2 + R * R4 * (PD+PD2)**2 -
     +       B1 - BM(1,MPREV+2)) * 0.5 / SDP
      IF (CDP.LE.CUTC)                             GO TO 410
      SDP = R * (R4 * (PD2 * (1. - PD2 * PD2 * .177778) -
     +                 PD3 * (1. - PD3 * PD3 * .177778)) +
     +           R  *  PD  * (1. - PD  * PD  * .177778)) / SDP
      CUTV = CUTV0
      S1 = B1 - F1 * F1
      G1 = 0.5 * (1.3 + S1)
 360  CHIM = 1.E38
      IF (LWKDTC.GT.LWKDT)                         GO TO 960
      IF (LWMDTC.GE.LWMDTL)                        GO TO 911
C     ------------------------------------------------------------------
C     -----------------------------------------  TRY RIGHT AND LEFT AMB
C     ------------------------------------------------------------------
 370  F1 = D1 - BK(3,K2)
      BM(2,LWMDTC+2) = (PD * R - F1)
      C1 = BM(2,LWMDTC+2) * BM(2,MPREV+2)
      IF (C1.LT.CUTV)                              GO TO 400
      if(cont_fract) then
        G1 = 0.5 * (G1 + S1 / G1)
        G1 = 0.5 * (G1 + S1 / G1)
        G1 = 0.5 * (G1 + S1 / G1)
      else
        if(s1.lt.0.) then
          call INERR(211,1)
          go to 400
        else
          G1 = sqrt(s1)  !  I switched off sqrt calc. via cont.fract.
        endif
      endif
      S1 = G1 + G2
      s1t=s1
C     ------------------------------------------------------  CURVATURE
      C1 = ((G1*F2 - F1*G2) * CDP -
     +      (F1*F2 + G1*G2) * SDP) / S1
      IF (ABS(C1).GT.CUR1)                         GO TO 400
C     -------------------------------------------  1 / ERROR**2 ON CURV
      S1 = (S1*S1) * (G1*G1) * (G2*G2) /
     +     (DTE(N1)*(G2*G2) + DTE(N4)*(G1*G1) + DTE(N2)*(S1*S1))
C     ------------------------------------------------  SUM 1/ERR(N)**2
      BM(2,LWMDTC+3) = S1 + BM(2,MPREV+3)
C     ------------------------------------------  CHISQ OF THE NEW WIRE
      CH = S1 * BM(2,MPREV+3) *
     +     (C1 - BM(1,MPREV+3))**2 / BM(2,LWMDTC+3)
      IF (CH.GT.chi2_pr_cut)                               GO TO 400
      IF (CH.GT.CHIM)  GO TO 380
c      call hf1(1,c1*s1t-sdp*sdpt,1.)
c      call hf1(2,c1*s1t,1.)
c      call hf1(3,sdp*sdpt,1.)
      CHIM = CH
      MOPT = LWMDTC
C     ---------------------------------------------------------  <CURV>
 380  BM(1,LWMDTC+3) = (C1 * S1 +
     +             BM(1,MPREV+3) * BM(2,MPREV+3)) / BM(2,LWMDTC+3)
C     ------------------------------------------------  FILL K - BUFFER
      LWKDTC = LWKDTC + 1
      KB(1,LWKDTC) = K2
      KB(2,LWKDTC) = N1
      BK(3,LWKDTC) = D1
      BK(4,LWKDTC) = G1
      dtds(n1)=d1
C     ------------------------------------------------ FILL TEMP BUFFER
      MB(2,LWMDTC) = LWKDTC
      MB(1,LWMDTC+1) = MPREV
      BM(2,LWMDTC+1) = BM(2,MPREV+5) + PD
      BM(1,LWMDTC+2) = (R - TIDRA(LDT(N3)))**2 +
     +              R * TIDRA(LDT(N3)) * BM(2,LWMDTC+1)**2
      MB(1,LWMDTC+4) = 0
      MB(2,LWMDTC+4) = LDT(N2)
      BM(1,LWMDTC+5) = BM(1,MPREV+5) + CH - 1.
      BM(2,LWMDTC+5) = PD
C     -----------------------------------------------  POINTERS IN MB :
      IF (.NOT.FLSOL)                              GO TO 384
      MN1 = MB(1,M+2)
      IF (BM(1,MN1+5).GE.BM(1,LWMDTC+5))           GO TO 382
      MN0 = MN1
 381  MN1 = MB(1,MN0+1)
      IF (BM(1,MN1+5).GE.BM(1,LWMDTC+5))           GO TO 383
      MN0 = MN1
              GO TO 381
C-----
 382  MB(1,LWMDTC) = MB(1,MN1)
      MB(1,MN1) = 0
      MB(1,MN1+4) = 0
      MB(1,M+2) = LWMDTC
      MB(1,LWMDTC+1) = MN1
              GO TO 390
C-----
 383  MB(1,LWMDTC) = 0
      MB(1,MN0+1) = LWMDTC
      MB(1,LWMDTC+1) = MN1
              GO TO 390
C-----
 384  FLSOL = .TRUE.
      IF (MDISCO.EQ.0)                             GO TO 386
      MB(1,LWMDTC+1) = MB(1,MDISCO)
      MB(1,MDISCO) = MB(1,MB(1,MDISCO))
      MDISCO = 0
              GO TO 387
 386  MB(1,LWMDTC+1) = MPREV
 387  MB(1,LWMDTC) = MB(1,M+2)
      MB(1,MPREV) = 0
      MB(1,M+2) = LWMDTC
 390  ASSIGN 430 TO LABELY
      INEXT = MAX0 (INEXT,MB(1,MPREV+4))
      MB(1,MPREV+4) = 0
      LWMDTC = LWMDTC + 6
 400  IF (D1.LE.0.)                                GO TO 410
      D1 = -D1
      F1 = D1 - BK(3,K2)
      S1 = B1 - F1 * F1
      G1 = 0.5 * (G1 + S1 / G1)
              GO TO 370
C
C     -----------------------------------------------------------------
C     -----------------------------------------  END OF LOOP OVER AMB'S
C----------------------------------------------------------------------
 410  CONTINUE
C
             GO TO LABELY,                         (420,430,440)
C     ---------------------------------  WIRE DOES NOT FIT TO THE TRACK
 420  IF (N1.EQ.NX)                                GO TO 490
      N1 = N1 + ND
      GO TO 330
C
C-----------------------------------------------------------  WIRE FITS
 430  ASSIGN 440 TO LABELY
      IF (.NOT.FLAGT . OR .
     +    BM(1,MPREV+5).GT.-1.5)                   GO TO 431
      IDT(N1) = -1
             GO TO 432
C-----
 431  IDT(N1) = MAX0 (IDT(N1),IDTFL)
      IDT(N2) = MAX0 (IDT(N2),IDTFL)
      IDT(N3) = MAX0 (IDT(N3),IDTFL)
      IDT(N4) = MAX0 (IDT(N4),IDTFL)
 432  IF (N1.EQ.NX)                                GO TO 480
      N1 = N1 + ND
      MTRACK = MPREV
      MPREV = MOPT
             GO TO 330
C
C-------------------------------------  WIRE DOES NOT FIT TO THE TRACK,
C                                                  BUT ANOTHER ONE DID.
 440  IF (.NOT.FLAGT)                              GO TO 460
      IF (BM(1,MCURR+5).LT.0.)                     GO TO 450
      IF (MPREV.EQ.MCURR)                          GO TO 491
      MPREV = MCURR
             GO TO 330
C-----
 450  IF (MPREV.EQ.MCURR)                          GO TO 530
      MPREV = MCURR
             GO TO 330
C-----
 460  IF (MPREV.EQ.MTRACK)                         GO TO 470
      MPREV = MTRACK
             GO TO 330
C-----
 470  IF (N1.EQ.NX)                                GO TO 510
      MPREV = MOPT
      N1 = N1 + ND
             GO TO 330
C
C     -----------------------------------------------------------------
C     -----------------------------------------  END OF LOOP OVER WIRES
C----------------------------------------------------------------------
 480  IF (BM(1,MCURR+5).GE.0.)                     GO TO 490
      IF (FLAGT)                                   GO TO 530
             GO TO 510
C
C     -----------------------------------------------------------------
C     -------------------------------------------------------  GO BACKW
C----------------------------------------------------------------------
 490  IF (.NOT.FLAGT)                              GO TO 510
 491  MPREV = MB(1,MCURR+1)
      IF (MPREV.EQ.0)                              GO TO 530
      IF (L-MB(2,MCURR+4).GT.LXTR)               GO TO 530
      IF (BM(1,MCURR+5).LT.0.)  MDISCO = MCURR + 1
      MCURR = MPREV
             GO TO 320
C
C     -----------------------------------------------------------------
C     ------------------------------------------------  EXTEND TRIPLETS
C----------------------------------------------------------------------
 500  MCURR = M + 1
      INEXT = -1
C                                                          NEXT TRIPLET
 510  MPREV = MB(1,MCURR+1)
      IF (MPREV.EQ.0)                              GO TO 520
      MCURR = MPREV
      ASSIGN 420 TO LABELY
      K2 = MB(2,MPREV)
      N2 = KB(2,K2)
C     ------------------------------------------------------------------
C     ---------------------------------  LOOP OVER WIRES OF THE CLUSTER
C     ------------------------------------------------------------------
      IF (BM(2,MPREV+2).LT.0.)                     GO TO 511
      IF (N2.EQ.NB)                                GO TO 510
      NX = NB
      ND = -1
      N1 = N2 + ND
      IF (IDT(N1).LT.0)                            GO TO 340
             GO TO 420
C-----
 511  IF (N2.EQ.NY)                                GO TO 510
      NX = NY
      ND = 1
      N1 = N2 + ND
      IF (IDT(N1).LT.0)                            GO TO 340
             GO TO 420
C
C-----------------------------------------------------  FILL I - BUFFER
 520  IF (INEXT.LT.0)  GO TO LABELT,               (691,758,818,867)
      IF (LWIDTC.EQ.LWIDT)                         GO TO 970
      LWIDTC = LWIDTC + 1
      MOPT = MB(1,M+2)
      MB(1,MOPT+4) = LWIDTC
      IB(2,LWIDTC) = 0
      IB(3,LWIDTC) = MB(2,MOPT)
      IB(7,LWIDTC) = MB(1,MOPT+3)
      IB(8,LWIDTC) = MB(1,MOPT+5)
             GO TO LABELT,                         (691,758,818,867)
C-----
 530  IF (INEXT)  540,531,532
 531  IF (LWIDTC.EQ.LWIDT)                         GO TO 970
      LWIDTC = LWIDTC + 1
      INEXT = LWIDTC
 532  MOPT = MB(1,M+2)
      MB(1,MOPT+4) = INEXT
      IB(2,INEXT) = 0
      IB(3,INEXT) = MB(2,MOPT)
      IB(7,INEXT) = MB(1,MOPT+3)
      IB(8,INEXT) = MB(1,MOPT+5)
C     -----------------------------------------------------  NEXT TRACK
 540  IF (MB(1,MMAIN).EQ.MTRACK)  MMAIN = MTRACK
      MTRACK = MB(1,MMAIN)
      IF (MTRACK.NE.0)                             GO TO 310
 550  IF (LPREV.GT.LXT3)                         GO TO 561
      J = J + 1
      if(j.ge.64) write (6,'(''  @@@ DTPTRN @@@ j ='',i4)') j
      IF (LPREV.LE.LXT2)  J2 = J
      JJ(J) = MC
      PB(J) = PIADD
C     -----------------------------------------------------------------
C     ----------------------------------------------------------  PAIRS
C     -----------------------------------------------------------------
      IF (LPREV.GT.LXT2)                         GO TO 561
      IF (LWMDTC.GE.LWMDTL)                        GO TO 912
 560  MB(1,LWMDTC) = MB(2,M+2)
      MB(2,M+2) = LWMDTC
      BM(2,LWMDTC) = PIADD
      MB(1,LWMDTC+1) = MB(1,MC)
      MB(2,LWMDTC+1) = MB(2,MC)
      LWMDTC = LWMDTC + 2
 561         GO TO LABELA,                         (580,570,590)
C     -----------------------------------------------------------------
C     -------------------------------------------------  NEXT CLUSTER :
C     -----------------------------------------------------------------
 570  IF (MC.EQ.MZC)                               GO TO 230
      MC = MB(1,MC+1)
             GO TO 270
C-----
 580  IF (MC . EQ . MAC)                           GO TO 200
      MC = MB(2,MC+1)
             GO TO 220
C-----
 590  MC = MB(1,MC+1)
             GO TO 240
C
C----------------------------------------------------------------------
C------------------------------------------------------------  TRIPLETS
C----------------------------------------------------------------------
 600  PIADD = 0.
      FLAGT = .FALSE.
      IF (J.EQ.0)                                  GO TO 850
      JM = 1
 630  MC = JJ(JM)
      NB2 = MB(1,MC)
      NY2 = MB(2,MC)
      RT2 = TIDRA(LDT(NB2))
      MC = MB(2,MC+2)
      IF (MC.EQ.0)                                 GO TO 740
C     -----------------------------------------------------------------
C     ---------------------------   A : WIRES IN THREE DIFFERENT LAYERS
C     -----------------------------------------------------------------
      IDTFL = -200
      ASSIGN 691 TO LABELT
      CUTPHI = CUTP(1)
      CUTV = CUTV1
 640  NB3 = MB(1,MC+1)
      NY3 = MB(2,MC+1)
      RT3 = TIDRA(LDT(NB3))
      NT3 = NB3
 650  NT2 = NB2
 660  NUSED = -2
      IF (IDT(NT2).GT.IDTFL)  NUSED = -1
      IF (IDT(NT3).GT.IDTFL)  NUSED = NUSED + 1
      IF (NUSED.EQ.0)  GO TO 692
      NT1 = NB
 690  IF (IDT(NT1).GE.IDTFL)  NUSED = NUSED + 1
      IF (NUSED.LT.0)                              GO TO 695
 691  IF (NT1.EQ.NY)                               GO TO 692
      NT1 = NT1 + 1
             GO TO 690
C-----
 692  NT2 = NT2 + 1
      IF (NT2.LE.NY2)                              GO TO 660
 693  NT3 = NT3 + 1
      IF (NT3.LE.NY3)                              GO TO 650
      MC = MB(1,MC)
      IF (MC.NE.0)                                 GO TO 640
             GO TO 740
C-----
 695  PD = DTP(NT2) - DTP(NT1) + PB(JM)
      PD2 = DTP(NT3) - DTP(NT2) + BM(2,MC)
      PD3 = PD + PD2
      IF (ABS(PD3).GT.CUTP(2))                     GO TO 691
      B1 = (RT2 - R)**2 + R * RT2 * (PD*PD)
      B2 = (RT3 - RT2)**2 + RT2 * RT3 * (PD2*PD2)
      B3 = (R - RT3)**2 + R * RT3 * PD3 * PD3
      CDP = (B3 - B1 - B2) * 0.5 / (B1 * B2)
      IF (CDP.LE.0.)                               GO TO 691
      SDP = (R   * RT2 * PD  * (1. - (PD  * PD ) * .177778) +
     +       RT2 * RT3 * PD2 * (1. - (PD2 * PD2) * .177778) -
     +       R   * RT3 * PD3 * (1. - (PD3 * PD3) * .177778)) / (B1 * B2)
      GB1(1) = RT2 - R
      GB1(2) = GB1(1)
      GB2(1) = RT3 - RT2
      GB2(2) = GB2(1)
 700  IF (LWMDTC.GE.LWMDTL)                        GO TO 913
 701  FLSOL  = .FALSE.
      FLSOL1 = .FALSE.
      G1_cut = G1_frac * max(cell_size(ldt(nt1)),cell_size(ldt(nt2)))
      G2_cut = G2_frac * max(cell_size(ldt(nt2)),cell_size(ldt(nt3)))
      DT1 = DTD(NT1)
      DT2 = DTD(NT2)
      DT3 = DTD(NT3)
      F1 = DT1 - DT2
      V1 = PD  * R -   F1
      S1 = B1 - F1 * F1
      if(cont_fract) then
        GB1(1) = 0.5 * (GB1(1) + S1 / GB1(1))
        GB1(1) = 0.5 * (GB1(1) + S1 / GB1(1))
        GB1(1) = 0.5 * (GB1(1) + S1 / GB1(1))
      else
        if(s1.lt.0.) then
cw          write(6,'('' !!! 701 s1,gb1(1) '',2g12.5)') s1,gb1(1)
          call INERR(212,1)
          s1=abs(s1)
          go to 730
        else
          GB1(1)=sqrt(s1)  !  I switched off sqrt calc. via cont.fract.
        endif
      endif
      G1 = GB1(1)
      F2 = DT2 - DT3
      V2 = PD2 * RT2 - F2
      S1 = B2 - F2 * F2
      if(cont_fract) then
        GB2(1) = 0.5 * (GB2(1) + S1 / GB2(1))
        GB2(1) = 0.5 * (GB2(1) + S1 / GB2(1))
        GB2(1) = 0.5 * (GB2(1) + S1 / GB2(1))
      else
        if(s1.lt.0.) then
cw          write(6,'('' !!! 701 s1,gb2(1) '',2g12.5)') s1,gb2(1)
          call INERR(213,1)
          s1=abs(s1)
          go to 730
        else
          GB2(1)=sqrt(s1)  !  I switched off sqrt calc. via cont.fract.
        endif
      endif
      G2 = GB2(1)
C     -----------------------------------------------------------------
C     --------------------------------------------------  8 AMBIGUITIES
C     -----------------------------------------------------------------
      ASSIGN 702 TO LABEL 8
             GO TO 710
C-----
 702  DT1 = - DT1
      F1 = DT1 - DT2
      V1 = PD * R - F1
      S1 = B1 - F1 * F1
      if(cont_fract) then
        GB1(2) = 0.5 * (GB1(2) + S1 / GB1(2))
        GB1(2) = 0.5 * (GB1(2) + S1 / GB1(2))
        GB1(2) = 0.5 * (GB1(2) + S1 / GB1(2))
      else
        if(s1.lt.0.) then
cw          write(6,'('' !!! 702 s1,gb1(2) '',2g12.5)') s1,gb1(2)
          call INERR(214,1)
          s1=abs(s1)
          go to 730
        else
          GB1(2)=sqrt(s1)  !  I switched off sqrt calc. via cont.fract.
        endif
      endif
      G1 = GB1(2)
      ASSIGN 703 TO LABEL 8
             GO TO 710
C-----
 703  FLSOL1 = .FALSE.
      DT3 = - DT3
      F2 = DT2 - DT3
      V2 = PD2 * RT2 - F2
      S1 = B2 - F2 * F2
      if(cont_fract) then
        GB2(2) = 0.5 * (GB2(2) + S1 / GB2(2))
        GB2(2) = 0.5 * (GB2(2) + S1 / GB2(2))
        GB2(2) = 0.5 * (GB2(2) + S1 / GB2(2))
      else
        if(s1.lt.0.) then
cw          write(6,'('' 703 s1,gb2(2):'',2g12.5)') s1,gb2(2)
          call INERR(215,1)
          s1=abs(s1)
          go to 730
        endif
        GB2(2)=sqrt(s1)  !  I switched off sqrt calc. via cont.fract.
      endif
      G2 = GB2(2)
      ASSIGN 704 TO LABEL 8
             GO TO 710
C-----
 704  DT1 = - DT1
      F1 = DT1 - DT2
      V1 = PD * R - F1
      G1 = GB1(1)
      ASSIGN 705 TO LABEL 8
             GO TO 710
C-----
 705  FLSOL1 = .FALSE.
      DT2 = - DT2
      F1 = DT1 - DT2
      V1 = PD * R - F1
      G1 = GB1(2)
      F2 = DT2 - DT3
      V2 = PD2 * RT2 - F2
      G2 = GB2(1)
      ASSIGN 706 TO LABEL 8
             GO TO 710
C-----
 706  DT1 = - DT1
      F1 = DT1 - DT2
      V1 = PD * R - F1
      G1 = GB1(1)
      ASSIGN 707 TO LABEL 8
             GO TO 710
C-----
 707  FLSOL1 = .FALSE.
      DT3 = - DT3
      F2 = DT2 - DT3
      V2 = PD2 * RT2 - F2
      G2 = GB2(2)
      ASSIGN 708 TO LABEL 8
             GO TO 710
C-----
 708  DT1 = - DT1
      F1 = DT1 - DT2
      V1 = PD * R - F1
      G1 = GB1(1)
      ASSIGN 730 TO LABEL 8
 710  IF (V1 * V2 .LT.CUTV)                        GO TO 720
      S1 = G1 + G2
      C1 = ((G1*F2 - F1*G2) * CDP -
     +      (F1*F2 + G1*G2) * SDP) / S1
      IF (ABS(C1).GT.CUR1)                         GO TO 720
      IF (G1.LE.G1_cut)                            GO TO 711
      IF (G2.GT.G2_cut)                            GO TO 712
 711  IF (ABS(C1).GT.CUR2)                         GO TO 720
 712  S1 = (S1*S1) * (G1*G1) * (G2*G2) /
     +     (DTE(NT1)*(G2*G2) + DTE(NT3)*(G1*G1) + DTE(NT2)*(S1*S1))
C     ------------------------------------------------  FILL K - BUFFER
      IF (.NOT.FLSOL1)                             GO TO 715
      LWKDTC = LWKDTC + 1
      KB(1,LWKDTC) = LWKDTC - 2
             GO TO 716
C-----
 715  LWKDTC = LWKDTC + 3
      IF (LWKDTC.GT.LWKDT)                         GO TO 960
      KB(1,LWKDTC-2) = 0
      KB(2,LWKDTC-2) = NT3
      BK(3,LWKDTC-2) = DT3
      dtds(nt3)=dt3
      KB(4,LWKDTC-2) = 0
      KB(1,LWKDTC-1) = LWKDTC - 2
      KB(2,LWKDTC-1) = NT2
      BK(3,LWKDTC-1) = DT2
      dtds(nt2)=dt2
      BK(4,LWKDTC-1) = G2
      KB(1,LWKDTC) = LWKDTC - 1
 716  KB(2,LWKDTC) = NT1
      BK(3,LWKDTC) = DT1
      dtds(nt1)=dt1
      BK(4,LWKDTC) = G1
C     ----------------------------------------------------------  FLAGS
      IDT(NT3) = MAX0 (IDT(NT3),IDTFL)
      IDT(NT2) = MAX0 (IDT(NT2),IDTFL)
      IDT(NT1) = MAX0 (IDT(NT1),IDTFL)
C     ------------------------------------------------ FILL TEMP BUFFER
      MB(2,LWMDTC) = LWKDTC
      BM(2,LWMDTC+1) = PD3
      BM(1,LWMDTC+2) = B3
      BM(2,LWMDTC+2) = V1
      BM(1,LWMDTC+3) = C1
      BM(2,LWMDTC+3) = S1
      MB(1,LWMDTC+4) = 0
      MB(2,LWMDTC+4) = LDT(NT2)
      BM(1,LWMDTC+5) = 0.
      BM(2,LWMDTC+5) = PD
C     ---------------------------------------------  SET POINTERS IN MB
      IF (FLSOL)                                   GO TO 718
      MB(1,LWMDTC) = MB(1,M+2)
      MB(1,LWMDTC+1) = 0
      MB(1,M+2) = LWMDTC
             GO TO 719
C-----
 718  MB(1,LWMDTC) = MB(1,MB(1,M+2))
      MB(1,MB(1,M+2)) = 0
      MB(1,LWMDTC+1) = MB(1,M+2)
      MB(1,M+2) = LWMDTC
 719  FLSOL = .TRUE.
      FLSOL1 = .TRUE.
      LWMDTC = LWMDTC + 6
 720         GO TO LABEL 8, (702,703,704,705,706,707,708,730)
 730  CONTINUE
      IF (FLSOL . AND . NT1.NE.NTX)                GO TO 500
             GO TO LABELT,                         (691,758,818,867)
C
C     -----------------------------------------------------------------
C     ---------------------  TRIPLETS   B : W2 AND W3 IN THE SAME LAYER
C----------------------------------------------------------------------
 740  CUTPHI = CUTP(2)
      CUTV = CUTV0
      IF (JM.GT.J2)                                GO TO 840
      IF (NB2.EQ.NY2)                              GO TO 800
      ASSIGN 758 TO LABELT
      IDTFL = JM - 400
      NT2 = NB2
      NTX2 = NY2
      NTD = -1
      NTX = NB
      NTA = NY
 750  NT3 = NT2 - NTD
      IF (IDT(NT2).LE.IDTFL)                       GO TO 751
      IF (IDT(NT3).GT.IDTFL)                       GO TO 759
 751  IF (IDT(NT2).GE.-1)                          GO TO 759
      IF (IDT(NT3).GE.-1)                          GO TO 759
      PD2 = DTP(NT3) - DTP(NT2)
      NT1 = NTA
 752  IF (IDT(NT1).GT.IDTFL)                       GO TO 758
c absence of this line seems to be a bug (A.Andryakov)
      PD2 = DTP(NT3) - DTP(NT2)
c
      PD = DTP(NT2) - DTP(NT1) + PB(JM)
      IF (ABS(PD).GT.CUTP3)                        GO TO 758
      PD3 = PD + PD2
      B1 = (RT2 - R)**2 + RT2 * (R*PD) * PD
      B2 = (RT2 * PD2)**2
      B3 = (R-RT2)**2 + R * RT2 * PD3 * PD3
C
C THE FOLLOWING SHOULD NEVER HAPPEN.....WHAT DOES IT MEAN??
      IF (B1.EQ.0.) THEN
        B1 = 1.
        CALL ERLOGR('DTPTRNS',ERWARN,0,0,
     +              'B1=0. AT LINE 1739')
      ENDIF
      IF (B2.EQ.0.) THEN
        B2 = 1.
        CALL ERLOGR('DTPTRNS',ERWARN,0,0,
     +              'B2=0. AT LINE 1739')
      ENDIF
      CDP = (B3 - B1 - B2) * 0.5 / (B1 * B2)
      IF (CDP.LE.CUTC)                             GO TO 758
C
      SDP = RT2 * (R   * (PD  * (1. - PD  * PD  * .177778) -
     +                    PD3 * (1. - PD3 * PD3 * .177778)) +
     +             RT2 *  PD2 * (1. - PD2 * PD2 * .177778)) / (B1 * B2)
      GB1(1) = RT2 - R
      GB1(2) = GB1(1)
      GB2(1) = max(cell_size(ldt(nt1)),cell_size(ldt(nt2)))
      GB2(2) = 0.5*GB2(1)/3.
             GO TO 700
C-----
 758  IF (NT1.EQ.NTX)                              GO TO 759
      NT1 = NT1 + NTD
             GO TO 752
C-----
 759  IF (NT3.EQ.NTX2)                             GO TO 760
      NT2 = NT3
             GO TO 750
C-----
 760  IF (NTD.GT.0)                                GO TO 800
      NT2 = NY2
      NTX2 = NB2
      NTD = 1
      NTX = NY
      NTA = NB
             GO TO 750
C
C     -----------------------------------------------------------------
C     --------------------  TRIPLETS   C : W1 AND W2 IN THE SAME LAYER
C----------------------------------------------------------------------
 800  IF (NB.EQ.NY)                                GO TO 840
      ASSIGN 818 TO LABELT
      IDTFL = -600
      NT3 = NB2
      NTX2 = NY2
      NTD = -1
      NTX = NB
      NTA = NY
 810  IF (IDT(NT3).GT.-300)                        GO TO 819
      NT2 = NTA
 811  NT1 = NT2 + NTD
      IF (IDT(NT1).GE.-1)                          GO TO 818
      IF (IDT(NT2).GE.-1)                          GO TO 818
      IF (IDT(NT1).GE.JM-400)                      GO TO 812
      IF (IDT(NT2).LT.JM-400)                      GO TO 813
 812  IF (IDT(NT1).LE.IDTFL)                       GO TO 813
      IF (IDT(NT2).GT.IDTFL)                       GO TO 818
 813  PD2 = DTP(NT3) - DTP(NT2) + PB(JM)
      IF (ABS(PD2).GT.CUTP3)                       GO TO 818
      PD = DTP(NT2) - DTP(NT1)
      PD3 = PD + PD2
      B1 = RSQ * (PD*PD)
      B2 = (RT2 - R)**2 + R * RT2 * PD2 * PD2
      B3 = (RT2-R)**2 + R * (RT2*PD3) * PD3
      CDP = (B3 - B1 - B2) * 0.5 / (B1 * B2)
      IF (CDP.LE.CUTC)                             GO TO 818
      SDP = R * (RT2 * (PD2 * (1. - PD2 * PD2 * .177778) -
     +                  PD3 * (1. - PD3 * PD3 * .177778)) +
     +           R   *  PD  * (1. - PD  * PD  * .177778)) / (B1 * B2)
      GB1(1) = max(cell_size(ldt(nt1)),cell_size(ldt(nt3)))
      GB1(2) = 0.5*GB1(1)/3.
      GB2(1) = RT2 - R
      GB2(2) = GB1(1)
             GO TO 700
C-----
 818  IF (NT1.EQ.NTX)                              GO TO 819
      NT2 = NT1
             GO TO 811
C-----
 819  IF (NT3.EQ.NTX2)                             GO TO 820
      NT3 = NT3 - NTD
             GO TO 810
C-----
 820  IF (NTD.GT.0)                                GO TO 840
      NT3 = NY2
      NTX2 = NB2
      NTD = 1
      NTX = NY
      NTA = NB
             GO TO 810
C-----
 840  JM = JM + 1
      IF (JM.LE.J)                                 GO TO 630
C     -----------------------------------------------------------------
C     -------------------------------   D : ALL WIRES IN THE SAME LAYER
C     -----------------------------------------------------------------
 850  IF (NY-NB.LE.1)                              GO TO 900
      ASSIGN 867 TO LABELT
      CUTPHI = CUTP(1)
      CUTV = CUTV0
      IDTFL = -900
      NT3 = NB
      NTX2 = NY - 2
      NTD = 1
      NTX = NY
      NTA = 2
      RT2 = R
 860  IF (IDT(NT3).GE.-1)                          GO TO 870
      NT1 = NT3 + NTA
      IF (IDT(NT1).GE.-1)                          GO TO 869
 861  NT2 = NT3 + NTD
      IF (IDT(NT2).GE.-1)                          GO TO 868
 862  NUSED = 0
      IF (IDT(NT3).GE.IDTFL)  NUSED = NUSED + 1
      IF (IDT(NT2).GE.IDTFL)  NUSED = NUSED + 1
      IF (IDT(NT1).GE.IDTFL)  NUSED = NUSED + 1
      IF (NUSED.GT.1)                              GO TO 868
      PD = DTP(NT2) - DTP(NT1)
      PD2 = DTP(NT3) - DTP(NT2)
      PD3 = PD + PD2
      IF (ABS(PD3).GT.CUTP3)                       GO TO 868
      GB1(1) = cell_size(ldt(nt1))
      GB2(1) = GB1(1)
      GB1(2) = 0.5*GB1(1)/3.
      GB2(2) = GB1(2)
      B1 = (RSQ*PD) * PD
      B2 = RSQ * PD2 * PD2
      B3 = RSQ * PD3 * PD3
      CDP = (B3 - B1 - B2) * 0.5 / (B1 * B2)
      SDP = RSQ * (PD  * (1. - PD  * PD  * .177778) +
     +             PD2 * (1. - PD2 * PD2 * .177778) -
     +             PD3 * (1. - PD3 * PD3 * .177778)) / (B1 * B2)
             GO TO 700
C-----
 867  IDTFL = IDTFL - 1
 868  NT2 = NT2 + NTD
      IF (NT2.NE.NT1)                              GO TO 862
 869  IF (NT1.EQ.NTX)                              GO TO 870
      NT1 = NT1 + NTD
             GO TO 861
C-----
 870  IF (NT3.EQ.NTX2)                             GO TO 880
      NT3 = NT3 + NTD
             GO TO 860
C-----
 880  IF (NTD.LT.0)                                GO TO 900
      IDTFL = -800
      NT3 = NY
      NTX2 = NB + 2
      NTD = -1
      NTX = NB
      NTA = -2
             GO TO 860
C
C-----------------------------------------------------------------------
C-----------------------------------------------------------  NEXT WIRE
C-----------------------------------------------------------------------
 900  MB(1,M+1) = LWMDTC
      MB(2,M+1) = MR
      MR = M
      M = LWMDTC
             GO TO 100
C
C     ------------------------------------------------------------------
C     -------------------------------------------  OVERWRITE M - BUFFER
C-----------------------------------------------------------------------
 910  LABELM = LABELM + 1
 911  LABELM = LABELM + 1
 912  LABELM = LABELM + 1
 913  LABELX = LABELM
      LABELM = 1
      IF (LWMDTL.NE.LWMDT)                         GO TO 930
      LWMDTC = 1
 920  LWMDTL = MAZ(3,LXTR+1) - 16
             GO TO (701,560,370,210), LABELX
C-----
 930  IF (LWMDTL-MAZ(3,LXTR+1) + 16)  920,950,940
 940  LWMDTL = LWMDT
             GO TO (701,560,370,210), LABELX
C
C     ------------------------------------------------------------------
C     ------------------------------------------------  BUFFER OVERFLOW
C-----------------------------------------------------------------------
 950  CALL INERR (203,1)
             RETURN
C-----
 960  CALL INERR (204,1)
             RETURN
C-----
 970  CALL INERR (205,1)
             RETURN
 9410 FORMAT (5I5,L5,9I5,L5)
      END
C   27/11/89            MEMBER NAME  DTSORT   (ES)          FVS
      SUBROUTINE DTSORT(i_view)
$$IMPLICIT
C
C SELECT THE BEST TRACK CANDIDATES FOUND BY DTPTRN
C
C --- HARTWIG ALBRECHT --- 80-05
C --- HARTWIG ALBRECHT --- 82-01
C --- HARTWIG ALBRECHT --- 83-10
C
$$INCLUDE 'K$ITRK:CFLAGS.INC'
$$INCLUDE 'K$ITRK:CDTHIT.INC'
$$INCLUDE 'K$ITRK:CDTCUT.INC'
$$INCLUDE 'K$ITRK:CTRACK.INC'
$$INCLUDE 'K$ITRK:CUWORK.INC'
$$INCLUDE 'K$ITRK:CTIDRI.INC'
      INTEGER I_VIEW
      INTEGER NWORK
      COMMON /CUWORK/  NWORK(512)
      INTEGER I_VIEW_S,K,I,I1,I2,I3,I4,I0,KC,LF,N,LL
C
      IF (LWIDTC.EQ.0)  RETURN
      if(tidst(i_view).lt.0) then
        i_view_s = 6
      else
        i_view_s = 4
      endif
C-------------------------------------------------  SORT WORKING SPACE
      K = 0
      DO 100 I=1,LWIDTC
      IF (IB(2,I).NE.0 . OR . IB(3,I).EQ.0)  GO TO 100
      K = K + 1
      NWORK(K) = I
 100  CONTINUE
      IF (K.EQ.0)  RETURN
C---------------------------------------------------------------  SORT
      I1 = K
 110  I1 = I1 / 2
      IF (I1.EQ.0)  GO TO 140
      I2 = K - I1
      DO 130 I3=1,I2
      I4 = I3
 120  IF (I4.LT.1)  GO TO 130
      IF (BI(8,NWORK(I4+I1)).GE.BI(8,NWORK(I4)))  GO TO 130
      I0 = NWORK(I4)
      NWORK(I4) = NWORK(I4+I1)
      NWORK(I4+I1) = I0
      I4 = I4 - I1
      GO TO 120
 130  CONTINUE
      GO TO 110
C--------------------------------------------------------  SET POINTERS
 140  IF (LWIDTL.NE.0)  GO TO 150
      LWIDT1 = NWORK(1)
      GO TO 160
 150  IB(1,LWIDTL) = NWORK(1)
      I1 = LWIDTL
 160  IF (K.EQ.1)  GO TO 180
      DO 170 I=2,K
 170  IB(1,NWORK(I-1)) = NWORK(I)
 180  IB(1,NWORK(K)) = 0
C--------------------------------------------------  SELECT GOOD TRACKS
      I = NWORK(1)
 200  I2 = IB(1,I)
      IF (IB(2,I).NE.0)  GO TO 330
      IB(5,I) = i_view
      IB(i_view_s,I) = 0
      KC = 0
      K = IB(3,I)
      LF = 0
 210  N = KB(2,K)
      IF (IDT(N).GT.0) GO TO 250
      IF (LF.EQ.0)   LF = LDT(N)
      IB(i_view_s,I) = IB(i_view_s,I) + 1
      KC = K
      K = KB(1,K)
      IF (K.NE.0)  GO TO 210
      GO TO 300
C-----------------------------------------------  WIRE ALREADY ASSIGNED
 250  BI(8,I) = BI(8,I) + 1.
      IF (KC.EQ.0)  GO TO 260
      BK(4,KC) = BK(4,KC) + BK(4,K)
      K = KB(1,K)
      KB(1,KC) = K
      IF (K.NE.0)  GO TO 210
      GO TO 300
 260  IB(3,I) = KB(1,K)
      K = KB(1,K)
      IF (K.NE.0)  GO TO 210
 300  LL = LDT(N)
c      IF (LL.EQ.LF)  GO TO 400
      IF (IB(i_view_s,I).LT.4)  GO TO 400
      IF (I2.EQ.0)  GO TO 310
      IF (BI(8,I).GT.BI(8,I2))  GO TO 340
C---------------------------------------------  MARK THE ASSIGNED WIRES
 310  LWJDTC = LWJDTC + 1
      LWIDTL = I
      IB(2,I) = LWJDTC
      JB(1,LWJDTC) = 0
      JB(9,LWJDTC) = 1
c      IB(4,I) = 0
c      IB(6,I) = 0
      K = IB(3,I)
 320  IDT(KB(2,K)) = I
      K = KB(1,K)
      IF (K.NE.0)  GO TO 320
 330  I1 = I
      GO TO 430
C-------------------------------------------------------------  REORDER
 340  I3 = IB(1,I)
 350  I4 = I3
      I3 = IB(1,I4)
      IF (I3.EQ.0)  GO TO 360
      IF (BI(8,I).GT.BI(8,I3))  GO TO 350
 360  IB(1,I4) = I
      IB(1,I) = I3
      GO TO 410
 400  IB(3,I) = 0
 410  IF (I1.NE.0)  GO TO 420
      LWIDT1 = I2
      GO TO 430
 420  IB(1,I1) = I2
 430  IF (LWJDTC.GE.LWJDT)  GO TO 600
      I = I2
      IF (I.NE.0)  GO TO 200
 500  IF (LWIDT1.LE.0) LWIDTC = 0
      RETURN
 600  CALL INERR (206,1)
      IB(1,I) = 0
      LWIDTL = 0
      GO TO 500
      END
C   27/11/89            MEMBER NAME  DTDIST   (ES)          FVS
      SUBROUTINE DTDIST
$$IMPLICIT
C
C     H.SCHROEDER VERSION 20-03-81
C     H.ALBRECHT  VERSION 26-01-82
C     H.SCHROEDER VERSION 05-03-83
C     H.SCHROEDER VERSION 28-08-83
C-----CALCULATES THE TRACK PARAMETERS :
C-----                 D : DISTANCE OF CLOSEST APPROACH
C-----                 X0: X VALUE AT D
C-----                 Y0: Y VALUE AT D
C-----                 XR: X VALUE AT FIRST LAYER WITH RADIUS R
C-----                 YR: Y VALUE AT FIRST LAYER WITH RADIUS R
C-----THESE VALUES ARE STORED IN THE BJ-BANK
C----------------------------------------------------------------------
C-   Updated   3-DEC-1993   Alexander Andryakov
C----------------------------------------------------------------------
$$INCLUDE 'K$ITRK:CTRACK.INC'
$$INCLUDE 'K$ITRK:CDTHIT.INC'
$$INCLUDE 'K$ITRK:CTIDRI.INC'
$$INCLUDE 'K$ITRK:CFLAGS.INC'
$$INCLUDE 'K$ITRK:CCONST.INC'
C
c      COMMON /CUWORK/ DTXH(256),DTYH(256)
      INTEGER I,ILAST,J,NHIT,K1,K2,NHIM,IN,IC,I2
      REAL R2,P2,R,P,PD,SP,CP,X1,Y1,CPD,X2,Y2
      REAL CEN,RHONEW,RHOSQ,QD,X0,Y0,RADSQ,RT
      REAL XQ,YQ,T0X,T0Y,TQX,TQY,TTQ0,Q,D,PSI,SPP,CPP
      REAL D1,D2,FAKY,FAKX,DTXH,DTYH,XP,YP,XC,YC
      dimension DTXH(256),DTYH(256)
      DOUBLE PRECISION XA,YB,DET,SXX,SXXP,SXY,SXPXP,SXPY,SIGMA,FY
     +,DX1,DY1
C
C-----LOOP OVER ALL TRACKS
      IF (LWIDTC.EQ.0)  RETURN
      I = LWIDT1
      ILAST = 0
 10   CONTINUE
      J = IB(2,I)
      if(j.ge.LWJDT) write (6,'(''  @@@ DTDIST @@@ j ='',i4)') j
      IF (JB(9,J).EQ.0)  GO TO 90
C
C-----LOOP OVER THE WIRES OF THE TRACK
      NHIT = 0
      K1 = IB(3,I)
 20   K2 = KB(1,K1)
      IF (K2.EQ.0)  GO TO 30
      R2 = TIDRA(LDT(KB(2,K2)))
      P2 = DTP(KB(2,K2))
      R = TIDRA(LDT(KB(2,K1)))
      P = DTP(KB(2,K1))
      PD = P2 - P
      IF (PD.GT.PI) PD = PD - PI2
      IF (PD.LT.-PI) PD = PD + PI2
      SP = SIN(P)
      CP = COS(P)
      X1 = R * CP
      Y1 = R * SP
      CPD = 1. - 0.5*PD*PD
      X2 = R2 * (CPD*CP-SP*PD)
      Y2 = R2 * (CPD*SP+CP*PD)
      D1 = BK(3,K1)
      D2 = BK(3,K2)
      FAKY = (R - R2)**2 +  R * R2 * PD * PD
      FAKX = ((D2-D1) * (X2-X1) + BK(4,K1) * (Y2-Y1)) / FAKY
      FAKY = (BK(4,K1) * (X2-X1) - (D2-D1) * (Y2-Y1)) / FAKY
      NHIT = NHIT + 2
      if(nhit.gt.256) then
        nhit = 256
        call INERR(207,1)
      endif
      NHIM = NHIT-1
      DTXH(NHIM) = X1 - D1 * FAKX
      DTYH(NHIM) = Y1 + D1 * FAKY
      DTXH(NHIT) = X2 - D2 * FAKX
      DTYH(NHIT) = Y2 + D2 * FAKY
c
c  Save x,y of the hit in /CDTHIT/ for 3-d pt.r.
c
      DTXH_K(LIST_HIT(KB(2,K1))) = DTXH(NHIM)
      DTYH_K(LIST_HIT(KB(2,K1))) = DTYH(NHIM)
      DTXH_K(LIST_HIT(KB(2,K2))) = DTXH(NHIT)
      DTYH_K(LIST_HIT(KB(2,K2))) = DTYH(NHIT)
c
c
c
 25   CONTINUE
      K1 = KB(1,K2)
      IF (K1.NE.0)  GO TO 20
 30   CONTINUE
C
C-----DETERMINE FIXED POINT ON THE TRACK
      IN = NHIT
      XP = DTXH(IN)
      YP = DTYH(IN)
      SXX = 0.
      SXXP = 0.
      SXY = 0.
      SXPXP = 0.
      SXPY = 0.
c      write (6,'(''  dtdist track can :'',i4/''    x           y'')') i
      DO 50 IC=1,NHIT
c          write (6,'(2g11.4)') DTXH(IC),DTYH(IC)
      DX1 = DTXH(IC) - XP
      DY1 = DTYH(IC) - YP
      IF ( IC.EQ.IN ) GOTO 50
      FY = DX1**2 + DY1**2
      IF (FY.EQ.0.) GOTO 50
      SIGMA = 0.0001*FY
      SXX = SXX + DX1*DX1*SIGMA
      SXXP = SXXP + DX1*DY1*SIGMA
      SXY = SXY + DX1*FY*SIGMA
      SXPXP = SXPXP + DY1*DY1*SIGMA
      SXPY = SXPY + DY1*FY*SIGMA
  50  CONTINUE
      DET = SXX*SXPXP - SXXP*SXXP
      XA = -0.5 * ( SXY*SXPXP - SXXP*SXPY ) / DET
      YB = -0.5 * ( SXX*SXPY -SXY*SXXP ) / DET
      XC = XP - XA
      YC = YP - YB
      CEN = SQRT( XC*XC + YC*YC )
      RHONEW = DSQRT( XA*XA + YB*YB )
      RHOSQ = RHONEW*RHONEW
      QD = RHONEW - CEN
      X0 = - QD*XC/CEN
      Y0 = - QD*YC/CEN
      I2 = NHIT/2
      RADSQ = DTXH(I2)**2 + DTYH(I2)**2
      RT = RHOSQ - RADSQ - CEN*CEN
      DX1 = 0.5 * DTYH(I2) * ( RT + 2.*XC*DTXH(I2) +2.*YC*DTYH(I2) ) /
     +      ( YC*DTXH(I2) - XC*DTYH(I2) )
      DY1 = - DTXH(I2) * DX1 / DTYH(I2)
      XQ = DTXH(I2) + DX1
      YQ = DTYH(I2) + DY1
      T0X =   X0 - XC
      T0Y =   Y0 - YC
      TQX =   XQ - XC
      TQY =   YQ - YC
      TTQ0 =  T0Y*TQX - T0X*TQY
      Q = SIGN(1.,TTQ0)
      D = Q*QD
C
C-----FILL J-BUFFER
C
      BJ(2,J) = D
      RADSQ = DTXH(1)**2 + DTYH(1)**2
      RT = RHOSQ - RADSQ - CEN*CEN
      DX1 = 0.5 * DTYH(1) * ( RT + 2.*XC*DTXH(1) +2.*YC*DTYH(1) ) /
     +      ( YC*DTXH(1) - XC*DTYH(1) )
      IF (DABS(DX1).GT.0.3) DX1=0.
      DY1 = - DTXH(1) * DX1 / DTYH(1)
      BJ(4,J) = DTXH(1) + DX1
      BJ(5,J) = DTYH(1) + DY1
      BJ(3,J) = 0.
      BJ(6,J) = 0.
      BJ(8,J) = 0.
      BJ(10,J) = (BJ(4,J) -X0 )**2 + (BJ(5,J) - Y0)**2
      PSI = .25 * BJ(10,J) / RHOSQ
      PSI = RHONEW * PSI * (0.5 + 0.125 * PSI)
      BJ(10,J) = SQRT( BJ(10,J) + (5.33333 * PSI * PSI) )
      PSI = BJ(10,J) / RHONEW
      SPP = Q*(XC-BJ(4,J))/CEN
      CPP = -Q*(YC-BJ(5,J))/CEN
      BJ(7,J) = ATAN2 (SPP,CPP)
      JB(9,J) = 1
      ILAST = I
C 
C------------ for debugging only -------------
C 
c      BI(8,I) = BI(7,I)
C 
C------------ for debugging only -------------
C 
      BI(7,I) = 0.5 * Q / RHONEW
 90   I = IB(1,I)
      IF (I.NE.0)  GO TO 10
      RETURN
      END
[KLOE] [Offline Doc] [TRK Files]
Generated with Light on Thu Apr 8 13:00:16 MET DST 1999 .
Mail comments and suggestions.