20 #include "KalmanFitterInfo.h"
26 #include "Exception.h"
27 #include "FitStatus.h"
30 #include "TrackPoint.h"
37 KalmanFitterInfo::KalmanFitterInfo() :
38 AbsFitterInfo(), fixWeights_(false)
43 KalmanFitterInfo::KalmanFitterInfo(
const TrackPoint* trackPoint,
const AbsTrackRep* rep) :
44 AbsFitterInfo(trackPoint, rep), fixWeights_(false)
49 KalmanFitterInfo::~KalmanFitterInfo() {
50 deleteMeasurementInfo();
56 if (hasReferenceState())
58 if (hasForwardPrediction())
60 if (hasForwardUpdate())
62 if (hasBackwardPrediction())
64 if (hasBackwardUpdate())
68 for (std::vector<MeasurementOnPlane*>::const_iterator it = this->
measurementsOnPlane_.begin(); it != this->measurementsOnPlane_.end(); ++it) {
72 retVal->fixWeights_ = this->fixWeights_;
89 retVal.getCov() *= 1. / weight;
91 retVal.setWeight(weight);
98 double sumOfWeights(0), weight(0);
100 retVal.getState().Zero();
101 retVal.getCov().Zero();
120 sumOfWeights += weight;
123 retVal.getCov() += covInv;
129 tools::invertMatrix(retVal.getCov());
131 retVal.getState() *= retVal.getCov();
133 retVal.setWeight(sumOfWeights);
144 return getMeasurementOnPlane(0);
146 double normMin(9.99E99);
147 unsigned int iMin(0);
149 for (
unsigned int i=0; i<getNumMeasurements(); ++i) {
151 Exception e(
"KalmanFitterInfo::getClosestMeasurementOnPlane: Cannot compare measurements with different H-Matrices. Maybe you have to select a different multipleMeasurementHandling.", __LINE__,__FILE__);
157 double norm = sqrt(res.Norm2Sqr());
158 if (norm < normMin) {
164 return getMeasurementOnPlane(iMin);
169 std::vector<double> retVal(getNumMeasurements());
171 for (
unsigned int i=0; i<getNumMeasurements(); ++i) {
172 retVal[i] = getMeasurementOnPlane(i)->getWeight();
184 if (!biased && fittedStateUnbiased_)
185 return *fittedStateUnbiased_;
189 const Track* tr = tp->getTrack();
192 bool first(
false), last(
false);
196 if (flag.isPruned()) {
197 debugOut <<
"KalmanFitterInfo::getFittedState - Track is pruned and has " << tr->getNumPoints() <<
" TrackPoints \n";
201 if (flag.isPruned() && tr->getNumPoints() == 1) {
202 if (flag.hasFlags(
"F")) {
205 debugOut <<
"KalmanFitterInfo::getFittedState - has flag F \n";
208 else if (flag.hasFlags(
"L")) {
211 debugOut <<
"KalmanFitterInfo::getFittedState - has flag L \n";
216 first = tr->getPointWithFitterInfo(0, rep) == tp;
217 last = tr->getPointWithFitterInfo(-1, rep) == tp;
221 debugOut <<
"KalmanFitterInfo::getFittedState first " << first <<
", last " << last <<
"\n";
222 debugOut <<
"KalmanFitterInfo::getFittedState forwardPrediction_ " << forwardPrediction_.get() <<
", forwardUpdate_ " << forwardUpdate_.get() <<
"\n";
223 debugOut <<
"KalmanFitterInfo::getFittedState backwardPrediction_ " << backwardPrediction_.get() <<
", backwardUpdate_ " << backwardUpdate_.get() <<
"\n";
235 if (last && !backwardPrediction_) {
236 if(!forwardUpdate_) {
237 Exception e(
"KalmanFitterInfo::getFittedState: Needed updates/predictions not available in this FitterInfo.", __LINE__,__FILE__);
242 debugOut <<
"KalmanFitterInfo::getFittedState - biased at last measurement = forwardUpdate_ \n";
244 return *forwardUpdate_;
248 if (first && (!forwardUpdate_ || (backwardUpdate_ && !forwardPrediction_) ) ) {
249 if(!backwardUpdate_.get()) {
250 Exception e(
"KalmanFitterInfo::getFittedState: Needed updates/predictions not available in this FitterInfo.", __LINE__,__FILE__);
255 debugOut <<
"KalmanFitterInfo::getFittedState - biased at first measurement = backwardUpdate_ \n";
258 return *backwardUpdate_;
261 if(!forwardUpdate_ || !backwardPrediction_) {
262 Exception e(
"KalmanFitterInfo::getFittedState: Needed updates/predictions not available in this FitterInfo.", __LINE__,__FILE__);
267 debugOut <<
"KalmanFitterInfo::getFittedState - biased = mean(forwardUpdate_, backwardPrediction_) \n";
276 if (last && !backwardPrediction_) {
277 if(!forwardPrediction_) {
278 Exception e(
"KalmanFitterInfo::getFittedState: Needed updates/predictions not available in this FitterInfo.", __LINE__,__FILE__);
283 debugOut <<
"KalmanFitterInfo::getFittedState - unbiased at last measurement = forwardPrediction_ \n";
285 return *forwardPrediction_;
289 if (first && !forwardPrediction_) {
290 if(!backwardPrediction_) {
291 Exception e(
"KalmanFitterInfo::getFittedState: Needed updates/predictions not available in this FitterInfo.", __LINE__,__FILE__);
296 debugOut <<
"KalmanFitterInfo::getFittedState - unbiased at first measurement = backwardPrediction_ \n";
298 return *backwardPrediction_;
301 if(!forwardPrediction_ || !backwardPrediction_) {
302 Exception e(
"KalmanFitterInfo::getFittedState: Needed updates/predictions not available in this FitterInfo.", __LINE__,__FILE__);
307 debugOut <<
"KalmanFitterInfo::getFittedState - unbiased = mean(forwardPrediction_, backwardPrediction_) \n";
310 return *fittedStateUnbiased_;
321 if(*(smoothedState.getPlane()) != *plane) {
322 Exception e(
"KalmanFitterInfo::getResidual: smoothedState and measurement are not defined in the same plane.", __LINE__,__FILE__);
325 if(smoothedState.getRep() != measurement->getRep()) {
326 Exception e(
"KalmanFitterInfo::getResidual: smoothedState and measurement are not defined wrt the same TrackRep.", __LINE__,__FILE__);
330 const AbsHMatrix* H = measurement->getHMatrix();
334 TVectorD res(H->Hv(smoothedState.getState()));
335 res -= measurement->getState();
338 if (onlyMeasurementErrors) {
339 return MeasurementOnPlane(res, measurement->getCov(), plane, smoothedState.getRep(), H->clone(), measurement->getWeight());
342 TMatrixDSym cov(smoothedState.getCov());
344 cov += measurement->getCov();
346 return MeasurementOnPlane(res, cov, plane, smoothedState.getRep(), H->clone(), measurement->getWeight());
350 double KalmanFitterInfo::getSmoothedChi2(
unsigned int iMeasurement)
const {
354 tools::invertMatrix(res.getCov(), Rinv);
355 return Rinv.Similarity(res.getState());
359 void KalmanFitterInfo::setReferenceState(ReferenceStateOnPlane* referenceState) {
383 void KalmanFitterInfo::setForwardPrediction(MeasuredStateOnPlane* forwardPrediction) {
384 forwardPrediction_.reset(forwardPrediction);
385 fittedStateUnbiased_.reset();
387 if (forwardPrediction_)
388 setPlane(forwardPrediction_->getPlane());
391 void KalmanFitterInfo::setBackwardPrediction(MeasuredStateOnPlane* backwardPrediction) {
392 backwardPrediction_.reset(backwardPrediction);
393 fittedStateUnbiased_.reset();
395 if (backwardPrediction_)
396 setPlane(backwardPrediction_->getPlane());
399 void KalmanFitterInfo::setForwardUpdate(KalmanFittedStateOnPlane* forwardUpdate) {
400 forwardUpdate_.reset(forwardUpdate);
401 fittedStateUnbiased_.reset();
404 setPlane(forwardUpdate_->getPlane());
407 void KalmanFitterInfo::setBackwardUpdate(KalmanFittedStateOnPlane* backwardUpdate) {
408 backwardUpdate_.reset(backwardUpdate);
409 fittedStateUnbiased_.reset();
412 setPlane(backwardUpdate_->getPlane());
416 void KalmanFitterInfo::setMeasurementsOnPlane(
const std::vector< genfit::MeasurementOnPlane* >& measurementsOnPlane) {
417 deleteMeasurementInfo();
419 for (std::vector<MeasurementOnPlane*>::const_iterator m = measurementsOnPlane.begin(), mend = measurementsOnPlane.end(); m < mend; ++m) {
420 addMeasurementOnPlane(*m);
425 void KalmanFitterInfo::addMeasurementOnPlane(MeasurementOnPlane* measurementOnPlane) {
427 setPlane(measurementOnPlane->getPlane());
432 void KalmanFitterInfo::addMeasurementsOnPlane(
const std::vector< genfit::MeasurementOnPlane* >& measurementsOnPlane) {
433 for (std::vector<MeasurementOnPlane*>::const_iterator m = measurementsOnPlane.begin(), mend = measurementsOnPlane.end(); m < mend; ++m) {
434 addMeasurementOnPlane(*m);
439 void KalmanFitterInfo::setRep(
const AbsTrackRep* rep) {
445 if (forwardPrediction_)
446 forwardPrediction_->setRep(rep);
449 forwardUpdate_->setRep(rep);
451 if (backwardPrediction_)
452 backwardPrediction_->setRep(rep);
455 backwardUpdate_->setRep(rep);
465 if (weights.size() != getNumMeasurements()) {
466 Exception e(
"KalmanFitterInfo::setWeights: weights do not have the same size as measurementsOnPlane", __LINE__,__FILE__);
471 errorOut <<
"KalmanFitterInfo::setWeights - WARNING: setting weights even though weights are fixed!" << std::endl;
474 for (
unsigned int i=0; i<getNumMeasurements(); ++i) {
475 getMeasurementOnPlane(i)->setWeight(weights[i]);
480 void KalmanFitterInfo::deleteForwardInfo() {
481 setForwardPrediction(
nullptr);
482 setForwardUpdate(
nullptr);
483 fittedStateUnbiased_.reset();
487 void KalmanFitterInfo::deleteBackwardInfo() {
488 setBackwardPrediction(
nullptr);
489 setBackwardUpdate(
nullptr);
490 fittedStateUnbiased_.reset();
494 void KalmanFitterInfo::deletePredictions() {
495 setForwardPrediction(
nullptr);
496 setBackwardPrediction(
nullptr);
497 fittedStateUnbiased_.reset();
501 void KalmanFitterInfo::deleteMeasurementInfo() {
510 void KalmanFitterInfo::Print(
const Option_t*)
const {
511 printOut <<
"genfit::KalmanFitterInfo. Belongs to TrackPoint " <<
trackPoint_ <<
"; TrackRep " <<
rep_ <<
"\n";
523 if (forwardPrediction_) {
524 printOut <<
"Forward prediction_: "; forwardPrediction_->Print();
526 if (forwardUpdate_) {
527 printOut <<
"Forward update: "; forwardUpdate_->Print();
529 if (backwardPrediction_) {
530 printOut <<
"Backward prediction_: "; backwardPrediction_->Print();
532 if (backwardUpdate_) {
533 printOut <<
"Backward update: "; backwardUpdate_->Print();
545 errorOut <<
"KalmanFitterInfo::checkConsistency(): trackPoint_ is nullptr" << std::endl;
557 if (plane.get() ==
nullptr) {
560 errorOut <<
"KalmanFitterInfo::checkConsistency(): plane is nullptr" << std::endl;
564 TVector3 oTest = plane->getO();
572 errorOut <<
"KalmanFitterInfo::checkConsistency(): measurementsOnPlane_ do not all have the same dimensionality" << std::endl;
577 errorOut <<
"KalmanFitterInfo::checkConsistency(): measurementsOnPlane_ have dimension 0" << std::endl;
586 errorOut <<
"KalmanFitterInfo::checkConsistency(): referenceState_ is not defined with the correct plane " <<
referenceState_->getPlane().get() <<
" vs. " << plane.get() << std::endl;
590 errorOut <<
"KalmanFitterInfo::checkConsistency(): referenceState_ is not defined with the correct TrackRep" << std::endl;
594 errorOut <<
"KalmanFitterInfo::checkConsistency(): referenceState_ does not have the right dimension!" << std::endl;
599 if (forwardPrediction_) {
600 if(forwardPrediction_->getPlane() != plane) {
601 errorOut <<
"KalmanFitterInfo::checkConsistency(): forwardPrediction_ is not defined with the correct plane" << std::endl;
604 if(forwardPrediction_->getRep() !=
rep_) {
605 errorOut <<
"KalmanFitterInfo::checkConsistency(): forwardPrediction_ is not defined with the correct TrackRep" << std::endl;
608 if (forwardPrediction_->getState().GetNrows() != dim || forwardPrediction_->getCov().GetNrows() != dim) {
609 errorOut <<
"KalmanFitterInfo::checkConsistency(): forwardPrediction_ does not have the right dimension!" << std::endl;
613 if (forwardUpdate_) {
614 if(forwardUpdate_->getPlane() != plane) {
615 errorOut <<
"KalmanFitterInfo::checkConsistency(): forwardUpdate_ is not defined with the correct plane" << std::endl;
618 if(forwardUpdate_->getRep() !=
rep_) {
619 errorOut <<
"KalmanFitterInfo::checkConsistency(): forwardUpdate_ is not defined with the correct TrackRep" << std::endl;
622 if (forwardUpdate_->getState().GetNrows() != dim || forwardUpdate_->getCov().GetNrows() != dim) {
623 errorOut <<
"KalmanFitterInfo::checkConsistency(): forwardUpdate_ does not have the right dimension!" << std::endl;
628 if (backwardPrediction_) {
629 if(backwardPrediction_->getPlane() != plane) {
630 errorOut <<
"KalmanFitterInfo::checkConsistency(): backwardPrediction_ is not defined with the correct plane" << std::endl;
633 if(backwardPrediction_->getRep() !=
rep_) {
634 errorOut <<
"KalmanFitterInfo::checkConsistency(): backwardPrediction_ is not defined with the correct TrackRep" << std::endl;
637 if (backwardPrediction_->getState().GetNrows() != dim || backwardPrediction_->getCov().GetNrows() != dim) {
638 errorOut <<
"KalmanFitterInfo::checkConsistency(): backwardPrediction_ does not have the right dimension!" << std::endl;
642 if (backwardUpdate_) {
643 if(backwardUpdate_->getPlane() != plane) {
644 errorOut <<
"KalmanFitterInfo::checkConsistency(): backwardUpdate_ is not defined with the correct plane" << std::endl;
647 if(backwardUpdate_->getRep() !=
rep_) {
648 errorOut <<
"KalmanFitterInfo::checkConsistency(): backwardUpdate_ is not defined with the correct TrackRep" << std::endl;
651 if (backwardUpdate_->getState().GetNrows() != dim || backwardUpdate_->getCov().GetNrows() != dim) {
652 errorOut <<
"KalmanFitterInfo::checkConsistency(): backwardUpdate_ does not have the right dimension!" << std::endl;
658 if((*it)->getPlane() != plane) {
659 errorOut <<
"KalmanFitterInfo::checkConsistency(): measurement is not defined with the correct plane" << std::endl;
662 if((*it)->getRep() !=
rep_) {
663 errorOut <<
"KalmanFitterInfo::checkConsistency(): measurement is not defined with the correct TrackRep" << std::endl;
666 if ((*it)->getState().GetNrows() == 0) {
667 errorOut <<
"KalmanFitterInfo::checkConsistency(): measurement has dimension 0!" << std::endl;
672 if (flags ==
nullptr or !flags->
hasFlags(
"U")) {
674 if (forwardUpdate_ && !forwardPrediction_) {
675 errorOut <<
"KalmanFitterInfo::checkConsistency(): forwardUpdate_ w/o forwardPrediction_" << std::endl;
680 if (backwardUpdate_ && !backwardPrediction_) {
681 errorOut <<
"KalmanFitterInfo::checkConsistency(): backwardUpdate_ w/o backwardPrediction_" << std::endl;
685 if (flags ==
nullptr or !flags->
hasFlags(
"M")) {
687 errorOut <<
"KalmanFitterInfo::checkConsistency(): forwardUpdate_ w/o measurement" << std::endl;
692 errorOut <<
"KalmanFitterInfo::checkConsistency(): backwardUpdate_ w/o measurement" << std::endl;
704 void KalmanFitterInfo::Streamer(TBuffer &R__b)
709 typedef ::genfit::KalmanFitterInfo thisClass;
711 if (R__b.IsReading()) {
712 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
if (R__v) { }
715 baseClass0::Streamer(R__b);
719 deleteBackwardInfo();
720 deleteReferenceInfo();
721 deleteMeasurementInfo();
728 if (flag & (1 << 1)) {
729 forwardPrediction_.reset(
new MeasuredStateOnPlane());
730 forwardPrediction_->Streamer(R__b);
731 forwardPrediction_->setPlane(getPlane());
734 if (flag & (1 << 2)) {
735 forwardUpdate_.reset(
new KalmanFittedStateOnPlane());
736 forwardUpdate_->Streamer(R__b);
737 forwardUpdate_->setPlane(getPlane());
740 if (flag & (1 << 3)) {
741 backwardPrediction_.reset(
new MeasuredStateOnPlane());
742 backwardPrediction_->Streamer(R__b);
743 backwardPrediction_->setPlane(getPlane());
746 if (flag & (1 << 4)) {
747 backwardUpdate_.reset(
new KalmanFittedStateOnPlane());
748 backwardUpdate_->Streamer(R__b);
749 backwardUpdate_->setPlane(getPlane());
753 std::vector<genfit::MeasurementOnPlane*,std::allocator<genfit::MeasurementOnPlane*> > &R__stl =
measurementsOnPlane_;
756 Error(
"measurementsOnPlane_ streamer",
"Missing the TClass object for genfit::MeasurementOnPlane!");
761 R__stl.reserve(R__n);
762 for (R__i = 0; R__i < R__n; R__i++) {
764 R__t->Streamer(R__b);
765 R__t->setPlane(getPlane());
766 R__stl.push_back(R__t);
769 R__b.CheckByteCount(R__s, R__c, thisClass::IsA());
771 R__c = R__b.WriteVersion(thisClass::IsA(), kTRUE);
774 baseClass0::Streamer(R__b);
778 | (!!forwardPrediction_ << 1)
779 | (!!forwardUpdate_ << 2)
780 | (!!backwardPrediction_ << 3)
781 | (!!backwardUpdate_ << 4));
786 forwardPrediction_->Streamer(R__b);
788 forwardUpdate_->Streamer(R__b);
790 backwardPrediction_->Streamer(R__b);
792 backwardUpdate_->Streamer(R__b);
794 std::vector<genfit::MeasurementOnPlane*,std::allocator<genfit::MeasurementOnPlane*> > &R__stl =
measurementsOnPlane_;
795 int R__n=(&R__stl) ?
int(R__stl.size()) : 0;
798 std::vector<genfit::MeasurementOnPlane*,std::allocator<genfit::MeasurementOnPlane*> >::iterator R__k;
799 for (R__k = R__stl.begin(); R__k != R__stl.end(); ++R__k) {
800 (*R__k)->Streamer(R__b);
804 R__b.SetByteCount(R__c, kTRUE);