46 #define CHECK( ARG ) \
48 const bool result = ARG; \
50 std::cout << "Failed to execute: " << ARG << std::endl; \
57 std::cout <<
"Running options:" << std::endl;
58 std::cout <<
"YOU HAVE TO ADAPT THE OPTIONS TO FFJETSMEARINGCORRECTION" << std::endl;
59 std::cout <<
" --help : To get the help you're reading" << std::endl;
60 std::cout <<
" --jetColl= : Specify the jet collection (e.g. UFO+CSSK jets)" << std::endl;
61 std::cout <<
" --MassDef= : Specify the kind of jet mass used (e.g. UFO)" << std::endl;
62 std::cout <<
" --MCType= : Specify the MC campaign (e.g. MC20, MC21, MC23, MC20AF3, MC23AF3)" << std::endl;
63 std::cout <<
" --sample= : Specify input xAOD" << std::endl;
64 std::cout <<
" Example: FFJetSmearingTool_MyExample --truth_jetColl=AntiKt10TruthSoftDropBeta100Zcut10Jets --reco_jetColl=AntiKt10UFOCSSKSoftDropBeta100Zcut10Jets --MassDef=UFO --MCType=MC23 --eventsMax=30000 --sample=/eos/atlas/atlascerngroupdisk/perf-jets/INSITU/TestFiles/dcamarer/DAOD_PHYS_MC_Zqqjets/mc20_13TeV/DAOD_PHYS.40038344._000011.pool.root.1 --output=.root --ConfigFile=/afs/cern.ch/user/d/dcamarer/private/PostDoc/JETM/JMRcombination_PhaseILargeR/test-jetcalibtools-configs/R22/source/JetUncertainties/share/DCM_240502_new/R10_FullJMR_Phase1.config --DebugTool=false" << std::endl;
77 std::string truth_jetColl =
"";
78 std::string reco_jetColl =
"";
79 std::string string_kindofmass =
"";
80 std::string string_kindofmc =
"";
82 std::string string_configfile_path =
"";
83 std::string string_debugtool =
"";
84 int eventsMax = 30000;
89 std::string
opt(
argv[
i]); std::vector< std::string >
v;
90 std::istringstream iss(
opt);
94 while (std::getline(iss,
item, delim)){
98 if (
opt.find(
"--help") != std::string::npos ){
103 if (
opt.find(
"--sample=") != std::string::npos )
sample =
v[1];
104 if (
opt.find(
"--truth_jetColl=") != std::string::npos ) truth_jetColl =
v[1];
105 if (
opt.find(
"--reco_jetColl=") != std::string::npos ) reco_jetColl =
v[1];
106 if (
opt.find(
"--MassDef=") != std::string::npos ) string_kindofmass =
v[1];
107 if (
opt.find(
"--MCType=") != std::string::npos ) string_kindofmc =
v[1];
108 if (
opt.find(
"--ConfigFile=") != std::string::npos ) string_configfile_path =
v[1];
109 if (
opt.find(
"--DebugTool=") != std::string::npos ) string_debugtool =
v[1];
110 if (
opt.find(
"--output=") != std::string::npos )
output =
v[1];
111 if (
opt.find(
"--eventsMax=") != std::string::npos ) eventsMax =
std::atoi(
v[1].
data());
116 std::cout <<
"No input xAOD file specified, exiting" << std::endl;
119 if (truth_jetColl==
""){
120 std::cout <<
"No truth jet collection specified, exiting" << std::endl;
123 if (reco_jetColl==
""){
124 std::cout <<
"No truth jet collection specified, exiting" << std::endl;
127 if (string_kindofmass==
""){
128 std::cout <<
"No kind of jet mass specified, exiting" << std::endl;
131 if (string_kindofmc==
""){
132 std::cout <<
"No kind of MC specified, exiting" << std::endl;
135 if (string_configfile_path==
""){
136 std::cout <<
"No ConfigFile specified, exiting" << std::endl;
139 if (string_debugtool==
""){
140 std::cout <<
"No debugtool specified, exiting" << std::endl;
144 std::cout <<
"Output not specified, exiting" << std::endl;
147 std::cout <<
sample.c_str() << truth_jetColl.c_str() << reco_jetColl.c_str() <<
output.c_str() << string_debugtool.c_str() << std::endl;
149 TString kindofmass = string_kindofmass;
150 TString kindofmc = string_kindofmc;
152 bool want_to_debug =
false;
153 if (string_debugtool ==
"true"){
154 want_to_debug =
true;
155 }
else if (string_debugtool ==
"false"){
156 want_to_debug =
false;
161 std::unique_ptr< TFile >
ifile( TFile::Open(
sample.c_str(),
"READ" ) );
170 const std::string name_FFJetSmearingTool =
"FFJetSmearing_Example";
172 CHECK(ffjetsmearingtool.setProperty(
"MassDef", kindofmass));
173 CHECK(ffjetsmearingtool.setProperty(
"MCType", kindofmc));
174 CHECK(ffjetsmearingtool.setProperty(
"ConfigFile", string_configfile_path));
175 CHECK(ffjetsmearingtool.setProperty(
"OutputLevel", MSG::ERROR));
184 std::cout <<
"\nRecommended systematics:\n" << std::endl;
185 for (
auto sysItr = recommendedSysts.
begin(); sysItr != recommendedSysts.
end(); ++sysItr){
186 std::cout << sysItr->
name().c_str() << std::endl;
189 std::vector<CP::SystematicSet> sysList;
203 const std::string name_JetCalibTools =
"JetCalibrationTool";
206 CHECK(m_JetCalibrationTool_handle.setProperty(
"JetCollection",
"AntiKt10UFOCSSKSoftDropBeta100Zcut10"));
207 CHECK(m_JetCalibrationTool_handle.setProperty(
"ConfigFile",
"JES_MC20PreRecommendation_R10_UFO_CSSK_SoftDrop_JMS_R21Insitu_26Nov2024.config"));
209 CHECK(m_JetCalibrationTool_handle.setProperty(
"CalibSequence",
"EtaJES_JMS"));
210 CHECK(m_JetCalibrationTool_handle.setProperty(
"IsData",
false));
211 CHECK(m_JetCalibrationTool_handle.setProperty(
"CalibArea",
"00-04-82"));
212 CHECK(m_JetCalibrationTool_handle.setProperty(
"DEVmode",
false));
225 for (
auto sys : recommendedSysts){
229 std::cout <<
"\n=============SYSTEMATICS CHECK NOW" << std::endl;
230 for (
auto sys : sysList){
232 std::cout <<
"\nRunning over the systematic " <<
sys.name().c_str() << std::endl;
233 static constexpr
float MeVtoGeV = 1.e-3;
237 std::cout <<
"Error, Cannot configure calibration tool for systematics" << std::endl;
241 TH1F* reco_jet_mass_hist =
new TH1F(
"reco_jet_mass_hist",
"reco_jet_mass_hist", 300, 0, 600);
242 TH1F* matched_truth_jet_mass_hist =
new TH1F(
"matched_truth_jet_mass_hist",
"matched_truth_jet_mass_hist", 300, 0, 600);
243 TH1F* smeared_reco_jet_mass_hist =
new TH1F(
"smeared_reco_jet_mass_hist",
"smeared_reco_jet_mass_hist", 300, 0, 600);
245 TH1F* reco_jet_pt_hist =
new TH1F(
"reco_jet_pt_hist",
"reco_jet_pt_hist", 800, 0, 4000);
246 TH1F* matched_truth_jet_pt_hist =
new TH1F(
"matched_truth_jet_pt_hist",
"matched_truth_jet_pt_hist", 800, 0, 4000);
247 TH1F* smeared_reco_jet_pt_hist =
new TH1F(
"smeared_reco_jet_pt_hist",
"smeared_reco_jet_pt_hist", 800, 0, 4000);
249 TH1F* reco_jet_rapidity_hist =
new TH1F(
"reco_jet_rapidity_hist",
"reco_jet_rapidity_hist", 50, -2.5, 2.5);
250 TH1F* matched_truth_jet_rapidity_hist =
new TH1F(
"matched_truth_jet_rapidity_hist",
"matched_truth_jet_rapidity_hist", 50, -2.5, 2.5);
251 TH1F* smeared_reco_jet_rapidity_hist =
new TH1F(
"smeared_reco_jet_rapidity_hist",
"smeared_reco_jet_rapidity_hist", 50, -2.5, 2.5);
253 reco_jet_mass_hist->Sumw2();
254 matched_truth_jet_mass_hist->Sumw2();
255 smeared_reco_jet_mass_hist->Sumw2();
257 reco_jet_pt_hist->Sumw2();
258 matched_truth_jet_pt_hist->Sumw2();
259 smeared_reco_jet_pt_hist->Sumw2();
261 reco_jet_rapidity_hist->Sumw2();
262 matched_truth_jet_rapidity_hist->Sumw2();
263 smeared_reco_jet_rapidity_hist->Sumw2();
265 int upperlimit1 = 600;
266 int upperlimit2 = 1000;
268 int numBinsMass = 120;
271 std::unique_ptr<TH3F> hist_jet_mass_scale_change_3D;
272 hist_jet_mass_scale_change_3D = std::make_unique<TH3F>(
"hist_jet_mass_scale_change_3D",
"hist_jet_mass_scale_change_3D",numBinsPt,0,upperlimit2,numBinsMass,0,upperlimit1,numBinsMass,0,upperlimit1);
274 float lowerlimit3 = -0.5;
275 float upperlimit3 = 0.5;
276 int numBinsDiff = 100;
278 std::unique_ptr<TH3F> hist_jet_mass_resolution_change_3D;
279 hist_jet_mass_resolution_change_3D = std::make_unique<TH3F>(
"hist_jet_mass_resolution_change_3D",
"hist_jet_mass_resolution_change_3D",numBinsPt,0,upperlimit2,numBinsMass,0,upperlimit1,numBinsDiff,lowerlimit3,upperlimit3);
283 Long64_t
nevents =
event.getEntries();
289 for (Long64_t ievent = 0; ievent <
nevents; ++ievent){
293 std::cout <<
"Failed to load entry " << ievent << std::endl;
298 if (ievent % 1000==0){
299 std::cout <<
"Event " << ievent <<
" of " <<
nevents << std::endl;
307 std::cout <<
"===>>> start processing event " << ei->
eventNumber() <<
", run " << ei->
runNumber() <<
" - Events processed so far: " << ievent << std::endl;
312 std::cout <<
"Number of truth jets: " << jets_truth->
size() << std::endl;
315 for (
const xAOD::Jet* jet_truth : *jets_truth){
317 std::cout <<
"Truth Jet: pt = " << jet_truth->pt()*
MeVtoGeV <<
", mass = " << jet_truth->m()*
MeVtoGeV <<
", eta = " << jet_truth->eta() << std::endl;
323 std::cout <<
"Number of reco jets: " << jets_reco->
size() << std::endl;
326 for (
const xAOD::Jet* jet_reco : *jets_reco){
328 std::cout <<
"Reco Jet: pt = " << jet_reco->pt()*
MeVtoGeV <<
", mass = " << jet_reco->m()*
MeVtoGeV <<
", eta = " << jet_reco->eta() << std::endl;
347 std::cout <<
"Start the loop over the jets" << std::endl;
350 bool lead_jet =
true;
353 if ( m_JetCalibrationTool_handle.
applyCalibration( *(jets_shallowCopy.first) ) != StatusCode::SUCCESS ){
354 std::cout <<
"JetCalibration tool reported a EL::StatusCode::FAILURE" << std::endl;
360 for (
xAOD::Jet* jet_reco : *(jets_shallowCopy.first) ){
362 double jetpt = jet_reco->pt() *
MeVtoGeV;
363 double jetm = jet_reco->m() *
MeVtoGeV;
364 double jetrapidity = jet_reco->rapidity();
366 if (jetpt < 200 or jetpt > 3000)
continue;
368 if (jetm > 600)
continue;
370 if (abs(jetrapidity) > 2)
continue;
372 if ( ffjetsmearingtool.
getMatchedTruthJet(*jet_reco, jet_truth_matched) != StatusCode::SUCCESS ){
376 double aux_original_jet_mass = jet_reco->m() *
MeVtoGeV;
378 if (lead_jet ==
true && aux_original_jet_mass > 0){
380 reco_jet_mass_hist->Fill(jet_reco->m() *
MeVtoGeV);
381 reco_jet_pt_hist->Fill(jet_reco->pt() *
MeVtoGeV);
382 reco_jet_rapidity_hist->Fill(jet_reco->rapidity());
384 matched_truth_jet_mass_hist->Fill(jet_truth_matched.
m() *
MeVtoGeV);
385 matched_truth_jet_pt_hist->Fill(jet_truth_matched.
pt() *
MeVtoGeV);
386 matched_truth_jet_rapidity_hist->Fill(jet_truth_matched.
rapidity());
390 std::cout <<
"FFJetSmearingTool reported a EL::StatusCode::FAILURE" << std::endl;
394 smeared_reco_jet_mass_hist->Fill(jet_reco->m() *
MeVtoGeV);
395 smeared_reco_jet_pt_hist->Fill(jet_reco->pt() *
MeVtoGeV);
396 smeared_reco_jet_rapidity_hist->Fill(jet_reco->rapidity());
398 hist_jet_mass_scale_change_3D->Fill(jet_reco->pt() *
MeVtoGeV, aux_original_jet_mass, jet_reco->m() *
MeVtoGeV);
399 hist_jet_mass_resolution_change_3D->Fill(jet_reco->pt() *
MeVtoGeV, aux_original_jet_mass, TMath::Abs( (jet_reco->m()*
MeVtoGeV) - (aux_original_jet_mass) )/aux_original_jet_mass);
407 delete jets_shallowCopy.first;
408 delete jets_shallowCopy.second;
412 TString output_path =
"output/" +
sys.name() +
output ;
413 TFile *jetmass_histograms =
new TFile(output_path,
"recreate");
415 reco_jet_mass_hist->Write();
416 matched_truth_jet_mass_hist->Write();
417 smeared_reco_jet_mass_hist->Write();
419 reco_jet_pt_hist->Write();
420 matched_truth_jet_pt_hist->Write();
421 smeared_reco_jet_pt_hist->Write();
423 reco_jet_rapidity_hist->Write();
424 matched_truth_jet_rapidity_hist->Write();
425 smeared_reco_jet_rapidity_hist->Write();
429 TH2F* hist_jet_mass_scale_change_2D =
new TH2F(
"hist_jet_mass_scale_change_2D",
"hist_jet_mass_scale_change_2D",numBinsPt,0,upperlimit2,numBinsMass,0,upperlimit1);
430 for (
int i=1;
i<=hist_jet_mass_scale_change_3D->GetNbinsX();
i++){
431 for (
int j=1; j<= hist_jet_mass_scale_change_3D->GetNbinsY(); j++){
432 TH1F* hold =
new TH1F(
"",
"",numBinsMass,0,upperlimit1);
433 for (
int k=1;
k<= hist_jet_mass_scale_change_3D->GetNbinsZ();
k++){
434 hold->SetBinContent(
k,hist_jet_mass_scale_change_3D->GetBinContent(
i,j,
k));
436 hist_jet_mass_scale_change_2D->SetBinContent(
i,j,hold->GetMean()/hist_jet_mass_scale_change_3D->GetYaxis()->GetBinCenter(j));
441 TH2F* hist_jet_mass_resolution_change_2D =
new TH2F(
"hist_jet_mass_resolution_change_2D",
"hist_jet_mass_resolution_change_2D",numBinsPt,0,upperlimit2,numBinsMass,0,upperlimit1);
442 for (
int i=1;
i<=hist_jet_mass_resolution_change_3D->GetNbinsX();
i++){
443 for (
int j=1; j<= hist_jet_mass_resolution_change_3D->GetNbinsY(); j++){
444 TH1F* hold =
new TH1F(
"",
"",numBinsDiff,lowerlimit3,upperlimit3);
445 for (
int k=1;
k<= hist_jet_mass_resolution_change_3D->GetNbinsZ();
k++){
446 hold->SetBinContent(
k,hist_jet_mass_resolution_change_3D->GetBinContent(
i,j,
k));
448 hist_jet_mass_resolution_change_2D->SetBinContent(
i,j,hold->GetMean()/hist_jet_mass_resolution_change_3D->GetYaxis()->GetBinCenter(j));
458 TCanvas *
c1 =
new TCanvas(
"c1",
"c1",
w,
h);
459 c1->SetWindowSize(
w+(
w-
c1->GetWw()),
h+(
h-
c1->GetWh()));
462 TPad *canvas_1 =
new TPad(
"canvas_1",
"canvas_1",0.0,0.0,1.0,1.0);
463 canvas_1->SetRightMargin(0.10);
464 canvas_1->SetFillStyle(4000);
468 hist_jet_mass_scale_change_2D->GetXaxis()->SetTitleOffset(1.5);
469 hist_jet_mass_scale_change_2D->GetXaxis()->SetNdivisions(5);
470 hist_jet_mass_scale_change_2D->GetYaxis()->SetTitleOffset(1.5);
471 hist_jet_mass_scale_change_2D->GetZaxis()->SetTitleOffset(1.5);
472 hist_jet_mass_scale_change_2D->GetYaxis()->SetTitle(
"Initial Reco Mass [GeV]");
473 hist_jet_mass_scale_change_2D->GetXaxis()->SetTitle(
"Reco p_{T} [GeV]");
474 hist_jet_mass_scale_change_2D->GetZaxis()->SetTitle(
"Average Mass smearing (Initial_reco_mass/smeared_reco_mass)");
475 hist_jet_mass_scale_change_2D->GetZaxis()->SetRangeUser(0.95,1.05);
476 hist_jet_mass_scale_change_2D->GetZaxis()->SetLabelSize(0.035);
477 hist_jet_mass_scale_change_2D->Draw(
"colz");
480 TString output_path_scale_debug =
"output/debug_plots/scale_variations/" +
sys.name() +
"_scaleDebug.pdf" ;
481 c1->Print(output_path_scale_debug);
483 delete hist_jet_mass_scale_change_2D;
486 TCanvas *
c2 =
new TCanvas(
"c2",
"c2",
w,
h);
487 c2->SetWindowSize(
w+(
w-
c2->GetWw()),
h+(
h-
c2->GetWh()));
490 TPad *canvas_2 =
new TPad(
"canvas_2",
"canvas_2",0.0,0.0,1.0,1.0);
491 canvas_2->SetRightMargin(0.10);
492 canvas_2->SetFillStyle(4000);
496 hist_jet_mass_resolution_change_2D->GetXaxis()->SetTitleOffset(1.5);
497 hist_jet_mass_resolution_change_2D->GetXaxis()->SetNdivisions(5);
498 hist_jet_mass_resolution_change_2D->GetYaxis()->SetTitleOffset(1.5);
499 hist_jet_mass_resolution_change_2D->GetZaxis()->SetTitleOffset(1.5);
500 hist_jet_mass_resolution_change_2D->GetYaxis()->SetTitle(
"Initial Reco Mass [GeV]");
501 hist_jet_mass_resolution_change_2D->GetXaxis()->SetTitle(
"Reco p_{T} [GeV]");
502 hist_jet_mass_resolution_change_2D->GetZaxis()->SetTitle(
"Average Mass smearing (Initial_reco_mass/smeared_reco_mass)");
503 hist_jet_mass_resolution_change_2D->GetZaxis()->SetRangeUser(-0.1,0.1);
504 hist_jet_mass_resolution_change_2D->GetZaxis()->SetLabelSize(0.035);
505 hist_jet_mass_resolution_change_2D->Draw(
"colz");
508 TString output_path_resolution_debug =
"output/debug_plots/resolution_variations/" +
sys.name() +
"_resolutionDebug.pdf" ;
509 c2->Print(output_path_resolution_debug);
511 delete hist_jet_mass_resolution_change_2D;
514 jetmass_histograms->Close();
515 delete jetmass_histograms;
517 delete reco_jet_mass_hist;
518 delete matched_truth_jet_mass_hist;
519 delete smeared_reco_jet_mass_hist;
521 delete reco_jet_pt_hist;
522 delete matched_truth_jet_pt_hist;
523 delete smeared_reco_jet_pt_hist;
525 delete reco_jet_rapidity_hist;
526 delete matched_truth_jet_rapidity_hist;
527 delete smeared_reco_jet_rapidity_hist;