168 if (
config.verbose) cout <<
"maxnbaseline = " <<
config.maxnbaseline << endl;
172 int nevents_thiscase;
175 TTree *ntuple =
new TTree(
"FakeBkg",
"Variables from toy MC");
176 ntuple->Branch(
"nevents", &nevents_thiscase,
"nevents/I");
178 ntuple->Branch(
"nevents_sel", &nevents_sel,
"nevents_sel/I");
179 Float_t fake_lep_frac;
180 ntuple->Branch(
"fake_lep_frac", &fake_lep_frac,
"fake_lep_frac/F");
182 ntuple->Branch(
"true_fakes", &true_fakes,
"true_fakes/F");
184 ntuple->Branch(
"asm_fakes", &asm_fakes,
"asm_fakes/F");
186 ntuple->Branch(
"asm_err", &asm_err,
"asm_err/F");
188 ntuple->Branch(
"fkf_fakes", &fkf_fakes,
"fkf_fakes/F");
190 ntuple->Branch(
"fkf_err", &fkf_err,
"fkf_err/F");
191 Float_t lhoodMM_fakes;
192 ntuple->Branch(
"lhoodMM_fakes", &lhoodMM_fakes,
"lhoodMM_fakes/F");
193 Float_t lhoodMM_poserr;
194 ntuple->Branch(
"lhoodMM_poserr", &lhoodMM_poserr,
"lhoodMM_poserr/F");
195 Float_t lhoodMM_negerr;
196 ntuple->Branch(
"lhoodMM_negerr", &lhoodMM_negerr,
"lhoodMM_negerr/F");
197 Float_t lhoodFF_fakes;
198 ntuple->Branch(
"lhoodFF_fakes", &lhoodFF_fakes,
"lhoodFF_fakes/F");
199 Float_t lhoodFF_poserr;
200 ntuple->Branch(
"lhoodFF_poserr", &lhoodFF_poserr,
"lhoodFF_poserr/F");
201 Float_t lhoodFF_negerr;
202 ntuple->Branch(
"lhoodFF_negerr", &lhoodFF_negerr,
"lhoodFF_negerr/F");
205 map<CP::SystematicVariation,float> lhoodMM_weight_map, lhoodMM_poserr_map, lhoodMM_negerr_map;
206 map<CP::SystematicVariation,float> lhoodFF_weight_map, lhoodFF_poserr_map, lhoodFF_negerr_map;
207 map<CP::SystematicVariation,float> asm_weight_map, asm_err_map;
208 map<CP::SystematicVariation,float> fkf_weight_map, fkf_err_map;
210 TRandom3 rand(242868252);
212 Double_t realeff_spread =
config.eff_spread;
213 Double_t fakeeff_spread =
config.eff_spread;
215 std::vector<bool> isTight;
216 std::vector<std::string> input = {
config.outputdirname+
"efficiencies_full" };
226 input.back().append(
".root");
233 for (
unsigned icase(0); icase <
config.ncases; icase++) {
236 TH1F* h_lep_pt_lhoodMM = 0;
237 TH1F* h_lep_eta_lhoodMM = 0;
238 TH2F* h_lep_pt_eta_lhoodMM = 0;
239 TH1F* h_lep_pt_lhoodFF = 0;
240 TH1F* h_lep_eta_lhoodFF = 0;
241 TH2F* h_lep_pt_eta_lhoodFF = 0;
242 TH1F* h_lep_pt_asm = 0;
243 TH1F* h_lep_eta_asm = 0;
244 TH2F* h_lep_pt_eta_asm = 0;
245 TH1F* h_lep_pt_fkf = 0;
246 TH1F* h_lep_eta_fkf = 0;
247 TH2F* h_lep_pt_eta_fkf = 0;
250 std::string hname =
"lep_pt_lhoodMM_"+
to_string(icase);
251 h_lep_pt_lhoodMM =
new TH1F(hname.c_str(), hname.c_str(), 10, 0, 100);
252 hname =
"lep_eta_lhoodMM_"+
to_string(icase);
253 h_lep_eta_lhoodMM =
new TH1F(hname.c_str(), hname.c_str(), 10, -5, 5);
254 hname =
"lep_pt_eta_lhoodMM_"+
to_string(icase);
255 h_lep_pt_eta_lhoodMM =
new TH2F(hname.c_str(), hname.c_str(), 10, 0, 100, 10, -5, 5);
256 hname =
"lep_pt_lhoodFF_"+
to_string(icase);
257 h_lep_pt_lhoodFF =
new TH1F(hname.c_str(), hname.c_str(), 10, 0, 100);
258 hname =
"lep_eta_lhoodFF_"+
to_string(icase);
259 h_lep_eta_lhoodFF =
new TH1F(hname.c_str(), hname.c_str(), 10, -5, 5);
260 hname =
"lep_pt_eta_lhoodFF_"+
to_string(icase);
261 h_lep_pt_eta_lhoodFF =
new TH2F(hname.c_str(), hname.c_str(), 10, 0, 100, 10, -5, 5);
263 h_lep_pt_asm =
new TH1F(hname.c_str(), hname.c_str(), 10, 0, 100);
265 h_lep_eta_asm =
new TH1F(hname.c_str(), hname.c_str(), 10, -5, 5);
266 hname =
"lep_pt_eta_asm_"+
to_string(icase);
267 h_lep_pt_eta_asm =
new TH2F(hname.c_str(), hname.c_str(), 10, 0, 100, 10, -5, 5);
269 h_lep_pt_fkf =
new TH1F(hname.c_str(), hname.c_str(), 10, 0, 100);
271 h_lep_eta_fkf =
new TH1F(hname.c_str(), hname.c_str(), 10, -5, 5);
272 hname =
"lep_pt_eta_fkf_"+
to_string(icase);
273 h_lep_pt_eta_fkf =
new TH2F(hname.c_str(), hname.c_str(), 10, 0, 100, 10, -5, 5);
276 float lep_pt = 0, lep_eta = 0;
280 cout <<
"Starting case " << icase << endl;
283 std::vector<CP::LhoodMM_tools*> lhmTool_sav;
285 std::vector<CP::LhoodMM_tools*> lhmTool_FF_sav;
287 std::vector<CP::AsymptMatrixTool*> asmTool_sav;
289 std::vector<CP::ApplyFakeFactor*> fkfTool_sav;
313 ANA_CHECK( lhmTool_FF.setProperty(
"DoFakeFactorFit",
true) );
318 for (
int iSave = 0; iSave <=
nSave; iSave++) {
319 std:: string toolName =
"LhoodMM_tools_save_" + std::to_string(icase) +
"_" + std::to_string(iSave);
321 lhmTool_sav.push_back(lhmTool_is);
328 toolName =
"LhoodMM_tools_FF_save_" + std::to_string(icase) +
"_" + std::to_string(iSave);
330 lhmTool_FF_sav.push_back(lhmTool_FF_is);
339 toolName =
"AsymptMatrixTool_save_" + std::to_string(icase) +
"_" + std::to_string(iSave);
345 asmTool_sav.push_back(asmTool_is);
348 toolName =
"ApplyFakeFactor_save_" + std::to_string(icase) +
"_" + std::to_string(iSave);
350 fkfTool_sav.push_back(fkfTool_is);
361 Double_t realeff_mean_thiscase = rand.Gaus(
config.realeff_mean, realeff_spread);
362 if (realeff_mean_thiscase > 0.99) realeff_mean_thiscase = 0.99;
363 Double_t fakeeff_mean_thiscase = rand.Gaus(
config.fakeeff_mean, fakeeff_spread);
364 if (fakeeff_mean_thiscase < 0.01) fakeeff_mean_thiscase = 0.01;
365 if (fakeeff_mean_thiscase > realeff_mean_thiscase) fakeeff_mean_thiscase = realeff_mean_thiscase-0.01;
367 fake_lep_frac = rand.Uniform();
375 std::vector<LhoodMMEvent> mmevts;
379 std::vector<double> realeff, fakeeff;
381 vector<FinalState*>
fs;
383 for (
unsigned ilep(0); ilep <=
config.maxnbaseline; ilep++) {
386 fs.push_back(this_fs);
389 if (
config.poisson_fluctuations) {
390 nevents_thiscase = rand.Poisson(
config.nevents);
392 nevents_thiscase =
config.nevents;
399 for (
int pass(0); pass<2; pass++) {
403 int nEventsMultFactor = 1;
404 if (pass > 0) nEventsMultFactor = 10;
405 for (Long64_t ievt(0); ievt<nevents_thiscase*nEventsMultFactor; ievt++) {
407 float nlep_frac = 1./(
config.maxnbaseline-
config.minnbaseline+1);
408 Int_t nlep_select =
config.minnbaseline+rand.Uniform()/nlep_frac;
410 float extraweight(1.0);
416 vector<FakeBkgTools::ParticleData> leptons_data;
418 vector<bool> lep_real;
421 vector<float> lep_pts;
422 for (
int ilep(0); ilep < nlep_select; ilep++) {
423 lep_pts.push_back(100*rand.Uniform());
426 sort(lep_pts.begin(), lep_pts.end(), std::greater<float>());
428 for (
int ilep(0); ilep < nlep_select; ilep++) {
432 if (rand.Uniform() > fake_lep_frac) {
438 lep_real.push_back(isReal);
440 lepton->
setCharge(rand.Uniform() > 0.5 ? 1 : -1 );
442 lep_pt = lep_pts[ilep];
443 lep_eta = -5. + 10*rand.Uniform();
447 ANA_CHECK( lookupEfficiencies(*lepton, lepton_data) );
451 TightAcc(*lepton) =
true;
453 TightAcc(*lepton) =
false;
457 TightAcc(*lepton) =
true;
459 TightAcc(*lepton) =
false;
464 leptons_data.push_back(lepton_data);
473 ANA_CHECK( lhmTool_sav[savIndex]->addEvent(leptons, extraweight) );
474 ANA_CHECK( lhmTool_FF_sav[savIndex]->addEvent(leptons, extraweight) );
475 ANA_CHECK( asmTool_sav[savIndex]->addEvent(leptons, extraweight) );
476 ANA_CHECK( fkfTool_sav[savIndex]->addEvent(leptons, extraweight) );
483 for (
int ilep(0); ilep < nlep_select; ilep++) {
484 if (!lep_real[ilep]) {
491 if (pass == 1 && all_real) {
498 ANA_CHECK( fkfTool_sav[savIndex]->addEvent(leptons, -extraweight/nEventsMultFactor) );
499 ANA_CHECK( lhmTool_FF_sav[savIndex]->addEvent(leptons, -extraweight/nEventsMultFactor) );
505 vector<int> lep_indices;
506 std::bitset<64> tights, reals, charges;
507 for (
int ilep(0); ilep < nlep_select; ilep++) {
508 lep_indices.push_back(ilep);
509 if (lep_real[ilep]) reals.set(ilep);
513 for (
long comb(0); comb < (1<<nlep_select); ++comb) {
514 tights = std::bitset<64>(comb);
515 if (
fs[nlep_select]->accept_selection(tights, charges)) {
516 if (
fs[nlep_select]->accept_process(nlep_select, reals, tights)) {
517 true_fakes += extraweight*
comboProb(leptons_data, tights, reals);
523 for (
int ilep = 0; ilep < nlep_select; ilep++) {
524 if (TightAcc(*leptons[ilep])) tights.set(ilep);
526 if (
fs[nlep_select]->accept_selection(tights,charges) ) {
527 nevents_sel += extraweight;
543 fkfYield -= wgt/nEventsMultFactor;
544 fkfErr += wgt*wgt/(nEventsMultFactor);
550 if (ievt > 0 && (((
nSave*ievt)%nevents_thiscase ==0) || ievt == nevents_thiscase -1) ) {
551 string saveFileName =
config.saveFileNameBase;
553 std::unique_ptr<TFile> saveFile(TFile::Open(saveFileName.c_str(),
"RECREATE"));
554 ANA_CHECK( lhmTool_sav[savIndex]->saveProgress(saveFile->mkdir(
"fakes")) );
558 saveFile = std::make_unique<TFile>(saveFileName.c_str(),
"RECREATE");
559 ANA_CHECK( asmTool_sav[savIndex]->saveProgress(saveFile.get()) );
565 if (ievt > 0 && (((
nSave*ievt)%(nevents_thiscase*nEventsMultFactor) ==0) || ievt == nevents_thiscase*nEventsMultFactor -1) ) {
566 string saveFileName =
config.saveFileNameBase;
569 std::unique_ptr<TFile> saveFile(TFile::Open(saveFileName.c_str(),
"RECREATE"));
570 ANA_CHECK( lhmTool_FF_sav[savIndex]->saveProgress(saveFile->mkdir(
"fakes")) );
574 saveFile = std::make_unique<TFile>(saveFileName.c_str(),
"RECREATE");
575 ANA_CHECK( fkfTool_sav[savIndex]->saveProgress(saveFile.get()) );
579 float nfakes_tmp(0), err_tmp(0);
586 if (*it !=
nullptr)
delete *it;
591 asm_err = sqrt(asmErr);
592 asm_fakes = asmYield;
602 fkf_fakes = fkfYield;
604 if (
config.test_systematics) {
606 std::string systBrName, systBrNameF;
608 for(
auto& sysvar : sysvars){
611 float asm_syst_weight, asm_syst_err;
612 float fkf_syst_weight, fkf_syst_err;
613 float lhoodMM_syst_weight, lhoodMM_syst_poserr, lhoodMM_syst_negerr;
614 float lhoodFF_syst_weight, lhoodFF_syst_poserr, lhoodFF_syst_negerr;
619 ANA_CHECK(
setupSystBranchesAsym(
"lhoodMM", sysvar, lhoodMM_syst_weight, lhoodMM_syst_poserr, lhoodMM_syst_negerr, lhoodMM_weight_map, lhoodMM_poserr_map, lhoodMM_negerr_map, ntuple) );
620 ANA_CHECK(
setupSystBranchesAsym(
"lhoodFF", sysvar, lhoodFF_syst_weight, lhoodFF_syst_poserr, lhoodFF_syst_negerr, lhoodFF_weight_map, lhoodFF_poserr_map, lhoodFF_negerr_map, ntuple) );
624 asm_err_map.find(sysvar)->second,
625 asm_err_map.find(sysvar)->second));
629 fkf_err_map.find(sysvar)->second,
630 fkf_err_map.find(sysvar)->second) );
633 lhoodMM_poserr_map.find(sysvar)->second,
634 lhoodMM_negerr_map.find(sysvar)->second) );
637 lhoodFF_poserr_map.find(sysvar)->second,
638 lhoodFF_negerr_map.find(sysvar)->second) );
643 cout <<
"OUTPUT true_fakes = " << true_fakes << endl;
644 cout <<
"OUTPUT nfakes for lhoodMM = " << lhoodMM_fakes <<
" +" << lhoodMM_poserr <<
" -" << lhoodMM_negerr << endl;
645 cout <<
"OUTPUT nfakes for lhoodFF = " << lhoodFF_fakes <<
" +" << lhoodFF_poserr <<
" -" << lhoodFF_negerr << endl;
646 cout <<
"OUTPUT nfakes for asm = " << asm_fakes <<
" +- " << asm_err << endl;
647 cout <<
"OUTPUT nfakes for fkf = " << fkf_fakes <<
" +- " << fkf_err << endl;
648 cout <<
"OUTPUT true_fakes = " << true_fakes << endl;
651 ANA_CHECK( doMerge(input,
"lhm",
config, h_lep_pt_lhoodMM, lep_pt, h_lep_eta_lhoodMM, lep_eta, h_lep_pt_eta_lhoodMM, lhoodMM_fakes, lhoodMM_poserr, lhoodMM_negerr, icase) );
652 ANA_CHECK( doMerge(input,
"lhf",
config, h_lep_pt_lhoodFF, lep_pt, h_lep_eta_lhoodFF, lep_eta, h_lep_pt_eta_lhoodFF, lhoodFF_fakes, lhoodFF_poserr, lhoodFF_negerr, icase) );
653 ANA_CHECK( doMerge(input,
"asm",
config, h_lep_pt_asm, lep_pt, h_lep_eta_asm, lep_eta, h_lep_pt_eta_asm, asm_fakes, asm_err, asm_err, icase) );
654 ANA_CHECK( doMerge(input,
"fkf",
config, h_lep_pt_fkf, lep_pt, h_lep_eta_fkf, lep_eta, h_lep_pt_eta_fkf, fkf_fakes, fkf_err, fkf_err, icase) );
661 h_lep_pt_lhoodMM->Write();
662 h_lep_eta_lhoodMM->Write();
663 h_lep_pt_eta_lhoodMM->Write();
664 h_lep_pt_lhoodFF->Write();
665 h_lep_eta_lhoodFF->Write();
666 h_lep_pt_eta_lhoodFF->Write();
667 h_lep_pt_asm->Write();
668 h_lep_eta_asm->Write();
669 h_lep_pt_eta_asm->Write();
670 h_lep_pt_fkf->Write();
671 h_lep_eta_fkf->Write();
672 h_lep_pt_eta_fkf->Write();
674 delete h_lep_pt_lhoodMM;
675 delete h_lep_eta_lhoodMM;
676 delete h_lep_pt_eta_lhoodMM;
677 delete h_lep_pt_lhoodFF;
678 delete h_lep_eta_lhoodFF;
679 delete h_lep_pt_eta_lhoodFF;
681 delete h_lep_eta_asm;
682 delete h_lep_pt_eta_asm;
684 delete h_lep_eta_fkf;
685 delete h_lep_pt_eta_fkf;
694 return StatusCode::SUCCESS;