*-- Author : R. Henderson 24/10/94 SUBROUTINE FPFSSG(NSMLS) C----------------------------------------------------------------------- C C--- Routine finds 'SECONDARY' segments from two Clusters/Planes C--- + any number of previously unused digits. C--- Firstly arrays are calculated which C--- flag clusters which have not already been used in segments C--- formed from three clusters. C--- (IUCLU(IPLANE,MAXCLU) = 0 if unused) C--- Then for unused digits that have not yet been placed in a cluster. C--- (IUD(MAXHTS,NUMWPL) = 0 if not used) C--- C--- A search is made for all candidate line segments formed from C--- two unused clusters to find any that have digits (the information C--- from which can be expressed as a line) in the orientation not C--- yet contributing with a Distance of Closest C--- Approach of less than DDTOL. The closest digit is included in the C--- segment together with any which are within DIGTOL of the closest. C--- C--- A new cluster is formed using the newly added digit(s).( NB. C--- If the cluster is formed of only one digit the cluster no longer C--- represents a plane.) The number of these created is stored in C--- COMMON/FPSTSG/ as NSTC(9). Otherwise the normal Cluster counter C--- is incremented to include all clusters new and old. C--- C--- The new segments are fitted using FPFSTS. A count of the new C--- secondary segments is kept in COMMON/FPSTSG/ as NFSSEG(9) but C--- otherwise the normal counter NFSEG(9) is incremented to include C--- these new segments. C--- C--- A new disconnected set is found for all segments by FPSSGF. C--- C--- COMMON/FPSTSG/NSTC(9) --- Number of secondary clusters formed. C--- NFSSEG(3) --- Number of secondary Segments formed. C--- NFTSEG(3) --- Number of Tertiary segments formed. C--- C--- The segments are ordered so all primary segments preceed C--- secondary and finary secondary preceed Tertiary) C--- 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 C--- *KEND. C--- *KEEP,FPH1WRK. C-- *KEEP,FPCSEG. C--- C--- C-- *KEEP,FPDIGI. C--- C-- *KEEP,FPDGI. C--- C-- *KEEP,FPSTID. C--- C-- *interface to real data C---. *KEEP,FPLSEG. C--- C--- *KEEP,FPLGEO. C--- C--- *KEEP,FPSTSG. C--- *KEEP,FPCLUS. C--- *KEND. C C C C C C--- Initialize arrays C CALL VZERO(IUD,MAXHTS*NUMWPL) C C--- Establish a list of clusters and digits available C--- to form secondary segments C C C--- Firstly Digits C C--- Loop over supermodules C C C--- Loop over candidate line segments C C C--- Loop on clusters that form CANDIDATE line segments C C C--- Find the planes.clusters numbers that make them up C C C--- Loop on four wires in cluster C C C--- Set flag in IUD (Used Digits) to +/-1 from 0 C (SIGN = DRIFT DIRECTION) C C--- C C C C C C--- Create list of used/unused clusters C CALL VZERO(IUCLU,9*MAXCLU) C C--- Loop over supermodules C C C--- Loop over segments C C--- Remove those outside disconnected set C C C--- C C C--- Set IUCLU to 1 if used C C--- C C--- Having established the unused CLS and Digits find all C--- distances of closest approach C CALL VZERO(NFSSEG,3) CALL VZERO(NFTSEG,3) C C--- Loop over supermodule C C C--- Loop on candidate line segments C * * SB mod to help with large events * CALL ERRLOG(216,'W:FPFSSG: .GT. MAXSEG segments found') C C--- Calculate the angle wrt to axis of candidate line segment C C C--- C C C--- Check that neither plane in candidate line segment used C C C--- Calculate which wires are to be searched for digits C--- They must be the wires which have not contributed to CLS C * * SB mod to help with large events * & CALL ERRLOG(214,'W:FPFSSG: Cluster limit reached') C C C--- Calculate w of cluster in missing orientation C C--- C--- C--- C C--- Now find unused digitizations on these wires C CALL VZERO(DMINW,4) CALL VZERO(IDIGM,4) C--- C--- C C--- Loop over all digits on wires C C C C--- Remove any digits already used C C C--- Loop on sign of drifts C C--- * DRIFT = (DRIW(IDIG,IWW)*(-1.0)**(ISD-1) + DW(IDIG,IWW)) * 10.0 C--- C C--- Now make vectors TO and PARALLEL to digit information C C--- C--- C C--- Make vector TO and PARALLEL to CLS C C--- C C--- Now calculate distance of closest approach of digit to CLS C C CALL FPDCA(TODIG,VDIG,TOCLS,VCLS,DIST) C New, hopefully faster version CALL FPNDCA(TODIG,VDIG,TOCLS,VCLS,DIST) C--- C--- C--- C C--- Store distance to closest digit on wire plane C C C--- Find closest C CALL VZERO(IWLIS,4) C--- C C--- Find any within a tolerance of closest C C C--- Create secondary clusters and segments C C C--- Create new clusters C CALL ERRLOG(214,'W:FPFSSG: Cluster limit reached') CALL VZERO( TCYUV(1,IPMISS,NTC(IPMISS)),4) CALL VZERO(TCYUVW(1,IPMISS,NTC(IPMISS)),4) CALL VZERO(IDGISM(1,IPMISS,NTC(IPMISS)),4) * TCYUV(IWW,IPMISS,NTC(IPMISS)) = * 1 (DRIW(IDIG,IWIR)*(-1.0)**(ISGN-1) + * 2 DW(IDIG,IWIR)) * 10.0 C C--- Fit newly created cluster with candidate line segment C--- to form new (secondary segment) C CALL FPFSTS(ID1,ID2,ID3,ISM,PCHI,CHISQ,NDF,PARSGN,ERRSGN) C C--- Reform disconnected segment sets C CALL FPSSGF(.TRUE.) *