////////////////////////////////////////////////////////////////////////// // // // PndMassFitter // // // // Author: D. Mishra, GSI, 2008 // // // ////////////////////////////////////////////////////////////////////////// #include #include "PndMassFitter.h" #include "RhoBase/TCandListIterator.h" #include "PndVtxFitterParticle.h" #include "PndVtxFitter_Init.h" #include "PndVtxFitterError.h" #include "RhoBase/TFactory.h" using namespace std; ClassImp(PndMassFitter) TBuffer &operator>>(TBuffer &buf, PndMassFitter *&obj) { obj = (PndMassFitter *) buf.ReadObject(PndMassFitter::Class()); return buf; } PndMassFitter::PndMassFitter( const TCandidate& b, double mass ) : VAbsFitter( b ) { m_atDecayPoint=KF_AT_DECAY_POINT; m_isFixMass=1; m_vertex_b=TVector3(0.,0.,0.); m_necessaryTrackNum = 2; m_invariantMass=mass; m_errorFlag = KF_NO_ERROR; fGlobChi2 = -1.; } PndMassFitter::~PndMassFitter() { //if(fHeadOfTree) delete fHeadOfTree; } void PndMassFitter::Fit() { TCandidate theHead=*fHeadOfTree; TCandListIterator iter=theHead.DaughterIterator(); //cout <<"Fit: head of Tree:"<Cov7(); //cout <<"PndMassFitter: Daughter "< KF_MAX_TRACK_NUMBER){ m_errorFlag = KF_INPUT_TRACK_SIZE; return m_errorFlag; }*/ SetInputMatrix(); //Set input matrix CalDgf(); // Calculate Dgf /** Fit function _fit() Starts **/ //cout<<"++++++ Fit function _fit() Starts +++++++ "< chiSq){ tmp_chiSq = chiSq; tmp_al_a = tmp_al_1; tmp_al_1 = m_al_1; tmp_V_al_1 = m_V_al_1; if(j == KF_MAX_ITERATION_NUMBER-1){ m_al_a = tmp_al_1; m_overIterationFlag = KF_OVER_ITERATION; }else continue; }else if(j != 0){ chiSq = tmp_chiSq; m_al_1 = tmp_al_1; m_al_a = tmp_al_a; m_V_al_1 = tmp_V_al_1; break; }else if(j == 0){ m_errorFlag = KF_INIT_CHISQ; return m_errorFlag; } } //Iteration Loop ends //cout<<"Chi2 is **********: "< chiSq){ tmp_chiSq = chiSq; tmp_al_a = tmp_al_1; tmp_al_1 = m_al_1; tmp_V_al_1 = m_V_al_1; if(j == KF_MAX_ITERATION_NUMBER-1){ m_al_a = tmp_al_1; m_overIterationFlag = KF_OVER_ITERATION; }else continue; }else if(j != 0){ chiSq = tmp_chiSq; m_al_1 = tmp_al_1; m_al_a = tmp_al_a; m_V_al_1 = tmp_V_al_1; break; }else if(j == 0){ m_errorFlag = KF_INIT_CHISQ; return m_errorFlag; } } //Iteration Loop ends //cout<<"Chi2 is **********: "< (int)KF_MAX_TRACK_NUMBER){ m_errorFlag = KF_INPUT_TRACK_SIZE; return m_errorFlag; } if(m_fitIncludingVertex==0){ unsigned index(0); TMatrixDSym tmp_V_al_0(KF_NUM7*m_trackNum); m_al_0.ResizeTo(KF_NUM7*m_trackNum,1); m_al_1.ResizeTo(KF_NUM7*m_trackNum,1); m_property.ResizeTo(m_trackNum,3); m_D.ResizeTo(1,KF_NUM7*m_trackNum); m_d.ResizeTo(1,1); m_V_D.ResizeTo(1,1); m_lam.ResizeTo(1,1); TMatrixDSym tmp_ErrCov(KF_NUM6); m_D_T.ResizeTo(KF_NUM7*m_trackNum,1); Int_t nTra = fDaughters.GetLength(); it =new PndVtxFitterParticle; for(Int_t i=0;iGetCovMat1( tc.Cov7() ) ); //Charge, Mass and a m_property[index][0] = tc.GetCharge()/3; m_property[index][1] = tc.P4().M(); //get the mass:Dummy value set by hand:Dipak m_property[index][2] = -KF_PHOTON_VELOCITY*m_magField*tc.GetCharge()/3; ++index; } delete it; // //Error between the tracks : will be done later :Dipak // if(m_correlationFlag == 1){ // m_errorFlag = m_setCorrelation(); // if(m_errorFlag != KF_NO_ERROR)return m_errorFlag; // } m_V_al_0.ResizeTo(tmp_V_al_0); m_V_al_0 = tmp_V_al_0; m_al_1 = m_al_0; m_V_al_1.ResizeTo(KF_NUM7*m_trackNum,KF_NUM7*m_trackNum); m_D = m_V_al_1.GetSub(0,0,0,KF_NUM7*m_trackNum-1); }else{//m_fitIncludingVertex ==1 unsigned index(0); TMatrixDSym tmp_V_al_0(KF_NUM7*m_trackNum+3); m_al_0.ResizeTo(KF_NUM7*m_trackNum+3,1); m_al_1.ResizeTo(KF_NUM7*m_trackNum+3,1); m_property.ResizeTo(m_trackNum,3); m_D.ResizeTo(1,KF_NUM7*m_trackNum+3); m_d.ResizeTo(1,1); m_V_D.ResizeTo(1,1); m_lam.ResizeTo(1,1); m_D_T.ResizeTo(KF_NUM7*m_trackNum+3,1); Int_t nTra = fDaughters.GetLength(); it =new PndVtxFitterParticle; for(Int_t i=0;iGetCovMat1( tc.Cov7() ) ); //Charge, Mass and a m_property[index][0] = tc.GetCharge()/3; m_property[index][1] = tc.P4().M(); //get the mass:Dummy value set by hand:Dipak m_property[index][2] = -KF_PHOTON_VELOCITY*m_magField*tc.GetCharge()/3; ++index; } delete it; m_al_0[KF_NUM7*m_trackNum+0][0] = m_vertex_b.X(); m_al_0[KF_NUM7*m_trackNum+1][0] = m_vertex_b.Y(); m_al_0[KF_NUM7*m_trackNum+2][0] = m_vertex_b.Z(); tmp_V_al_0.SetSub(KF_NUM7*m_trackNum,it->GetErrVertexOut()); //cout<SetP4(sum); if(m_fitIncludingVertex == 0)fHeadOfTree->SetPos(m_vertex_b); else fHeadOfTree->SetPos(TVector3(m_al_1[KF_NUM7*m_trackNum+0][0],m_al_1[KF_NUM7*m_trackNum+1][0],m_al_1[KF_NUM7*m_trackNum+2][0])); return m_errorFlag; } unsigned PndMassFitter::CalDgf() { m_dgf = 1; return m_dgf; } void PndMassFitter::SetInvariantMass(Double_t m) {m_invariantMass = m;} void PndMassFitter::SetAtDecayPoint() {m_atDecayPoint = KF_AT_DECAY_POINT;} void PndMassFitter::SetNotDecayPoint() {m_atDecayPoint = KF_NOT_DECAY_POINT;} Double_t PndMassFitter::GetInvariantMass() {return m_invariantMass;} unsigned PndMassFitter::GetDecayPoint() {return m_atDecayPoint;}