コード例 #1
0
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();
}
コード例 #2
0
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;
  }
}