void HHV4Vector::Rotate(const HHV4Vector & q) { Double_t ex, ey, ez, en; Double_t a, b, c, d, px1, py1, pz1, px2, py2, pz2, px3, py3, pz3; px1 = Px(); py1 = Py(); pz1 = Pz(); ex = q.Px(); ey = q.Py(); ez = q.Pz(); en = sqrt(ex * ex + ey * ey + ez * ez); ex = ex / en; ey = ey / en; ez = ez / en; // cout << "Rotate e: " << ex << " " << ey << " " << ez << endl; a = ez; b = sqrt(1. - a * a); c = ex / b; d = -ey / b; px2 = a * px1 + b * pz1; // rotation around y-axis py2 = py1; pz2 = -b * px1 + a * pz1; // cout << "Rotate p2: " << px2 << " " << py2 << " " << pz2 << endl; px3 = c * px2 + d * py2; // rotation around z-axis py3 = -d * px2 + c * py2; pz3 = pz2; // cout << "Rotate p3: " << px3 << " " << py3 << " " << pz3 << endl; SetPxPyPzE(px3, py3, pz3, E()); }
void HHDiJetKinFit::ConstrainE2(Int_t iv4, Int_t iv41, Int_t iv42) { m_fitrecord->UpdateMothers(iv41); Double_t M1, M2, M, Mc, E1, E2, b2, beta2; M = m_fitrecord->GetEntry(iv4)->M(); Mc = m_particlelist->GetParticleInfo( m_fitrecord->GetEntry(iv4)->ID() )->M(); E1 = m_fitrecord->GetEntry(iv41)->E(); M1 = m_fitrecord->GetEntry(iv41)->M(); E2 = m_fitrecord->GetEntry(iv42)->E(); M2 = m_fitrecord->GetEntry(iv42)->M(); if (M2 == 0.) { // massless case m_fitrecord->UpdateEntry(iv42)->SetEkeepM(E2 * (Mc / M) * (Mc / M)); // only changes absolute value and keeps eta, phi, m untouched // such that invariant mass of 1 and 2 gives correct mass Mc m_fitrecord->UpdateMothers(iv42); return; } Int_t ID2jet = -1; Int_t ID2 = m_fitrecord->GetEntry(iv42)->ID(); if (ID2 == HHPID::q || ID2 == HHPID::c || ID2 == HHPID::b || ID2 == HHPID::gluon) ID2jet = 1; ID2jet = -1; beta2 = sqrt(E2 * E2 - M2 * M2) / E2; if (ID2jet < 0) { // is not a jet b2 = (M2 / E2) * (M2 / E2); // isn't the no jet case identical to the jet case? 1/gamma**2 = m**2/E**2 = 1-beta**2 } else { // is a jet b2 = 1 - beta2 * beta2; } Double_t d = (M * M - M1 * M1 - M2 * M2) / (2. * E1 * E2); Double_t E2lin = (Mc * Mc - M1 * M1) / (2. * E1 * d); Double_t E2N = E1 * d / b2; Double_t E2new = E2N * (-1. + sqrt(1. + 2. * E2lin / E2N)); if (ID2jet < 0) { // is not a jet m_fitrecord->UpdateEntry(iv42)->SetEkeepM(E2new); } else { // is a jet HHV4Vector* entry = m_fitrecord->GetEntry(iv42); m_fitrecord->UpdateEntry(iv42)->SetEEtaPhiM(E2new, entry->Eta(), entry->Phi(), M2 * E2new / E2); } m_fitrecord->UpdateMothers(iv42); }
void HHV4Vector::Subtract(const HHV4Vector & q1, const HHV4Vector & q2) { Double_t Etemp = q1.E() - q2.E(); Double_t Pxtemp = q1.Px() - q2.Px(); Double_t Pytemp = q1.Py() - q2.Py(); Double_t Pztemp = q1.Pz() - q2.Pz(); SetPxPyPzE(Pxtemp, Pytemp, Pztemp, Etemp); }
double HHDiJetKinFit::GetPullE(Int_t iv4){ HHV4Vector* fv = m_fitrecord->GetEntry(iv4); HHV4Vector* rv = m_recrecord->GetEntry(iv4); return (fv->E()-rv->E())/rv->dE(); }
Double_t HHDiJetKinFit::Chi2V4(Int_t iv4) { Double_t chi2 = 0; Double_t chi2_E = 0; Double_t chi2_Eta = 0; Double_t chi2_Phi = 0; HHV4Vector* fitobject = m_fitrecord->GetEntry(iv4); HHV4Vector* recobject = m_recrecord->GetEntry(iv4); // std::cout << "V4chi2 dE " ; V4fit[iv4].Print(); if (fitobject->dE() > 0.) { chi2_E = ((recobject->E() - fitobject->E()) / fitobject->dE()) * ((recobject->E() - fitobject->E()) / fitobject->dE()); } if (fitobject->dEta() > 0.) { chi2_Eta = ((recobject->Eta() - fitobject->Eta()) / fitobject->dEta()) * ((recobject->Eta() - fitobject->Eta()) / fitobject->dEta()); } if (fitobject->dPhi() > 0.) { chi2_Phi = ((recobject->Phi() - fitobject->Phi()) / fitobject->dPhi()) * ((recobject->Phi() - fitobject->Phi()) / fitobject->dPhi()); } chi2 = chi2_E + chi2_Eta + chi2_Phi; if (m_logLevel>1){ PSTools::coutf(5, TString("E")); PSTools::coutf(9, 2, recobject->E()); PSTools::coutf(9, 2, fitobject->E()); PSTools::coutf(9, 2, recobject->E()-fitobject->E()); PSTools::coutf(3, TString("|")); PSTools::coutf(9, 2, fitobject->dE()); PSTools::coutf(3, TString("->")); PSTools::coutf(9, 2, chi2_E); std::cout << std::endl; PSTools::coutf(5, TString("Eta")); PSTools::coutf(9, 2, recobject->Eta()); PSTools::coutf(9, 2, fitobject->Eta()); PSTools::coutf(9, 2, recobject->Eta()-fitobject->Eta()); PSTools::coutf(3, TString("|")); PSTools::coutf(9, 2, fitobject->dEta()); PSTools::coutf(3, TString("->")); PSTools::coutf(9, 2, chi2_Eta); std::cout << std::endl; PSTools::coutf(5, TString("Phi")); PSTools::coutf(9, 2, recobject->Phi()); PSTools::coutf(9, 2, fitobject->Phi()); PSTools::coutf(9, 2, recobject->Phi()-fitobject->Phi()); PSTools::coutf(3, TString("|")); PSTools::coutf(9, 2, fitobject->dPhi()); PSTools::coutf(3, TString("->")); PSTools::coutf(9, 2, chi2_Phi); std::cout << std::endl; } return chi2; }
HHV4Vector::HHV4Vector(const HHV4Vector & v, TString suffix) { m_e = v.E(); m_eta = v.Eta(); m_phi = v.Phi(); m_m = v.M(); m_dE = v.dE(); m_dEta = v.dEta(); m_dPhi = v.dPhi(); m_name = v.Name() + suffix; m_id = v.ID(); m_id2 = v.ID2(); m_mother = v.Mother(); m_nDaughter = v.nDaughter(); m_cov_manually_set = false; for (int i = 0; i < m_nDaughter; i++) m_daughter[i] = v.Daughter(i); }
void HHKinFit::ConstrainE2(Int_t iv4, Int_t iv41, Int_t iv42) { Double_t M1, M2, M, Mc, E1, E2, b2, beta2; m_fitrecord->UpdateMothers(iv41); Mc = m_particlelist->GetParticleInfo( m_fitrecord->GetEntry(iv4)->ID() )->M(); M = m_fitrecord->GetEntry(iv4)->M(); int loopCount = 0; while(fabs(M-Mc) > 0.000001){ loopCount++; Int_t ID2 = m_fitrecord->GetEntry(iv42)->ID(); if (ID2 == HHPID::tau && m_logLevel > 3) m_fitrecord->Print("Fit Record Before Constraining:"); E1 = m_fitrecord->GetEntry(iv41)->E(); M1 = m_fitrecord->GetEntry(iv41)->M(); E2 = m_fitrecord->GetEntry(iv42)->E(); M2 = m_fitrecord->GetEntry(iv42)->M(); if (M2 == 0.) { // massless case if(m_logLevel > 0) std::cout << "Massless case!" << std::endl; m_fitrecord->UpdateEntry(iv42)->SetEkeepM(E2 * (Mc / M) * (Mc / M)); // only changes absolute value and keeps eta, phi, m untouched // such that invariant mass of 1 and 2 gives correct mass Mc m_fitrecord->UpdateMothers(iv42); return; } Int_t ID2jet = -1; if (ID2 == HHPID::q || ID2 == HHPID::c || ID2 == HHPID::b || ID2 == HHPID::gluon) ID2jet = 1; if(m_keepMassesConst) ID2jet = -1; beta2 = sqrt(E2 * E2 - M2 * M2) / E2; if (ID2jet < 0) { // is not a jet b2 = (M2 / E2) * (M2 / E2); // isn't the no jet case identical to the jet case? 1/gamma**2 = m**2/E**2 = 1-beta**2 } else { // is a jet b2 = 1 - beta2 * beta2; } //std::cout << "beta2 b2: " << beta2 << " " << b2 << std::endl; Double_t d = (M * M - M1 * M1 - M2 * M2) / (2. * E1 * E2); Double_t E2lin = (Mc * Mc - M1 * M1) / (2. * E1 * d); Double_t E2N = E1 * d / b2; Double_t E2new = E2N * (-1. + sqrt(1. + 2. * E2lin / E2N)); //std::cout << "d, E2lin, E2N, E2new: " << d << " " << E2lin << " " << E2N << " " << E2new << std::endl; if (ID2jet < 0) { // is not a jet m_fitrecord->UpdateEntry(iv42)->SetEkeepM(E2new); } else { // is a jet HHV4Vector* entry = m_fitrecord->GetEntry(iv42); m_fitrecord->UpdateEntry(iv42)->SetEEtaPhiM(E2new, entry->Eta(), entry->Phi(), M2 * E2new / E2); if(m_logLevel > 2) std::cout << "Jet Masses are now - BJet1 Mass: " << m_fitrecord->GetEntry(iv41)->M() << " BJet2 Mass: " << m_fitrecord->GetEntry(iv42)->M() << std::endl; } m_fitrecord->UpdateMothers(iv42); M = m_fitrecord->GetEntry(iv4)->M(); if (ID2 == HHPID::tau && m_logLevel > 3 ) m_fitrecord->Print("Fit Record After Constraining:"); } if(m_logLevel > 1){ std::cout << "Did Mass Constraint Loop " << loopCount << " times." << std::endl; } }
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; } }