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_;
78 MeasurementOnPlane KalmanFitterInfo::getAvgWeightedMeasurementOnPlane(
bool ignoreWeights)
const {
82 if(measurementsOnPlane_.size() == 1) {
87 double weight = (measurementsOnPlane_[0])->getWeight();
89 retVal.getCov() *= 1. / weight;
91 retVal.setWeight(weight);
99 double sumOfWeights(0), weight(0);
101 retVal.getState().Zero();
102 retVal.getCov().Zero();
106 for(
unsigned int i=0; i<measurementsOnPlane_.size(); ++i) {
111 assert(measurementsOnPlane_[i]->getPlane() == measurementsOnPlane_[0]->getPlane());
112 assert(*(measurementsOnPlane_[i]->getHMatrix()) == *(measurementsOnPlane_[0]->getHMatrix()));
115 tools::invertMatrix(measurementsOnPlane_[i]->getCov(), covInv);
120 weight = measurementsOnPlane_[i]->getWeight();
121 sumOfWeights += weight;
124 retVal.getCov() += covInv;
126 retVal.getState() += covInv * measurementsOnPlane_[i]->getState();
130 tools::invertMatrix(retVal.getCov());
132 retVal.getState() *= retVal.getCov();
134 retVal.setWeight(sumOfWeights);
141 if(measurementsOnPlane_.size() == 0)
144 if(measurementsOnPlane_.size() == 1)
145 return getMeasurementOnPlane(0);
147 double normMin(9.99E99);
148 unsigned int iMin(0);
149 const AbsHMatrix* H = measurementsOnPlane_[0]->getHMatrix();
150 for (
unsigned int i=0; i<getNumMeasurements(); ++i) {
151 if (*(measurementsOnPlane_[i]->getHMatrix()) != *H){
152 Exception e(
"KalmanFitterInfo::getClosestMeasurementOnPlane: Cannot compare measurements with different H-Matrices. Maybe you have to select a different multipleMeasurementHandling.", __LINE__,__FILE__);
157 TVectorD res = measurementsOnPlane_[i]->getState() - H->
Hv(sop->getState());
158 double norm =
sqrt(res.Norm2Sqr());
159 if (norm < normMin) {
165 return getMeasurementOnPlane(iMin);
170 std::vector<double> retVal(getNumMeasurements());
172 for (
unsigned int i=0; i<getNumMeasurements(); ++i) {
173 retVal[i] = getMeasurementOnPlane(i)->getWeight();
183 if (biased && fittedStateBiased_)
184 return *fittedStateBiased_;
185 if (!biased && fittedStateUnbiased_)
186 return *fittedStateUnbiased_;
190 const Track* tr = tp->getTrack();
193 bool first(
false), last(
false);
197 if (flag.isPruned()) {
198 debugOut <<
"KalmanFitterInfo::getFittedState - Track is pruned and has " << tr->getNumPoints() <<
" TrackPoints \n";
202 if (flag.isPruned() && tr->getNumPoints() == 1) {
203 if (flag.hasFlags(
"F")) {
206 debugOut <<
"KalmanFitterInfo::getFittedState - has flag F \n";
209 else if (flag.hasFlags(
"L")) {
212 debugOut <<
"KalmanFitterInfo::getFittedState - has flag L \n";
217 first = tr->getPointWithFitterInfo(0, rep) == tp;
218 last = tr->getPointWithFitterInfo(-1, rep) == tp;
222 debugOut <<
"KalmanFitterInfo::getFittedState first " << first <<
", last " << last <<
"\n";
223 debugOut <<
"KalmanFitterInfo::getFittedState forwardPrediction_ " << forwardPrediction_.get() <<
", forwardUpdate_ " << forwardUpdate_.get() <<
"\n";
224 debugOut <<
"KalmanFitterInfo::getFittedState backwardPrediction_ " << backwardPrediction_.get() <<
", backwardUpdate_ " << backwardUpdate_.get() <<
"\n";
236 if (last && !backwardPrediction_) {
237 if(!forwardUpdate_) {
238 Exception e(
"KalmanFitterInfo::getFittedState: Needed updates/predictions not available in this FitterInfo.", __LINE__,__FILE__);
243 debugOut <<
"KalmanFitterInfo::getFittedState - biased at last measurement = forwardUpdate_ \n";
245 return *forwardUpdate_;
249 if (first && (!forwardUpdate_ || (backwardUpdate_ && !forwardPrediction_) ) ) {
250 if(!backwardUpdate_.get()) {
251 Exception e(
"KalmanFitterInfo::getFittedState: Needed updates/predictions not available in this FitterInfo.", __LINE__,__FILE__);
256 debugOut <<
"KalmanFitterInfo::getFittedState - biased at first measurement = backwardUpdate_ \n";
259 return *backwardUpdate_;
262 if(!forwardUpdate_ || !backwardPrediction_) {
263 Exception e(
"KalmanFitterInfo::getFittedState: Needed updates/predictions not available in this FitterInfo.", __LINE__,__FILE__);
268 debugOut <<
"KalmanFitterInfo::getFittedState - biased = mean(forwardUpdate_, backwardPrediction_) \n";
271 return *fittedStateBiased_;
277 if (last && !backwardPrediction_) {
278 if(!forwardPrediction_) {
279 Exception e(
"KalmanFitterInfo::getFittedState: Needed updates/predictions not available in this FitterInfo.", __LINE__,__FILE__);
284 debugOut <<
"KalmanFitterInfo::getFittedState - unbiased at last measurement = forwardPrediction_ \n";
286 return *forwardPrediction_;
290 if (first && !forwardPrediction_) {
291 if(!backwardPrediction_) {
292 Exception e(
"KalmanFitterInfo::getFittedState: Needed updates/predictions not available in this FitterInfo.", __LINE__,__FILE__);
297 debugOut <<
"KalmanFitterInfo::getFittedState - unbiased at first measurement = backwardPrediction_ \n";
299 return *backwardPrediction_;
302 if(!forwardPrediction_ || !backwardPrediction_) {
303 Exception e(
"KalmanFitterInfo::getFittedState: Needed updates/predictions not available in this FitterInfo.", __LINE__,__FILE__);
308 debugOut <<
"KalmanFitterInfo::getFittedState - unbiased = mean(forwardPrediction_, backwardPrediction_) \n";
311 return *fittedStateUnbiased_;
315 MeasurementOnPlane KalmanFitterInfo::getResidual(
unsigned int iMeasurement,
bool biased,
bool onlyMeasurementErrors)
const {
322 if(*(smoothedState.getPlane()) != *plane) {
323 Exception e(
"KalmanFitterInfo::getResidual: smoothedState and measurement are not defined in the same plane.", __LINE__,__FILE__);
326 if(smoothedState.getRep() != measurement->getRep()) {
327 Exception e(
"KalmanFitterInfo::getResidual: smoothedState and measurement are not defined wrt the same TrackRep.", __LINE__,__FILE__);
331 const AbsHMatrix* H = measurement->getHMatrix();
335 TVectorD res(H->
Hv(smoothedState.getState()));
336 res -= measurement->getState();
339 if (onlyMeasurementErrors) {
340 return MeasurementOnPlane(res, measurement->getCov(), plane, smoothedState.getRep(), H->clone(), measurement->getWeight());
343 TMatrixDSym cov(smoothedState.getCov());
345 cov += measurement->getCov();
347 return MeasurementOnPlane(res, cov, plane, smoothedState.getRep(), H->clone(), measurement->getWeight());
351 double KalmanFitterInfo::getSmoothedChi2(
unsigned int iMeasurement)
const {
355 tools::invertMatrix(res.getCov(), Rinv);
356 return Rinv.Similarity(res.getState());
360 void KalmanFitterInfo::setReferenceState(ReferenceStateOnPlane* referenceState) {
361 referenceState_.reset(referenceState);
363 setPlane(referenceState_->getPlane());
384 void KalmanFitterInfo::setForwardPrediction(MeasuredStateOnPlane* forwardPrediction) {
385 forwardPrediction_.reset(forwardPrediction);
386 fittedStateUnbiased_.reset();
387 fittedStateBiased_.reset();
388 if (forwardPrediction_)
389 setPlane(forwardPrediction_->getPlane());
392 void KalmanFitterInfo::setBackwardPrediction(MeasuredStateOnPlane* backwardPrediction) {
393 backwardPrediction_.reset(backwardPrediction);
394 fittedStateUnbiased_.reset();
395 fittedStateBiased_.reset();
396 if (backwardPrediction_)
397 setPlane(backwardPrediction_->getPlane());
400 void KalmanFitterInfo::setForwardUpdate(KalmanFittedStateOnPlane* forwardUpdate) {
401 forwardUpdate_.reset(forwardUpdate);
402 fittedStateUnbiased_.reset();
403 fittedStateBiased_.reset();
405 setPlane(forwardUpdate_->getPlane());
408 void KalmanFitterInfo::setBackwardUpdate(KalmanFittedStateOnPlane* backwardUpdate) {
409 backwardUpdate_.reset(backwardUpdate);
410 fittedStateUnbiased_.reset();
411 fittedStateBiased_.reset();
413 setPlane(backwardUpdate_->getPlane());
417 void KalmanFitterInfo::setMeasurementsOnPlane(
const std::vector< genfit::MeasurementOnPlane* >& measurementsOnPlane) {
418 deleteMeasurementInfo();
420 for (std::vector<MeasurementOnPlane*>::const_iterator m = measurementsOnPlane.begin(), mend = measurementsOnPlane.end(); m < mend; ++m) {
421 addMeasurementOnPlane(*m);
426 void KalmanFitterInfo::addMeasurementOnPlane(MeasurementOnPlane* measurementOnPlane) {
427 if (measurementsOnPlane_.size() == 0)
428 setPlane(measurementOnPlane->getPlane());
430 measurementsOnPlane_.push_back(measurementOnPlane);
433 void KalmanFitterInfo::addMeasurementsOnPlane(
const std::vector< genfit::MeasurementOnPlane* >& measurementsOnPlane) {
434 for (std::vector<MeasurementOnPlane*>::const_iterator m = measurementsOnPlane.begin(), mend = measurementsOnPlane.end(); m < mend; ++m) {
435 addMeasurementOnPlane(*m);
440 void KalmanFitterInfo::setRep(
const AbsTrackRep* rep) {
444 referenceState_->setRep(rep);
446 if (forwardPrediction_)
447 forwardPrediction_->setRep(rep);
450 forwardUpdate_->setRep(rep);
452 if (backwardPrediction_)
453 backwardPrediction_->setRep(rep);
456 backwardUpdate_->setRep(rep);
458 for (std::vector<MeasurementOnPlane*>::iterator it = measurementsOnPlane_.begin(); it != measurementsOnPlane_.end(); ++it) {
464 void KalmanFitterInfo::setWeights(
const std::vector<double>& weights) {
466 if (weights.size() != getNumMeasurements()) {
467 Exception e(
"KalmanFitterInfo::setWeights: weights do not have the same size as measurementsOnPlane", __LINE__,__FILE__);
472 errorOut <<
"KalmanFitterInfo::setWeights - WARNING: setting weights even though weights are fixed!" << std::endl;
475 for (
unsigned int i=0; i<getNumMeasurements(); ++i) {
476 getMeasurementOnPlane(i)->setWeight(weights[i]);
481 void KalmanFitterInfo::deleteForwardInfo() {
482 setForwardPrediction(
nullptr);
483 setForwardUpdate(
nullptr);
484 fittedStateUnbiased_.reset();
485 fittedStateBiased_.reset();
488 void KalmanFitterInfo::deleteBackwardInfo() {
489 setBackwardPrediction(
nullptr);
490 setBackwardUpdate(
nullptr);
491 fittedStateUnbiased_.reset();
492 fittedStateBiased_.reset();
495 void KalmanFitterInfo::deletePredictions() {
496 setForwardPrediction(
nullptr);
497 setBackwardPrediction(
nullptr);
498 fittedStateUnbiased_.reset();
499 fittedStateBiased_.reset();
502 void KalmanFitterInfo::deleteMeasurementInfo() {
504 for (
size_t i = 0; i < measurementsOnPlane_.size(); ++i)
505 delete measurementsOnPlane_[i];
507 measurementsOnPlane_.clear();
511 void KalmanFitterInfo::Print(
const Option_t*)
const {
512 printOut <<
"genfit::KalmanFitterInfo. Belongs to TrackPoint " << trackPoint_ <<
"; TrackRep " << rep_ <<
"\n";
517 for (
unsigned int i=0; i<measurementsOnPlane_.size(); ++i) {
518 printOut <<
"MeasurementOnPlane Nr " << i <<
": "; measurementsOnPlane_[i]->Print();
521 if (referenceState_) {
522 printOut <<
"Reference state: "; referenceState_->Print();
524 if (forwardPrediction_) {
525 printOut <<
"Forward prediction_: "; forwardPrediction_->Print();
527 if (forwardUpdate_) {
528 printOut <<
"Forward update: "; forwardUpdate_->Print();
530 if (backwardPrediction_) {
531 printOut <<
"Backward prediction_: "; backwardPrediction_->Print();
533 if (backwardUpdate_) {
534 printOut <<
"Backward update: "; backwardUpdate_->Print();
546 errorOut <<
"KalmanFitterInfo::checkConsistency(): trackPoint_ is nullptr" << std::endl;
558 if (plane.get() ==
nullptr) {
559 if (!(referenceState_ || forwardPrediction_ || forwardUpdate_ || backwardPrediction_ || backwardUpdate_ || measurementsOnPlane_.size() > 0))
561 errorOut <<
"KalmanFitterInfo::checkConsistency(): plane is nullptr" << std::endl;
566 TVector3 oTest = plane->getO();
571 if (measurementsOnPlane_.size() > 1) {
572 int dim = measurementsOnPlane_[0]->getState().GetNrows();
573 for (
unsigned int i = 1; i<measurementsOnPlane_.size(); ++i) {
574 if(measurementsOnPlane_[i]->getState().GetNrows() != dim) {
575 errorOut <<
"KalmanFitterInfo::checkConsistency(): measurementsOnPlane_ do not all have the same dimensionality" << std::endl;
580 errorOut <<
"KalmanFitterInfo::checkConsistency(): measurementsOnPlane_ have dimension 0" << std::endl;
586 int dim = rep_->getDim();
587 if (referenceState_) {
588 if(referenceState_->getPlane() != plane) {
589 errorOut <<
"KalmanFitterInfo::checkConsistency(): referenceState_ is not defined with the correct plane " << referenceState_->getPlane().get() <<
" vs. " << plane.get() << std::endl;
592 if (referenceState_->getRep() != rep_) {
593 errorOut <<
"KalmanFitterInfo::checkConsistency(): referenceState_ is not defined with the correct TrackRep" << std::endl;
596 if (referenceState_->getState().GetNrows() != dim) {
597 errorOut <<
"KalmanFitterInfo::checkConsistency(): referenceState_ does not have the right dimension!" << std::endl;
602 if (forwardPrediction_) {
603 if(forwardPrediction_->getPlane() != plane) {
604 errorOut <<
"KalmanFitterInfo::checkConsistency(): forwardPrediction_ is not defined with the correct plane" << std::endl;
607 if(forwardPrediction_->getRep() != rep_) {
608 errorOut <<
"KalmanFitterInfo::checkConsistency(): forwardPrediction_ is not defined with the correct TrackRep" << std::endl;
611 if (forwardPrediction_->getState().GetNrows() != dim || forwardPrediction_->getCov().GetNrows() != dim) {
612 errorOut <<
"KalmanFitterInfo::checkConsistency(): forwardPrediction_ does not have the right dimension!" << std::endl;
616 if (forwardUpdate_) {
617 if(forwardUpdate_->getPlane() != plane) {
618 errorOut <<
"KalmanFitterInfo::checkConsistency(): forwardUpdate_ is not defined with the correct plane" << std::endl;
621 if(forwardUpdate_->getRep() != rep_) {
622 errorOut <<
"KalmanFitterInfo::checkConsistency(): forwardUpdate_ is not defined with the correct TrackRep" << std::endl;
625 if (forwardUpdate_->getState().GetNrows() != dim || forwardUpdate_->getCov().GetNrows() != dim) {
626 errorOut <<
"KalmanFitterInfo::checkConsistency(): forwardUpdate_ does not have the right dimension!" << std::endl;
631 if (backwardPrediction_) {
632 if(backwardPrediction_->getPlane() != plane) {
633 errorOut <<
"KalmanFitterInfo::checkConsistency(): backwardPrediction_ is not defined with the correct plane" << std::endl;
636 if(backwardPrediction_->getRep() != rep_) {
637 errorOut <<
"KalmanFitterInfo::checkConsistency(): backwardPrediction_ is not defined with the correct TrackRep" << std::endl;
640 if (backwardPrediction_->getState().GetNrows() != dim || backwardPrediction_->getCov().GetNrows() != dim) {
641 errorOut <<
"KalmanFitterInfo::checkConsistency(): backwardPrediction_ does not have the right dimension!" << std::endl;
645 if (backwardUpdate_) {
646 if(backwardUpdate_->getPlane() != plane) {
647 errorOut <<
"KalmanFitterInfo::checkConsistency(): backwardUpdate_ is not defined with the correct plane" << std::endl;
650 if(backwardUpdate_->getRep() != rep_) {
651 errorOut <<
"KalmanFitterInfo::checkConsistency(): backwardUpdate_ is not defined with the correct TrackRep" << std::endl;
654 if (backwardUpdate_->getState().GetNrows() != dim || backwardUpdate_->getCov().GetNrows() != dim) {
655 errorOut <<
"KalmanFitterInfo::checkConsistency(): backwardUpdate_ does not have the right dimension!" << std::endl;
660 for (std::vector<MeasurementOnPlane*>::const_iterator it = measurementsOnPlane_.begin(); it != measurementsOnPlane_.end(); ++it) {
661 if((*it)->getPlane() != plane) {
662 errorOut <<
"KalmanFitterInfo::checkConsistency(): measurement is not defined with the correct plane" << std::endl;
665 if((*it)->getRep() != rep_) {
666 errorOut <<
"KalmanFitterInfo::checkConsistency(): measurement is not defined with the correct TrackRep" << std::endl;
669 if ((*it)->getState().GetNrows() == 0) {
670 errorOut <<
"KalmanFitterInfo::checkConsistency(): measurement has dimension 0!" << std::endl;
675 if (flags ==
nullptr or !flags->
hasFlags(
"U")) {
677 if (forwardUpdate_ && !forwardPrediction_) {
678 errorOut <<
"KalmanFitterInfo::checkConsistency(): forwardUpdate_ w/o forwardPrediction_" << std::endl;
683 if (backwardUpdate_ && !backwardPrediction_) {
684 errorOut <<
"KalmanFitterInfo::checkConsistency(): backwardUpdate_ w/o backwardPrediction_" << std::endl;
688 if (flags ==
nullptr or !flags->
hasFlags(
"M")) {
689 if (forwardUpdate_ && measurementsOnPlane_.size() == 0) {
690 errorOut <<
"KalmanFitterInfo::checkConsistency(): forwardUpdate_ w/o measurement" << std::endl;
694 if (backwardUpdate_ && measurementsOnPlane_.size() == 0) {
695 errorOut <<
"KalmanFitterInfo::checkConsistency(): backwardUpdate_ w/o measurement" << std::endl;
707 void KalmanFitterInfo::Streamer(TBuffer &R__b)
712 typedef ::genfit::KalmanFitterInfo thisClass;
714 if (R__b.IsReading()) {
715 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
if (R__v) { }
718 baseClass0::Streamer(R__b);
722 deleteBackwardInfo();
723 deleteReferenceInfo();
724 deleteMeasurementInfo();
726 referenceState_.reset(
new ReferenceStateOnPlane());
727 referenceState_->Streamer(R__b);
728 referenceState_->setPlane(getPlane());
731 if (flag & (1 << 1)) {
732 forwardPrediction_.reset(
new MeasuredStateOnPlane());
733 forwardPrediction_->Streamer(R__b);
734 forwardPrediction_->setPlane(getPlane());
737 if (flag & (1 << 2)) {
738 forwardUpdate_.reset(
new KalmanFittedStateOnPlane());
739 forwardUpdate_->Streamer(R__b);
740 forwardUpdate_->setPlane(getPlane());
743 if (flag & (1 << 3)) {
744 backwardPrediction_.reset(
new MeasuredStateOnPlane());
745 backwardPrediction_->Streamer(R__b);
746 backwardPrediction_->setPlane(getPlane());
749 if (flag & (1 << 4)) {
750 backwardUpdate_.reset(
new KalmanFittedStateOnPlane());
751 backwardUpdate_->Streamer(R__b);
752 backwardUpdate_->setPlane(getPlane());
756 std::vector<genfit::MeasurementOnPlane*,std::allocator<genfit::MeasurementOnPlane*> > &R__stl = measurementsOnPlane_;
759 Error(
"measurementsOnPlane_ streamer",
"Missing the TClass object for genfit::MeasurementOnPlane!");
764 R__stl.reserve(R__n);
765 for (R__i = 0; R__i < R__n; R__i++) {
767 R__t->Streamer(R__b);
768 R__t->setPlane(getPlane());
769 R__stl.push_back(R__t);
772 R__b.CheckByteCount(R__s, R__c, thisClass::IsA());
774 R__c = R__b.WriteVersion(thisClass::IsA(), kTRUE);
777 baseClass0::Streamer(R__b);
780 int flag = ((!!referenceState_)
781 | (!!forwardPrediction_ << 1)
782 | (!!forwardUpdate_ << 2)
783 | (!!backwardPrediction_ << 3)
784 | (!!backwardUpdate_ << 4));
787 referenceState_->Streamer(R__b);
789 forwardPrediction_->Streamer(R__b);
791 forwardUpdate_->Streamer(R__b);
793 backwardPrediction_->Streamer(R__b);
795 backwardUpdate_->Streamer(R__b);
797 std::vector<genfit::MeasurementOnPlane*,std::allocator<genfit::MeasurementOnPlane*> > &R__stl = measurementsOnPlane_;
798 int R__n=int(R__stl.size());
801 std::vector<genfit::MeasurementOnPlane*,std::allocator<genfit::MeasurementOnPlane*> >::iterator R__k;
802 for (R__k = R__stl.begin(); R__k != R__stl.end(); ++R__k) {
803 (*R__k)->Streamer(R__b);
807 R__b.SetByteCount(R__c, kTRUE);
This class collects all information needed and produced by a specific AbsFitter and is specific to on...
HMatrix for projecting from AbsTrackRep parameters to measured parameters in a DetPlane.
virtual void HMHt(TMatrixDSym &M) const
similarity: H*M*H^t
virtual TVectorD Hv(const TVectorD &v) const
H*v.
Abstract base class for a track representation.
Exception class for error handling in GENFIT (provides storage for diagnostic information)
#MeasuredStateOnPlane with additional info produced by a Kalman filter or DAF.
Collects information needed and produced by a AbsKalmanFitter implementations and is specific to one ...
std::vector< MeasurementOnPlane * > measurementsOnPlane_
cache
#StateOnPlane with additional covariance matrix.
Measured coordinates on a plane.
#StateOnPlane with linearized transport to that #ReferenceStateOnPlane from previous and next #Refere...
A state with arbitrary dimension defined in a DetPlane.
Object containing AbsMeasurement and AbsFitterInfo objects.
Collection of TrackPoint objects, AbsTrackRep objects and FitStatus objects.
FitStatus * getFitStatus(const AbsTrackRep *rep=nullptr) const
Get FitStatus for a AbsTrackRep. Per default, return FitStatus for cardinalRep.
double sqrt(double a)
sqrt for double
Eigen::VectorXd getWeights(int Size)
Get the vector of weights to calculate the integral over the Chebyshev nodes The nodes are by definit...
Defines for I/O streams used for error and debug printing.
std::ostream debugOut
Default stream for debug output.
std::ostream printOut
Default stream for output of Print calls.
std::shared_ptr< genfit::DetPlane > SharedPlanePtr
Shared Pointer to a DetPlane.
std::ostream errorOut
Default stream for error output.
MeasuredStateOnPlane calcAverageState(const MeasuredStateOnPlane &forwardState, const MeasuredStateOnPlane &backwardState)
Calculate weighted average between two MeasuredStateOnPlanes.
Info which information has been pruned from the Track.
bool hasFlags(Option_t *option="CFLWRMIU") const
check if all the given flags are set