19 else std::cerr <<
"WARNING in TtresChi2: units different from GeV or MeV" << std::endl;
42 if (
m_debug > 0) std::cout <<
"in destructor " << std::endl;
141 std::cerr <<
"TtresChi2::Init chi2 is not defined!!" << std::endl;
189 m_i_n.reserve(10000);
200 std::vector<TLorentzVector*> neutrinoVector;
207 return neutrinoVector;
212 const std::vector<bool>* isJetBtagged, TLorentzVector*
MET,
int& i_q1_W,
213 int& i_q2_W,
int& i_b_had,
int& i_b_lep,
int& ign1,
double& chi2ming1,
214 double& chi2ming1H,
double& chi2ming1L) {
215 if (
m_debug > 0) std::cout <<
"entering TtresChi2::findMinChiSquare_HMelseLM()" << std::endl;
219 chi2ming1H, chi2ming1L);
221 if (
status && TMath::Log10(chi2ming1) < 0.9)
return status;
224 status = this->
findMinChiSquare(L, jetVector, isJetBtagged,
MET, i_q1_W, i_q2_W, i_b_had, i_b_lep, ign1, chi2ming1,
225 chi2ming1H, chi2ming1L);
232 const std::vector<bool>* isJetBtagged, TLorentzVector*
MET,
int& i_q1_W,
233 int& i_q2_W,
int& i_b_had,
int& i_b_lep,
int& ign1,
double& chi2ming1,
234 double& chi2ming1H,
double& chi2ming1L) {
235 if (
m_debug > 0) std::cout <<
"entering TtresChi2::findMinChiSquare_LMelseHM()" << std::endl;
238 status = this->
findMinChiSquare(L, jetVector, isJetBtagged,
MET, i_q1_W, i_q2_W, i_b_had, i_b_lep, ign1, chi2ming1,
239 chi2ming1H, chi2ming1L);
241 if (
status && TMath::Log10(chi2ming1) < 0.9)
return status;
245 chi2ming1H, chi2ming1L);
252 const std::vector<bool>* isJetBtagged, TLorentzVector*
MET,
int& i_q1_W,
253 int& i_q2_W,
int& i_b_had,
int& i_b_lep,
int& ign1,
double& chi2ming1,
254 double& chi2ming1H,
double& chi2ming1L) {
255 if (
m_debug > 0) std::cout <<
"entering TtresChi2::findMinChiSquare_AllRanges()" << std::endl;
259 for (
unsigned int i = 0;
i < jetVector->size();
260 ++
i)
if (jetVector->at(
i)->M() > massMax) massMax = jetVector->at(
i)->M();
262 if (massMax >=
m_highJetMass *
m_Units)
status = this->
findMinChiSquare_HighMass(L, jetVector, isJetBtagged,
MET, i_q1_W, i_q2_W, i_b_lep, ign1, chi2ming1, chi2ming1H, chi2ming1L);
263 else status = this->
findMinChiSquare(L, jetVector, isJetBtagged,
MET, i_q1_W, i_q2_W, i_b_had, i_b_lep, ign1, chi2ming1, chi2ming1H, chi2ming1L);
269 bool TtresChi2::findMinChiSquare(TLorentzVector* L,
const std::vector<TLorentzVector*>* jetVector,
const std::vector<bool>* isJetBtagged, TLorentzVector*
MET,
int& i_q1_W,
int& i_q2_W,
int& i_b_had,
int& i_b_lep,
int& ign1,
double& chi2ming1,
double& chi2ming1H,
double& chi2ming1L) {
270 if (
m_debug > 0) std::cout <<
"entering TtresChi2::findMinChiSquare()" << std::endl;
280 double chi2ming1WH = 1e7;
281 int n_jets = jetVector->size();
287 std::cerr <<
"ERROR : TtresChi2::findMinChiSquare: Lepton is NULL" << std::endl;
292 for (
unsigned int ib = 0;
ib < (
unsigned int) isJetBtagged->size(); ++
ib) {
293 if (isJetBtagged->at(
ib)) n_bjets++;
301 for (
unsigned int i = 0;
i < (
unsigned int) n_jets;
i++) {
302 const TLorentzVector*
I = jetVector->at(
i);
303 for (
unsigned int j =
i + 1; j < (
unsigned int) n_jets; j++) {
304 const TLorentzVector* J = jetVector->at(j);
305 for (
unsigned int k = 0;
k < (
unsigned int) n_jets;
k++) {
306 if (
k !=
i &&
k != j) {
307 const TLorentzVector* K = jetVector->at(
k);
308 TLorentzVector TopH = (*I) + (*J) + (*K);
309 TLorentzVector Whad = (*I) + (*J);
310 for (
unsigned int n = 0;
n < neutrinoVector.size();
n++) {
311 TLorentzVector*
N = neutrinoVector[
n];
313 TLorentzVector Wlv = (*N) + (*L);
314 for (
unsigned int m = 0;
m < (
unsigned int) n_jets;
m++) {
315 if (
m !=
i &&
m != j &&
m !=
k) {
316 const TLorentzVector* M = jetVector->at(
m);
317 TLorentzVector Tlv = Wlv + (*M);
318 TLorentzVector Tt = Tlv + TopH;
323 double chi2tempg1 = chi2H + chi2L;
326 chi2tempg1 += chi2Diff;
329 chi2tempg1 += chi2DiffRel;
332 chi2tempg1 += chi2DiffRelMass;
339 if (isJetBtagged->at(
k)) {
343 if (isJetBtagged->at(
m)) {
347 bool passBtag =
false;
349 if (n_bJetsComb > 0) {
355 }
else if (n_bjets == 1) {
356 if (n_bJetsComb == 1) {
359 }
else if (n_bjets >= 2) {
360 if (n_bJetsComb == 2) {
390 if (chi2tempg1 < chi2ming1) {
392 chi2ming1 = chi2tempg1;
416 }
else if (n_bjets == 1) {
417 if (isJetBtagged->at(
k)) {
419 }
else if (isJetBtagged->at(
m)) {
422 std::cerr <<
"<!> In TtresChi2::findMinChiSquare : cannot find the corresponding category." << std::endl;
424 }
else if (n_bjets >= 2) {
425 if (isJetBtagged->at(
k)) {
426 if (isJetBtagged->at(
m)) {
431 }
else if (isJetBtagged->at(
m)) {
434 std::cerr <<
"<!> In TtresChi2::findMinChiSquare : cannot find the corresponding category." << std::endl;
448 if (i_q1_W != -1 && i_q2_W != -1 && i_b_had != -1 && i_b_lep != -1 && ign1 != -1) {
457 for (
unsigned int i = 0;
i < neutrinoVector.size();
i++) {
458 delete neutrinoVector[
i];
460 neutrinoVector.clear();
465 bool TtresChi2::findMinChiSquare_HighMass(TLorentzVector* L,
const std::vector<TLorentzVector*>* jetVector,
const std::vector<bool>* isJetBtagged, TLorentzVector*
MET,
int& i_q1_W,
int& i_q2_W,
int& i_b_lep,
int& ign1,
double& chi2ming1,
double&
466 chi2ming1H,
double& chi2ming1L) {
467 if (
m_debug > 0) std::cout <<
"entering TtresChi2::findMinChiSquare_HighMass()" << std::endl;
477 int n_jets = jetVector->size();
483 std::cerr <<
"ERROR : TtresChi2::findMinChiSquare: Lepton is NULL" << std::endl;
488 for (
unsigned int ib = 0;
ib < (
unsigned int) isJetBtagged->size(); ++
ib) {
489 if (isJetBtagged->at(
ib)) n_bjets++;
497 for (
unsigned int i = 0;
i < (
unsigned int) n_jets;
i++) {
498 const TLorentzVector*
I = jetVector->at(
i);
499 for (
unsigned int j =
i + 1; j < (
unsigned int) n_jets; j++) {
500 const TLorentzVector* J = jetVector->at(j);
502 TLorentzVector TopH = (*I) + (*J);
504 for (
unsigned int n = 0;
n < neutrinoVector.size();
n++) {
505 TLorentzVector*
N = neutrinoVector[
n];
507 TLorentzVector Wlv = (*N) + (*L);
508 for (
unsigned int m = 0;
m < (
unsigned int) n_jets;
m++) {
509 if (
m !=
i &&
m != j) {
510 const TLorentzVector* M = jetVector->at(
m);
511 TLorentzVector Tlv = Wlv + (*M);
512 TLorentzVector Tt = Tlv + TopH;
514 double HMtoptemp =
I->M();
518 double chi2tempg1 = chi2H + chi2L;
521 chi2tempg1 += chi2Diff;
524 chi2tempg1 += chi2DiffRel;
527 chi2tempg1 += chi2DiffRelMass;
536 if (isJetBtagged->at(
i) || isJetBtagged->at(j)) {
540 if (isJetBtagged->at(
m)) {
544 bool passBtag =
false;
546 if (n_bJetsComb > 0) {
552 }
else if (n_bjets == 1) {
553 if (n_bJetsComb == 1) {
556 }
else if (n_bjets >= 2) {
557 if (n_bJetsComb == 2) {
584 if (chi2tempg1 < chi2ming1 && HMtoptemp >= HMtop) {
587 chi2ming1 = chi2tempg1;
609 }
else if (n_bjets == 1) {
610 if (isJetBtagged->at(
i) || isJetBtagged->at(j)) {
612 }
else if (isJetBtagged->at(
m)) {
615 std::cerr <<
"<!> In TtresChi2::findMinChiSquare : cannot find the corresponding category." << std::endl;
617 }
else if (n_bjets >= 2) {
618 if (isJetBtagged->at(
i) || isJetBtagged->at(
m)) {
619 if (isJetBtagged->at(
m)) {
624 }
else if (isJetBtagged->at(
m)) {
627 std::cerr <<
"<!> In TtresChi2::findMinChiSquare : cannot find the corresponding category." << std::endl;
640 if (i_q1_W != -1 && i_q2_W != -1 && i_b_lep != -1 && ign1 != -1) {
649 for (
unsigned int i = 0;
i < neutrinoVector.size();
i++) {
650 delete neutrinoVector[
i];
652 neutrinoVector.clear();
657 bool TtresChi2::findMinChiSquare_VeryHighMass(TLorentzVector* L,
const std::vector<TLorentzVector*>* jetVector,
const std::vector<bool>* isJetBtagged, TLorentzVector*
MET,
int& i_q2_W,
int& i_b_lep,
int& ign1,
double& chi2ming1,
double& chi2ming1H,
double& chi2ming1L) {
658 if (
m_debug > 0) std::cout <<
"entering TtresChi2::findMinChiSquare_VeryHighMass() " << std::endl;
667 int n_jets = jetVector->size();
671 std::cerr <<
"ERROR : TtresChi2::findMinChiSquare: Lepton is NULL" << std::endl;
678 for (
unsigned int i = 0;
i < (
unsigned int) n_jets;
i++) {
679 const TLorentzVector*
I = jetVector->at(
i);
680 TLorentzVector TopH = (*I);
683 for (
unsigned int n = 0;
n < neutrinoVector.size();
n++) {
684 TLorentzVector*
N = neutrinoVector[
n];
686 TLorentzVector Wlv = (*N) + (*L);
687 for (
unsigned int m = 0;
m < (
unsigned int) n_jets;
m++) {
689 const TLorentzVector* M = jetVector->at(
m);
690 TLorentzVector Tlv = Wlv + (*M);
691 TLorentzVector Tt = Tlv + TopH;
693 double HMtoptemp =
I->M();
697 double chi2tempg1 = chi2L;
704 if (chi2tempg1 < chi2ming1 && HMtoptemp >= HMtop) {
711 if (isJetBtagged->at(
i)) {
715 if (isJetBtagged->at(
m)) {
721 chi2ming1 = chi2tempg1;
741 if (i_q2_W != -1 && i_b_lep != -1 && ign1 != -1) {
749 for (
unsigned int i = 0;
i < neutrinoVector.size();
i++) {
750 delete neutrinoVector[
i];
752 neutrinoVector.clear();