*-- Author : R. Henderson 24/10/94
SUBROUTINE FPSSGF(LSECSG)
C---------------------------------------------------------------
C
C Routine checks the connectivity of the found
C
C SECONDARY and TERTIARY segments
C
C and returns an optimized non-connected solution in MASKSG
C 0 = accept segment , -1 = reject segment
C
C the difference between this routine and FPSGRF is that it
C cannot assume that clusters are disconnected a priori
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,FPLSEG.
C---
COMMON /FPLSEG / PW(12,MAXSEG,3) , PWC(12,MAXSEG,3) ,
1 PRCHI(MAXSEG,3) , NFSEG(3) ,
2 XYDXY(4,MAXSEG,3) , EXYDXY(4,4,MAXSEG,3) ,
3 ZSEG(2,MAXSEG,3) ,
4 ASEGIN(MAXSEG,3) , ISEGIN(5,MAXSEG,3) ,
5 MASKSG(MAXSEG,3) , IDGISG(12,MAXSEG,3)
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---
*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---
*KEEP,FPSTSG.
COMMON/FPSTSG/ NSTC(9),NFSSEG(3),NFTSEG(3)
C---
*KEND.
C
C---
C---
C---
C--- Local variables
C---
C--- ISGTAB (I,J) = segment number of Jth node connected to Ith node
C--- KSGTAB (I) = number of segments connected to Ith node
C--- MXLIS = list of nodes with maximum connectivity
C--- CHLIS = weight asscociated with each node listed in MXLIS
C
DIMENSION KSGTAB(MAXSEG) , FSGTAB(MAXSEG) , ISGTAB(MAXSEG,MAXCON)
DIMENSION MXLIS(MAXSEG) , CHLIS(MAXSEG)
LOGICAL LSECSG,LFIRST
DATA LFIRST/.TRUE./
C
C--- input
C
C ASEGIN(SEG,SUPERMODULE) = chisquare of segment
C
C ISEGIN(1,SEG,SUPERMODULE) = 1st cluster-plane for segment
C ISEGIN(2,SEG,SUPERMODULE) = 2nd cluster-plane for segment
C ISEGIN(3,SEG,SUPERMODULE) = 3rd cluster-plane for segment
C ISEGIN(4,SEG,SUPERMODULE) = number of degree of freedom for segmen
C
C NFSEG(SUPERMODULE) = number of found segments per supermodu
C
C--- output
C
C MASKSG(SEG,SUPERMODULE) = 0 if allowed
C = -1 if lost
C
IF (LFIRST) THEN
LFIRST = .FALSE.
CALL FPPBIN
ENDIF
C
C--- loop over supermodules
C
DO 10 ISM = 1,3
C
C--- define where secondary segments start depending on whether
C--- called from Secondary or tertiary segment finder.
C
IF(LSECSG)THEN
NGSEG = NFSEG(ISM) - NFSSEG(ISM)
NSTSSG = NGSEG + 1
ELSE
NGSEG = NFSEG(ISM) - NFTSEG(ISM)
NSTSSG = NGSEG + 1
ENDIF
C
C--- zero ksgtab
C
DO 50 I = 1,MAXSEG
KSGTAB(I) = 0
50 CONTINUE
C
C--- construct connectivity table
C
C
C--- 1st loop over segments
C
DO 20 ISEG = NSTSSG,NFSEG(ISM)
DO 21 KSEG = NSTSSG,NFSEG(ISM)
C
C--- remove if segs the same
C
IF(ISEG.EQ.KSEG)GO TO 21
C
C--- search to see if any cluster planes in common
C
DO 30 ID1 = 1,3
ICP1 = ISEGIN(ID1,ISEG,ISM)
C
C--- decode cluster planes
C
* IP1 = MOD(ICP1,10)
ICL1 = ICP1/10
IP1 = ICP1 - ICL1*10
C---
DO 31 ID2 = 1,3
ICP2 = ISEGIN(ID2,KSEG,ISM)
C
C--- decode cluster planes
C
* IP2 = MOD(ICP2,10)
ICL2 = ICP2/10
IP2 = ICP2 - ICL2*10
C
C--- if planes the same loop over wires to see if same digits used
C
IF(IP1 .EQ. IP2 .AND. ICL1.NE.0 .AND. ICL2.NE.0)THEN
IP = IP1
DO 33 IWW = 1,4
C
C--- if digits are the same (and not 0) then build connection
C
* IF(ICL1 .EQ. 0 .OR. ICL2 .EQ. 0)GO TO 33
C
IF(IABS(IDGISM(IWW,IP,ICL1)) .EQ. 0)GO TO 33
C
IF(IABS(IDGISM(IWW,IP,ICL1)) .NE.
1 IABS(IDGISM(IWW,IP,ICL2)))GO TO 33
C
C--- found one in common , increment counter , store connection
C
KSGTAB(ISEG) = KSGTAB(ISEG) + 1
C
C--- trap out of bounds. has been known to happen in MC!
C
IF(KSGTAB(ISEG) .GT. MAXCON) THEN
GO TO 999
ENDIF
ISGTAB(ISEG,KSGTAB(ISEG)) = KSEG
C
C--- connection found skip furthur search of KSEG segment
C
GO TO 21
C
33 CONTINUE
ENDIF
31 CONTINUE
30 CONTINUE
21 CONTINUE
20 CONTINUE
C
C
C
C
C--- Start to remove connectivity
C
C
C--- Find the highest multiplicity
C
500 CONTINUE
IF( NFSEG(ISM) .GT. 0)THEN
CALL VFLOAT(KSGTAB,FSGTAB,NFSEG(ISM))
MXSEG = LVMAX(FSGTAB,NFSEG(ISM))
IVMXSG = KSGTAB(MXSEG)
ELSE
IVMXSG = 0
ENDIF
IF(IVMXSG .EQ. 0) GO TO 600
C
C--- Loop over all segments and find those with same multiplicity
C
NMXSG = 0
DO 510 ISEG = NSTSSG,NFSEG(ISM)
C IF(KSGTAB(ISEG) .LT. (IVMXSG-2)
IF(KSGTAB(ISEG) .LT. (IVMXSG)
1 .OR. KSGTAB(ISEG) .LE. 0) GO TO 510
NMXSG = NMXSG + 1
MXLIS(NMXSG) = ISEG
510 CONTINUE
C
C--- Find which segment contributes most to chisquare
C
DO 520 IMX = 1 , NMXSG
MXSEG = MXLIS(IMX)
C
C--- Find probablility of link segments
C
CHISUM = 0.0
NDFSUM = 0
DO 521 LSEG = 1,KSGTAB(MXSEG)
CHISUM = CHISUM + ASEGIN(ISGTAB(MXSEG,LSEG),ISM)
NDFSUM = NDFSUM + ISEGIN(4,ISGTAB(MXSEG,LSEG),ISM)
521 CONTINUE
C
C--- Store probability of links less own prob
C
* Fix for v.small chisq...
IF(CHISUM .LT. 0.001) THEN
PROB1 = 0.99999
ELSE
PROB1 = FPPROB(CHISUM,NDFSUM)
C PROB1 = PROB(CHISUM,NDFSUM)
ENDIF
IF(ASEGIN(MXSEG,ISM) .LT. 0.001) THEN
PROB2 = 0.99999
ELSE
PROB2 = FPPROB(ASEGIN(MXSEG,ISM),ISEGIN(4,MXSEG,ISM))
C PROB2 = PROB(ASEGIN(MXSEG,ISM),ISEGIN(4,MXSEG,ISM))
ENDIF
CHLIS(IMX) = PROB1 - PROB2
* CHLIS(IMX) = PROB(CHISUM,NDFSUM) -
* 1 PROB(ASEGIN(MXSEG,ISM),ISEGIN(4,MXSEG,ISM))
520 CONTINUE
C
C
C--- Find the segment with largest positive contribution
C
MXPSEG = LVMAX(CHLIS,NMXSG)
IWSEG = MXLIS(MXPSEG)
C
C--- Remove all reference to this segment from connectivity table
C
* KSGTAB(IWSEG) = -1
* DO 530 IS = NSTSSG, NFSEG(ISM)
* IF( KSGTAB(IS) .LT. 1)GO TO 530
* DO 531 ILS = 1, KSGTAB(IS)
* IF(ISGTAB(IS,ILS) .NE. IWSEG) GO TO 531
* ISGTAB(IS,ILS) = ISGTAB(IS,KSGTAB(IS))
* KSGTAB(IS) = KSGTAB(IS) - 1
* 531 CONTINUE
* 530 CONTINUE
DO 530 ILLS = 1, KSGTAB(IWSEG)
IS = ISGTAB(IWSEG,ILLS)
DO 531 ILS = 1, KSGTAB(IS)
IF(ISGTAB(IS,ILS) .NE. IWSEG) GO TO 531
ISGTAB(IS,ILS) = ISGTAB(IS,KSGTAB(IS))
KSGTAB(IS) = KSGTAB(IS) - 1
GOTO 530
531 CONTINUE
530 CONTINUE
KSGTAB(IWSEG) = -1
C
C
C--- Repeat proceedure on remaining nodes
C
C
GO TO 500
C
C
C--- No connectivity remaining
C
600 CONTINUE
C---
C
C--- Write output bank
C
DO 650 I = NSTSSG,NFSEG(ISM)
MASKSG(I,ISM) = KSGTAB(I)
650 CONTINUE
10 CONTINUE
RETURN
C
C--- Something horrible has happened - kill event!
C
999 CONTINUE
CALL ERRLOG(217,'W:FPSSGF: Too much confusion! Planar data off')
DO 888 ISM = 1,3
NFSEG(ISM) = 0
888 CONTINUE
RETURN
END
*