/** CbmLitWeightCalculatorOptimal.h *@author A.Lebedev *@since 2009 ** ** **/ #include "CbmLitWeightCalculatorOptimal.h" #include "CbmLitHit.h" //#include "CbmLitStripHit.h" //#include "CbmLitPixelHit.h" #include "CbmLitMath.h" //#include #include CbmLitWeightCalculatorOptimal::CbmLitWeightCalculatorOptimal() { } CbmLitWeightCalculatorOptimal::~CbmLitWeightCalculatorOptimal() { } LitStatus CbmLitWeightCalculatorOptimal::Initialize() { return kLITSUCCESS; } LitStatus CbmLitWeightCalculatorOptimal::Finalize() { return kLITSUCCESS; } LitStatus CbmLitWeightCalculatorOptimal::DoCalculate( const CbmLitTrackParam* par, HitPtrIterator itBegin, HitPtrIterator itEnd, myf T) { for(HitPtrIterator it = itBegin; it != itEnd; it++) { if ((*it)->IsOutlier()) continue; if (OptimalWeight(par, *it, T) == kLITERROR) return kLITERROR; } if (Normalize(itBegin, itEnd) == kLITERROR) return kLITERROR; return kLITSUCCESS; } LitStatus CbmLitWeightCalculatorOptimal::DoCalculate( const CbmLitTrackParam* par, HitPtrVector& hits, myf T) { return DoCalculate(par, hits.begin(), hits.end(), T); } LitStatus CbmLitWeightCalculatorOptimal::OptimalWeight( const CbmLitTrackParam* par, CbmLitHit* hit, myf T) const { myf chiSq = ChiSq(par, hit); hit->SetW((1 + T) / (1 + T * std::exp(chiSq))); return kLITSUCCESS; } LitStatus CbmLitWeightCalculatorOptimal::Normalize( HitPtrIterator itBegin, HitPtrIterator itEnd) const { myf sumW = 0.; myf sumCut = 0.; for(HitPtrIterator it = itBegin; it != itEnd; it++) { if ((*it)->IsOutlier()) continue; sumW += (*it)->GetW(); } if (sumW == 0.) { return kLITERROR; } else { for(HitPtrIterator it = itBegin; it != itEnd; it++) { if ((*it)->IsOutlier()) continue; (*it)->SetW((*it)->GetW() / sumW); } } return kLITSUCCESS; }