48 static TLatex* tex = []()
52 tex->SetTextSize(0.045);
53 tex->SetTextColor(kBlack);
62 const TString config2 = uncToolDiff ? uncToolDiff->getConfigFile() :
"";
63 const TString year = config1.Contains(
"_2011/") ?
"2011" : config1.Contains(
"_2012/") ?
"2012": config1.Contains(
"_2015/") ?
"2015" :
"UNKNOWN";
64 const TString jetDef = uncTool->
getJetDef();
65 const TString scenario1 = config1.Contains(
"StrongerCorrelations") ?
"stronger" : (config1.Contains(
"WeakerCorrelations") ?
"weaker" :
"nominal");
66 const TString scenario2 = config2.Contains(
"StrongerCorrelations") ?
"stronger" : (config2.Contains(
"WeakerCorrelations") ?
"weaker" :
"nominal");
67 const TString scenarioDiff = Form(
"%s - %s correlation scenarios",scenario1.Data(),scenario2.Data());
68 const TString reduction1 = config1.Contains(
"_ByCategory") ?
"category reduction" : (config1.Contains(
"NP") ?
"global reduction" :
"original");
69 const TString reduction2 = config2.Contains(
"_ByCategory") ?
"category reduction" : (config2.Contains(
"NP") ?
"global reduction" :
"original");
70 const TString reductionDiff = Form(
"%s - %s",reduction1.Data(),reduction2.Data());
72 TString configDescString;
75 if (scenario1 == scenario2 && reduction1 == reduction2)
76 configDescString =
"UNKNOWN COMPARISON TYPE";
77 else if (scenario1 == scenario2 && reduction1 != reduction2)
78 configDescString = Form(
"%s correlation scenario, %s",scenario1.Data(),reductionDiff.Data());
79 else if (scenario1 != scenario2 && reduction1 == reduction2)
80 configDescString = Form(
"%s%s",scenarioDiff.Data(),reduction1 ==
"original" ?
"" : Form(
", %s",reduction1.Data()));
82 configDescString = Form(
"%s, %s",scenarioDiff.Data(),reductionDiff.Data());
86 configDescString = Form(
"%s correlation scenario%s",scenario1.Data(),reduction1 ==
"original" ?
"" : Form(
", %s",reduction1.Data()));
91 const TString fixedValString = TString(histo->GetXaxis()->GetTitle()).Contains(
"#it{p}") ? Form(
"(#eta^{jet1},#eta^{jet2}) = (%.1f,%.1f)",fixedValue1,fixedValue2) : Form(
"(#it{p}_{T}^{jet1},#it{p}_{T}^{jet2}) = (%ld,%ld) GeV",lround(fixedValue1),lround(fixedValue2));
95 const TString reductionString =
"str.red";
96 const TString selector =
"";
97 const TString scenarioString = TString(histo->GetName()).BeginsWith(
"diff_")?Form(
"Correlation difference, Rep_{full}^{%sJES} - Rep_{%s}^{%sJES}, %s",selector.Data(),reductionString.Data(),selector.Data(),fixedValString.Data()):Form(
"Correlation matrix, Rep_{%s}^{%sJES}, %s",TString(histo->GetName()).Contains(
"_0_")?
"full":reductionString.Data(),selector.Data(),fixedValString.Data());
98 tex->DrawLatex(0.13,0.8751,Form(
"anti-#it{k}_{t} #it{R} = %s, %s+JES %s",jetDef.Contains(
"AntiKt4") ?
"0.4" : jetDef.Contains(
"AntiKt6") ?
"0.6" :
"UNKNOWN", jetDef.Contains(
"EM") ?
"EM" : jetDef.Contains(
"LC") ?
"LCW" :
"UNKNOWN", year.Data()));
99 tex->DrawLatex(0.13,0.9305,scenarioString.Data());
103 tex->DrawLatex(0.48,0.960,Form(
"anti-#it{k}_{t} #it{R} = %s, %s+JES + #it{in situ}",jetDef.Contains(
"AntiKt4") ?
"0.4" : jetDef.Contains(
"AntiKt6") ?
"0.6" :
"UNKNOWN", jetDef.Contains(
"EM") ?
"EM" : jetDef.Contains(
"LC") ?
"LCW" :
"UNKNOWN"));
104 tex->DrawLatex(0.48,0.905,fixedValString.Data());
105 tex->DrawLatex(0.13,0.905,Form(
"Data %s, #sqrt{s} = %d TeV",year.Data(),year==
"2012"?8:year==
"2011"?7:year==
"2015"||year==
"2016"?13:0));
111 tex->DrawLatex(0.15,0.84,configDescString.Data());
112 tex->DrawLatex(0.15,0.79,TString(uncTool->
getAnalysisFile().c_str()).Contains(
"Unknown") ?
"unknown flavour composition" : TString(uncTool->
getAnalysisFile().c_str()).Contains(
"InclusiveJets") ?
"inclusive jets composition" :
"Unexpected flavour composition file");
118 if (TString(histo->GetXaxis()->GetTitle()).Contains(
"#it{p}"))
119 tex->DrawLatex(0.01,0.015,Form(
"Mean value %.2f, max %.2f at (%ld,%ld) GeV",round(100*
mean)/100.,round(100*extremum)/100.,lround(histo->GetXaxis()->GetBinCenter(extremeX)),lround(histo->GetYaxis()->GetBinCenter(extremeY))));
121 tex->DrawLatex(0.01,0.015,Form(
"Mean value %.2f, max %.2f at (%.2f,%.2f)",round(100*
mean)/100.,round(100*extremum)/100.,histo->GetXaxis()->GetBinCenter(extremeX),histo->GetYaxis()->GetBinCenter(extremeY)));
136void PlotCorrelationHistos(
const TString& outFile, TCanvas* canvas, TFile* outHistFile,
const std::vector<JetUncertaintiesTool*>& providers,
const std::vector<TH2D*>& corrMats,
const double fixedValue1,
const double fixedValue2)
140 std::vector<TH2D*> corrMatDiffs;
141 std::vector< std::pair<JetUncertaintiesTool*,JetUncertaintiesTool*> > diffProviders;
142 for (
size_t iHisto = 0; iHisto + 1 < corrMats.size(); ++iHisto)
145 TH2D*
diff =
new TH2D(*corrMats.at(iHisto));
146 diff->SetName(Form(
"diff_%s",
diff->GetName()));
149 for (
int binX = 1; binX <=
diff->GetNbinsX(); ++binX)
150 for (
int binY = 1; binY <=
diff->GetNbinsY(); ++binY)
151 if (corrMats.at(iHisto)->GetBinContent(binX,binY) < -100)
152 diff->SetBinContent(binX,binY,corrMats.at(iHisto)->GetBinContent(binX,binY));
154 diff->SetBinContent(binX,binY,
relativeMetric(corrMats.at(iHisto)->GetBinContent(binX,binY),corrMats.at(iHisto+1)->GetBinContent(binX,binY)));
156 diff->SetBinContent(binX,binY,corrMats.at(iHisto)->GetBinContent(binX,binY) - corrMats.at(iHisto+1)->GetBinContent(binX,binY));
165 corrMatDiffs.push_back(
diff);
166 diffProviders.emplace_back(providers.at(iHisto),providers.at(iHisto+1));
170 for (
size_t iHisto = 0; iHisto < corrMats.size(); ++iHisto)
172 TH2D* histo = corrMats.at(iHisto);
173 histo->GetZaxis()->SetTitle(
"correlation");
174 histo->GetZaxis()->SetRangeUser(0.0,1.0);
177 DrawLabels(histo,fixedValue1,fixedValue2,providers.at(iHisto));
179 if (outFile !=
"NONE" && !outFile.EndsWith(
".eps"))
180 canvas->Print(outFile);
181 else if (outFile !=
"NONE")
182 canvas->Print(TString(outFile).ReplaceAll(
".eps",Form(
"-%d.eps",++
iEPS)));
187 histo->Write(histo->GetName());
193 for (
size_t iHisto = 0; iHisto < corrMatDiffs.size(); ++iHisto)
195 TH2D* histo = corrMatDiffs.at(iHisto);
204 unsigned long long numValidBins = 0;
205 for (
int binX = 1; binX <= histo->GetNbinsX(); ++binX)
206 for (
int binY = 1; binY <= histo->GetNbinsY(); ++binY)
209 if (histo->GetBinContent(binX,binY) < -100)
213 meanDiff += histo->GetBinContent(binX,binY);
215 if (fabs(histo->GetBinContent(binX,binY)) > fabs(maxDiff))
217 maxDiff = histo->GetBinContent(binX,binY);
223 if (numValidBins > 0)
224 meanDiff /= numValidBins;
229 const double maxDiffRounded =
static_cast<int>(fabs(maxDiff)*20+1)/20.;
230 histo->GetZaxis()->SetRangeUser(-maxDiffRounded,maxDiffRounded);
236 histo->GetZaxis()->SetTitle(
"correlation difference");
239 DrawLabels(histo,fixedValue1,fixedValue2,diffProviders.at(iHisto).first,diffProviders.at(iHisto).second,meanDiff,maxDiff,maxX,maxY);
241 if (outFile !=
"NONE" && !outFile.EndsWith(
".eps"))
242 canvas->Print(outFile);
243 else if (outFile !=
"NONE")
244 canvas->Print(TString(outFile).ReplaceAll(
".eps",Form(
"-%d.eps",++
iEPS)));
246 if (outHistFile && corrMatDiffs.size() == 1)
249 histo->Write(histo->GetName());
255void MakeCorrelationPlots(
const TString& outFile, TCanvas* canvas, TFile* outHistFile,
const std::vector<JetUncertaintiesTool*>& providers,
const std::vector< std::pair<double,double> >& fixedEta,
const std::vector< std::pair<double,double> >& fixedPt)
257 const TString
release = providers.at(0)->getRelease();
258 const double minPtVal =
release.EndsWith(
"TLA") ? 75 : 17;
259 const double maxPtVal =
testJER ? 1500 :
release.EndsWith(
"TLA") ? 1000 : (
release.BeginsWith(
"2011") ||
release.BeginsWith(
"2012")) ? 2500 : 3000;
260 const double minEtaVal = 0;
261 const double maxEtaVal =
release.EndsWith(
"TLA") ? 2.8 : 4.5;
264 canvas->SetLogx(
true);
265 canvas->SetLogy(
true);
266 for (
size_t iFixed = 0; iFixed < fixedEta.size(); ++iFixed)
268 const double etaVal1 = fixedEta.at(iFixed).first;
269 const double etaVal2 = fixedEta.at(iFixed).second;
271 printf(
"Processing (eta1,eta2) = (%.2f,%.2f)\n",etaVal1,etaVal2);
274 std::vector<TH2D*> corrPt;
275 for (
size_t iProv = 0; iProv < providers.size(); ++iProv)
277 corrPt.push_back(providers.at(iProv)->getPtCorrelationMatrix(100,minPtVal,maxPtVal,etaVal1,etaVal2));
278 corrPt.back()->GetXaxis()->SetTitle(
"#it{p}_{T}^{jet} [GeV]");
279 corrPt.back()->GetYaxis()->SetTitle(corrPt.back()->GetXaxis()->GetTitle());
283 for (
int binX = 1; binX <= corrPt.back()->GetNbinsX(); ++binX)
284 for (
int binY = 1; binY <= corrPt.back()->GetNbinsY(); ++binY)
285 if (corrPt.back()->GetBinContent(binX,binY) > -100) {
286 corrPt.back()->SetBinContent(binX,binY,1-corrPt.back()->GetBinContent(binX,binY));
296 canvas->SetLogx(
false);
297 canvas->SetLogy(
false);
298 for (
size_t iFixed = 0; iFixed < fixedPt.size(); ++iFixed)
300 const double ptVal1 = fixedPt.at(iFixed).first;
301 const double ptVal2 = fixedPt.at(iFixed).second;
303 printf(
"Processing (pT1,pT2) = (%.0f,%.0f)\n",ptVal1,ptVal2);
306 std::vector<TH2D*> corrEta;
307 for (
size_t iProv = 0; iProv < providers.size(); ++iProv)
309 corrEta.push_back(providers.at(iProv)->getEtaCorrelationMatrix(round(10*(maxEtaVal-minEtaVal)),minEtaVal,maxEtaVal,ptVal1,ptVal2));
310 corrEta.back()->GetXaxis()->SetTitle(
"#eta^{jet}");
311 corrEta.back()->GetYaxis()->SetTitle(corrEta.back()->GetXaxis()->GetTitle());
315 for (
int binX = 1; binX <= corrEta.back()->GetNbinsX(); ++binX)
316 for (
int binY = 1; binY <= corrEta.back()->GetNbinsY(); ++binY)
317 if (corrEta.back()->GetBinContent(binX,binY) > -100)
318 corrEta.back()->SetBinContent(binX,binY,1-corrEta.back()->GetBinContent(binX,binY));
330 if (argc != 7 && argc != 8 && argc != 9)
332 printf(
"Expected arguments:\n");
333 printf(
"\t1. Output file (ps, pdf, eps)\n");
334 printf(
"\t2. Jet definition(s), semicolon delimited\n");
335 printf(
"\t3. MC type\n");
336 printf(
"\t4. Config file(s), semicolon delimited\n");
337 printf(
"\t\tDifferences will be performed by left minus right\n");
338 printf(
"\t\tExample: A;B;C --> A,B,C,A-B,B-C\n");
339 printf(
"\t5. Fixed eta values to consider for pT correlations, semicolon delimited\n");
340 printf(
"\t Note: Comma-delimited pairs if specifying both eta1 and eta2\n");
341 printf(
"\t6. Fixed pT values to consider for eta correlations, semicolon delimited\n");
342 printf(
"\t Note: Comma-delimited pairs if specifying both pt1 and pt2\n");
343 printf(
"\t Note: Expected units are GeV, not MeV\n");
344 printf(
"\t7. Output histogram root file (OPTIONAL)\n");
345 printf(
"\t8. Whether to switch to relative differences (OPTIONAL, default \"false\")\n");
348 TFile* outHistFile =
nullptr;
349 TString outFile = argv[1];
351 TString mcType = argv[3];
356 outHistFile = TFile::Open(argv[7],
"RECREATE");
360#ifdef XAOD_STANDALONE
361 StatusCode::enableFailure();
366 printf(
"Failed to find any configs: %s\n",argv[4]);
371 if (fixedEtaS.empty() && fixedPtS.empty())
373 printf(
"No fixed pT or eta values were specified, nothing to do.\n");
378 std::vector< std::pair<double,double> > fixedEta;
379 std::vector< std::pair<double,double> > fixedPt;
382 for (
size_t iEta1 = 0; iEta1 < fixedEtaS.size(); ++iEta1)
383 for (
size_t iEta2 = 0; iEta2 < fixedEtaS.size(); ++iEta2)
388 for (
size_t iEta = 0; iEta < fixedEtaS.size(); ++iEta)
392 fixedEta.emplace_back(temp.at(0),temp.at(0));
393 else if (temp.size() == 2)
394 fixedEta.emplace_back(temp.at(0),temp.at(1));
397 printf(
"Specified a fixed eta term which is not 1 or 2 values: %s\n",fixedEtaS.at(iEta).Data());
398 printf(
"Unsure of how to interpret this term, exiting.\n");
406 for (
size_t iPt1 = 0; iPt1 < fixedPtS.size(); ++iPt1)
407 for (
size_t iPt2 = 0; iPt2 < fixedPtS.size(); ++iPt2)
412 for (
size_t iPt = 0; iPt < fixedPtS.size(); ++iPt)
415 if (temp.size() == 1)
416 fixedPt.emplace_back(temp.at(0),temp.at(0));
417 else if (temp.size() == 2)
418 fixedPt.emplace_back(temp.at(0),temp.at(1));
421 printf(
"Specified a fixed pt term which is not 1 or 2 values: %s\n",fixedPtS.at(iPt).Data());
422 printf(
"Unsure of how to interpret this term, exiting.\n");
430 gStyle->SetPalette(1);
431 TCanvas* canvas =
new TCanvas(
"canvas");
433 canvas->SetFillStyle(4000);
434 canvas->SetFillColor(0);
435 canvas->SetFrameBorderMode(0);
439 if (outFile !=
"NONE" && !outFile.EndsWith(
".eps"))
440 canvas->Print(outFile+
"[");
444 for (
size_t iJetDef = 0; iJetDef < jetDefs.size(); ++iJetDef)
446 const TString jetDef = jetDefs.at(iJetDef);
449 std::vector<JetUncertaintiesTool*> providers;
450 printf(
"Processing %zu config(s)...\n",configs.size());
451 for (
size_t iConfig = 0; iConfig < configs.size(); ++iConfig)
457 if (providers.back()->setProperty(
"JetDefinition",jetDef.Data()).isFailure())
459 printf(
"Failed to set JetDefinition to %s\n",jetDef.Data());
462 if (providers.back()->setProperty(
"MCType",mcType.Data()).isFailure())
464 printf(
"Failed to set MCType to %s\n",mcType.Data());
467 if (providers.back()->setProperty(
"ConfigFile",configs.at(iConfig).Data()).isFailure())
469 printf(
"Failed to set ConfigFile to %s\n",configs.at(iConfig).Data());
485 if (providers.back()->setScaleToGeV().isFailure())
487 printf(
"Failed to set tool scale to GeV for config: %s\n",configs.at(iConfig).Data());
492 if (providers.back()->initialize().isFailure())
494 printf(
"Failed to initialize tool for config: %s\n",configs.at(iConfig).Data());
503 for (
size_t iProv = 0; iProv < providers.size(); ++iProv)
504 delete providers.at(iProv);
509 if (outFile !=
"NONE" && !outFile.EndsWith(
".eps"))
510 canvas->Print(outFile+
"]");
515 outHistFile->Close();
516 outHistFile =
nullptr;