////////////////////////////////////////////////////////////////////////// // // // PndVtxFitter // // // // Author: D. Mishra, GSI, 2008 // // // ////////////////////////////////////////////////////////////////////////// #include #include "PndVtxFitter.h" #include "RhoBase/RhoCandListIterator.h" #include "PndVtxFitterParticle.h" #include "PndVtxFitter_Init.h" #include "PndVtxFitterError.h" #include "RhoBase/RhoFactory.h" using namespace std; ClassImp ( PndVtxFitter ) TBuffer& operator>> ( TBuffer& buf, PndVtxFitter *&obj ) { obj = ( PndVtxFitter* ) buf.ReadObject ( PndVtxFitter::Class() ); return buf; } PndVtxFitter::PndVtxFitter ( RhoCandidate& b ) : RhoFitterBase ( b ) { // fHeadOfTree=RhoFactory::Instance()->NewCandidate(b); m_mode=0; m_vertexChisq=0.; m_vertex_b=TVector3 ( 0.,0.,0. ); m_errVertex_a=3; m_errBeam=3; m_beam=0; m_knownVertex=0; m_tube=0; m_itrk_tube=-1; m_magField=KF_MAGNETIC_FIELD; m_necessaryTrackNum = 2; } PndVtxFitter::~PndVtxFitter() { //if(fHeadOfTree) delete fHeadOfTree; } void PndVtxFitter::FitNode(RhoCandidate* b) { SetDaugthersFromComposite(b); // if(GetConstraintOpt() == 0)DoVertexFitWOCorr(); if ( m_beamConstraint == 0 ) { DoVertexFitWOCorr(); } else { DoVertexFitBeamConstraint(); } SetOutputToRhoCandidate(b); } /** No Correlations between the tracks. ==>Section 4.2 of Belle Note #194: "Vertex Constraint to an Unknown position". This is same as "_fit2()" function in "kvertexfitter" ***/ unsigned PndVtxFitter::DoVertexFitWOCorr() { m_trackNum = fDaughters.GetLength(); cout<<"PndVtxFitter::DoVertexFitWOCorr: "< chiSq ) { for ( Int_t k=0; k chiSq ) { for ( Int_t k=0; kSection C.5 of Belle Note #194: "Fitting with constraints for Unknown parameters". Vertex Refitter in the point with Errors. This is same as "_fit3()" function in "kvertexfitter". **/ unsigned PndVtxFitter::DoVertexFitBeamConstraint() { m_trackNum = fDaughters.GetLength(); // if(m_errorFlag != KF_NO_ERROR)return m_errorFlag; if ( m_trackNum < m_necessaryTrackNum ) { m_errorFlag = KF_TRACK_SIZE; return m_errorFlag; } SetInputMatrix(); //Set input matrix CalDgf(); //calculate Dgf /** Fit function _fit3() Starts **/ cout<<"++++++ Fit function _fit3() Starts +++++++ "< chiSq || ( tmp_chiSq <= chiSq && itFlag == 0 ) ) { if ( tmp_chiSq <= chiSq ) { itFlag = 1; } for ( int k=0; k ( int ) KF_MAX_TRACK_NUMBER2 ) { m_errorFlag = KF_INPUT_TRACK_SIZE; return m_errorFlag; } } else { if ( m_trackNum > ( int ) KF_MAX_TRACK_NUMBER ) { m_errorFlag = KF_INPUT_TRACK_SIZE; return m_errorFlag; } } unsigned index ( 0 ); TMatrixD tmp_al_0 ( KF_NUM6*m_trackNum,1 ); TMatrixDSym tmp_V_al_0 ( KF_NUM6*m_trackNum ); TMatrixD tmp_property ( m_trackNum,3 ); TMatrixDSym tmp_ErrCov ( KF_NUM6 ); // m_trackNum = fArr->GetEntriesFast(); it =new PndVtxFitterParticle; for ( Int_t i=0; iGetCovMat ( mat7 ); tmp_al_0[index* KF_NUM6+0][0] = tc.P4().Px(); tmp_al_0[index* KF_NUM6+1][0] = tc.P4().Py(); tmp_al_0[index* KF_NUM6+2][0] = tc.P4().Pz(); tmp_al_0[index* KF_NUM6+3][0] = tc.Pos().X(); tmp_al_0[index* KF_NUM6+4][0] = tc.Pos().Y(); tmp_al_0[index* KF_NUM6+5][0] = tc.Pos().Z(); tmp_V_al_0.SetSub ( index*KF_NUM6, tmp_ErrCov ); //Dipak tmp_property[index][0] = tc.GetCharge() /3; tmp_property[index][1] = tc.P4().M();//get the mass:Dummy value set by hand :Dipak tmp_property[index][2] = -KF_PHOTON_VELOCITY*m_magField*tc.GetCharge() /3; ++index; } delete it; // cout<<" Total number of Tracks 'PndVtxFitter' SetInputMatrix ***######### "< 6x6 matrix //m_setCorrelation function has been defined in kfitterbase.cc if(m_knownVertex == 0 && m_beam == 0 && m_mode != KF_MODE_WO_CORRELATION){ if(m_correlationFlag == 1){ m_errorFlag = m_setCorrelation(); if(m_errorFlag != KF_NO_ERROR)return m_errorFlag; } } ******/ m_v_a[0][0] = m_vertex_b.X(); m_v_a[1][0] = m_vertex_b.Y(); m_v_a[2][0] = m_vertex_b.Z(); m_al_0 = tmp_al_0; m_al_1 = m_al_0; m_property = tmp_property; m_D = m_V_al_1.GetSub ( 0,m_trackNum*2-1,0,KF_NUM6*m_trackNum-1 ); m_E = m_V_al_1.GetSub ( 0,m_trackNum*2-1,0,2 ); m_d = m_V_al_1.GetSub ( 0,m_trackNum*2-1,0,0 ); m_V_D = m_V_al_1.GetSub ( 0,m_trackNum*2-1,0,m_trackNum*2-1 ); m_lam = m_V_al_1.GetSub ( 0,m_trackNum*2-1,0,0 ); m_lam0 = m_V_al_1.GetSub ( 0,m_trackNum*2-1,0,0 ); m_V_Dt = m_V_al_1.GetSub ( 0,m_trackNum*2-1,0,m_trackNum*2-1 ); m_Cov_v_al_1 = m_V_al_1.GetSub ( 0,2,0,KF_NUM6*m_trackNum-1 ); return m_errorFlag; } unsigned PndVtxFitter::MakeCoreMatrix() { Double_t px,py,pz,x,y,z,a; Double_t pt,invPt,invPt2,dlx,dly,dlz,a1,a2,r2d2,B,Rx,Ry,S,U; Double_t sininv,sqrtag; for ( int i=0; i 1. ) { m_errorFlag = KF_ARCSIN; return m_errorFlag; } //sin^(-1)(B) sininv = TMath::ASin ( B ); Double_t tmp0 = 1.0-B*B; if ( tmp0 == 0. ) { m_errorFlag = KF_DIV_ZERO; return m_errorFlag; } //1/sqrt(1-B^2) sqrtag = 1.0/sqrt ( tmp0 ); S = sqrtag*invPt2; U = dlz-pz*sininv/a; } else { // neutral B = 0.0; sininv = 0.0; sqrtag = 1.0; S = invPt2; U = dlz-pz*a2*invPt2; } //d: Matrix m_d[i*2+0][0] = a1-0.5*a*r2d2; m_d[i*2+1][0] = U*pt; //D: Matrix m_D[i*2+0][i* KF_NUM6+0] = dly; m_D[i*2+0][i* KF_NUM6+1] = -dlx; m_D[i*2+0][i* KF_NUM6+2] = 0.0; m_D[i*2+0][i* KF_NUM6+3] = py+a*dlx; m_D[i*2+0][i* KF_NUM6+4] = -px+a*dly; m_D[i*2+0][i* KF_NUM6+5] = 0.0; m_D[i*2+1][i* KF_NUM6+0] = -pz*pt*S*Rx+U*px*invPt; m_D[i*2+1][i* KF_NUM6+1] = -pz*pt*S*Ry+U*py*invPt; if ( a != 0. ) { m_D[i*2+1][i* KF_NUM6+2] = -sininv*pt/a; } else { m_D[i*2+1][i* KF_NUM6+2] = -a2*invPt; } m_D[i*2+1][i* KF_NUM6+3] = px*pz*pt*S; m_D[i*2+1][i* KF_NUM6+4] = py*pz*pt*S; m_D[i*2+1][i* KF_NUM6+5] = -pt; //E: Matrix m_E[i*2+0][0] = -py-a*dlx; m_E[i*2+0][1] = px-a*dly; m_E[i*2+0][2] = 0.0; m_E[i*2+1][0] = -px*pz*pt*S; m_E[i*2+1][1] = -py*pz*pt*S; m_E[i*2+1][2] = pt; } // for loop 'i' return m_errorFlag; } //Fill output to RhoCandidate unsigned PndVtxFitter::SetOutputToRhoCandidate(RhoCandidate* cand) { //cout<<"I'm inside OutputToRhoCandidate *** "<SetP4 ( sum ); cand->SetPos ( foudVertex ); // cout <<"SetOutputToRhoCandidate head of Tree:"<<(*fHeadOfTree)<SetCovPos ( m_V_E ); //Implemented in TFitParams :Dipak cand->PosCov().Print(); fChiSquare= m_chisq; return m_errorFlag; }