#include "CbmKFPixelMeasurement.h" #include using std::vector; ClassImp(CbmKFPixelMeasurement); Int_t CbmKFPixelMeasurement::Filter( CbmKFTrackInterface &track ){ Bool_t err = 0; Double_t *T = track.GetTrack(); Double_t *C = track.GetCovMatrix(); Double_t w = (C[0]+V[0])*(C[2]+V[2]) - (C[1]+V[1])*(C[1]+V[1]); if( w<1.E-20 || !finite(w)) { err = 1; return err; } w = 1./w ; if( !finite(w) ) return 1; Double_t W[3] = { w*(C[2]+V[2]), -w*(C[1]+V[1]), w*(C[0]+V[0])}; Double_t zeta[2] = { T[0] - x, T[1] - y }; track.GetRefChi2() += zeta[0]*zeta[0]*W[0] + 2*zeta[0]*zeta[1]*W[1] + zeta[1]*zeta[1]*W[2]; track.GetRefNDF() += 2; Double_t K[5][2] = { { C[ 0]*W[ 0] + C[ 1]*W[ 1], C[ 0]*W[ 1] + C[ 1]*W[ 2] }, { C[ 1]*W[ 0] + C[ 2]*W[ 1], C[ 1]*W[ 1] + C[ 2]*W[ 2] }, { C[ 3]*W[ 0] + C[ 4]*W[ 1], C[ 3]*W[ 1] + C[ 4]*W[ 2] }, { C[ 6]*W[ 0] + C[ 7]*W[ 1], C[ 6]*W[ 1] + C[ 7]*W[ 2] }, { C[10]*W[ 0] + C[11]*W[ 1], C[10]*W[ 1] + C[11]*W[ 2] }, }; T[0]-= K[0][0]*zeta[0] + K[0][1]*zeta[1]; T[1]-= K[1][0]*zeta[0] + K[1][1]*zeta[1]; T[2]-= K[2][0]*zeta[0] + K[2][1]*zeta[1]; T[3]-= K[3][0]*zeta[0] + K[3][1]*zeta[1]; T[4]-= K[4][0]*zeta[0] + K[4][1]*zeta[1]; Double_t KHC[15] = { C[0]*K[0][0] + C[1]*K[0][1], C[0]*K[1][0] + C[1]*K[1][1], C[1]*K[1][0] + C[2]*K[1][1], C[0]*K[2][0] + C[1]*K[2][1], C[1]*K[2][0] + C[2]*K[2][1], C[3]*K[2][0] + C[4]*K[2][1], C[0]*K[3][0] + C[1]*K[3][1], C[1]*K[3][0] + C[2]*K[3][1], C[3]*K[3][0] + C[4]*K[3][1], C[6]*K[3][0] + C[7]*K[3][1], C[0]*K[4][0] + C[1]*K[4][1], C[1]*K[4][0] + C[2]*K[4][1], C[3]*K[4][0] + C[4]*K[4][1], C[6]*K[4][0] + C[7]*K[4][1], C[10]*K[4][0] + C[11]*K[4][1] }; C[ 0]-= KHC[ 0]; C[ 1]-= KHC[ 1]; C[ 2]-= KHC[ 2]; C[ 3]-= KHC[ 3]; C[ 4]-= KHC[ 4]; C[ 5]-= KHC[ 5]; C[ 6]-= KHC[ 6]; C[ 7]-= KHC[ 7]; C[ 8]-= KHC[ 8]; C[ 9]-= KHC[ 9]; C[10]-= KHC[10]; C[11]-= KHC[11]; C[12]-= KHC[12]; C[13]-= KHC[13]; C[14]-= KHC[14]; return 0; } //////////////////////////////////////////////////////////////////////////// // // mathAddMeasurements: the implementation of the Probabilistic // Data Association Filter for the MAPS // // // Author : Dmitry Emeliyanov, RAL, dmitry.emeliyanov@cern.ch // ///////////////////////////////////////////////////////////////////////////// //#define _DEBUG_PDAF_ void CbmKFPixelMeasurement::FilterPDAF( CbmKFTrackInterface &track, vector &vm, double gateX, double gateY, vector &vProb ) { const double Pdetect=0.90;// hit efficiency const double gateEff=0.99;// probability of the correct hit falling into the search window // 10 sigma x 10 sigma size Double_t *T = track.GetTrack(); Double_t *C = track.GetCovMatrix(); double gateArea=gateX*gateY; double chi2,zeta[2]; int ndf=2,idx,i,j,k; vector vExp; vector vResidX; vector vResidY; vector vChi2; #ifdef _DEBUG_PDAF_ cout<<"PDAF: "<size()<<" hits validated"<