HHKinFit2::HHFitConstraint4Vector::HHFitConstraint4Vector(HHFitObject* object, bool px, bool py, bool pz, bool E) : HHFitConstraint(object), m_ncomp(0), m_cov(), m_invcov(), m_indices() { m_components[0]=px; m_components[1]=py; m_components[2]=pz; m_components[3]=E; for (int i=0; i<4; i++) { if (m_components[i]) { m_indices.push_back(i); m_ncomp++; } } m_cov.ResizeTo(m_ncomp,m_ncomp); for (int i=0; i<m_ncomp; i++) for (int j=0; j<m_ncomp; j++) m_cov(i,j)=m_fitobject->getCovMatrix()(m_indices[i],m_indices[j]); if(m_ncomp>1){ TMatrixDEigen eigenmatrix(m_cov); for (int i=0; i<m_ncomp; i++){ if (eigenmatrix.GetEigenValues()(i,i)<0){ std::stringstream msg; msg << "covariance matrix is not positive-definite, but has at least one negative eigenvalue"; throw(HHCovarianceMatrixException(msg.str())); } } } m_invcov.ResizeTo(m_ncomp,m_ncomp); m_invcov = m_cov; m_invcov.Invert(); // m_cov.Print(); // m_invcov.Print(); }
void HHKinFit::Fit() { // V4Vector* ptmissrec = PTmissCalc(fitrecord); /*HHV4Vector* ptmissrec =*/ m_recrecord->GetEntry(HHEventRecord::MET); // ---------- for PSfit ----- const Int_t np = 2; Double_t a[np]; Double_t astart[np]; Double_t alimit[np][2]; Double_t aprec[np]; Double_t daN[np]; Double_t h[np]; Double_t chi2iter[1], aMemory[np][5], g[np], H[np * np], Hinv[np * np]; Bool_t noNewtonShifts = false; Int_t iter = 0; // number of iterations Int_t method = 1; // initial fit method, see PSfit() Int_t mode = 1; // mode =1 for start of a new fit by PSfit() // Int_t icallNewton = -1; // init start of Newton Method // Int_t iloop = 0; // counter for falls to fit function // calculate htau from tauvis; recombine leaves measured entries in event record untouched m_recrecord->Recombine(); Double_t bjet1UpperLimit = m_recrecord->GetEntry(HHEventRecord::b1)->E() + 5.0 * m_recrecord->GetEntry(HHEventRecord::b1)->dE(); Double_t bjet1LowerLimit = m_recrecord->GetEntry(HHEventRecord::b1)->E() - 5.0 * m_recrecord->GetEntry(HHEventRecord::b1)->dE(); Double_t bjet2UpperLimit = m_recrecord->GetEntry(HHEventRecord::b2)->E() + 5.0 * m_recrecord->GetEntry(HHEventRecord::b2)->dE(); Double_t bjet2LowerLimit = m_recrecord->GetEntry(HHEventRecord::b2)->E() - 5.0 * m_recrecord->GetEntry(HHEventRecord::b2)->dE(); Double_t tau1LowerLimit = m_recrecord->GetEntry(HHEventRecord::tauvis1)->E(); Double_t tau2LowerLimit = m_recrecord->GetEntry(HHEventRecord::tauvis2)->E(); m_keepMassesConst = false; /*Double_t mhtauHypo = */m_particlelist->GetParticleInfo(HHPID::h1)->M(); /*Double_t mhtauReco = */m_recrecord->GetEntry(HHEventRecord::htau)->M(); Double_t mtau = m_particlelist->GetParticleInfo(HHPID::tau)->M(); //Calculate Recoil CovMatrix TMatrixD Cov_MET = m_recrecord->GetEntry(HHEventRecord::MET)->GetCov(); TMatrixD Cov_b1 = m_recrecord->GetEntry(HHEventRecord::b1)->GetCov(); TMatrixD Cov_b2 = m_recrecord->GetEntry(HHEventRecord::b2)->GetCov(); TMatrixD Cov_tauvis1 = m_recrecord->GetEntry(HHEventRecord::tauvis1)->GetCov(); TMatrixD Cov_tauvis2 = m_recrecord->GetEntry(HHEventRecord::tauvis2)->GetCov(); m_covRecoil = Cov_MET - (Cov_b1 + Cov_b2 + Cov_tauvis1 + Cov_tauvis2); TMatrixDEigen eigenmatrix(m_covRecoil); if (eigenmatrix.GetEigenValues()(0,0)<0 || eigenmatrix.GetEigenValues()(1,1)<0){ m_fixedCovMatrix = true; m_covRecoil(0,0) = 100; m_covRecoil(1,1) = 100; m_covRecoil(1,0) = 0; m_covRecoil(0,1) = 0; } TMatrixDEigen eigenmatrix2(m_covRecoil); // initialise tau1 and tau2 vectors if(m_recrecord->GetEntry(HHEventRecord::tauvis1)->E() > mtau){ m_fitrecord->UpdateEntry(HHEventRecord::tau1)->SetEEtaPhiM(m_recrecord->GetEntry(HHEventRecord::tauvis1)->E(), m_recrecord->GetEntry(HHEventRecord::tauvis1)->Eta(), m_recrecord->GetEntry(HHEventRecord::tauvis1)->Phi(), mtau); } else{ m_fitrecord->UpdateEntry(HHEventRecord::tau1)->SetEEtaPhiM(pow(m_recrecord->GetEntry(HHEventRecord::tauvis1)->P(),2)+pow(mtau,2), m_recrecord->GetEntry(HHEventRecord::tauvis1)->Eta(), m_recrecord->GetEntry(HHEventRecord::tauvis1)->Phi(), mtau); } if(tau2LowerLimit > mtau){ m_fitrecord->UpdateEntry(HHEventRecord::tau2)->SetEEtaPhiM(tau2LowerLimit, m_recrecord->GetEntry(HHEventRecord::tauvis2)->Eta(), m_recrecord->GetEntry(HHEventRecord::tauvis2)->Phi(), mtau); } else{ m_fitrecord->UpdateEntry(HHEventRecord::tau2)->SetEEtaPhiM(pow(m_recrecord->GetEntry(HHEventRecord::tauvis2)->P(),2)+pow(mtau,2), m_recrecord->GetEntry(HHEventRecord::tauvis2)->Eta(), m_recrecord->GetEntry(HHEventRecord::tauvis2)->Phi(), mtau); } //firstly, compute upper limit of E(tau1) by having set E(tau2)=E(tau2)_min and compute E(tau1) ConstrainE2(HHEventRecord::htau, HHEventRecord::tau2, HHEventRecord::tau1); Double_t maxEtau1 = m_fitrecord->GetEntry(HHEventRecord::tau1)->E(); /* //secondly, compute lower limit of E(tau1) by setting E(tau1)=E(tauvis1) and compute E(tau2) //and check whether E(tau2)<E(tauvis2) if(m_recrecord->GetEntry(HHEventRecord::tauvis1)->E() > mtau){ m_fitrecord->UpdateEntry(HHEventRecord::tau1)->SetEEtaPhiM(m_recrecord->GetEntry(HHEventRecord::tauvis1)->E(), m_recrecord->GetEntry(HHEventRecord::tauvis1)->Eta(), m_recrecord->GetEntry(HHEventRecord::tauvis1)->Phi(), mtau); } else{ m_fitrecord->UpdateEntry(HHEventRecord::tau1)->SetEEtaPhiM(pow(m_recrecord->GetEntry(HHEventRecord::tauvis1)->P(),2)+pow(mtau,2), m_recrecord->GetEntry(HHEventRecord::tauvis1)->Eta(), m_recrecord->GetEntry(HHEventRecord::tauvis1)->Phi(), mtau); } ConstrainE2(HHEventRecord::htau, HHEventRecord::tau1, HHEventRecord::tau2); */ Double_t minEtau1 = tau1LowerLimit; //Reset taus if(m_recrecord->GetEntry(HHEventRecord::tauvis2)->E() > mtau){ m_fitrecord->UpdateEntry(HHEventRecord::tau2)->SetEEtaPhiM(m_recrecord->GetEntry(HHEventRecord::tauvis2)->E(), m_recrecord->GetEntry(HHEventRecord::tauvis2)->Eta(), m_recrecord->GetEntry(HHEventRecord::tauvis2)->Phi(), mtau); } else{ m_fitrecord->UpdateEntry(HHEventRecord::tau2)->SetEEtaPhiM(pow(m_recrecord->GetEntry(HHEventRecord::tauvis2)->P(),2)+pow(mtau,2), m_recrecord->GetEntry(HHEventRecord::tauvis2)->Eta(), m_recrecord->GetEntry(HHEventRecord::tauvis2)->Phi(), mtau); } if(m_recrecord->GetEntry(HHEventRecord::tauvis1)->E() > mtau){ m_fitrecord->UpdateEntry(HHEventRecord::tau1)->SetEEtaPhiM(m_recrecord->GetEntry(HHEventRecord::tauvis1)->E(), m_recrecord->GetEntry(HHEventRecord::tauvis1)->Eta(), m_recrecord->GetEntry(HHEventRecord::tauvis1)->Phi(), mtau); } else{ m_fitrecord->UpdateEntry(HHEventRecord::tau2)->SetEEtaPhiM(pow(m_recrecord->GetEntry(HHEventRecord::tauvis1)->P(),2)+pow(mtau,2), m_recrecord->GetEntry(HHEventRecord::tauvis1)->Eta(), m_recrecord->GetEntry(HHEventRecord::tauvis1)->Phi(), mtau); } ConstrainE2(HHEventRecord::htau, HHEventRecord::tau1, HHEventRecord::tau2); m_fitrecord->UpdateMothers(HHEventRecord::b1); m_fitrecord->UpdateMothers(HHEventRecord::tau1); if (!(maxEtau1>=m_recrecord->GetEntry(HHEventRecord::tauvis1)->E()) ){ if(m_printlevel > 0) std::cout << "tautau mass constraint cannot be fulfilled -> reconstructed visible tau energy greater/smaller than maximal/minimal allowed total tau energy." << std::endl; m_convergence=-1; m_chi2=9999; m_chi2_b1=9999; m_chi2_b2=9999; m_chi2_balance=9999; m_fittedmH=-1; return; } // fill initial tau fit parameters astart[1] = m_fitrecord->GetEntry(HHEventRecord::tau1)->E(); // energy of first tau aprec[1] = 0.1; //0.1 // precision for fit astart[0] = m_fitrecord->GetEntry(HHEventRecord::b1)->E(); // energy of first b-jet aprec[0] = astart[0]*0.002; //0.1 // precision for fit m_tauStartEnergy = astart[1]; m_bStartEnergy = astart[1]; // fill initial step width h[0] = 0.5*m_fitrecord->GetEntry(HHEventRecord::b1)->dE(); h[1] = 0.1*minEtau1; // daN[0] = 1.0; //0.0 // initial search direction in Eb-Etau diagonal daN[1] = 1.0; //1.0 // fit range alimit[0][0] = bjet1LowerLimit; if (alimit[0][0]<0.01) alimit[0][0]=0.01; alimit[0][1] = bjet1UpperLimit; //EBJet2 Constraints HHV4Vector* bjet2_entry = m_fitrecord->GetEntry(HHEventRecord::b2); double E_bjet2 = bjet2_entry->E(); double E_bjet2Low = bjet2LowerLimit; double E_bjet2High = bjet2UpperLimit; if( E_bjet2Low <= 0.01) E_bjet2Low = 0.01; if (m_logLevel>1) std::cout << "Setting bjet 2 Energy to " << E_bjet2Low << std::endl; if(m_keepMassesConst) m_fitrecord->UpdateEntry(HHEventRecord::b2)->SetEkeepM(E_bjet2Low); else m_fitrecord->UpdateEntry(HHEventRecord::b2)->SetEEtaPhiM(E_bjet2Low, //Set b2 to lower b2 limit bjet2_entry->Eta(), bjet2_entry->Phi(), bjet2_entry->M() * E_bjet2Low/E_bjet2 ); ConstrainE2(HHEventRecord::hb, HHEventRecord::b2, HHEventRecord::b1); //Calculate b1 with b2 fixed if(alimit[0][1] > m_fitrecord->GetEntry(HHEventRecord::b1)->E()){ alimit[0][1] = m_fitrecord->GetEntry(HHEventRecord::b1)->E(); //Modify b1 limit if b2 limit is tighter if (m_logLevel>1) std::cout << "Upper bjet 1 limit is now " << alimit[0][1] << std::endl; } if (m_logLevel>1) std::cout << "Setting bjet 2 Energy to " << E_bjet2High << std::endl; if(m_keepMassesConst) m_fitrecord->UpdateEntry(HHEventRecord::b2)->SetEkeepM(E_bjet2High); else m_fitrecord->UpdateEntry(HHEventRecord::b2)->SetEEtaPhiM(E_bjet2High, //Set b2 to upper b2 limit bjet2_entry->Eta(), bjet2_entry->Phi(), bjet2_entry->M() * E_bjet2High/E_bjet2Low ); ConstrainE2(HHEventRecord::hb, HHEventRecord::b2, HHEventRecord::b1); //Calculate b1 with b2 fixed if(alimit[0][0] < m_fitrecord->GetEntry(HHEventRecord::b1)->E()){ alimit[0][0] = m_fitrecord->GetEntry(HHEventRecord::b1)->E(); //Modify b1 limit if b2 limit is tighter if (m_logLevel>1) std::cout << "Lower bjet 1 limit is now " << alimit[0][0] << std::endl; } //Fill initial bjet fit parameters if(alimit[0][1] - alimit[0][0] > 0.5*m_fitrecord->GetEntry(HHEventRecord::b1)->dE()){ astart[0] = alimit[0][0] + (alimit[0][1] - alimit[0][0])/2.0; // energy of first b-jet } else{ m_convergence=-2; m_chi2=9999; m_chi2_b1=9999; m_chi2_b2=9999; m_chi2_balance=9999; m_fittedmH=-1; return; } HHV4Vector* bjet1_entry = m_fitrecord->GetEntry(HHEventRecord::b1); Double_t bjet1_entryEnergy = bjet1_entry->E(); if(m_keepMassesConst) m_fitrecord->UpdateEntry(HHEventRecord::b1)->SetEkeepM(astart[0]); else m_fitrecord->UpdateEntry(HHEventRecord::b1)->SetEEtaPhiM(astart[0], bjet1_entry->Eta(), bjet1_entry->Phi(), bjet1_entry->M()*astart[0]/bjet1_entryEnergy); ConstrainE2(HHEventRecord::hb, HHEventRecord::b1, HHEventRecord::b2); alimit[1][0] = minEtau1; // tau: minimum is visible tau1 energy alimit[1][1] = maxEtau1; // maximum as computed above // tau: check initial values against fit range if (astart[1] - h[1] < alimit[1][0]) { astart[1] = alimit[1][0] + h[1]; } else if (astart[1] + h[1] > alimit[1][1]) { astart[1] = alimit[1][1] - h[1]; } for (Int_t ip = 0; ip < np; ip++) { a[ip] = astart[ip]; } for (Int_t ip = 0; ip < np; ip++) { aMemory[ip][0] = -999.0; aMemory[ip][1] = -995.0; aMemory[ip][2] = -990.0; aMemory[ip][3] = -985.0; aMemory[ip][3] = -980.0; } // static const Int_t nloopmax = 100; // static Double_t Xa[nloopmax], Ya[nloopmax]; // static Double_t Xa1[nloopmax], Ya1[nloopmax]; // static Double_t HPx[nloopmax], HPy[nloopmax]; // static Double_t HPx1[nloopmax], HPy1[nloopmax]; ConstrainE2(HHEventRecord::htau, HHEventRecord::tau1, HHEventRecord::tau2); ConstrainE2(HHEventRecord::hb, HHEventRecord::b1, HHEventRecord::b2); if (m_logLevel>1){ std::cout << "Starting FitLoop! Start-Values: " << std::endl; std::cout << "Fit Params: " << std::endl; std::cout << "Eb1: " << m_fitrecord->GetEntry(HHEventRecord::b1)->E() << " Eb2: " << m_fitrecord->GetEntry(HHEventRecord::b2)->E() << std::endl; std::cout << "Eb1 Lower Limit: " << alimit[0][0] << "Eb1 Upper Limit: " << alimit[0][1] << std::endl; std::cout << "Eb1 Precision is : " << aprec[0] << std::endl; std::cout << "Etau1: " << m_fitrecord->GetEntry(HHEventRecord::tau1)->E() << " Etau2: " << m_fitrecord->GetEntry(HHEventRecord::tau2)->E() << std::endl; std::cout << "ETau1 Lower Limit: " << alimit[1][0] << "ETau1 Upper Limit: " << alimit[1][1] << std::endl; std::cout << "Etau1 Precision is : " << aprec[1] << std::endl; std::cout << "HH Px: " << m_fitrecord->GetEntry(HHEventRecord::H)->Px() << " HH Py: " << m_fitrecord->GetEntry(HHEventRecord::H)->Py() << std::endl; } for (Int_t iloop = 0; iloop < m_maxloops * 10 && iter < m_maxloops; iloop++) { // FIT loop if(m_keepMassesConst) m_fitrecord->UpdateEntry(HHEventRecord::b1)->SetEkeepM(a[0]); // update 4-vectors with fit parameters (No Mass Change) else{ HHV4Vector* entry = m_fitrecord->GetEntry(HHEventRecord::b1); m_fitrecord->UpdateEntry(HHEventRecord::b1)->SetEEtaPhiM(a[0], entry->Eta(), entry->Phi(), entry->M()*a[0]/entry->E()); //Change b2 Mass } m_fitrecord->UpdateEntry(HHEventRecord::tau1)->SetEkeepM(a[1]); ConstrainE2(HHEventRecord::hb, HHEventRecord::b1, HHEventRecord::b2); ConstrainE2(HHEventRecord::htau, HHEventRecord::tau1, HHEventRecord::tau2); m_chi2_b1 = Chi2V4(HHEventRecord::b1); m_chi2_b2 = Chi2V4(HHEventRecord::b2); m_chi2_balance = Chi2Balance(); m_chi2 = m_chi2_b1 + m_chi2_b2 + m_chi2_balance; // chi2 calculation if (m_logLevel>1){ std::cout << std::setprecision(9); std::cout << "Fit Params: " << std::endl; std::cout << "Eb1: " << a[0] << " Etau1: " << a[1] << std::endl; if (m_logLevel>3){ std::cout << "Eb1FR: " << m_fitrecord->GetEntry(HHEventRecord::b1)->E() << " Etau1FR: " << m_fitrecord->GetEntry(HHEventRecord::tau1)->E() << std::endl; std::cout << "Eb2FR: " << m_fitrecord->GetEntry(HHEventRecord::b2)->E() << " Etau2FR: " << m_fitrecord->GetEntry(HHEventRecord::tau2)->E() << std::endl; } std::cout << std::setprecision(6); std::cout << "chi2 b1: " << m_chi2_b1 << std::endl; std::cout << "chi2 b2: " << m_chi2_b2 << std::endl; std::cout << "chi2 missing: " << m_chi2_balance << std::endl; std::cout << "------------------" << std::endl; std::cout << "chi2 : " << m_chi2 << std::endl; std::cout << "------------------" << std::endl; std::cout << "------------------" << std::endl; } // chi2 = Chi2V4(recrecord, fitrecord, V4EventRecord::b1) // + Chi2V4(recrecord, fitrecord, V4EventRecord::b2) // + Chi2PTmiss(*ptmissrec, fitrecord); // chi2 calculation // if (iloop >= 0 && iloop < nloopmax) { // Xa1[iloop] = m_fitrecord->GetEntry(HHEventRecord::b1)->E(); // Ya1[iloop] = m_fitrecord->GetEntry(HHEventRecord::tau1)->E(); // } // if (iter >= 0 && iter < nloopmax) { // Xa[iter] = m_fitrecord->GetEntry(HHEventRecord::b1)->E(); // Ya[iter] = m_fitrecord->GetEntry(HHEventRecord::tau1)->E(); // } // if (iloop >= 0 && iloop < nloopmax) { // HPx1[iloop] = m_fitrecord->GetEntry(HHEventRecord::H)->Px(); // HPy1[iloop] = m_fitrecord->GetEntry(HHEventRecord::H)->Py(); // } // if (iter >= 0 && iter < nloopmax) { // HPx[iter] = m_fitrecord->GetEntry(HHEventRecord::H)->Px(); // HPy[iter] = m_fitrecord->GetEntry(HHEventRecord::H)->Py(); // } // if (iloop>=0 && iloop<nloopmax) {Xloop[iloop] = a[0] ; Yloop[iloop] = a[1] ; } // if (iter>=0) { nIterations = Iterations->SetNextPoint( V4fit[V4EventRecord::b1].E(), V4fit[V4EventRecord::tau1].E() ) ; } // if (iter>=0) { nIterations = Iterations->SetNextPoint( a[0], a[1] ) ; } PSMath::PSfitShow(iloop, m_convergence, iter, method, mode, m_printlevel, m_graphicslevel, np, a, astart, alimit, aprec, daN, h, m_chi2, g, H); if (m_convergence != 0) { break; } m_convergence = PSMath::PSfit(iloop, iter, method, mode, noNewtonShifts, m_printlevel, np, a, astart, alimit, aprec, daN, h, aMemory, m_chi2, chi2iter, g, H, Hinv); } // ------ end of FIT loop m_fittedmH = m_fitrecord->GetEntry(HHEventRecord::H)->M(); if(m_convergence != 0 && m_convergence != 5){ if(a[0] < (alimit[0][0] + 2*aprec[0]) ){ if (m_logLevel>1) std::cout << "Convergence at lower bjet limit!" << std::endl; m_convergence = 3; } if(a[0] > (alimit[0][1] - 2*aprec[0]) ){ if (m_logLevel>1) std::cout << "Convergence at upper bjet limit!" << std::endl; m_convergence = 3; } if(a[1] < (alimit[1][0] + 2*aprec[1]) ){ if(m_convergence == 3) m_convergence = 5; else{ if (m_logLevel>1) std::cout << "Convergence at lower tau limit!" << std::endl; m_convergence = 4; } } if(a[1] > (alimit[1][1] - 2*aprec[1]) ){ if(m_convergence == 3) m_convergence = 5; else{ if (m_logLevel>1) std::cout << "Convergence at upper tau limit!" << std::endl; m_convergence = 4; } } } if (m_logLevel>1) std::cout << "Convergence is " << m_convergence << std::endl; /* TMatrixD Cov_MET = m_recrecord->GetEntry(HHEventRecord::MET)->GetCov(); TMatrixD Cov_b1 = m_recrecord->GetEntry(HHEventRecord::b1)->GetCov(); TMatrixD Cov_b2 = m_recrecord->GetEntry(HHEventRecord::b2)->GetCov(); TMatrixD Cov_tauvis1 = m_recrecord->GetEntry(HHEventRecord::tauvis1)->GetCov(); TMatrixD Cov_tauvis2 = m_recrecord->GetEntry(HHEventRecord::tauvis2)->GetCov(); TMatrixDEigen eigenmatrixMET(Cov_MET); if (eigenmatrix2.GetEigenValues()(0,0)<0 || eigenmatrix2.GetEigenValues()(1,1)<0){ std::cout << "Recoil covariance matrix has negative Eigenvalues:" << std::endl; m_recrecord->Print("",1); std::cout << "COV_MET: " << std::endl; PSTools::coutf(9, Cov_MET(0,0)); PSTools::coutf(9, Cov_MET(0,1)); std::cout << std::endl; PSTools::coutf(9, Cov_MET(1,0)); PSTools::coutf(9, Cov_MET(1,1)); std::cout << std::endl; std::cout << "COV_b1: dE=" << m_recrecord->GetEntry(HHEventRecord::b1)->dE() << std::endl; PSTools::coutf(9, Cov_b1(0,0)); PSTools::coutf(9, Cov_b1(0,1)); std::cout << std::endl; PSTools::coutf(9, Cov_b1(1,0)); PSTools::coutf(9, Cov_b1(1,1)); std::cout << std::endl; std::cout << "COV_b2: dE=" << m_recrecord->GetEntry(HHEventRecord::b2)->dE() << std::endl; PSTools::coutf(9, Cov_b2(0,0)); PSTools::coutf(9, Cov_b2(0,1)); std::cout << std::endl; PSTools::coutf(9, Cov_b2(1,0)); PSTools::coutf(9, Cov_b2(1,1)); std::cout << std::endl; std::cout << "COV_recoil: " << std::endl; PSTools::coutf(9, m_covRecoil(0,0)); PSTools::coutf(9, m_covRecoil(0,1)); std::cout << std::endl; PSTools::coutf(9, m_covRecoil(1,0)); PSTools::coutf(9, m_covRecoil(1,1)); std::cout << std::endl; std::cout << "eigenvalues COV_MET:" << std::endl; PSTools::coutf(9, eigenmatrixMET.GetEigenValues()(0,0)); PSTools::coutf(9, eigenmatrixMET.GetEigenValues()(1,1)); std::cout << std::endl; std::cout << "eigenvalues COV_recoil:" << std::endl; PSTools::coutf(9, eigenmatrix.GetEigenValues()(0,0)); PSTools::coutf(9, eigenmatrix.GetEigenValues()(1,1)); std::cout << std::endl; } */ if (m_logLevel>0){ Double_t px_MET = m_recrecord->GetEntry(HHEventRecord::MET)->Px(); Double_t py_MET = m_recrecord->GetEntry(HHEventRecord::MET)->Py(); Double_t px_b1 = m_recrecord->GetEntry(HHEventRecord::b1)->Px(); Double_t py_b1 = m_recrecord->GetEntry(HHEventRecord::b1)->Py(); Double_t px_b2 = m_recrecord->GetEntry(HHEventRecord::b2)->Px(); Double_t py_b2 = m_recrecord->GetEntry(HHEventRecord::b2)->Py(); Double_t px_tauvis1 = m_recrecord->GetEntry(HHEventRecord::tauvis1)->Px(); Double_t py_tauvis1 = m_recrecord->GetEntry(HHEventRecord::tauvis1)->Py(); Double_t px_tauvis2 = m_recrecord->GetEntry(HHEventRecord::tauvis2)->Px(); Double_t py_tauvis2 = m_recrecord->GetEntry(HHEventRecord::tauvis2)->Py(); Double_t px_H_reco = px_MET + px_b1 + px_b2 + px_tauvis1 + px_tauvis2; Double_t py_H_reco = py_MET + py_b1 + py_b2 + py_tauvis1 + py_tauvis2; std::cout << "MET:" << std::endl; PSTools::coutf(9, px_MET); PSTools::coutf(9, py_MET); std::cout << std::endl; std::cout << "recoil:" << std::endl; PSTools::coutf(9, -px_H_reco); PSTools::coutf(9, -py_H_reco); std::cout << std::endl; std::cout << "chi2 b1: " << m_chi2_b1 << std::endl; std::cout << "chi2 b2: " << m_chi2_b2 << std::endl; std::cout << "chi2 balance: " << m_chi2_balance << std::endl; std::cout << "CHI2 TOTAL: " << m_chi2 << std::endl; } }