7 #include <TMatrixDSym.h>
9 #include <GenFit/MeasuredStateOnPlane.h>
10 #include <GenFit/MeasurementOnPlane.h>
11 #include <GenFit/WireMeasurement.h>
12 #include <GenFit/PlanarMeasurement.h>
13 #include <GenFit/RKTrackRep.h>
14 #include <GenFit/AbsFitterInfo.h>
15 #include <GenFit/KalmanFitterInfo.h>
16 #include <GenFit/StateOnPlane.h>
25 static bool inited =
false;
29 static double Z_TARGET;
31 static double Z_UPSTREAM;
35 static double SIGX_BEAM;
36 static double SIGY_BEAM;
39 void initGlobalVariables()
63 GFTrack::GFTrack(): _track(nullptr), _trkrep(nullptr), _propState(nullptr), _virtMeas(nullptr), _trkcand(nullptr), _pdg(0), _errorNo(0)
65 initGlobalVariables();
68 GFTrack::GFTrack(
SRecTrack& recTrack): _track(nullptr), _trkrep(nullptr), _propState(nullptr), _virtMeas(nullptr), _trkcand(nullptr), _pdg(0), _errorNo(0)
70 initGlobalVariables();
72 _pdg = recTrack.
getCharge() > 0 ? -13 : 13;
73 _trkrep =
new genfit::RKTrackRep(_pdg);
78 TVectorD seed_state(6);
79 seed_state[0] = seed_pos.X();
80 seed_state[1] = seed_pos.Y();
81 seed_state[2] = seed_pos.Z();
82 seed_state[3] = seed_mom.Px();
83 seed_state[4] = seed_mom.Py();
84 seed_state[5] = seed_mom.Pz();
86 TMatrixDSym seed_cov(6);
87 double uncertainty[6] = {10., 10., 10., 3., 3., 10.};
88 for(
int i = 0; i < 6; i++)
90 for(
int j = 0; j < 6; j++)
92 seed_cov[i][j] = uncertainty[i]*uncertainty[j];
95 _track =
new genfit::Track(_trkrep, seed_state, seed_cov);
99 for(
int i = 0; i < nHits; ++i)
107 GFTrack::GFTrack(
Tracklet& tracklet): _track(nullptr), _trkrep(nullptr), _propState(nullptr), _virtMeas(nullptr), _trkcand(nullptr), _pdg(0), _errorNo(0)
109 initGlobalVariables();
115 if(_track !=
nullptr)
delete _track;
125 if(_trkrep !=
nullptr) _trkrep->setDebugLvl(v);
130 for(
auto iter = measurements.begin(); iter != measurements.end(); ++iter)
132 if(!(*iter)->isEnabled())
continue;
141 genfit::TrackPoint* tp =
new genfit::TrackPoint(measurement, _track);
142 tp->setSortingParameter(measurement->
getZ());
143 _track->insertPoint(tp);
148 genfit::AbsTrackRep* rep = _track->getCardinalRep();
151 genfit::FitStatus* fs = _track->getFitStatus(rep);
152 if(fs)
return fs->getChi2();
160 genfit::AbsTrackRep* rep = _track->getCardinalRep();
163 genfit::FitStatus* fs = _track->getFitStatus(rep);
164 if(fs)
return fs->getNdf();
172 double z = meas->
getZ();
173 if(z < _measurements.front()->getZ())
177 else if(z > _measurements.back()->getZ())
179 return _measurements.size() - 1;
183 auto iter = std::lower_bound(_measurements.begin(), _measurements.end(), meas, [](
GFMeasurement* a,
GFMeasurement* b) { return (a->getZ() < b->getZ()); });
184 int idx = std::distance(_measurements.begin(), iter);
185 return fabs(z - _measurements[idx]->getZ()) < fabs(z - _measurements[idx-1]->getZ()) ? idx : idx-1;
191 TVector3 linePoint = (endPoint2 + endPoint1);
192 TVector3 lineDir = endPoint2 - endPoint1;
194 if(!setInitialStateForExtrap(startPtID))
return -9999.;
196 genfit::AbsTrackRep* rep = _track->getCardinalRep();
197 double len = rep->extrapolateToLine(*_propState, linePoint, lineDir);
199 TVectorD hitcoord(7);
200 hitcoord[0] = endPoint1.X();
201 hitcoord[1] = endPoint1.Y();
202 hitcoord[2] = endPoint1.Z();
203 hitcoord[3] = endPoint2.X();
204 hitcoord[4] = endPoint2.Y();
205 hitcoord[5] = endPoint2.Z();
207 TMatrixDSym tempcov(7);
209 _virtMeas.reset(
new genfit::WireMeasurement(hitcoord, tempcov, 999, 999,
nullptr));
216 genfit::SharedPlanePtr destPlane(
new genfit::DetPlane(pO, pU, pV));
218 if(!setInitialStateForExtrap(startPtID))
return -9999.;
220 genfit::AbsTrackRep* rep = _track->getCardinalRep();
221 double len = rep->extrapolateToPlane(*_propState, destPlane);
223 TVectorD hitcoord(2);
224 hitcoord[0] = pO.X();
225 hitcoord[1] = pO.Y();
226 TMatrixDSym tempcov(2);
227 tempcov.UnitMatrix();
229 genfit::PlanarMeasurement* pMeas =
new genfit::PlanarMeasurement(hitcoord, tempcov, 998, 998,
nullptr);
230 pMeas->setPlane(destPlane);
231 _virtMeas.reset(pMeas);
238 if(!setInitialStateForExtrap(startPtID))
return -9999.;
240 genfit::AbsTrackRep* rep = _track->getCardinalRep();
241 double len = rep->extrapolateToPoint(*_propState, point);
251 std::unique_ptr<const genfit::AbsHMatrix> H(_virtMeas->constructHMatrix(_propState->getRep()));
254 TVectorD stateVec(_propState->getState());
255 TMatrixDSym cov(_propState->getCov());
257 double ndf = meas.GetNrows();
259 TVectorD res(meas - H->Hv(stateVec));
260 TMatrixDSym covSumInv(cov);
263 genfit::tools::invertMatrix(covSumInv);
265 TMatrixD CHt(H->MHt(cov));
266 TVectorD update(TMatrixD(CHt, TMatrixD::kMult, covSumInv)*res);
269 covSumInv.Similarity(CHt);
271 _propState->setStateCov(stateVec, cov);
274 TVectorD resNew(meas - H->Hv(stateVec));
275 TMatrixDSym HCHt(cov);
279 genfit::tools::invertMatrix(HCHt);
280 chi2 = HCHt.Similarity(resNew);
285 bool GFTrack::setInitialStateForExtrap(
const int startPtID)
287 genfit::AbsTrackRep* rep = _track->getCardinalRep();
288 if(_track->getNumPoints() > 0)
290 genfit::TrackPoint* tp = _track->getPointWithMeasurementAndFitterInfo(startPtID, rep);
291 if(tp ==
nullptr)
return false;
293 genfit::KalmanFitterInfo* info =
static_cast<genfit::KalmanFitterInfo*
>(tp->getFitterInfo(rep));
294 _propState.reset(
new genfit::MeasuredStateOnPlane(info->getFittedState()));
298 _propState.reset(
new genfit::MeasuredStateOnPlane(_fitstates[startPtID]));
307 TVector3 pU(1., 0., 0.);
308 TVector3 pV(0., 1., 0.);
309 TVector3 pO(0., 0., z );
311 TVectorD beamCenter(2);
312 beamCenter[0] = X_BEAM; beamCenter[1] = Y_BEAM;
313 TMatrixDSym beamCov(2);
315 beamCov(0, 0) = SIGX_BEAM*SIGX_BEAM; beamCov(1, 1) = SIGY_BEAM*SIGY_BEAM;
321 if(fabs(len) > 6000.)
throw len;
328 else if(mom !=
nullptr)
333 catch(genfit::Exception& e)
335 if(_errorNo < MAX_ERROR) std::cerr <<
"SQGenFit::GFTrack::swimToVertex: hypo test failed vertex @Z=" << z <<
": " << e.what() << std::endl;
340 if(_errorNo < MAX_ERROR) std::cerr <<
"SQGenFit::GFTrack::swimToVertex: hypo test failed vertex @Z=" << z <<
": " << len << std::endl;
347 if(_errorNo == MAX_ERROR)
349 std::cerr <<
"SQGenFit::GFTrack::swimToVertex: ... too many extraplolation errors, future errors from this track will be suppressed... " << std::endl;
358 _trkcand = &tracklet;
359 _pdg = tracklet.
getCharge() > 0 ? -13 : 13;
360 _trkrep =
new genfit::RKTrackRep(_pdg);
362 TVectorD seed_state(6);
366 seed_state[0] = seed_pos.X();
367 seed_state[1] = seed_pos.Y();
368 seed_state[2] = seed_pos.Z();
369 seed_state[3] = seed_mom.Px();
370 seed_state[4] = seed_mom.Py();
371 seed_state[5] = seed_mom.Pz();
373 TMatrixDSym seed_cov(6);
374 double uncertainty[6] = {10., 10., 10., 3., 3., 10.};
375 for(
int i = 0; i < 6; i++)
377 for(
int j = 0; j < 6; j++)
379 seed_cov[i][j] = uncertainty[i]*uncertainty[j];
387 _track =
new genfit::Track(_trkrep, seed_state, seed_cov);
389 _measurements.clear();
390 for(
auto iter = tracklet.
hits.begin(); iter != tracklet.
hits.end(); ++iter)
392 if(iter->hit.index < 0)
continue;
395 _measurements.push_back(meas);
397 std::sort(_measurements.begin(), _measurements.end(), [](
GFMeasurement* a,
GFMeasurement* b) { return (a->getZ() < b->getZ()); });
405 if(!updateMeasurements)
return;
406 for(
auto iter = _measurements.begin(); iter != _measurements.end(); ++iter)
408 (*iter)->postFitUpdate();
418 for(
auto iter = _measurements.begin(); iter != _measurements.end(); ++iter)
422 const genfit::MeasuredStateOnPlane& fitstate = (*iter)->getTrackPoint()->getKalmanFitterInfo()->getFittedState(
true);
426 fitstate.getPosMom(pos, mom);
427 TMatrixD stateVec(5, 1);
429 stateVec[1][0] = mom.Px()/mom.Pz();
430 stateVec[2][0] = mom.Py()/mom.Pz();
431 stateVec[3][0] = pos.X();
432 stateVec[4][0] = pos.Y();
436 TMatrixD cov(fitstate.getCov());
439 strack.
insertChisq((*iter)->getTrackPoint()->getKalmanFitterInfo()->getSmoothedChi2());
448 std::cout <<
"=============== SGTrack ===============" << std::endl;
449 std::cout <<
"------------ Track candidate ----------" << std::endl;
452 std::cout <<
"------------ Fit status ---------------" << std::endl;
453 _track->getFitStatus(_trkrep)->Print();
455 std::cout <<
"------------ Fit Result ---------------" << std::endl;
456 _track->getFittedState().Print();
458 if(debugLvl < 1)
return;
459 for(
auto iter = _measurements.begin(); iter != _measurements.end(); ++iter)
461 (*iter)->print(debugLvl-1);
464 if(debugLvl < 20)
return;
465 std::cout <<
"------------ GenFit Track ---------------" << std::endl;
virtual double get_DoubleFlag(const std::string &name) const
void setTrackPtr(GFTrack *trackPtr)
void print(unsigned int debugLvl=0)
double extrapolateToPlane(TVector3 &pO, TVector3 &pU, TVector3 &pV, const int startPtID=0)
void getExtrapPosMomCov(TVector3 &pos, TVector3 &mom, TMatrixDSym &cov)
void addMeasurements(std::vector< GFMeasurement * > &measurements)
void setVerbosity(unsigned int v)
void postFitUpdate(bool updateMeasurements=true)
int getNearestMeasurementID(GFMeasurement *meas)
double swimToVertex(double z, TVector3 *pos=nullptr, TVector3 *mom=nullptr, TMatrixDSym *cov=nullptr)
void addMeasurement(GFMeasurement *measurement)
double extrapolateToLine(TVector3 &endPoint1, TVector3 &endPoint2, const int startPtID=0)
void getExtrapPosMom(TVector3 &pos, TVector3 &mom)
void setMaxErrorCount(unsigned int m)
void setTracklet(Tracklet &tracklet, double z_reference=590., bool wildseedcov=false)
double extrapolateToPoint(TVector3 &point, bool update=false, const int startPtID=0)
double updatePropState(const TVectorD &meas, const TMatrixDSym &V)
Int_t getCharge() const
Gets.
TVectorD getGFAuxInfo(Int_t i)
void insertChisq(Double_t chisq)
void setChisq(Double_t chisq)
Sets.
void insertCovariance(TMatrixD covar)
void insertGFState(const genfit::MeasuredStateOnPlane &msop)
TVector3 getMomentumVecSt1() const
TVector3 getPositionVecSt1() const
TVectorD getGFState(Int_t i)
TVector3 getGFPlaneU(Int_t i)
TVector3 getGFPlaneO(Int_t i)
TMatrixDSym getGFCov(Int_t i)
void insertHitIndex(Int_t index)
void setKalmanStatus(Int_t status)
TVector3 getGFPlaneV(Int_t i)
void insertStateVector(TMatrixD state)
double getExpPositionY(double z) const
std::list< SignedHit > hits
TVector3 getExpMomentum(double z) const
double getExpPositionX(double z) const
void print(std::ostream &os=std::cout)
int getCharge() const
Return the charge (+1 or -1) of this tracklet.
static recoConsts * instance()