34 #include <TDatabasePDG.h>
46 cardinalRep_(0), fitStatuses_(), mcTrackId_(-1), timeSeed_(0), stateSeed_(6), covSeed_(6)
53 cardinalRep_(0), fitStatuses_(), stateSeed_(6), covSeed_(6)
79 std::vector <AbsMeasurement*> factoryHits = factory.
createMany(trackCand);
81 if (factoryHits.size() != trackCand.
getNHits()) {
82 Exception exc(
"Track::Track ==> factoryHits.size() != trackCand->getNHits()",__LINE__,__FILE__);
88 for (
unsigned int i=0; i<factoryHits.size(); ++i){
97 cardinalRep_(0), fitStatuses_(), mcTrackId_(-1), timeSeed_(0), stateSeed_(stateSeed),
98 covSeed_(TMatrixDSym::kUnit, TMatrixDSym(6))
105 cardinalRep_(0), fitStatuses_(), mcTrackId_(-1), timeSeed_(0), stateSeed_(6),
106 covSeed_(TMatrixDSym::kUnit, TMatrixDSym(6))
114 cardinalRep_(0), fitStatuses_(), mcTrackId_(-1), timeSeed_(0), stateSeed_(stateSeed),
123 cardinalRep_(rhs.cardinalRep_), mcTrackId_(rhs.mcTrackId_), timeSeed_(rhs.timeSeed_),
124 stateSeed_(rhs.stateSeed_), covSeed_(rhs.covSeed_)
128 std::map<const AbsTrackRep*, AbsTrackRep*> oldRepNewRep;
130 for (std::vector<AbsTrackRep*>::const_iterator it=rhs.
trackReps_.begin(); it!=rhs.
trackReps_.end(); ++it) {
133 oldRepNewRep[(*it)] = newRep;
142 for (std::map< const AbsTrackRep*, FitStatus* >::const_iterator it=rhs.
fitStatuses_.begin(); it!=rhs.
fitStatuses_.end(); ++it) {
143 setFitStatus(it->second->clone(), oldRepNewRep[it->first]);
198 for (
size_t i = 0; i <
trackReps_.size(); ++i)
235 if ((*it)->hasFitterInfo(rep)) {
245 if ((*it)->hasFitterInfo(rep)) {
265 if ((*it)->hasFitterInfo(rep)) {
274 for (std::vector<TrackPoint*>::const_reverse_iterator it =
trackPoints_.rbegin(); it !=
trackPoints_.rend(); ++it) {
275 if ((*it)->hasFitterInfo(rep)) {
294 Exception exc(
"Track::getFittedState ==> no trackPoint with fitterInfo for rep",__LINE__,__FILE__);
304 for (
size_t i = 0; i <
trackReps_.size(); ++i)
308 Exception exc(
"Track::getIdForRep ==> cannot find TrackRep in Track",__LINE__,__FILE__);
332 return (dynamic_cast<KalmanFitStatus*>(
fitStatuses_.at(rep)) != NULL);
337 return dynamic_cast<KalmanFitStatus*>(
getFitStatus(rep));
368 debugOut <<
"Track::insertPoint at position " <<
id <<
"\n";
426 int n = points.size();
435 for (std::vector<TrackPoint*>::iterator p = points.begin(); p != points.end(); ++p)
436 (*p)->setTrack(
this);
476 debugOut <<
"Track::deletePoint at position " <<
id <<
"\n";
522 std::map<const AbsTrackRep*, AbsTrackRep*> otherRepThisRep;
523 std::vector<const AbsTrackRep*> otherRepsToRemove;
525 for (std::vector<AbsTrackRep*>::const_iterator otherRep=other->
trackReps_.begin(); otherRep!=other->
trackReps_.end(); ++otherRep) {
527 for (std::vector<AbsTrackRep*>::const_iterator thisRep=
trackReps_.begin(); thisRep!=
trackReps_.end(); ++thisRep) {
528 if ((*thisRep)->isSame(*otherRep)) {
529 otherRepThisRep[*otherRep] = *thisRep;
531 debugOut <<
" map other rep " << *otherRep <<
" to " << (*thisRep) <<
"\n";
534 Exception exc(
"Track::mergeTrack ==> more than one matching rep.",__LINE__,__FILE__);
543 otherRepsToRemove.push_back(*otherRep);
545 debugOut <<
" remove other rep " << *otherRep <<
"\n";
551 std::vector<TrackPoint*> points;
554 for (std::vector<TrackPoint*>::const_iterator otherTp=other->
trackPoints_.begin(); otherTp!=other->
trackPoints_.end(); ++otherTp) {
555 points.push_back(
new TrackPoint(**otherTp, otherRepThisRep, &otherRepsToRemove));
581 for (std::vector<TrackPoint*>::const_iterator pointIt =
trackPoints_.begin(); pointIt !=
trackPoints_.end(); ++pointIt) {
582 (*pointIt)->deleteFitterInfo(rep);
600 if (
id >= 0 && (
unsigned int)
id <
trackReps_.size())
604 errorOut <<
"Track::setCardinalRep: Attempted to set cardinalRep_ to a value out of bounds. Resetting cardinalRep_ to 0." << std::endl;
616 double minChi2(9.E99);
619 for (std::map< const AbsTrackRep*, FitStatus* >::const_iterator it =
fitStatuses_.begin(); it !=
fitStatuses_.end(); ++it) {
620 if (it->second->isFitConverged()) {
621 if (it->second->getChi2() < minChi2) {
622 minChi2 = it->second->getChi2();
628 if (bestRep != NULL) {
647 int equalUntil(-1), equalFrom(nPoints);
648 for (
int i = 0; i<nPoints; ++i) {
655 if (equalUntil == nPoints-1)
661 for (
int i = nPoints-1; i>equalUntil; --i) {
669 debugOut <<
"Track::sort. Equal up to (including) hit " << equalUntil <<
" and from (including) hit " << equalFrom <<
" \n";
690 double fittedCharge = fittedState.
getCharge();
692 for (
unsigned int i = 0; i<
trackReps_.size(); ++i) {
693 if (
trackReps_[i]->getPDGCharge() * fittedCharge < 0) {
724 for (
unsigned int i = 0; i<
trackReps_.size(); ++i) {
740 debugOut <<
"Track::deleteForwardInfo from position " << startId <<
" to " << endId <<
"\n";
751 assert (endId >= startId);
753 for (std::vector<TrackPoint*>::const_iterator pointIt =
trackPoints_.begin() + startId; pointIt !=
trackPoints_.begin() + endId; ++pointIt) {
755 if ((*pointIt)->hasFitterInfo(rep))
756 (*pointIt)->getFitterInfo(rep)->deleteForwardInfo();
759 const std::vector<AbsFitterInfo*> fitterInfos = (*pointIt)->getFitterInfos();
760 for (std::vector<AbsFitterInfo*>::const_iterator fitterInfoIt = fitterInfos.begin(); fitterInfoIt != fitterInfos.end(); ++fitterInfoIt) {
761 (*fitterInfoIt)->deleteForwardInfo();
770 debugOut <<
"Track::deleteBackwardInfo from position " << startId <<
" to " << endId <<
"\n";
781 assert (endId >= startId);
784 for (std::vector<TrackPoint*>::const_iterator pointIt =
trackPoints_.begin() + startId; pointIt !=
trackPoints_.begin() + endId; ++pointIt) {
786 if ((*pointIt)->hasFitterInfo(rep))
787 (*pointIt)->getFitterInfo(rep)->deleteBackwardInfo();
790 const std::vector<AbsFitterInfo*> fitterInfos = (*pointIt)->getFitterInfos();
791 for (std::vector<AbsFitterInfo*>::const_iterator fitterInfoIt = fitterInfos.begin(); fitterInfoIt != fitterInfos.end(); ++fitterInfoIt) {
792 (*fitterInfoIt)->deleteBackwardInfo();
801 debugOut <<
"Track::deleteReferenceInfo from position " << startId <<
" to " << endId <<
"\n";
812 assert (endId >= startId);
814 for (std::vector<TrackPoint*>::const_iterator pointIt =
trackPoints_.begin() + startId; pointIt !=
trackPoints_.begin() + endId; ++pointIt) {
816 if ((*pointIt)->hasFitterInfo(rep))
817 (*pointIt)->getFitterInfo(rep)->deleteReferenceInfo();
820 std::vector<AbsFitterInfo*> fitterInfos = (*pointIt)->getFitterInfos();
821 for (std::vector<AbsFitterInfo*>::const_iterator fitterInfoIt = fitterInfos.begin(); fitterInfoIt != fitterInfos.end(); ++fitterInfoIt) {
822 (*fitterInfoIt)->deleteReferenceInfo();
831 debugOut <<
"Track::deleteMeasurementInfo from position " << startId <<
" to " << endId <<
"\n";
842 assert (endId >= startId);
844 for (std::vector<TrackPoint*>::const_iterator pointIt =
trackPoints_.begin() + startId; pointIt !=
trackPoints_.begin() + endId; ++pointIt) {
846 if ((*pointIt)->hasFitterInfo(rep))
847 (*pointIt)->getFitterInfo(rep)->deleteMeasurementInfo();
850 std::vector<AbsFitterInfo*> fitterInfos = (*pointIt)->getFitterInfos();
851 for (std::vector<AbsFitterInfo*>::const_iterator fitterInfoIt = fitterInfos.begin(); fitterInfoIt != fitterInfos.end(); ++fitterInfoIt) {
852 (*fitterInfoIt)->deleteMeasurementInfo();
861 debugOut <<
"Track::deleteFitterInfo from position " << startId <<
" to " << endId <<
"\n";
872 assert (endId >= startId);
874 for (std::vector<TrackPoint*>::const_iterator pointIt =
trackPoints_.begin() + startId; pointIt !=
trackPoints_.begin() + endId; ++pointIt) {
876 if ((*pointIt)->hasFitterInfo(rep))
877 (*pointIt)->deleteFitterInfo(rep);
880 for (std::vector<AbsTrackRep*>::const_iterator repIt =
trackReps_.begin(); repIt !=
trackReps_.end(); ++repIt) {
881 if ((*pointIt)->hasFitterInfo(*repIt))
882 (*pointIt)->deleteFitterInfo(*repIt);
896 bool backwards(
false);
897 if (startId > endId) {
898 double temp = startId;
912 for (std::vector<TrackPoint*>::const_iterator pointIt =
trackPoints_.begin() + startId; pointIt !=
trackPoints_.begin() + endId; ++pointIt) {
913 if (! (*pointIt)->hasFitterInfo(rep)) {
914 Exception e(
"Track::getTracklength: trackPoint has no fitterInfo", __LINE__,__FILE__);
922 state = (*pointIt)->getFitterInfo(rep)->getFittedState();
943 for (
unsigned int j = 0; j < measurements.size(); ++j) {
948 if (dynamic_cast<const PlanarMeasurement*>(m)) {
949 planeId = static_cast<const PlanarMeasurement*>(m)->
getPlaneId();
975 if (startId > endId) {
976 std::swap(startId, endId);
991 Exception e(
"Track::getTOF: trackPoint has no fitterInfo", __LINE__,__FILE__);
1008 assert(startId >= 0);
1009 assert(startId <= endId);
1012 std::vector< AbsFitterInfo* > fis;
1014 for (std::vector<TrackPoint*>::iterator tp =
trackPoints_.begin() + startId; tp !=
trackPoints_.begin() + endId; ++tp) {
1017 fis = (*tp)->getFitterInfos();
1019 else if ((*tp)->hasFitterInfo(rep)) {
1020 fis.push_back((*tp)->getFitterInfo(rep));
1023 for (std::vector< AbsFitterInfo* >::iterator fi = fis.begin(); fi != fis.end(); ++fi) {
1039 for (std::map< const AbsTrackRep*, FitStatus* >::const_iterator it=
fitStatuses_.begin(); it!=
fitStatuses_.end(); ++it) {
1040 it->second->getPruneFlags().setFlags(option);
1062 for (
unsigned int i = 0; i <
trackReps_.size(); ++i) {
1076 std::vector< AbsFitterInfo* > fis =
trackPoints_[i]->getFitterInfos();
1077 for (
unsigned int j = 0; j<fis.size(); ++j) {
1088 if (f.
hasFlags(
"U") && dynamic_cast<KalmanFitterInfo*>(fis[j]) != NULL) {
1089 static_cast<KalmanFitterInfo*>(fis[j])->deletePredictions();
1110 TString opt = option;
1112 if (opt.Contains(
"C")) {
1170 printf(
"% -9.3g ",
trackPoints_[i]->getSortingParameter());
1173 for (std::vector<AbsTrackRep*>::const_iterator rep =
trackReps_.begin(); rep !=
trackReps_.end(); ++rep) {
1246 printOut <<
"=======================================================================================\n";
1250 for (
unsigned int i=0; i<
trackReps_.size(); ++i) {
1253 printOut <<
" (This is the cardinal rep)";
1258 printOut <<
"---------------------------------------------------------------------------------------\n";
1261 printOut <<
"TrackPoint Nr. " << i <<
"\n";
1263 printOut <<
"..........................................................................\n";
1266 for (std::map< const AbsTrackRep*, FitStatus* >::const_iterator it=
fitStatuses_.begin(); it!=
fitStatuses_.end(); ++it) {
1267 it->second->Print();
1270 printOut <<
"=======================================================================================\n";
1279 std::map<const AbsTrackRep*, const KalmanFitterInfo*> prevFis;
1283 errorOut <<
"Track::checkConsistency(): stateSeed_ dimension != 6" << std::endl;
1288 errorOut <<
"Track::checkConsistency(): covSeed_ dimension != 6" << std::endl;
1293 errorOut <<
"Track::checkConsistency(): Warning: covSeed_ is zero" << std::endl;
1299 errorOut <<
"Track::checkConsistency(): Number of fitStatuses is != number of TrackReps " << std::endl;
1305 errorOut <<
"Track::checkConsistency(): cardinalRep id " <<
cardinalRep_ <<
" out of bounds" << std::endl;
1309 for (std::vector<AbsTrackRep*>::const_iterator rep =
trackReps_.begin(); rep !=
trackReps_.end(); ++rep) {
1311 if ((*rep) == NULL) {
1312 errorOut <<
"Track::checkConsistency(): TrackRep is NULL" << std::endl;
1317 TParticlePDG* particle = TDatabasePDG::Instance()->GetParticle((*rep)->getPDG());
1318 if (particle == NULL) {
1319 errorOut <<
"Track::checkConsistency(): TrackRep pdg ID " << (*rep)->getPDG() <<
" is not valid" << std::endl;
1325 errorOut <<
"Track::checkConsistency(): No FitStatus for Rep or FitStatus is NULL" << std::endl;
1333 if ((*tp) == NULL) {
1334 errorOut <<
"Track::checkConsistency(): TrackPoint is NULL" << std::endl;
1338 if ((*tp)->getTrack() !=
this) {
1339 errorOut <<
"Track::checkConsistency(): TrackPoint does not point back to this track" << std::endl;
1344 const std::vector<AbsMeasurement*>& rawMeasurements = (*tp)->getRawMeasurements();
1345 for (std::vector<AbsMeasurement*>::const_iterator m = rawMeasurements.begin(); m != rawMeasurements.end(); ++m) {
1348 errorOut <<
"Track::checkConsistency(): Measurement is NULL" << std::endl;
1352 if ((*m)->getTrackPoint() != *tp) {
1353 errorOut <<
"Track::checkConsistency(): Measurement does not point back to correct TrackPoint" << std::endl;
1359 std::vector<AbsFitterInfo*> fitterInfos = (*tp)->getFitterInfos();
1360 for (std::vector<AbsFitterInfo*>::const_iterator fi = fitterInfos.begin(); fi != fitterInfos.end(); ++fi) {
1362 if ((*fi) == NULL) {
1363 errorOut <<
"Track::checkConsistency(): FitterInfo is NULL. TrackPoint: " << *tp << std::endl;
1369 for (std::vector<AbsTrackRep*>::const_iterator rep =
trackReps_.begin(); rep !=
trackReps_.end(); ++rep) {
1370 if ( (*rep) == (*fi)->getRep() ) {
1375 errorOut <<
"Track::checkConsistency(): fitterInfo points to TrackRep which is not in Track" << std::endl;
1379 if (!( (*fi)->checkConsistency(&(this->getFitStatus((*fi)->getRep())->getPruneFlags())) ) ) {
1380 errorOut <<
"Track::checkConsistency(): FitterInfo not consistent. TrackPoint: " << *tp << std::endl;
1384 if (dynamic_cast<KalmanFitterInfo*>(*fi) != NULL) {
1385 if (prevFis[(*fi)->getRep()] != NULL &&
1386 static_cast<KalmanFitterInfo*>(*fi)->hasReferenceState() &&
1387 prevFis[(*fi)->getRep()]->hasReferenceState() ) {
1388 double len = static_cast<KalmanFitterInfo*>(*fi)->getReferenceState()->getForwardSegmentLength();
1389 double prevLen = prevFis[(*fi)->getRep()]->getReferenceState()->getBackwardSegmentLength();
1390 if (fabs(prevLen + len) > 1E-10 ) {
1391 errorOut <<
"Track::checkConsistency(): segment lengths of reference states for rep " << (*fi)->getRep() <<
" (id " <<
getIdForRep((*fi)->getRep()) <<
") at TrackPoint " << (*tp) <<
" don't match" << std::endl;
1392 errorOut << prevLen <<
" + " << len <<
" = " << prevLen + len << std::endl;
1393 errorOut <<
"TrackPoint " << *tp <<
", FitterInfo " << *fi <<
", rep " <<
getIdForRep((*fi)->getRep()) << std::endl;
1398 prevFis[(*fi)->getRep()] = static_cast<KalmanFitterInfo*>(*fi);
1401 prevFis[(*fi)->getRep()] = NULL;
1409 std::vector<TrackPoint*> trackPointsWithMeasurement;
1412 if ((*it)->hasRawMeasurements()) {
1413 trackPointsWithMeasurement.push_back(*it);
1418 errorOut <<
"Track::checkConsistency(): trackPointsWithMeasurement_ has incorrect size" << std::endl;
1422 for (
unsigned int i = 0; i < trackPointsWithMeasurement.size(); ++i) {
1424 errorOut <<
"Track::checkConsistency(): trackPointsWithMeasurement_ is not correct" << std::endl;
1426 errorOut <<
"should have id " << i <<
", address " << trackPointsWithMeasurement[i] << std::endl;
1438 debugOut <<
"Track::trackHasChanged \n";
1444 for (std::map< const AbsTrackRep*, FitStatus* >::const_iterator it=
fitStatuses_.begin(); it!=
fitStatuses_.end(); ++it) {
1445 it->second->setHasTrackChanged();
1455 if ((*it)->hasRawMeasurements()) {
1462 void Track::Streamer(TBuffer &R__b)
1465 const bool streamTrackPoints =
true;
1467 typedef ::genfit::Track thisClass;
1469 if (R__b.IsReading()) {
1471 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
if (R__v) { }
1472 TObject::Streamer(R__b);
1474 std::vector<AbsTrackRep*> &R__stl =
trackReps_;
1478 Error(
"trackReps_ streamer",
"Missing the TClass object for genfit::AbsTrackRep!");
1483 R__stl.reserve(R__n);
1484 for (R__i = 0; R__i < R__n; R__i++) {
1487 R__stl.push_back(R__t);
1491 if (streamTrackPoints)
1497 Error(
"trackPoints_ streamer",
"Missing the TClass object for genfit::TrackPoint!");
1502 R__stl.reserve(R__n);
1503 for (R__i = 0; R__i < R__n; R__i++) {
1508 R__stl.push_back(R__t);
1512 std::map<const AbsTrackRep*,FitStatus*> &R__stl =
fitStatuses_;
1516 Error(
"fitStatuses_ streamer",
"Missing the TClass object for genfit::AbsTrackRep!");
1521 Error(
"fitStatuses_ streamer",
"Missing the TClass object for genfit::FitStatus!");
1526 for (R__i = 0; R__i < R__n; R__i++) {
1544 R__b.CheckByteCount(R__s, R__c, thisClass::IsA());
1548 R__c = R__b.WriteVersion(thisClass::IsA(), kTRUE);
1549 TObject::Streamer(R__b);
1551 std::vector<AbsTrackRep*> &R__stl =
trackReps_;
1552 int R__n=int(R__stl.size());
1557 Error(
"trackReps_ streamer",
"Missing the TClass object for genfit::AbsTrackRep!");
1560 std::vector<AbsTrackRep*>::iterator R__k;
1561 for (R__k = R__stl.begin(); R__k != R__stl.end(); ++R__k) {
1567 if (streamTrackPoints)
1570 int R__n=int(R__stl.size());
1573 std::vector<TrackPoint*>::iterator R__k;
1574 for (R__k = R__stl.begin(); R__k != R__stl.end(); ++R__k) {
1580 std::map<const AbsTrackRep*,FitStatus*> &R__stl =
fitStatuses_;
1581 int R__n=int(R__stl.size());
1586 Error(
"fitStatuses_ streamer",
"Missing the TClass object for genfit::AbsTrackRep!");
1591 Error(
"fitStatuses_ streamer",
"Missing the TClass object for genfit::FitStatus!");
1594 std::map<const AbsTrackRep*,FitStatus*>::iterator R__k;
1595 for (R__k = R__stl.begin(); R__k != R__stl.end(); ++R__k) {
1598 R__b << ((*R__k).second);
1605 R__b.SetByteCount(R__c, kTRUE);