74 StatusCode writeROOT(
const string&
name,
int type,
float realeff_mean,
float fakeeff_mean,
float eff_spread,
float eff_delta_with_pt);
83 std::map<CP::SystematicVariation, float> &syst_map,
84 std::map<CP::SystematicVariation, float> &syst_err_map,
92 std::map<CP::SystematicVariation, float> &syst_map,
93 std::map<CP::SystematicVariation, float> &syst_poserr_map,
94 std::map<CP::SystematicVariation, float> &syst_negerr_map,
99 StatusCode doMerge(
const std::vector<std::string> &
input,
const std::string &
name,
fbtTestToyMC_config &
config,
TH1F* h_lep_pt,
float &lep_pt,
TH1F* h_lep_eta,
float &lep_eta,
TH2F* h_lep_pt_eta,
float &fakes,
float &poserr,
float &negerr,
int icase);
103 double comboProb(
const vector<FakeBkgTools::ParticleData> & leptons_data,
const std::bitset<64> & tights,
const std::bitset<64> &reals) ;
137 config.realeff_mean = 0.90;
138 config.fakeeff_mean = 0.20;
140 config.eff_delta_with_pt = 0.;
144 config.saveFileNameBase =
"saveProgress";
145 config.mergeFileNameBase =
"saveProgress";
146 config.test_merge =
false;
147 config.test_histo =
false;
148 config.test_systematics =
false;
149 config.poisson_fluctuations =
false;
151 config.selection =
">=1T";
152 config.process =
">=1F[T]";
154 if (
config.verbose) cout <<
"maxnbaseline = " <<
config.maxnbaseline << endl;
164 if (
config.verbose) cout <<
"maxnbaseline = " <<
config.maxnbaseline << endl;
168 int nevents_thiscase;
171 TTree *ntuple =
new TTree(
"FakeBkg",
"Variables from toy MC");
172 ntuple->Branch(
"nevents", &nevents_thiscase,
"nevents/I");
174 ntuple->Branch(
"nevents_sel", &nevents_sel,
"nevents_sel/I");
175 Float_t fake_lep_frac;
176 ntuple->Branch(
"fake_lep_frac", &fake_lep_frac,
"fake_lep_frac/F");
178 ntuple->Branch(
"true_fakes", &true_fakes,
"true_fakes/F");
180 ntuple->Branch(
"asm_fakes", &asm_fakes,
"asm_fakes/F");
182 ntuple->Branch(
"asm_err", &asm_err,
"asm_err/F");
184 ntuple->Branch(
"fkf_fakes", &fkf_fakes,
"fkf_fakes/F");
186 ntuple->Branch(
"fkf_err", &fkf_err,
"fkf_err/F");
187 Float_t lhoodMM_fakes;
188 ntuple->Branch(
"lhoodMM_fakes", &lhoodMM_fakes,
"lhoodMM_fakes/F");
189 Float_t lhoodMM_poserr;
190 ntuple->Branch(
"lhoodMM_poserr", &lhoodMM_poserr,
"lhoodMM_poserr/F");
191 Float_t lhoodMM_negerr;
192 ntuple->Branch(
"lhoodMM_negerr", &lhoodMM_negerr,
"lhoodMM_negerr/F");
193 Float_t lhoodFF_fakes;
194 ntuple->Branch(
"lhoodFF_fakes", &lhoodFF_fakes,
"lhoodFF_fakes/F");
195 Float_t lhoodFF_poserr;
196 ntuple->Branch(
"lhoodFF_poserr", &lhoodFF_poserr,
"lhoodFF_poserr/F");
197 Float_t lhoodFF_negerr;
198 ntuple->Branch(
"lhoodFF_negerr", &lhoodFF_negerr,
"lhoodFF_negerr/F");
201 map<CP::SystematicVariation,float> lhoodMM_weight_map, lhoodMM_poserr_map, lhoodMM_negerr_map;
202 map<CP::SystematicVariation,float> lhoodFF_weight_map, lhoodFF_poserr_map, lhoodFF_negerr_map;
203 map<CP::SystematicVariation,float> asm_weight_map, asm_err_map;
204 map<CP::SystematicVariation,float> fkf_weight_map, fkf_err_map;
206 TRandom3
rand(242868252);
208 Double_t realeff_spread =
config.eff_spread;
209 Double_t fakeeff_spread =
config.eff_spread;
211 std::vector<bool> isTight;
212 std::vector<std::string>
input = {
config.outputdirname+
"efficiencies_full" };
222 input.back().append(
".root");
229 for (
unsigned icase(0); icase <
config.ncases; icase++) {
232 TH1F* h_lep_pt_lhoodMM = 0;
233 TH1F* h_lep_eta_lhoodMM = 0;
234 TH2F* h_lep_pt_eta_lhoodMM = 0;
235 TH1F* h_lep_pt_lhoodFF = 0;
236 TH1F* h_lep_eta_lhoodFF = 0;
237 TH2F* h_lep_pt_eta_lhoodFF = 0;
238 TH1F* h_lep_pt_asm = 0;
239 TH1F* h_lep_eta_asm = 0;
240 TH2F* h_lep_pt_eta_asm = 0;
241 TH1F* h_lep_pt_fkf = 0;
242 TH1F* h_lep_eta_fkf = 0;
243 TH2F* h_lep_pt_eta_fkf = 0;
247 h_lep_pt_lhoodMM =
new TH1F(
hname.c_str(),
hname.c_str(), 10, 0, 100);
249 h_lep_eta_lhoodMM =
new TH1F(
hname.c_str(),
hname.c_str(), 10, -5, 5);
251 h_lep_pt_eta_lhoodMM =
new TH2F(
hname.c_str(),
hname.c_str(), 10, 0, 100, 10, -5, 5);
253 h_lep_pt_lhoodFF =
new TH1F(
hname.c_str(),
hname.c_str(), 10, 0, 100);
255 h_lep_eta_lhoodFF =
new TH1F(
hname.c_str(),
hname.c_str(), 10, -5, 5);
257 h_lep_pt_eta_lhoodFF =
new TH2F(
hname.c_str(),
hname.c_str(), 10, 0, 100, 10, -5, 5);
259 h_lep_pt_asm =
new TH1F(
hname.c_str(),
hname.c_str(), 10, 0, 100);
261 h_lep_eta_asm =
new TH1F(
hname.c_str(),
hname.c_str(), 10, -5, 5);
263 h_lep_pt_eta_asm =
new TH2F(
hname.c_str(),
hname.c_str(), 10, 0, 100, 10, -5, 5);
265 h_lep_pt_fkf =
new TH1F(
hname.c_str(),
hname.c_str(), 10, 0, 100);
267 h_lep_eta_fkf =
new TH1F(
hname.c_str(),
hname.c_str(), 10, -5, 5);
269 h_lep_pt_eta_fkf =
new TH2F(
hname.c_str(),
hname.c_str(), 10, 0, 100, 10, -5, 5);
272 float lep_pt, lep_eta;
276 cout <<
"Starting case " << icase << endl;
279 std::vector<CP::LhoodMM_tools*> lhmTool_sav;
281 std::vector<CP::LhoodMM_tools*> lhmTool_FF_sav;
283 std::vector<CP::AsymptMatrixTool*> asmTool_sav;
285 std::vector<CP::ApplyFakeFactor*> fkfTool_sav;
309 ANA_CHECK( lhmTool_FF.setProperty(
"DoFakeFactorFit",
true) );
314 for (
int iSave = 0; iSave <=
nSave; iSave++) {
317 lhmTool_sav.push_back(lhmTool_is);
326 lhmTool_FF_sav.push_back(lhmTool_FF_is);
328 ANA_CHECK( lhmTool_FF_sav[iSave]->setProperty(
"DoFakeFactorFit",
true) );
341 asmTool_sav.push_back(asmTool_is);
346 fkfTool_sav.push_back(fkfTool_is);
357 Double_t realeff_mean_thiscase =
rand.Gaus(
config.realeff_mean, realeff_spread);
358 if (realeff_mean_thiscase > 0.99) realeff_mean_thiscase = 0.99;
359 Double_t fakeeff_mean_thiscase =
rand.Gaus(
config.fakeeff_mean, fakeeff_spread);
360 if (fakeeff_mean_thiscase < 0.01) fakeeff_mean_thiscase = 0.01;
361 if (fakeeff_mean_thiscase > realeff_mean_thiscase) fakeeff_mean_thiscase = realeff_mean_thiscase-0.01;
363 fake_lep_frac =
rand.Uniform();
371 std::vector<LhoodMMEvent> mmevts;
375 std::vector<double> realeff, fakeeff;
377 vector<FinalState*>
fs;
379 for (
unsigned ilep(0); ilep <=
config.maxnbaseline; ilep++) {
382 fs.push_back(this_fs);
385 if (
config.poisson_fluctuations) {
386 nevents_thiscase =
rand.Poisson(
config.nevents);
388 nevents_thiscase =
config.nevents;
393 for (
int pass(0); pass<2; pass++) {
397 int nEventsMultFactor = 1;
398 if (pass > 0) nEventsMultFactor = 10;
399 for (Long64_t ievt(0); ievt<nevents_thiscase*nEventsMultFactor; ievt++) {
401 float nlep_frac = 1./(
config.maxnbaseline-
config.minnbaseline+1);
402 Int_t nlep_select =
config.minnbaseline+
rand.Uniform()/nlep_frac;
404 float extraweight(1.0);
410 vector<FakeBkgTools::ParticleData> leptons_data;
412 vector<bool> lep_real;
415 vector<float> lep_pts;
416 for (
int ilep(0); ilep < nlep_select; ilep++) {
417 lep_pts.push_back(100*
rand.Uniform());
420 sort(lep_pts.begin(), lep_pts.end(), std::greater<float>());
422 for (
int ilep(0); ilep < nlep_select; ilep++) {
426 if (
rand.Uniform() > fake_lep_frac) {
432 lep_real.push_back(isReal);
436 lep_pt = lep_pts[ilep];
437 lep_eta = -5. + 10*
rand.Uniform();
438 lepton->
setP4( 1000*lep_pt, lep_eta, 0, 0.511);
445 lepton->
auxdata<
char>(
"Tight") =
true;
447 lepton->
auxdata<
char>(
"Tight") =
false;
451 lepton->
auxdata<
char>(
"Tight") =
true;
453 lepton->
auxdata<
char>(
"Tight") =
false;
458 leptons_data.push_back(lepton_data);
467 ANA_CHECK( lhmTool_sav[savIndex]->addEvent(leptons, extraweight) );
468 ANA_CHECK( lhmTool_FF_sav[savIndex]->addEvent(leptons, extraweight) );
469 ANA_CHECK( asmTool_sav[savIndex]->addEvent(leptons, extraweight) );
470 ANA_CHECK( fkfTool_sav[savIndex]->addEvent(leptons, extraweight) );
477 for (
int ilep(0); ilep < nlep_select; ilep++) {
478 if (!lep_real[ilep]) {
485 if (pass == 1 && all_real) {
492 ANA_CHECK( fkfTool_sav[savIndex]->addEvent(leptons, -extraweight/nEventsMultFactor) );
493 ANA_CHECK( lhmTool_FF_sav[savIndex]->addEvent(leptons, -extraweight/nEventsMultFactor) );
499 vector<int> lep_indices;
500 std::bitset<64> tights, reals, charges;
501 for (
int ilep(0); ilep < nlep_select; ilep++) {
502 lep_indices.push_back(ilep);
503 if (lep_real[ilep]) reals.set(ilep);
507 for (
long comb(0); comb < (1<<nlep_select); ++comb) {
508 tights = std::bitset<64>(comb);
509 if (
fs[nlep_select]->accept_selection(tights, charges)) {
510 if (
fs[nlep_select]->accept_process(nlep_select, reals, tights)) {
511 true_fakes += extraweight*
comboProb(leptons_data, tights, reals);
517 for (
int ilep = 0; ilep < nlep_select; ilep++) {
518 if (leptons[ilep]->auxdata<char>(
"Tight")) tights.set(ilep);
520 if (
fs[nlep_select]->accept_selection(tights,charges) ) {
521 nevents_sel += extraweight;
537 fkfYield -= wgt/nEventsMultFactor;
538 fkfErr += wgt*wgt/(nEventsMultFactor);
544 if (ievt > 0 && (((
nSave*ievt)%nevents_thiscase ==0) || ievt == nevents_thiscase -1) ) {
559 if (ievt > 0 && (((
nSave*ievt)%(nevents_thiscase*nEventsMultFactor) ==0) || ievt == nevents_thiscase*nEventsMultFactor -1) ) {
573 float nfakes_tmp(0), err_tmp(0);
580 if (*
it !=
nullptr)
delete *
it;
585 asm_err = sqrt(asmErr);
586 asm_fakes = asmYield;
596 fkf_fakes = fkfYield;
598 if (
config.test_systematics) {
600 std::string systBrName, systBrNameF;
602 for(
auto& sysvar : sysvars){
605 float asm_syst_weight, asm_syst_err;
606 float fkf_syst_weight, fkf_syst_err;
607 float lhoodMM_syst_weight, lhoodMM_syst_poserr, lhoodMM_syst_negerr;
608 float lhoodFF_syst_weight, lhoodFF_syst_poserr, lhoodFF_syst_negerr;
613 ANA_CHECK(
setupSystBranchesAsym(
"lhoodMM", sysvar, lhoodMM_syst_weight, lhoodMM_syst_poserr, lhoodMM_syst_negerr, lhoodMM_weight_map, lhoodMM_poserr_map, lhoodMM_negerr_map, ntuple) );
614 ANA_CHECK(
setupSystBranchesAsym(
"lhoodFF", sysvar, lhoodFF_syst_weight, lhoodFF_syst_poserr, lhoodFF_syst_negerr, lhoodFF_weight_map, lhoodFF_poserr_map, lhoodFF_negerr_map, ntuple) );
618 asm_err_map.find(sysvar)->second,
619 asm_err_map.find(sysvar)->second));
623 fkf_err_map.find(sysvar)->second,
624 fkf_err_map.find(sysvar)->second) );
627 lhoodMM_poserr_map.find(sysvar)->second,
628 lhoodMM_negerr_map.find(sysvar)->second) );
631 lhoodFF_poserr_map.find(sysvar)->second,
632 lhoodFF_negerr_map.find(sysvar)->second) );
637 cout <<
"OUTPUT true_fakes = " << true_fakes << endl;
638 cout <<
"OUTPUT nfakes for lhoodMM = " << lhoodMM_fakes <<
" +" << lhoodMM_poserr <<
" -" << lhoodMM_negerr << endl;
639 cout <<
"OUTPUT nfakes for lhoodFF = " << lhoodFF_fakes <<
" +" << lhoodFF_poserr <<
" -" << lhoodFF_negerr << endl;
640 cout <<
"OUTPUT nfakes for asm = " << asm_fakes <<
" +- " << asm_err << endl;
641 cout <<
"OUTPUT nfakes for fkf = " << fkf_fakes <<
" +- " << fkf_err << endl;
642 cout <<
"OUTPUT true_fakes = " << true_fakes << endl;
645 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) );
646 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) );
647 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) );
648 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) );
655 h_lep_pt_lhoodMM->Write();
656 h_lep_eta_lhoodMM->Write();
657 h_lep_pt_eta_lhoodMM->Write();
658 h_lep_pt_lhoodFF->Write();
659 h_lep_eta_lhoodFF->Write();
660 h_lep_pt_eta_lhoodFF->Write();
661 h_lep_pt_asm->Write();
662 h_lep_eta_asm->Write();
663 h_lep_pt_eta_asm->Write();
664 h_lep_pt_fkf->Write();
665 h_lep_eta_fkf->Write();
666 h_lep_pt_eta_fkf->Write();
668 delete h_lep_pt_lhoodMM;
669 delete h_lep_eta_lhoodMM;
670 delete h_lep_pt_eta_lhoodMM;
671 delete h_lep_pt_lhoodFF;
672 delete h_lep_eta_lhoodFF;
673 delete h_lep_pt_eta_lhoodFF;
675 delete h_lep_eta_asm;
676 delete h_lep_pt_eta_asm;
678 delete h_lep_eta_fkf;
679 delete h_lep_pt_eta_fkf;
688 return StatusCode::SUCCESS;
692 TRandom3 rnd(235789);
696 std::unique_ptr<TFile>
file(TFile::Open(
name.c_str(),
"RECREATE"));
700 TH1D hElFake(
"FakeEfficiency_el_pt",
"FakeEfficiency_el_pt", nbin, 0., 1.*nbin);
701 TH1D hMuFake(
"FakeEfficiency_mu_pt",
"FakeEfficiency_mu_pt", nbin, 0., 1.*nbin);
702 TH1D hElReal(
"RealEfficiency_el_pt",
"RealEfficiency_el_pt", nbin, 0., 1.*nbin);
703 TH1D hMuReal(
"RealEfficiency_mu_pt",
"RealEfficiency_mu_pt", nbin, 0., 1.*nbin);
705 TH1D hElFake_bigSyst(
"FakeEfficiency_el_pt__bigSyst",
"FakeEfficiency_el_pt__bigSyst", nbin, 0., 1.*nbin);
706 TH1D hElFake_smallSyst(
"FakeEfficiency_el_pt__smallSyst",
"FakeEfficiency_el_pt__smallSyst", nbin, 0., 1.*nbin);
707 TH1D hMuFake_bigSyst(
"FakeEfficiency_mu_pt__bigSyst",
"FakeEfficiency_mu_pt__bigSyst", nbin, 0., 1.*nbin);
708 TH1D hMuFake_smallSyst(
"FakeEfficiency_mu_pt__smallSyst",
"FakeEfficiency_mu_pt__smallSyst", nbin, 0., 1.*nbin);
709 TH1D hElReal_bigSyst(
"RealEfficiency_el_pt__bigSyst",
"RealEfficiency_el_pt__bigSyst", nbin, 0., 1.*nbin);
710 TH1D hMuReal_bigSyst(
"RealEfficiency_mu_pt__bigSyst",
"RealEfficiency_mu_pt__bigSyst", nbin, 0., 1.*nbin);
712 for (
int ibin = 1; ibin <= nbin; ibin++) {
713 Double_t realeff = TMath::Min(rnd.Gaus(realeff_mean, eff_spread)+eff_delta_with_pt*(ibin-nbin/2), 0.99);
714 Double_t fakeeff = TMath::Max(rnd.Gaus(fakeeff_mean, eff_spread)-eff_delta_with_pt*(ibin-nbin/2), 0.01);
716 float minrfdiff = 0.10;
717 if (realeff - fakeeff < minrfdiff) {
718 if (realeff > minrfdiff) {
719 fakeeff = realeff - minrfdiff;
721 realeff = realeff + 0.10;
726 if (realeff < 0 || realeff > 1.) cout <<
"ERROR: Bad real efficiency value: " << realeff << endl;
727 if (fakeeff < 0 || fakeeff > 1.) cout <<
"ERROR: Bad fake efficiency value: " << fakeeff << endl;
728 if ((realeff - fakeeff) < minrfdiff) cout <<
"ERROR: Too small difference between real and fake efficiencies: " << realeff <<
" " << fakeeff << endl;
730 hElFake.SetBinContent(ibin, fakeeff);
731 hElFake.SetBinError(ibin, eff_spread);
733 hMuFake.SetBinContent(ibin, fakeeff);
734 hMuFake.SetBinError(ibin, eff_spread);
736 hElReal.SetBinContent(ibin, realeff);
737 hElReal.SetBinError(ibin, eff_spread);
739 hMuReal.SetBinContent(ibin, realeff);
740 hMuReal.SetBinError(ibin, eff_spread);
743 hElFake_bigSyst.SetBinContent(ibin, 0.20*hElFake.GetBinContent(ibin));
744 hElFake_smallSyst.SetBinContent(ibin, 0.02*hElFake.GetBinContent(ibin));
745 hMuFake_bigSyst.SetBinContent(ibin, 0.20*hMuFake.GetBinContent(ibin));
746 hMuFake_smallSyst.SetBinContent(ibin, 0.02*hMuFake.GetBinContent(ibin));
747 hElReal_bigSyst.SetBinContent(ibin, 0.20*hElReal.GetBinContent(ibin));
748 hMuReal_bigSyst.SetBinContent(ibin, 0.20*hMuReal.GetBinContent(ibin));
757 hElFake_bigSyst.Write();
758 hElReal_bigSyst.Write();
759 hElFake_smallSyst.Write();
760 hMuFake_bigSyst.Write();
761 hMuFake_smallSyst.Write();
762 hMuReal_bigSyst.Write();
765 return StatusCode::SUCCESS;
771 {
"ncases", required_argument, 0,
'c'},
772 {
"nevents", required_argument, 0,
'e'},
773 {
"minnb", required_argument, 0,
'm'},
774 {
"maxnb", required_argument, 0,
'n'},
775 {
"rmean", required_argument, 0,
'r'},
776 {
"fmean", required_argument, 0,
'f'},
777 {
"effsigma", required_argument, 0,
's'},
778 {
"effdeltawithpt", required_argument, 0,
'd'},
779 {
"sel", required_argument, 0,
'l'},
780 {
"proc", required_argument, 0,
'p'},
781 {
"test_save", no_argument, 0,
'S'},
782 {
"test_merge", required_argument, 0,
'M'},
783 {
"test_histo", required_argument, 0,
'H'},
784 {
"test_systematics", no_argument, 0,
'E'},
785 {
"verbose", no_argument, 0,
'v'},
786 {
"poisson", no_argument, 0,
'P'},
787 {
"help", no_argument, 0,
'h'},
795 while ((
c = getopt_long(
argc,
argv,
"c:e:m:n:r:f:s:d:l:p:S:M:HEPvh",
long_options, &longindex)) != -1) {
816 config.selection = optarg;
829 config.saveFileNameBase = optarg;
833 config.mergeFileNameBase = optarg;
839 config.test_systematics =
true;
845 config.poisson_fluctuations =
true;
862 while (
pos != string::npos) {
867 while (
pos != string::npos) {
871 return StatusCode::SUCCESS;
875 string outputdirname;
877 outputdirname =
"FakeBkgTools_toy_MC_nevents_";
879 outputdirname +=
"_ncases_";
881 outputdirname +=
"_minnbaseline_";
883 outputdirname +=
"_maxnbaseline_";
885 outputdirname +=
"_realeff_";
887 outputdirname +=
"_fakeeff_";
889 outputdirname +=
"_effspread_";
891 outputdirname +=
"_selection_";
892 outputdirname +=
config.selection;
893 outputdirname +=
"_process_";
894 outputdirname +=
config.process;
895 if (
config.poisson_fluctuations) {
896 outputdirname +=
"_poisson_";
902 pos = outputdirname.find(
">=");
903 while (
pos != string::npos) {
904 outputdirname.replace(
pos, 2,
"ge");
905 pos = outputdirname.find(
">=");
907 pos = outputdirname.find(
"<=");
908 while (
pos != string::npos) {
909 outputdirname.replace(
pos, 2,
"le");
910 pos = outputdirname.find(
"<=");
912 pos = outputdirname.find(
">");
913 while (
pos != string::npos) {
914 outputdirname.replace(
pos, 1,
"gt");
915 pos = outputdirname.find(
">");
917 pos = outputdirname.find(
"<");
918 while (
pos != string::npos) {
919 outputdirname.replace(
pos, 1,
"lt");
920 pos = outputdirname.find(
"<");
922 pos = outputdirname.find(
"=");
923 while (
pos != string::npos) {
924 outputdirname.replace(
pos, 1,
"eq");
925 pos = outputdirname.find(
"=");
927 pos = outputdirname.find(
",");
928 while (
pos != string::npos) {
929 outputdirname.replace(
pos, 1,
"");
930 pos = outputdirname.find(
",");
932 pos = outputdirname.find(
"[");
933 while (
pos != string::npos) {
934 outputdirname.replace(
pos, 1,
"");
935 pos = outputdirname.find(
"[");
937 pos = outputdirname.find(
"]");
938 while (
pos != string::npos) {
939 outputdirname.replace(
pos, 1,
"");
940 pos = outputdirname.find(
"]");
942 pos = outputdirname.find(
"\"");
943 while (
pos != string::npos) {
944 outputdirname.replace(
pos, 1,
"");
945 pos = outputdirname.find(
"\"");
947 pos = outputdirname.find(
"\\");
948 while (
pos != string::npos) {
949 outputdirname.replace(
pos, 1,
"");
950 pos = outputdirname.find(
"\\");
953 gSystem->mkdir(outputdirname.c_str());
954 rootfilename = outputdirname+
"/output.root";
956 config.outputdirname = outputdirname;
958 std::unique_ptr<TFile> f_out(TFile::Open(rootfilename.c_str(),
"RECREATE"));
977 return StatusCode::SUCCESS;
983 cout <<
"Um, no ROOT file!" << endl;
984 return StatusCode::FAILURE;
1004 return StatusCode::SUCCESS;
1009 if (
h_realeff_e == 0) cout <<
"No real e" << endl;
1010 if (
h_fakeeff_e == 0) cout <<
"No fake e" << endl;
1020 return StatusCode::SUCCESS;
1023 double comboProb(
const vector<FakeBkgTools::ParticleData> & leptons_data,
const std::bitset<64> & tights,
const std::bitset<64> &reals) {
1026 for (
unsigned ilep = 0; ilep < leptons_data.size(); ilep++) {
1029 prob *= leptons_data[ilep].real_efficiency.nominal;
1031 prob *= leptons_data[ilep].fake_efficiency.nominal;
1035 prob *= (1.-leptons_data[ilep].real_efficiency.nominal);
1037 prob *= (1.-leptons_data[ilep].fake_efficiency.nominal);
1045 double comboProb_FF(
const vector<FakeBkgTools::ParticleData> & leptons_data,
const std::bitset<64> &tights,
const std::bitset<64> & reals) {
1049 for (
unsigned ilep = 0; ilep < leptons_data.size(); ilep++) {
1053 prob *= leptons_data[ilep].fake_efficiency.nominal;
1059 prob *= (1.-leptons_data[ilep].fake_efficiency.nominal);
1063 for (
unsigned ilep = 0; ilep < leptons_data.size(); ilep++) {
1065 float F = leptons_data[ilep].fake_efficiency.nominal/(1-leptons_data[ilep].fake_efficiency.nominal);
1076 std::map<CP::SystematicVariation, float> &syst_map,
1077 std::map<CP::SystematicVariation, float> &syst_err_map,
1079 syst_map.emplace(std::make_pair(sysvar,
weight));
1080 std::string systBrName = baseName;
1081 systBrName = systBrName+
"_fakes_"+sysvar.
name();
1082 std::string systBrNameF = systBrName+
"/F";
1083 ntuple->Branch(systBrName.c_str(), &(syst_map.find(sysvar)->second), systBrNameF.c_str());
1084 syst_err_map.emplace(std::make_pair(sysvar, weight_err));
1085 systBrName = baseName;
1086 systBrName = systBrName+
"_err_"+sysvar.
name();
1087 systBrNameF = systBrName+
"/F";
1088 ntuple->Branch(systBrName.c_str(), &(syst_err_map.find(sysvar)->second), systBrNameF.c_str());
1090 return StatusCode::SUCCESS;
1096 float &weight_poserr,
1097 float &weight_negerr,
1098 std::map<CP::SystematicVariation, float> &syst_map,
1099 std::map<CP::SystematicVariation, float> &syst_poserr_map,
1100 std::map<CP::SystematicVariation, float> &syst_negerr_map,
1102 syst_map.emplace(std::make_pair(sysvar,
weight));
1103 std::string systBrName = baseName;
1104 systBrName = systBrName+
"_fakes_"+sysvar.
name();
1105 std::string systBrNameF = systBrName+
"/F";
1106 ntuple->Branch(systBrName.c_str(), &(syst_map.find(sysvar)->second), systBrNameF.c_str());
1107 syst_poserr_map.emplace(std::make_pair(sysvar, weight_poserr));
1108 systBrName = baseName;
1109 systBrName = systBrName+
"_poserr_"+sysvar.
name();
1110 systBrNameF = systBrName+
"/F";
1111 ntuple->Branch(systBrName.c_str(), &(syst_poserr_map.find(sysvar)->second), systBrNameF.c_str());
1112 syst_negerr_map.emplace(std::make_pair(sysvar, weight_negerr));
1113 systBrName = baseName;
1114 systBrName = systBrName+
"_negerr_"+sysvar.
name();
1115 systBrNameF = systBrName+
"/F";
1116 ntuple->Branch(systBrName.c_str(), &(syst_negerr_map.find(sysvar)->second), systBrNameF.c_str());
1118 return StatusCode::SUCCESS;
1121 StatusCode doMerge(
const std::vector<std::string> &
input,
const std::string &
name,
fbtTestToyMC_config &
config,
TH1F* h_lep_pt,
float &lep_pt,
TH1F* h_lep_eta,
float &lep_eta,
TH2F* h_lep_pt_eta,
float &fakes,
float &poserr,
float &negerr,
int icase) {
1124 system(haddcmd.c_str());
1126 std::unique_ptr<CP::BaseFakeBkgTool>
tool;
1128 if (
name ==
"lhm" ||
name ==
"lhf") {
1129 std::string toolName =
"Lhood";
1130 if (
name ==
"lhm") {
1135 toolName +=
to_string(icase)+
"_tools_merge";
1136 tool = std::make_unique<CP::LhoodMM_tools>(toolName);
1137 if (
name ==
"lhf") {
1140 ANA_CHECK(
tool->setProperty(
"ProgressFileDirectory",
"fakes") );
1141 }
else if (
name ==
"asm") {
1142 tool = std::make_unique<CP::AsymptMatrixTool>(
"asm_tool_merge");
1143 }
else if (
name ==
"fkf") {
1144 tool = std::make_unique<CP::ApplyFakeFactor>(
"fkf_tool_merge");
1147 std::string mergeFileName =
config.mergeFileNameBase+
"_"+
name+
"_"+
to_string(icase)+
".root";
1148 std::cout << mergeFileName << std::endl;
1149 ANA_CHECK(
tool->setProperty(
"ProgressFileName", mergeFileName) );
1153 ANA_CHECK(
tool->register1DHistogram(h_lep_eta, &lep_eta) );
1154 ANA_CHECK(
tool->register2DHistogram(h_lep_pt_eta, &lep_pt, &lep_eta) );
1159 return StatusCode::SUCCESS;
1163 std::cout << std::endl <<
"fbtTestToyMC provides a toy MC model of a set of pseudoexperiments. It is intended to explore the statistical properties of the fake lepton background estimate for a given set of experiemental conditions (number of events, number of leptons required, typical values of the real and fake efficiencies, etc.)" << std::endl << std::endl;
1164 std::cout <<
"Options: " << std::endl;
1165 std::cout <<
" --ncases, -c: number of pseudoexperiments to run (default: 100)" << std::endl;
1166 std::cout <<
" --nevents, -e: number of events in each pseudoexperiment (default: 100)" << std::endl;
1167 std::cout <<
" --poisson, -P: use Poisson-distributed number of events in each pseudoexperiment, rather than a fixed number (default: false)" << std::endl;
1168 std::cout <<
" --minnb, -m: minimum number of baseline leptons per event (default: 1)" << std::endl;
1169 std::cout <<
" --maxnb, -m: maximum number of baseline leptons per event (default: 4)" << std::endl;
1170 std::cout <<
" --rmean, -r: average real lepton efficiency (default: 0.9)" << std::endl;
1171 std::cout <<
" --fmean, -f: average fake lepton efficiency (default: 0.2)" << std::endl;
1172 std::cout <<
" --effsigma, -s: standard deviation for lepton-to-lepton variation in real and fake efficiencies (default: 0.10)" << std::endl;
1173 std::cout <<
" --effdeltawithpt, -d: rate at which the real (fake) efficiency increases (decreases) with simulated pt. Note that the simulated pt range is 0 to 100" << std::endl;
1174 std::cout <<
" --sel, -l: selection string to be used by the tools (default \" >= 1T\") " << std::endl;
1175 std::cout <<
" --proc, -p: process string to be used by the tools (default \" >= 1F[T]\") " << std::endl;
1176 std::cout <<
" --test_save, -S: save output from subjobs in each pseudoexperiement. If set, requires an argument to specify the base name of the root files where the output will be saved. (default: false) " << std::endl;
1177 std::cout <<
" --test_merge, -M: merge output from subjobs in each pseudoexperiement. If set, requires an argument to specify the base name of the root files to be merged. This should match the base name used in a previous run with the --test_save option (default: false) " << std::endl;
1178 std::cout <<
" --test_histo, -H: test the filling of 1- and 2-dimensional histograms (default: false) " << std::endl;
1179 std::cout <<
" --test_systematics, -E: test the handling of systematic unceratinties (default: false) " << std::endl;
1180 std::cout <<
" --verbose, -v: enable verbose output (default: false) " << std::endl;
1181 std::cout <<
" --help, -h: print this help message" << std::endl;
1182 return StatusCode::SUCCESS;;