*-- Author : S.Burke / J.V. Morris SUBROUTINE FKLFIT(IERR) ********************************************************************** * * * KALMAN Filter + Smoother applied to the full Forward Tracker * * * * ERROR CONDITIONS; * * * * IERR = 0 ; normal termination * * -> IERR = 101 ; no starting point was provided * * -> IERR = 102 ; not enough measurements to fit * * -> IERR = 103 ; invalid value in MES array * * -> IERR = 104 ; invalid value of JSTART, JSTOP or JLAST * * IERR = 20 + n ; 1 < n < 10 iterations in point rejection * * -> IERR = 130 ; 10 iterations in point rejection * * -> IERR = 200 + ee ; fatal error ee from FKLPRO * * -> IERR = 300 + ee ; fatal error ee from FKLFIL * * -> IERR = 400 + ee ; fatal error ee from FKLSMO * * -> IERR = 500 + ee ; fatal error ee from FKLPRS * * -> IERR = 600 + ee ; fatal error ee from FKLPAS * * -> IERR = 600 + ee ; fatal error ee from FKLPAF * * * * -> Fatal errors * * * ********************************************************************** *KEEP,FKECODE. *KEND. * * Common block definitions * *KEEP,FKNPL. * * Per-track values can go in H1WORK; note that LTRUE and LFIRST must * be set at least per event. * * This is about 36k words long; the remaining common blocks are * about 3.6k in total. Some of this could be in /H1WORK/, but the * blocks would have to be reorganised. * * /FKPROJ/ * /FKFILT/ * /FKSMTH/ * /FKINT/ * /FKRSID/ * /FKTRUE/ * /FKDBG/ *KEEP,FKCNTL. *KEEP,FKCONS. *KEEP,FKMEAS. *KEEP,FKFLAG. *KEEP,FKPROJ. *KEEP,FKFILT. *KEEP,FKSMTH. *KEEP,FKTRUE. *KEEP,FKRSID. *KEEP,FKRJCT. *KEEP,FKINT. *KEND. ********************************************************************** * * Initialisation and checks ......... * * * Check that the start and stop positions are sensible * CALL FKERR(IUTIL,IROUT,IFATAL,IINV,IERR) * Starting point does not exist CALL FKERR(IUTIL,IROUT,IFATAL,IINF1,IERR) * * Set the steps between planes according to the direction * * * Are there enough measurements (ignoring the starting point which has * zero weight) to do the 5 parameter fit? * * Can only deal with 1 or 2 measurements per plane CALL FKERR(IUTIL,IROUT,IFATAL,IINF3,IERR) CALL FKERR(IUTIL,IROUT,IFATAL,IINF2,IERR) * * Calculate plane spacing according to direction. * Be careful about edge effects! * * If point rejection is on, the smoothed residuals must be calculated * Re-entry point CALL FKERR(IUTIL,IROUT,IFATAL,IFREE1,IERR) * * Reset all flags ... * * * End of initialisation and checks. * ********************************************************************** * * If we're past the last measurement, look for a new one CALL FKLPAF(JPL,IFAIL) CALL FKERR(IUTIL,IROUT,IFPAF,IFAIL,IERR) * Filter at plane JPL CALL FKLFLT(JPL,IFAIL) CALL FKERR(IUTIL,IROUT,IFFLT,IFAIL,IERR) * Project to plane JPL+JSTEP (except if we're at the end) CALL FKLPRO(JPL,IFAIL) CALL FKERR(IUTIL,IROUT,IFPRO,IFAIL,IERR) ********************************************************************** * Smooth from plane JPL+JSTEP to plane JPL ... CALL FKLSMO(JPL,IFAIL) CALL FKERR(IUTIL,IROUT,IFSMO,IFAIL,IERR) * Set the rejection flag to 0 on the first pass * Reject bad points (do this on all planes, as they may be in a block) CALL FKLPRS(JPL,NDROP,IFAIL) CALL FKERR(IUTIL,IROUT,IFPRS,IFAIL,IERR) * * If there isn't a measurement, look for one. * FKLPAS can be called even if LMES is .TRUE., but whether * it's useful depends on FKHUNT, which hasn't been written yet. * If JPL is above the high water mark FKLPAF will already have * looked for a new point, so there's no point in doing it again. * CALL FKLPAS(JPL,NDROP,IFAIL) CALL FKERR(IUTIL,IROUT,IFPAS,IFAIL,IERR) * If we've changed a point on this pass, we must smooth back to JSTOP * * Have any planes been rejected during smoothing? * If so, re-filter outwards from plane NDROP, and smooth back to NDROP+1 * IF (NPASS.GT.2) CALL FKERR(IUTIL,IROUT,IWARN,IFREE+NPASS,IERR) *