*-- Author : R. Henderson SUBROUTINE FPLINT C C--- Routine finds all interections between any two planes (defined by C--- clusters)from different wire orientations within the same C--- supermodule C--- C C--- *KEEP,FPPRAM. C C--- MAXSEG is maximum number of segments per supermodule C--- MAXCON is maximum number of amibiguous segments associatable with C--- one segment C--- LIMSTO is maximum number of 2 cluster planes intersections to be C--- stored per supermodule C--- MSEGLM is maximum number of clusters that can be found before C--- connectivity considered C--- MAXCLU is maximum number of clusters that can be found after C--- forming non-connected set MUST BE 50 IF RUN WITH OLD RCW C--- (cluster = 3/4 digits found in a straight line in one C--- 4-wire orientation) C PARAMETER (MAXSEG = 200) PARAMETER (MAXCON = 100) PARAMETER (LIMSTO = 5000) PARAMETER (MSEGLM = 150) PARAMETER (MAXCLU = 50) C--- *KEND. C--- *KEEP,FPLGEO. C--- COMMON /FPLGEO/ ZPLAN(36) , TP(9) , YP(26) , PLANE(3,9), 1 RMAX , RMIN , YSTART , YSPACE , 2 X0 , Y0 , PZSTRU (8), STAGER , 3 RESOL , ACUT , CTP(9) , STP(9) C--- *KEND. C--- *KEEP,FPCLUS. COMMON /FPCLUS/ TC(3,9,MAXCLU) , NTC(9) , TOC(3,9,MAXCLU) , 2 TCYUV(4,9,MAXCLU), TCYUVW(4,9,MAXCLU) C--- *KEND. C--- *KEEP,FPH1WRK. PARAMETER (MAXHTS=200) PARAMETER (NUMWPL=36) PARAMETER (MAXTRK=200) PARAMETER (MXTTRK=900) PARAMETER (MAXTR3=200) PARAMETER (MAXHPW=2) PARAMETER (MAXDIG=2000) PARAMETER (NUMRWR=1727) PARAMETER (NUMPWR=1151) LOGICAL DRMASK COMMON /H1WORK/ C-- *KEEP,FPCSEG. C--- 3 TPNORM(3,9,MAXCLU), PCONST(9,MAXCLU) , 4 SMLS(4,2,LIMSTO,3) , C--- C-- *KEEP,FPDIGI. 5 DRSTO(MSEGLM,4),NDRSTO(4), 6 IDIGST(4,MSEGLM), 7 SEGTAB(MSEGLM,MSEGLM),DRMASK(MSEGLM,4), 8 IDCELL(MSEGLM,4), 9 NSGTAB(MSEGLM),ASGTAB(MSEGLM), A RESSTO(MSEGLM,4) , C--- C-- *KEEP,FPDGI. B IDGIST(MSEGLM,4),IDGISM(4,9,MAXCLU) C ,RCHI(MAXSEG,3) , C--- C-- *KEEP,FPSTID. D IDRSTO(MSEGLM,4),IDYUV(4,9,MSEGLM), E IDYUVS(12,MAXSEG,3),FREQ(MSEGLM+1) , C--- C-- *interface to real data F NDPW(NUMWPL),DW(MAXHTS,NUMWPL),DWG(MAXHTS,NUMWPL), G DRIWP(MAXHTS,NUMWPL),DRIWM(MAXHTS,NUMWPL), G DRIW(MAXHTS,NUMWPL),IPHOLE(MAXHTS,NUMWPL), H IPFRPE(MAXHTS,36), IPPIOS(MAXDIG,2) C---. *KEND. C-- C DIMENSION ZSMOD(2,3) DIMENSION SMLSX(2), SMLSY(2), SMLSZ(2) C REAL AMINV(2,2),PCVEC(2),CPINT(2),PONINT(3) REAL INLINE(3) C INTEGER NSMLS(3) C--- C C--- define front and back of planar supermodule (f/b,sm). C ZSMOD(1,1) = ZPLAN(1) ZSMOD(2,1) = ZPLAN(12) ZSMOD(1,2) = ZPLAN(13) ZSMOD(2,2) = ZPLAN(24) ZSMOD(1,3) = ZPLAN(25) ZSMOD(2,3) = ZPLAN(36) C C--- define inner and outter radii squared C RMINSQ = RMIN**2 RMAXSQ = RMAX**2 C C--- Loop over supermodules C DO 10 ISM = 1,3 C C--- Set counter for supermodule C NSMLS(ISM) = 0 C C--- Loop over plane combinations in sm C DO 20 IP1 = 1 + (ISM-1)*3 , 2 + (ISM-1)*3 C C--- Loop on all tracks in this plane C DO 30 IT1 = 1,NTC(IP1) C C--- remove all combinations with nothing in C IF ( TC(3,IP1,IT1) .EQ. 0.0 ) GO TO 30 C C--- Combination of planes C DO 40 IP2 = IP1 + 1 , 3 + (ISM-1)*3 C C--- Loop on all tracks in this plane C DO 50 IT2 = 1,NTC(IP2) C C--- remove all combinations with nothing in C IF ( TC(3,IP2,IT2) .EQ. 0.0 ) GO TO 50 C C--- find cos of angle between track planes C CTHETA = TPNORM(1,IP1,IT1) * TPNORM(1,IP2,IT2) + 1 TPNORM(2,IP1,IT1) * TPNORM(2,IP2,IT2) + 2 TPNORM(3,IP1,IT1) * TPNORM(3,IP2,IT2) C C--- Set up inverse matrix for finding point on line C DET = 1.0 - CTHETA**2 AMINV(1,1) = 1.0 / DET AMINV(2,2) = 1.0 / DET AMINV(1,2) = -CTHETA / DET AMINV(2,1) = -CTHETA / DET C C--- set up vector of plane definition constants C PCVEC(1) = PCONST(IP1,IT1) PCVEC(2) = PCONST(IP2,IT2) C C--- find coefficient of point on line of intersection C DO 100 I = 1,2 CPINT(I) = 0.0 DO 101 J = 1,2 CPINT(I) = CPINT (I) + AMINV(I,J) * PCVEC(J) 101 CONTINUE 100 CONTINUE C C--- now we have line of intersection as C line = cpint + lambda * ( tpnorm1 vec tpnorm2 ) C C--- calculate vector to line ponint C DO 55 KK = 1,3 PONINT(KK) = CPINT(1) * TPNORM(KK,IP1,IT1) + 1 CPINT(2) * TPNORM(KK,IP2,IT2) 55 CONTINUE C C--- Calculate direction vector of intersection C INLINE(1) = 1 ( TPNORM(3,IP1,IT1) * TPNORM(2,IP2,IT2) 2 - TPNORM(2,IP1,IT1) * TPNORM(3,IP2,IT2) ) INLINE(2) = 1 - ( TPNORM(3,IP1,IT1) * TPNORM(1,IP2,IT2) 2 - TPNORM(1,IP1,IT1) * TPNORM(3,IP2,IT2) ) INLINE(3) = 1 ( TPNORM(2,IP1,IT1) * TPNORM(1,IP2,IT2) 2 - TPNORM(1,IP1,IT1) * TPNORM(2,IP2,IT2) ) C C--- solve for beginning and end of supermodule C IF( INLINE(3) .NE. 0.0 ) THEN ALAMB = ( ZSMOD (1,ISM) - PONINT (3) ) / INLINE(3) ALAME = ( ZSMOD (2,ISM) - PONINT (3) ) / INLINE(3) ENDIF C SMLSX(1) = PONINT(1) + ALAMB*INLINE(1) SMLSY(1) = PONINT(2) + ALAMB*INLINE(2) SMLSZ(1) = PONINT(3) + ALAMB*INLINE(3) C C--- remove those segments not in sensitive volume C RSQ = SMLSX(1)**2 + SMLSY(1)**2 IF ( RSQ .LT. RMINSQ .OR. RSQ .GT. RMAXSQ )THEN C--- C--- ELSE C--- C--- C C--- Store line segment for later analysis and plot C C C--- protect overwriting and store good primative segments C IF (NSMLS(ISM) .GE. LIMSTO ) THEN CALL ERRLOG(211,'W:FPLINT: NSMLS(ISM) >= LIMSTO') GO TO 10 ELSE C--- NSMLS(ISM) = NSMLS(ISM) + 1 NSEGSM=NSMLS(ISM) C--- ENDIF C C--- calculate and store beginning and end points C SMLS(1,1,NSEGSM,ISM) = PONINT(1) + ALAMB*INLINE(1) SMLS(1,2,NSEGSM,ISM) = PONINT(1) + ALAME*INLINE(1) SMLS(2,1,NSEGSM,ISM) = PONINT(2) + ALAMB*INLINE(2) SMLS(2,2,NSEGSM,ISM) = PONINT(2) + ALAME*INLINE(2) SMLS(3,1,NSEGSM,ISM) = PONINT(3) + ALAMB*INLINE(3) SMLS(3,2,NSEGSM,ISM) = PONINT(3) + ALAME*INLINE(3) C C--- record segment contributing track/planes C--- smls(4,1 = it1*10 + ip1 smls(4,2 = it2*10 + ip2 C SMLS(4,1,NSEGSM,ISM) = IT1*10 + IP1 SMLS(4,2,NSEGSM,ISM) = IT2*10 + IP2 ENDIF C C--- End of loops C 50 CONTINUE 40 CONTINUE 30 CONTINUE 20 CONTINUE 10 CONTINUE C C--- find if segments are coincident C C--- Primary (3 clusters) C CALL FPFSEG(NSMLS) C C--- Secondary (2 clusters + >=1 digit) C CALL FPFSSG(NSMLS) C C--- Tertiary (2 clusters ONLY) C CALL FPFTSG(NSMLS) C--- END *