00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00012
00013 #ifndef ALGFITTRACKSR_H
00014 #define ALGFITTRACKSR_H
00015
00016 #include<map>
00017 #include "Algorithm/AlgBase.h"
00018 #include "RecoBase/AlgReco.h"
00019 #include "RecoBase/AlgTrack.h"
00020 #include "Validity/VldContext.h"
00021
00022 class TrackClusterSRItr;
00023 class TrackClusterSR;
00024 class CandFitTrackSRHandle;
00025 class CandStripHandleItr;
00026 class KalmanPlaneSR;
00027 class TObjArray;
00028 class UgliGeomHandle;
00029
00030 class AlgFitTrackSR : public AlgBase, public AlgReco, public AlgTrack
00031 {
00032
00033 public:
00034 AlgFitTrackSR();
00035 virtual ~AlgFitTrackSR();
00036 virtual void RunAlg(AlgConfig &ac, CandHandle &ch, CandContext &cx);
00037 virtual void Trace(const char *c) const;
00038
00039 private:
00040
00041 VldContext fVldContext;
00042 Detector::Detector_t fDetector;
00043 Int_t pRev,pRev2,pFor;
00044 Int_t fParmMaxIterate;
00045 Int_t fParmMaxIterate2;
00046 Double_t fParmQPDiff;
00047 Double_t fParmMinPlanePE;
00048 Int_t fParmLastPlane;
00049 Int_t fParmIsCosmic;
00050 Double_t fParmMaxLocalChi2;
00051 Double_t fParmMaxLocalPreChi2;
00052 Double_t fParmMaxAngleCovariance;
00053 Double_t fParmMaxImpactParameter;
00054 Int_t fParmNSkipActive;
00055 Int_t fParmNSkipView;
00056
00057 Double_t fParmPassReducedChi2;
00058 Double_t fParmPassPlaneAsymmetry;
00059 Int_t fParmPassMinPlaneAsymmetry;
00060
00061 Double_t fParmMinClusterCharge;
00062 Int_t fParmMaxClusterNStrip;
00063
00064 Double_t fParmDeltaChi2;
00065 Double_t fParmDeltaCovariance;
00066 Double_t fParmMisalignmentError;
00067
00068 Double_t fParmDState[5];
00069 Double_t fParmdedx;
00070 Double_t fParmPlnRadLen;
00071 Int_t fParmQPRangeCheck;
00072 Double_t fParmMaxQP;
00073 Double_t fParmMaxQPFrac;
00074 Int_t fSwimmer;
00075 Double_t fParmMaxAngle;
00076
00077 Double_t fParmTPosError2;
00078 Double_t fParmInitialPositionError2;
00079 Double_t fParmInitialSlopeError2;
00080 Double_t fParmInitialQPError2;
00081 Double_t fParmCovarianceScale;
00082
00083
00084 Double_t fCov[5][5];
00085
00086 Int_t Predict(KalmanPlaneSR *prevkp, KalmanPlaneSR *currentkp, Int_t idir);
00087
00088 Int_t Filter(KalmanPlaneSR *currentkp, Int_t idir);
00089
00090 Int_t FitFrom(KalmanPlaneSR *prevkp, KalmanPlaneSR *currentkp, Int_t idir, Int_t iterate);
00091
00092 Int_t CalculatePropagator(KalmanPlaneSR *prevkp, KalmanPlaneSR *currentkp, Int_t idir);
00093 void CalculateNoise(KalmanPlaneSR *prevkp, KalmanPlaneSR *currentkp, Int_t idir,
00094 Int_t befaft=0);
00095 void CalculatePreCovariance(KalmanPlaneSR *prevkp, KalmanPlaneSR *currentkp, Int_t idir);
00096 Int_t CalculatePreState(KalmanPlaneSR *prevkp, KalmanPlaneSR *currentkp, Int_t idir);
00097 void CalculatePreChi2(KalmanPlaneSR *currentkp, Int_t idir, Double_t = 0.0119);
00098 void CalculateGain(KalmanPlaneSR *currentkp, Int_t idir, Double_t = 0.0119);
00099 void CalculateFilState(KalmanPlaneSR *currentkp, Int_t idir);
00100 void CalculateFilCovariance(KalmanPlaneSR *currentkp, Int_t idir);
00101 void CalculateFilChi2(KalmanPlaneSR *currentkp, Int_t idir, Double_t = 0.0119);
00102
00103 Bool_t Swim(Double_t *swimstate, Double_t *state,
00104 Double_t zPos, Double_t finalZ, Int_t idir,
00105 const VldContext*);
00106
00107
00108 void InitKalmanFitParameters(AlgConfig &ac);
00109
00110 void InitializeFit(CandFitTrackSRHandle & cfh,Int_t, Int_t);
00111
00112 void MakeSliceClusterList(TObjArray *trackClusterList,
00113 const TObjArray *tclist,
00114 CandStripHandleItr &stripItr,
00115 CandFitTrackSRHandle &cfh);
00116
00117 void MakeTrackClusterList(TObjArray *trackClusterList, CandStripHandleItr &stripItr,
00118 CandFitTrackSRHandle &cfh, Int_t direction);
00119 void SetTrackParameters(const CandTrackHandle *track0, CandFitTrackSRHandle &cfh,
00120 Int_t direction);
00121 Int_t FindNumSkippedPlanes(Int_t currentPlane, Int_t prevPlane,
00122 KalmanPlaneSR *oldkp,
00123 Int_t direction);
00124 Int_t FindTimingDirection(TrackClusterSRItr &clusterItr);
00125 Bool_t MarkTrackClusters(const CandTrackHandle *track0,
00126 TObjArray &planeClusterList,
00127 CandStripHandleItr &stripItr, CandFitTrackSRHandle &cfh,
00128 Int_t &begPlane, Int_t &endPlane);
00129 void SetTrackEndParameters(Int_t begPlane, Int_t endPlane,
00130 CandFitTrackSRHandle &cfh,
00131 const CandTrackHandle *track0);
00132 void ResetTrackClusterList(TObjArray &planeClusterList);
00133 void ResetTrackClusterList(TObjArray &planeClusterList,
00134 CandFitTrackSRHandle &cfh);
00135 Int_t DoKalmanFit(TObjArray &planeClusterList, CandFitTrackSRHandle &cfh,
00136 Int_t &istatus, Int_t direction, Int_t dosearch);
00137
00138 Int_t ReverseFit(TObjArray &planeClusterList,CandFitTrackSRHandle &cfh, Int_t,Bool_t = kFALSE);
00139
00140 Int_t AddClustersToFit(TObjArray &planeClusterList, CandFitTrackSRHandle &cfh,
00141 Int_t iterate, Int_t &nu, Int_t &nv, Int_t direction);
00142 Int_t RemoveBadPointsFromFit(CandFitTrackSRHandle &cfh,
00143 TObjArray &planeClusterList,
00144 std::map<Int_t,Int_t>& uFitPlanes,
00145 std::map<Int_t,Int_t>& vFitPlanes, Int_t &nfitu,
00146 Int_t &nfitv, Int_t direction);
00147 Int_t FindDownstreamPlanes(TObjArray &planeClusterList,
00148 CandFitTrackSRHandle &cfh,
00149 Int_t direction);
00150 Int_t FindUpstreamPlanes(TObjArray &planeClusterList, CandFitTrackSRHandle &cfh,
00151 TObjArray *newkplist, Int_t direction);
00152 Int_t FindNumSkippedPlanesInView(std::map<Int_t,Int_t>& fitPlanes,
00153 std::map<Int_t,Int_t>::iterator& fitIter,
00154 Int_t currentPlane, Int_t prevPlane,
00155 Int_t lastPlane, Int_t direction);
00156 Int_t AddForwardBestKPToFit(KalmanPlaneSR *bestkp,
00157 CandFitTrackSRHandle &cfh,
00158 Int_t &nswimfail);
00159
00160 Int_t AddToFit(CandFitTrackSRHandle & cfh, TrackClusterSR *, Int_t);
00161
00162 Int_t AddToFit(CandFitTrackSRHandle & cfh, KalmanPlaneSR *, Int_t,Bool_t);
00163
00164 Int_t AddReverseBestKPToFit(KalmanPlaneSR *bestkp, KalmanPlaneSR *oldkp,
00165 CandFitTrackSRHandle &cfh, TObjArray *newkplist,
00166 Int_t &nswimfail, Int_t direction);
00167 void SetPlaneParameters(CandFitTrackSRHandle &cfh, const KalmanPlaneSR *kpu0,
00168 const KalmanPlaneSR *kpu1, const KalmanPlaneSR *kpv0,
00169 const KalmanPlaneSR *kpv1);
00170 void MakeDaughterStripList(CandFitTrackSRHandle &cfh);
00171 void SwimVertexAndEndPoints(CandFitTrackSRHandle &cfh, KalmanPlaneSR *kp0,
00172 KalmanPlaneSR *kp1, const KalmanPlaneSR *kpu0,
00173 const KalmanPlaneSR *kpu1, const KalmanPlaneSR *kpv0,
00174 const KalmanPlaneSR *kpv1, Double_t *planepe,
00175 Int_t plane0, Int_t plane1, Double_t &vtxqp,
00176 Int_t direction);
00177 Int_t IterateKalmanFit(TObjArray &planeClusterList, CandFitTrackSRHandle &cfh,
00178 Int_t &nu, Int_t &nv, Int_t direction, Int_t dosearch);
00179
00180
00181 Int_t FindTimingDirection(CandFitTrackSRHandle &cfh,
00182 Double_t *fitparm,
00183 Double_t &timefitchi2);
00184
00185 ClassDef(AlgFitTrackSR,8)
00186
00187 };
00188
00189 #endif // ALGFITTRACKSR_H