72int main(
int argc,
char* argv[]){
77 std::string sample =
"";
78 std::string truth_jetColl =
"";
79 std::string reco_jetColl =
"";
80 std::string string_kindofmass =
"";
81 std::string string_kindofmc =
"";
82 std::string output =
"";
83 std::string string_configfile_path =
"";
84 std::string string_debugtool =
"";
85 int eventsMax = 30000;
88 for (
int i=1; i< argc; i++){
90 std::string opt(argv[i]); std::vector< std::string > v;
91 std::istringstream iss(opt);
95 while (std::getline(iss, item, delim)){
99 if ( opt.find(
"--help") != std::string::npos ){
104 if ( opt.find(
"--sample=") != std::string::npos ) sample = v[1];
105 if ( opt.find(
"--truth_jetColl=") != std::string::npos ) truth_jetColl = v[1];
106 if ( opt.find(
"--reco_jetColl=") != std::string::npos ) reco_jetColl = v[1];
107 if ( opt.find(
"--MassDef=") != std::string::npos ) string_kindofmass = v[1];
108 if ( opt.find(
"--MCType=") != std::string::npos ) string_kindofmc = v[1];
109 if ( opt.find(
"--ConfigFile=") != std::string::npos ) string_configfile_path = v[1];
110 if ( opt.find(
"--DebugTool=") != std::string::npos ) string_debugtool = v[1];
111 if ( opt.find(
"--output=") != std::string::npos ) output = v[1];
112 if ( opt.find(
"--eventsMax=") != std::string::npos ) eventsMax = std::atoi(v[1].
data());
117 std::cout <<
"No input xAOD file specified, exiting" << std::endl;
120 if (truth_jetColl==
""){
121 std::cout <<
"No truth jet collection specified, exiting" << std::endl;
124 if (reco_jetColl==
""){
125 std::cout <<
"No truth jet collection specified, exiting" << std::endl;
128 if (string_kindofmass==
""){
129 std::cout <<
"No kind of jet mass specified, exiting" << std::endl;
132 if (string_kindofmc==
""){
133 std::cout <<
"No kind of MC specified, exiting" << std::endl;
136 if (string_configfile_path==
""){
137 std::cout <<
"No ConfigFile specified, exiting" << std::endl;
140 if (string_debugtool==
""){
141 std::cout <<
"No debugtool specified, exiting" << std::endl;
145 std::cout <<
"Output not specified, exiting" << std::endl;
148 std::cout << sample << truth_jetColl << reco_jetColl << output << string_debugtool << std::endl;
150 TString kindofmass = string_kindofmass;
151 TString kindofmc = string_kindofmc;
153 bool want_to_debug =
false;
154 if (string_debugtool ==
"true"){
155 want_to_debug =
true;
156 }
else if (string_debugtool ==
"false"){
157 want_to_debug =
false;
162 std::unique_ptr< TFile > ifile( TFile::Open( sample.c_str(),
"READ" ) );
167 std::cout <<
"Failed to open file " << std::endl;
173 const std::string name_FFJetSmearingTool =
"FFJetSmearing_Example";
175 CHECK(ffjetsmearingtool.setProperty(
"MassDef", kindofmass));
176 CHECK(ffjetsmearingtool.setProperty(
"MCType", kindofmc));
177 CHECK(ffjetsmearingtool.setProperty(
"ConfigFile", string_configfile_path));
178 CHECK(ffjetsmearingtool.setProperty(
"OutputLevel", MSG::ERROR));
180 CHECK(ffjetsmearingtool.setProperty(
"OutputLevel", MSG::VERBOSE));
187 std::cout <<
"\nRecommended systematics:\n" << std::endl;
188 for (
auto sysItr = recommendedSysts.
begin(); sysItr != recommendedSysts.
end(); ++sysItr){
189 std::cout << sysItr->name().c_str() << std::endl;
192 std::vector<CP::SystematicSet> sysList;
196 const std::string name_JetCalibTools =
"JetCalibrationTool";
199 CHECK(m_JetCalibrationTool_handle.setProperty(
"JetCollection",
"AntiKt10UFOCSSKSoftDropBeta100Zcut10"));
200 CHECK(m_JetCalibrationTool_handle.setProperty(
"ConfigFile",
"JES_MC20PreRecommendation_R10_UFO_CSSK_SoftDrop_JMS_R21Insitu_26Nov2024.config"));
202 CHECK(m_JetCalibrationTool_handle.setProperty(
"CalibSequence",
"EtaJES_JMS"));
203 CHECK(m_JetCalibrationTool_handle.setProperty(
"IsData",
false));
204 CHECK(m_JetCalibrationTool_handle.setProperty(
"CalibArea",
"00-04-82"));
205 CHECK(m_JetCalibrationTool_handle.setProperty(
"DEVmode",
false));
218 for (
auto sys : recommendedSysts){
222 std::cout <<
"\n=============SYSTEMATICS CHECK NOW" << std::endl;
223 for (
auto sys : sysList){
225 std::cout <<
"\nRunning over the systematic " << sys.name().c_str() << std::endl;
226 static constexpr float MeVtoGeV = 1.e-3;
230 std::cout <<
"Error, Cannot configure calibration tool for systematics" << std::endl;
234 TH1F* reco_jet_mass_hist =
new TH1F(
"reco_jet_mass_hist",
"reco_jet_mass_hist", 300, 0, 600);
235 TH1F* matched_truth_jet_mass_hist =
new TH1F(
"matched_truth_jet_mass_hist",
"matched_truth_jet_mass_hist", 300, 0, 600);
236 TH1F* smeared_reco_jet_mass_hist =
new TH1F(
"smeared_reco_jet_mass_hist",
"smeared_reco_jet_mass_hist", 300, 0, 600);
238 TH1F* reco_jet_pt_hist =
new TH1F(
"reco_jet_pt_hist",
"reco_jet_pt_hist", 800, 0, 4000);
239 TH1F* matched_truth_jet_pt_hist =
new TH1F(
"matched_truth_jet_pt_hist",
"matched_truth_jet_pt_hist", 800, 0, 4000);
240 TH1F* smeared_reco_jet_pt_hist =
new TH1F(
"smeared_reco_jet_pt_hist",
"smeared_reco_jet_pt_hist", 800, 0, 4000);
242 TH1F* reco_jet_rapidity_hist =
new TH1F(
"reco_jet_rapidity_hist",
"reco_jet_rapidity_hist", 50, -2.5, 2.5);
243 TH1F* matched_truth_jet_rapidity_hist =
new TH1F(
"matched_truth_jet_rapidity_hist",
"matched_truth_jet_rapidity_hist", 50, -2.5, 2.5);
244 TH1F* smeared_reco_jet_rapidity_hist =
new TH1F(
"smeared_reco_jet_rapidity_hist",
"smeared_reco_jet_rapidity_hist", 50, -2.5, 2.5);
246 reco_jet_mass_hist->Sumw2();
247 matched_truth_jet_mass_hist->Sumw2();
248 smeared_reco_jet_mass_hist->Sumw2();
250 reco_jet_pt_hist->Sumw2();
251 matched_truth_jet_pt_hist->Sumw2();
252 smeared_reco_jet_pt_hist->Sumw2();
254 reco_jet_rapidity_hist->Sumw2();
255 matched_truth_jet_rapidity_hist->Sumw2();
256 smeared_reco_jet_rapidity_hist->Sumw2();
258 int upperlimit1 = 600;
259 int upperlimit2 = 1000;
261 int numBinsMass = 120;
264 std::unique_ptr<TH3F> hist_jet_mass_scale_change_3D;
265 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);
267 float lowerlimit3 = -0.5;
268 float upperlimit3 = 0.5;
269 int numBinsDiff = 100;
271 std::unique_ptr<TH3F> hist_jet_mass_resolution_change_3D;
272 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);
276 Long64_t nevents =
event->getEntries();
278 if (eventsMax < nevents){
282 for (Long64_t ievent = 0; ievent < nevents; ++ievent){
285 if ( event->getEntry( ievent ) < 0 ){
286 std::cout <<
"Failed to load entry " << ievent << std::endl;
291 if (ievent % 1000==0){
292 std::cout <<
"Event " << ievent <<
" of " << nevents << std::endl;
298 CHECK( event->retrieve(ei,
"EventInfo") );
300 std::cout <<
"===>>> start processing event " << ei->
eventNumber() <<
", run " << ei->
runNumber() <<
" - Events processed so far: " << ievent << std::endl;
304 CHECK( event->retrieve(jets_truth, truth_jetColl) );
305 std::cout <<
"Number of truth jets: " << jets_truth->
size() << std::endl;
308 for (
const xAOD::Jet* jet_truth : *jets_truth){
310 std::cout <<
"Truth Jet: pt = " << jet_truth->pt()*MeVtoGeV <<
", mass = " << jet_truth->m()*MeVtoGeV <<
", eta = " << jet_truth->eta() << std::endl;
315 CHECK( event->retrieve(jets_reco, reco_jetColl) );
316 std::cout <<
"Number of reco jets: " << jets_reco->
size() << std::endl;
319 for (
const xAOD::Jet* jet_reco : *jets_reco){
321 std::cout <<
"Reco Jet: pt = " << jet_reco->pt()*MeVtoGeV <<
", mass = " << jet_reco->m()*MeVtoGeV <<
", eta = " << jet_reco->eta() << std::endl;
326 jet_truth_matched.makePrivateStore();
330 CHECK( event->retrieve( jets, reco_jetColl ) );
340 std::cout <<
"Start the loop over the jets" << std::endl;
343 bool lead_jet =
true;
346 if ( m_JetCalibrationTool_handle.
applyCalibration( *(jets_shallowCopy.first) ) != StatusCode::SUCCESS ){
347 std::cout <<
"JetCalibration tool reported a EL::StatusCode::FAILURE" << std::endl;
353 for (
xAOD::Jet* jet_reco : *(jets_shallowCopy.first) ){
355 double jetpt = jet_reco->pt() * MeVtoGeV;
356 double jetm = jet_reco->m() * MeVtoGeV;
357 double jetrapidity = jet_reco->rapidity();
359 if (jetpt < 200 or jetpt > 3000)
continue;
361 if (jetm > 600)
continue;
363 if (abs(jetrapidity) > 2)
continue;
365 if ( ffjetsmearingtool.
getMatchedTruthJet(*jet_reco, jet_truth_matched) != StatusCode::SUCCESS ){
369 double aux_original_jet_mass = jet_reco->m() * MeVtoGeV;
371 if (lead_jet ==
true && aux_original_jet_mass > 0){
373 reco_jet_mass_hist->Fill(jet_reco->m() * MeVtoGeV);
374 reco_jet_pt_hist->Fill(jet_reco->pt() * MeVtoGeV);
375 reco_jet_rapidity_hist->Fill(jet_reco->rapidity());
377 matched_truth_jet_mass_hist->Fill(jet_truth_matched.
m() * MeVtoGeV);
378 matched_truth_jet_pt_hist->Fill(jet_truth_matched.
pt() * MeVtoGeV);
379 matched_truth_jet_rapidity_hist->Fill(jet_truth_matched.
rapidity());
383 std::cout <<
"FFJetSmearingTool reported a EL::StatusCode::FAILURE" << std::endl;
387 smeared_reco_jet_mass_hist->Fill(jet_reco->m() * MeVtoGeV);
388 smeared_reco_jet_pt_hist->Fill(jet_reco->pt() * MeVtoGeV);
389 smeared_reco_jet_rapidity_hist->Fill(jet_reco->rapidity());
391 hist_jet_mass_scale_change_3D->Fill(jet_reco->pt() * MeVtoGeV, aux_original_jet_mass, jet_reco->m() * MeVtoGeV);
392 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);
402 TString output_path =
"output/" + sys.name() + output ;
403 TFile *jetmass_histograms =
new TFile(output_path,
"recreate");
405 reco_jet_mass_hist->Write();
406 matched_truth_jet_mass_hist->Write();
407 smeared_reco_jet_mass_hist->Write();
409 reco_jet_pt_hist->Write();
410 matched_truth_jet_pt_hist->Write();
411 smeared_reco_jet_pt_hist->Write();
413 reco_jet_rapidity_hist->Write();
414 matched_truth_jet_rapidity_hist->Write();
415 smeared_reco_jet_rapidity_hist->Write();
419 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);
420 for (
int i=1; i<=hist_jet_mass_scale_change_3D->GetNbinsX(); i++){
421 for (
int j=1; j<= hist_jet_mass_scale_change_3D->GetNbinsY(); j++){
422 TH1F* hold =
new TH1F(
"",
"",numBinsMass,0,upperlimit1);
423 for (
int k=1; k<= hist_jet_mass_scale_change_3D->GetNbinsZ(); k++){
424 hold->SetBinContent(k,hist_jet_mass_scale_change_3D->GetBinContent(i,j,k));
426 hist_jet_mass_scale_change_2D->SetBinContent(i,j,hold->GetMean()/hist_jet_mass_scale_change_3D->GetYaxis()->GetBinCenter(j));
431 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);
432 for (
int i=1; i<=hist_jet_mass_resolution_change_3D->GetNbinsX(); i++){
433 for (
int j=1; j<= hist_jet_mass_resolution_change_3D->GetNbinsY(); j++){
434 TH1F* hold =
new TH1F(
"",
"",numBinsDiff,lowerlimit3,upperlimit3);
435 for (
int k=1; k<= hist_jet_mass_resolution_change_3D->GetNbinsZ(); k++){
436 hold->SetBinContent(k,hist_jet_mass_resolution_change_3D->GetBinContent(i,j,k));
438 hist_jet_mass_resolution_change_2D->SetBinContent(i,j,hold->GetMean()/hist_jet_mass_resolution_change_3D->GetYaxis()->GetBinCenter(j));
448 TCanvas *c1 =
new TCanvas(
"c1",
"c1",w,
h);
449 c1->SetWindowSize(w+(w-c1->GetWw()),
h+(
h-c1->GetWh()));
452 TPad *canvas_1 =
new TPad(
"canvas_1",
"canvas_1",0.0,0.0,1.0,1.0);
453 canvas_1->SetRightMargin(0.10);
454 canvas_1->SetFillStyle(4000);
458 hist_jet_mass_scale_change_2D->GetXaxis()->SetTitleOffset(1.5);
459 hist_jet_mass_scale_change_2D->GetXaxis()->SetNdivisions(5);
460 hist_jet_mass_scale_change_2D->GetYaxis()->SetTitleOffset(1.5);
461 hist_jet_mass_scale_change_2D->GetZaxis()->SetTitleOffset(1.5);
462 hist_jet_mass_scale_change_2D->GetYaxis()->SetTitle(
"Initial Reco Mass [GeV]");
463 hist_jet_mass_scale_change_2D->GetXaxis()->SetTitle(
"Reco p_{T} [GeV]");
464 hist_jet_mass_scale_change_2D->GetZaxis()->SetTitle(
"Average Mass smearing (Initial_reco_mass/smeared_reco_mass)");
465 hist_jet_mass_scale_change_2D->GetZaxis()->SetRangeUser(0.95,1.05);
466 hist_jet_mass_scale_change_2D->GetZaxis()->SetLabelSize(0.035);
467 hist_jet_mass_scale_change_2D->Draw(
"colz");
470 TString output_path_scale_debug =
"output/debug_plots/scale_variations/" + sys.name() +
"_scaleDebug.pdf" ;
471 c1->Print(output_path_scale_debug);
473 delete hist_jet_mass_scale_change_2D;
476 TCanvas *c2 =
new TCanvas(
"c2",
"c2",w,
h);
477 c2->SetWindowSize(w+(w-c2->GetWw()),
h+(
h-c2->GetWh()));
480 TPad *canvas_2 =
new TPad(
"canvas_2",
"canvas_2",0.0,0.0,1.0,1.0);
481 canvas_2->SetRightMargin(0.10);
482 canvas_2->SetFillStyle(4000);
486 hist_jet_mass_resolution_change_2D->GetXaxis()->SetTitleOffset(1.5);
487 hist_jet_mass_resolution_change_2D->GetXaxis()->SetNdivisions(5);
488 hist_jet_mass_resolution_change_2D->GetYaxis()->SetTitleOffset(1.5);
489 hist_jet_mass_resolution_change_2D->GetZaxis()->SetTitleOffset(1.5);
490 hist_jet_mass_resolution_change_2D->GetYaxis()->SetTitle(
"Initial Reco Mass [GeV]");
491 hist_jet_mass_resolution_change_2D->GetXaxis()->SetTitle(
"Reco p_{T} [GeV]");
492 hist_jet_mass_resolution_change_2D->GetZaxis()->SetTitle(
"Average Mass smearing (Initial_reco_mass/smeared_reco_mass)");
493 hist_jet_mass_resolution_change_2D->GetZaxis()->SetRangeUser(-0.1,0.1);
494 hist_jet_mass_resolution_change_2D->GetZaxis()->SetLabelSize(0.035);
495 hist_jet_mass_resolution_change_2D->Draw(
"colz");
498 TString output_path_resolution_debug =
"output/debug_plots/resolution_variations/" + sys.name() +
"_resolutionDebug.pdf" ;
499 c2->Print(output_path_resolution_debug);
501 delete hist_jet_mass_resolution_change_2D;
504 jetmass_histograms->Close();
505 delete jetmass_histograms;
507 delete reco_jet_mass_hist;
508 delete matched_truth_jet_mass_hist;
509 delete smeared_reco_jet_mass_hist;
511 delete reco_jet_pt_hist;
512 delete matched_truth_jet_pt_hist;
513 delete smeared_reco_jet_pt_hist;
515 delete reco_jet_rapidity_hist;
516 delete matched_truth_jet_rapidity_hist;
517 delete smeared_reco_jet_rapidity_hist;