00001 #include <stdexcept>
00002 #include "StiKalmanTrackFitter.h"
00003 #include "StiKalmanTrack.h"
00004 #include "StiKTNIterator.h"
00005
00006
00007 Int_t StiKalmanTrackFitter::_debug = 0;
00008
00021 Int_t StiKalmanTrackFitter::fit(StiTrack * stiTrack, Int_t fitDirection)
00022 {
00023 enum {kMaxNErr=333};
00024 static Int_t nCall=0; nCall++;
00025 StiKalmanTrackNode::Break(nCall);
00026
00027 if (debug() > 2) cout << "SKTFitter::fit() -I- Started:"<<endl;
00028 StiKalmanTrack * track = dynamic_cast<StiKalmanTrack * >(stiTrack);
00029 assert(track);
00030 StiHit * targetHit;
00031 StiKalmanTrackNode * targetNode;
00032 const StiDetector * targetDet;
00033
00034 StiKTNBidirectionalIterator first;
00035 StiKTNBidirectionalIterator last;
00036 StiKTNBidirectionalIterator source;
00037 Double_t chi2;
00038 Int_t status = 0,nerr =0;
00039 if (!fitDirection) {
00040 first = track->begin();
00041 last = track->end();
00042 } else {
00043 last = track->rend();
00044 first = track->rbegin();
00045 }
00046 if (debug()) cout << "StiKalmanTrackFitter::fit direction = " << fitDirection << endl;
00047
00048 Int_t nGoodNodes = track->getNNodes(3);
00049 if (nGoodNodes<3) return kShortTrackBeforeFit;
00050
00051
00052 StiKalmanTrackNode *pNode = 0;
00053 Int_t iNode=0; status = 0;
00054 for (source=first;source!=last;source++) {
00055 if (nerr>kMaxNErr) return nerr;
00056 do {
00057 iNode++;
00058 targetNode = &(*source);
00059 targetDet = targetNode->getDetector();
00060 targetHit = targetNode->getHit();
00061 Double_t oldChi2 = targetNode->getChi2(); if(oldChi2){};
00062 static Int_t myKount=0;myKount++;
00063 if (!pNode && !targetNode->isValid()) continue;
00064
00065 status = 0;
00066 if (pNode) {
00067 targetNode->setChi2(1e51);
00068 if (targetDet)
00069 status = targetNode->propagate(pNode,targetDet,fitDirection);
00070 else if (targetHit)
00071 status = targetNode->propagate(pNode,targetHit,fitDirection);
00072 if (status) {nerr++; continue;}
00073 }
00074 else {
00075 if (debug()) {
00076 targetNode->ResetComment(::Form("%30s start refit",targetDet->getName().c_str()));
00077 targetNode->PrintpT("S");}
00078
00079 pNode = targetNode;
00080 }
00081
00082
00083 do {
00084 targetNode->setChi2(0.);
00085 if (!targetHit) break;
00086 assert(targetNode->getHit()==targetHit);
00087 StiKalmanTrackNode tryNode = *targetNode;
00088 targetNode->setChi2(1e52);
00089 if (tryNode.nudge(targetHit)) {nerr++; break;}
00090 chi2 = tryNode.evaluateChi2(targetHit);
00091 if ((chi2>StiKalmanTrackFitterParameters::instance()->getMaxChi2())) {nerr++; break;}
00092 status = tryNode.updateNode();
00093 if (status) {nerr++; break;}
00094 tryNode.setChi2(chi2);
00095 {
00096 if (debug()) {cout << Form("%5d ",status); StiKalmanTrackNode::PrintStep();}
00097 }
00098
00099 *targetNode=tryNode;
00100 }while(0);
00101 pNode = targetNode;
00102 } while(0);
00103 }
00104 nGoodNodes = track->getNNodes(3);
00105 if (nGoodNodes<3) return kShortTrackAfterFit;
00106 return (nerr>kMaxNErr)? kManyErrors:0;
00107 }
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130