ATLAS Offline Software
Loading...
Searching...
No Matches
IsolationCorrection.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5// Header for the ROOT tool of this package
7#include "TFile.h"
8#include "TGraphAsymmErrors.h"
9#include "TRandom3.h"
10#include "TTree.h"
11#include "TVector.h"
12// xAOD
14#include "xAODEgamma/Electron.h"
15#include "xAODEgamma/Photon.h"
19
21
22#include <typeinfo>
23#include <utility>
24#include <cmath>
25
26
27namespace{
28const float GeV(1000);
29}
30
31namespace CP {
32
38 m_corr_file(""),
40 m_corr_ddsmearing_file(""), // in run I, there was a shift and a smearing
41 m_is_mc(false),
42 m_AFII_corr(false),
43 m_set_mc(false),
44 m_correct_etcone(false),
46 m_useLogLogFit(false),
48 m_shower(nullptr),
49 m_previousYear("2000")
50 {
51 // 3 possible periods
52 for (int i = 0; i < 3; i++) {
53 // 2 simulation flavour
54 for (int j = 0; j < 2; j++)
55 m_corrInitialized[i][j] = false;
56 }
57 }
58
59 void IsolationCorrection::SetCorrectionFile(const std::string& corr_file, const std::string& corr_ddshift_file, const std::string& corr_ddsmearing_file) {
60 // the leakage parameterisation
62 // the DD shifts (for photons)
64 // And an eventual smearing (run I)
66 }
67
69
70 setEtaBins();
73 return StatusCode::SUCCESS;
74 }
75
79
80
82 float corrected_isolation = input.isolationValue(isol) - GetPtCorrection(input, isol);
83 return corrected_isolation;
84
85 }
86
87
89 /*
90 - nPV: number of primary vertices (corrections were derived requiring >= 2 tracks/vertex in 2011 data)
91
92 - Etcone40: (ph_Etcone40) *** in MeV!
93 - Etcone40_ED_corrected: ED corrected version of Etcone40 (ph_Etcone40_ED_corrected) *** in Mev!
94
95 - energy: cluster energy (ph_cl_E) *** in MeV!
96 - etaS2: eta in the 2nd calo sampling (ph_etas2)
97 - etaPointing: pointing eta -> from 1st and 2nd calo samplings (ph_etap)
98 - etaCluster: cluster eta (ph_cl_eta)
99 - radius: radius of the input EtconeXX variable. Can be given as, e.g., .20 or 20
100 - is_mc: set to true if running on MC
101 - Etcone_value: value of uncorrected EtconeXX variable (ph_EtconeXX) *** in MeV!
102 - isConversion: photons only: conversion flag (ph_isConv)
103 - parttype: ELECTRON or PHOTON, enum defined below
104 - version: REL22, REL21, REL20_2, REL17_2, REL17 or REL16, enum defined below
105 */
106 float isolation_ptcorrection = 0;
107 float energy = 0;
108
109 //energy = input.caloCluster()->energyBE(1) + input.caloCluster()->energyBE(2) + input.caloCluster()->energyBE(3); //input.e()
110 if (input.caloCluster() == nullptr) {
111 ATH_MSG_WARNING("The associated cluster of the object does not exist ! Maybe the thinning was too agressive... No leakage correction computed.");
112 return 0.;
113 }
115 energy = input.caloCluster()->energyBE(1) + input.caloCluster()->energyBE(2) + input.caloCluster()->energyBE(3);
116 else
117 energy = input.caloCluster()->e();
118
119 bool is_mc = m_is_mc;
121 bool convFlag = false;
122
123 float etaS2 = input.caloCluster()->etaBE(2);
124 float etaS1 = input.caloCluster()->etaBE(1);
125 float etaCluster = input.caloCluster()->eta();
126 float phiCluster = input.caloCluster()->phi();
127
128 if(part_type == IsolationCorrection::PHOTON && fabs(etaS2) > 2.37) return 0.;
129 if(part_type == IsolationCorrection::ELECTRON && fabs(etaS2) > 2.47) return 0.;
130
131 if(fabs(etaS1) > 2.5) return 0.;
132 if(fabs(phiCluster) > float(M_PI)) return 0.;
133
134 if (part_type == IsolationCorrection::ELECTRON && energy > 15e3)
135 ATH_MSG_VERBOSE("Electron ? " << (part_type == IsolationCorrection::ELECTRON) << " Input E = " << input.caloCluster()->e() << " E used " << energy << " author = " << input.author() << " pT = " << input.pt() << " phi = " << input.phi());
136
137 int convFlag_int = 0;
138 float conv_radius = 0.;
139 float conv_ratio = 0.;
140
141 if(part_type == IsolationCorrection::PHOTON){
142 const xAOD::Photon* ph_input = static_cast<const xAOD::Photon_v1*> (&input);
143
144 convFlag_int = xAOD::EgammaHelpers::conversionType(ph_input);
145 if(convFlag_int == 3 ) convFlag_int = 2;
146 else if(convFlag_int != 0) convFlag_int = 1;
147
148 if(convFlag_int != 0) convFlag = true;
149 conv_radius = xAOD::EgammaHelpers::conversionRadius(ph_input);
150
151 if(convFlag_int == 2){
152 const xAOD::Vertex* phVertex = ph_input->vertex();
153
154 static const SG::Accessor<float> accPt1("pt1");
155 static const SG::Accessor<float> accPt2("pt2");
156 const xAOD::TrackParticle* tp0 = phVertex->trackParticle(0);
157 const xAOD::TrackParticle* tp1 = phVertex->trackParticle(1);
158
159 float pt1conv{}, pt2conv{};
160 if (accPt1.isAvailable(*phVertex) && accPt2.isAvailable(*phVertex) ){
161 pt1conv = accPt1(*phVertex);
162 pt2conv = accPt2(*phVertex);
163 }else{
164 pt1conv = getPtAtFirstMeasurement( tp0 );
165 pt2conv = getPtAtFirstMeasurement( tp1 );
166 }
167 //avoid unlikely zero division
168 const auto [numerator, denominator] = std::minmax(pt1conv,pt2conv);
169 if (denominator == 0.)[[unlikely]]{
170 //something is very wrong
171 ATH_MSG_WARNING("denominator is zero.");
172 return 0.;
173 }
174 conv_ratio = numerator/denominator;
175 }
176 }
177 int author = input.author();
178
179 // for test
181 if (input.phi() > 0)
182 author = 1;
183 else
184 author = 16;
185 }
186
187 //using std::optional
188 auto etaPointing = m_shower->getCaloPointingEta(etaS1, etaS2, phiCluster, is_mc);
189 if (!etaPointing.has_value()) return 0.;
190
191 float radius = xAOD::Iso::coneSize(isol);
193
194 if(is_topo){
195
196 isolation_ptcorrection = GetPtCorrectionTopo( energy,
197 etaS2,
198 etaPointing.value(),
199 etaCluster,
200 radius,
201 is_mc,
202 convFlag,
203 part_type,
205 convFlag_int,
206 author,
207 conv_radius,
208 conv_ratio);
209 }else{
210 isolation_ptcorrection = GetPtCorrection( energy,
211 etaS2,
212 etaPointing.value(),
213 etaCluster,
214 radius,
215 is_mc,
216 convFlag,
217 part_type);
218 }
219
220 return isolation_ptcorrection;
221 }
222
224 {
225 if (!tp) return 0;
226 for (unsigned int i = 0; i < tp->numberOfParameters(); ++i)
228 return hypot(tp->parameterPX(i), tp->parameterPY(i));
229 return tp->pt();
230 }
231
232 // I also include the DD from 2015 study because it is done in the same way as 2015-2016 or 2017
233StatusCode IsolationCorrection::setupDD(const std::string& year) {
234
235 if (m_corr_ddshift_file.empty()){
236 ATH_MSG_WARNING("IsolationCorrection::GetDDCorrection " << year << ", unknown correction file name.\nNo correction is applied.\n");
237 return StatusCode::FAILURE;
238 }
239
240 int ii = year == "2017" ? 2 : (year == "2015_2016" ? 1 : 0);
241 int jj = m_AFII_corr ? 1 : 0;
242
243 if (year == m_previousYear && m_corrInitialized[ii][jj])
244 return StatusCode::SUCCESS;
245
246 ATH_MSG_VERBOSE("Will setup the tool to retrieve " << year << " DD corrections");
247
248 m_previousYear = year;
249 if (year == "2015") {
251 m_crackBin = 2;
256 } else if (year == "2015_2016") {
258 m_crackBin = 4;
263 } else if (year == "2017") {
265 m_crackBin = 4;
270 } else {
271 ATH_MSG_WARNING("Year " << year << " is not known in IsolationCorrection ! Check your input ! No correction is applied");
272 return StatusCode::FAILURE;
273 }
274
275 if (!m_corrInitialized[ii][jj]) {
276
277 ATH_MSG_VERBOSE("DD corrections for year " << year << " not loaded yet. Doing it know");
278
279 std::unique_ptr< TFile > file_ptleakagecorr( TFile::Open( m_corr_ddshift_file.c_str(), "READ" ) );
280 if (!file_ptleakagecorr) {
281 ATH_MSG_ERROR("file " << m_corr_ddshift_file << " not found ! Check your inputs");
282 return StatusCode::FAILURE;
283 }
284 TString baseN = year + "/" + (m_AFII_corr ? "AF2/" : "FullSim/");
285 TVector *veta = (TVector*)file_ptleakagecorr->Get(baseN+"/etaBinning");
286 m_feta_bins_dd->resize(veta->GetNrows());
287 for (int ieta = 0; ieta < veta->GetNrows(); ieta++) m_feta_bins_dd->at(ieta) = (*veta)[ieta];
288 TTree *tbinLabel = (TTree*)file_ptleakagecorr->Get(baseN+"tbinLabel");
289 TBranch *bbinLabel(nullptr);
290 TString *binLabel(nullptr); tbinLabel->SetBranchAddress("binLabel",&binLabel,&bbinLabel);
291 for (unsigned int ieta = 0; ieta < m_feta_bins_dd->size()-2; ieta++) {
292 tbinLabel->GetEntry(ieta);
293 TString gN = "topoETcone40_DataDriven_unconverted_photon_eta_";
294 gN += (*binLabel);
295 m_graph_dd_cone40_unconv_photon_shift->push_back( (TGraph*) file_ptleakagecorr->Get(baseN+gN));
296 gN = "topoETcone40_DataDriven_converted_photon_eta_";
297 gN += (*binLabel);
298 m_graph_dd_cone40_conv_photon_shift->push_back( (TGraph*) file_ptleakagecorr->Get(baseN+gN));
299 gN = "topoETcone20_DataDriven_unconverted_photon_eta_";
300 gN += (*binLabel);
301 m_graph_dd_cone20_unconv_photon_shift->push_back( (TGraph*) file_ptleakagecorr->Get(baseN+gN));
302 gN = "topoETcone20_DataDriven_converted_photon_eta_";
303 gN += (*binLabel);
304 m_graph_dd_cone20_conv_photon_shift->push_back( (TGraph*) file_ptleakagecorr->Get(baseN+gN));
305 ATH_MSG_VERBOSE("Got graphs \n"
306 << " dR = 0.4, unconv " << m_graph_dd_cone40_unconv_photon_shift->at(ieta)->GetName() << "\n"
307 << " dR = 0.4, conv " << m_graph_dd_cone40_conv_photon_shift->at(ieta)->GetName() << "\n"
308 << " dR = 0.2, unconv " << m_graph_dd_cone20_unconv_photon_shift->at(ieta)->GetName() << "\n"
309 << " dR = 0.2, conv " << m_graph_dd_cone20_conv_photon_shift->at(ieta)->GetName());
310
311 }
312 m_corrInitialized[ii][jj] = true;
313 }
314
315 return StatusCode::SUCCESS;
316}
317
318 float IsolationCorrection::GetDDCorrection(const xAOD::Egamma& input, const xAOD::Iso::IsolationType isol, const std::string& year) {
319
320 ATH_MSG_VERBOSE("Getting DD correction");
321 if (setupDD(year) == StatusCode::FAILURE) {
322 return 0;
323 }
324
325 // corrections only for MC and photon
326 if(!m_is_mc || input.type() == xAOD::Type::Electron) return 0;
327
328 const xAOD::Photon* ph_input = static_cast<const xAOD::Photon_v1*> (&input);
329 int convFlag_int = xAOD::EgammaHelpers::conversionType(ph_input);
330
331 bool converted = false;
332 if(convFlag_int > 0) converted = true;
333
334 float etaS2 = input.eta();
335 int eta_bin = 0;
336
337 double feta = fabs(etaS2);
338 for (unsigned int i = 0; i < m_feta_bins_dd->size()-1; i++) {
339 if (feta >= m_feta_bins_dd->at(i) && feta < m_feta_bins_dd->at(i+1))
340 eta_bin = i;
341 }
342 if (eta_bin == m_crackBin)
343 return 0;
344 else if (eta_bin > m_crackBin)
345 eta_bin -= 1;
346
347 if (eta_bin < 0) {
348 ATH_MSG_WARNING("Strange cluster S2 eta for photon isolation DD correction ! eta = " << etaS2 << ". No correction");
349 return 0;
350 }
351
352 if (input.pt() > 25e3)
353 ATH_MSG_VERBOSE("Getting correction for photon pt: " <<input.pt()
354 << " eta: " << etaS2 << " etabin: " << eta_bin);
355
356 float pt_gev = input.pt()*0.001;
357 if (pt_gev > 999.) pt_gev = 999. ;
358
359 float isolation_ddcorrection = 0;
360 if (isol==xAOD::Iso::topoetcone40) {
361 if (!converted)
362 isolation_ddcorrection = 1e3*(*m_graph_dd_cone40_unconv_photon_shift)[eta_bin]->Eval(pt_gev);
363 else
364 isolation_ddcorrection = 1e3*(*m_graph_dd_cone40_conv_photon_shift)[eta_bin]->Eval(pt_gev);
365 } else if (isol==xAOD::Iso::topoetcone20) {
366 if (!converted)
367 isolation_ddcorrection = 1e3*(*m_graph_dd_cone20_unconv_photon_shift)[eta_bin]->Eval(pt_gev);
368 else
369 isolation_ddcorrection = 1e3*(*m_graph_dd_cone20_conv_photon_shift)[eta_bin]->Eval(pt_gev);
370 }
371
372 return isolation_ddcorrection;
373 }
374
376 if (input->caloCluster() == nullptr) {
377 ATH_MSG_WARNING("The associated cluster of the object does not exist ! Maybe the thinning was too agressive... use object eta for eta (instead of etaS2 or pointing).");
378 return input->eta();
379 }
380 float etaS1 = input->caloCluster()->etaBE(1);
381 float etaS2 = input->caloCluster()->etaBE(2);
382 float phiCluster = input->caloCluster()->phi();
384
385 if(part_type == IsolationCorrection::PHOTON && fabs(etaS2) > 2.37) return 0.;
386 if(part_type == IsolationCorrection::ELECTRON && fabs(etaS2) > 2.47) return 0.;
387 if(fabs(etaS1) > 2.5) return 0.;
388 if(fabs(phiCluster) > 3.2) return 0.;
389
390 auto etaPointing = m_shower->getCaloPointingEta(etaS1, etaS2, phiCluster);
391 //using std::optional here
392 return etaPointing.value_or(0.);
393 }
394
396 m_is_mc = is_mc;
397 m_set_mc = true;
398 }
399
400 void IsolationCorrection::SetAFII(bool AFII_corr){
401 m_AFII_corr = AFII_corr;
402 }
403
404 // obsolete
405 /*
406 void IsolationCorrection::SetDD(bool apply_dd){
407 ATH_MSG_WARNING("The method SetDD is obsolete and not doing anything");
408 }
409 */
410
411 void IsolationCorrection::SetCorrectEtcone(bool correct_etcone){
412 m_correct_etcone = correct_etcone;
413 }
414
415 void IsolationCorrection::SetTroubleCategories(bool trouble_categories){
416 m_trouble_categories = trouble_categories;
417 }
418
422
426 m_eta_bins_fine = {0.0, 0.10, 0.60, 0.80, 1.15, 1.37, 1.52, 1.81, 2.01, 2.37, 2.47};
427 m_eta_bins_coarse = {0.0, 0.60, 1.37, 1.52, 1.81, 2.47};
428 }
429
430 // initialize the leakage corrections and DD only for rel17.2.
431 // Other DD are initialized once used for the first time
433 if (m_tool_ver == REL17_2) {
434 set2011Corr(); // in fact, this is for etcone
435 set2012Corr();
436 setDDCorr();
437 } else if (m_tool_ver == REL20_2 || m_tool_ver == REL21 || m_tool_ver == REL22)
438 set2015Corr();
439 }
440
441 // This for etcone !!! From 2011 !
443
444 // -------------------------------------------------------------------------------------------
445 // ------------- full 2011 (rel 17) leakage corrections --------------------------------------
446 // CURRENT isolation corrections: fine grained in eta, derived from MC11
447 m_mc_rel17_leakage_correction_slopes_electron_15 = { 0.01466, 0.01421, 0.01427, 0.01872, 0.02008, 0.02181, 0.02141, 0.02636, 0.03285, 0.03564 };
448 m_mc_rel17_leakage_correction_slopes_electron_20 = { 0.01616, 0.01572, 0.01596, 0.02139, 0.02339, 0.03350, 0.02499, 0.03038, 0.03870, 0.04337 };
449 m_mc_rel17_leakage_correction_slopes_electron_25 = { 0.01663, 0.01616, 0.01667, 0.02223, 0.02445, 0.03852, 0.02611, 0.03174, 0.04093, 0.04692 };
450 m_mc_rel17_leakage_correction_slopes_electron_30 = { 0.01689, 0.01635, 0.01684, 0.02256, 0.02485, 0.04223, 0.02660, 0.03232, 0.04182, 0.04846 };
451 m_mc_rel17_leakage_correction_slopes_electron_35 = { 0.01695, 0.01642, 0.01693, 0.02268, 0.02501, 0.04403, 0.02685, 0.03254, 0.04223, 0.04928 };
452 m_mc_rel17_leakage_correction_slopes_electron_40 = { 0.01701, 0.01646, 0.01702, 0.02272, 0.02517, 0.04550, 0.02698, 0.03267, 0.04242, 0.04964 };
453
454 m_mc_rel17_leakage_correction_offsets_electron_15 = { 21.71, 36.00, 132.56, 191.64, 263.46, 619.58, 288.75, 121.92, 102.35, 175.02 };
455 m_mc_rel17_leakage_correction_offsets_electron_20 = { 76.67, 85.35, 184.90, 276.72, 384.97, 595.60, 657.99, 231.88, 170.48, 312.30 };
456 m_mc_rel17_leakage_correction_offsets_electron_25 = { 90.44, 105.02, 267.95, 420.38, 555.09, 1014.50, 765.83, 283.50, 224.18, 357.30 };
457 m_mc_rel17_leakage_correction_offsets_electron_30 = { 119.55, 127.09, 279.48, 430.96, 571.81, 846.86, 968.01, 354.46, 263.11, 455.21 };
458 m_mc_rel17_leakage_correction_offsets_electron_35 = { 138.79, 161.87, 371.47, 572.08, 754.17, 1249.38, 1000.44, 389.22, 295.72, 464.28 };
459 m_mc_rel17_leakage_correction_offsets_electron_40 = { 180.08, 187.89, 363.31, 553.46, 707.60, 1006.20, 1105.73, 434.21, 312.78, 535.90 };
460
461 // photons: last eta bin isn't used
462 m_mc_rel17_leakage_correction_slopes_photon_converted_15 = { 0.01450, 0.01410, 0.01410, 0.01860, 0.01990, 0.0, 0.02120, 0.02610, 0.03260, 0.0 };
463 m_mc_rel17_leakage_correction_slopes_photon_converted_20 = { 0.01600, 0.01560, 0.01580, 0.02130, 0.02320, 0.0, 0.02450, 0.03000, 0.03840, 0.0 };
464 m_mc_rel17_leakage_correction_slopes_photon_converted_25 = { 0.01630, 0.01600, 0.01620, 0.02210, 0.02420, 0.0, 0.02560, 0.03140, 0.04060, 0.0 };
465 m_mc_rel17_leakage_correction_slopes_photon_converted_30 = { 0.01630, 0.01600, 0.01630, 0.02240, 0.02460, 0.0, 0.02610, 0.03190, 0.04150, 0.0 };
466 m_mc_rel17_leakage_correction_slopes_photon_converted_35 = { 0.01660, 0.01600, 0.01630, 0.02240, 0.02470, 0.0, 0.02640, 0.03210, 0.04190, 0.0 };
467 m_mc_rel17_leakage_correction_slopes_photon_converted_40 = { 0.01610, 0.01590, 0.01620, 0.02250, 0.02480, 0.0, 0.02650, 0.03220, 0.04210, 0.0 };
468
469 m_mc_rel17_leakage_correction_offsets_photon_converted_15 = { 36.50, 61.80, 176.90, 206.40, 300.70, 0.0, 277.40, 91.70, 126.60, 0.0 };
470 m_mc_rel17_leakage_correction_offsets_photon_converted_20 = { 93.30, 101.40, 270.60, 369.10, 514.70, 0.0, 586.10, 160.80, 193.80, 0.0 };
471 m_mc_rel17_leakage_correction_offsets_photon_converted_25 = { 195.80, 166.20, 386.50, 472.30, 637.30, 0.0, 739.40, 207.60, 240.60, 0.0 };
472 m_mc_rel17_leakage_correction_offsets_photon_converted_30 = { 286.60, 241.60, 501.60, 570.70, 739.50, 0.0, 860.00, 264.50, 270.40, 0.0 };
473 m_mc_rel17_leakage_correction_offsets_photon_converted_35 = { 329.90, 314.70, 585.60, 655.60, 835.70, 0.0, 934.30, 291.50, 291.90, 0.0 };
474 m_mc_rel17_leakage_correction_offsets_photon_converted_40 = { 478.70, 383.80, 679.20, 725.70, 938.70, 0.0, 999.30, 322.80, 316.20, 0.0 };
475
476 m_mc_rel17_leakage_correction_slopes_photon_unconverted_15 = { 0.01480, 0.01410, 0.01400, 0.01820, 0.01950, 0.0, 0.02140, 0.02660, 0.03250, 0.0 };
477 m_mc_rel17_leakage_correction_slopes_photon_unconverted_20 = { 0.01630, 0.01560, 0.01560, 0.02060, 0.02240, 0.0, 0.02480, 0.03060, 0.03830, 0.0 };
478 m_mc_rel17_leakage_correction_slopes_photon_unconverted_25 = { 0.01670, 0.01610, 0.01620, 0.02140, 0.02330, 0.0, 0.02590, 0.03200, 0.04050, 0.0 };
479 m_mc_rel17_leakage_correction_slopes_photon_unconverted_30 = { 0.01690, 0.01630, 0.01640, 0.02170, 0.02360, 0.0, 0.02630, 0.03260, 0.04140, 0.0 };
480 m_mc_rel17_leakage_correction_slopes_photon_unconverted_35 = { 0.01700, 0.01640, 0.01650, 0.02180, 0.02380, 0.0, 0.02650, 0.03280, 0.04180, 0.0 };
481 m_mc_rel17_leakage_correction_slopes_photon_unconverted_40 = { 0.01710, 0.01640, 0.01650, 0.02190, 0.02390, 0.0, 0.02660, 0.03290, 0.04200, 0.0 };
482
483 m_mc_rel17_leakage_correction_offsets_photon_unconverted_15 = { -27.80, 3.80, 67.50, 80.90, 114.90, 0.0, 82.60, 2.10, 39.80, 0.0 };
484 m_mc_rel17_leakage_correction_offsets_photon_unconverted_20 = { -17.70, 12.60, 97.80, 126.50, 186.20, 0.0, 200.80, 24.00, 62.30, 0.0 };
485 m_mc_rel17_leakage_correction_offsets_photon_unconverted_25 = { -8.60, 20.30, 118.20, 161.80, 244.30, 0.0, 271.80, 39.80, 79.10, 0.0 };
486 m_mc_rel17_leakage_correction_offsets_photon_unconverted_30 = { 5.40, 33.80, 141.60, 199.50, 295.40, 0.0, 336.50, 64.80, 90.40, 0.0 };
487 m_mc_rel17_leakage_correction_offsets_photon_unconverted_35 = { 9.60, 47.80, 154.10, 231.10, 346.10, 0.0, 384.60, 77.80, 96.90, 0.0 };
488 m_mc_rel17_leakage_correction_offsets_photon_unconverted_40 = { 13.30, 62.00, 177.00, 267.10, 406.20, 0.0, 419.80, 89.40, 105.90, 0.0 };
489 }
490
492 if( !m_corr_file.empty()){
493 load2012Corr();
494 }else{
495 ATH_MSG_WARNING("Correction file for 2017 data/mc not specified, tool not initialized for 2017 corrections\n");
496 }
497 }
498
500 std::unique_ptr<TFile> file_ptleakagecorr(TFile::Open(m_corr_file.c_str(), "READ"));
501 if(!file_ptleakagecorr){
502 ATH_MSG_WARNING("Correction file for 2012 data/mc not found, tool not initialized for 2012 corrections\n");
503 m_corr_file = "";
504 return;
505 }else{
506 m_graph_cone40_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_photon_unconverted_etabin0_extrap") );
507 m_graph_cone40_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_photon_unconverted_etabin1_extrap") );
508 m_graph_cone40_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_photon_unconverted_etabin2_extrap") );
509 m_graph_cone40_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_photon_unconverted_etabin3_extrap") );
510 m_graph_cone40_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_photon_unconverted_etabin4_extrap") );
511 m_graph_cone40_photon_unconverted.push_back( new TGraph() );//No corrections for photons in the crack region
512 m_graph_cone40_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_photon_unconverted_etabin6_extrap") );
513 m_graph_cone40_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_photon_unconverted_etabin7_extrap") );
514 m_graph_cone40_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_photon_unconverted_etabin8_extrap") );
515 m_graph_cone40_photon_unconverted.push_back( new TGraph() );//No corrections for photons with |eta|>2.37
516
517 m_graph_cone40_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_photon_converted_etabin0_extrap") );
518 m_graph_cone40_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_photon_converted_etabin1_extrap") );
519 m_graph_cone40_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_photon_converted_etabin2_extrap") );
520 m_graph_cone40_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_photon_converted_etabin3_extrap") );
521 m_graph_cone40_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_photon_converted_etabin4_extrap") );
522 m_graph_cone40_photon_converted.push_back( new TGraph() );//No corrections for photons in the crack region
523 m_graph_cone40_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_photon_converted_etabin6_extrap") );
524 m_graph_cone40_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_photon_converted_etabin7_extrap") );
525 m_graph_cone40_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_photon_converted_etabin8_extrap") );
526 m_graph_cone40_photon_converted.push_back( new TGraph() );//No corrections for photons with |eta|>2.37
527
528 m_graph_cone40_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_electron_etabin0_extrap") );
529 m_graph_cone40_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_electron_etabin1_extrap") );
530 m_graph_cone40_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_electron_etabin2_extrap") );
531 m_graph_cone40_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_electron_etabin3_extrap") );
532 m_graph_cone40_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_electron_etabin4_extrap") );
533 m_graph_cone40_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_electron_etabin5_extrap") );
534 m_graph_cone40_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_electron_etabin6_extrap") );
535 m_graph_cone40_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_electron_etabin7_extrap") );
536 m_graph_cone40_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_electron_etabin8_extrap") );
537 m_graph_cone40_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone40_electron_etabin9_extrap") );
538
539 m_graph_cone30_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_photon_unconverted_etabin0_extrap") );
540 m_graph_cone30_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_photon_unconverted_etabin1_extrap") );
541 m_graph_cone30_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_photon_unconverted_etabin2_extrap") );
542 m_graph_cone30_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_photon_unconverted_etabin3_extrap") );
543 m_graph_cone30_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_photon_unconverted_etabin4_extrap") );
544 m_graph_cone30_photon_unconverted.push_back( new TGraph() );//No corrections for photons in the crack region
545 m_graph_cone30_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_photon_unconverted_etabin6_extrap") );
546 m_graph_cone30_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_photon_unconverted_etabin7_extrap") );
547 m_graph_cone30_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_photon_unconverted_etabin8_extrap") );
548 m_graph_cone30_photon_unconverted.push_back( new TGraph() );//No corrections for photons with |eta|>2.37
549
550 m_graph_cone30_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_photon_converted_etabin0_extrap") );
551 m_graph_cone30_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_photon_converted_etabin1_extrap") );
552 m_graph_cone30_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_photon_converted_etabin2_extrap") );
553 m_graph_cone30_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_photon_converted_etabin3_extrap") );
554 m_graph_cone30_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_photon_converted_etabin4_extrap") );
555 m_graph_cone30_photon_converted.push_back( new TGraph() );//No corrections for photons in the crack region
556 m_graph_cone30_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_photon_converted_etabin6_extrap") );
557 m_graph_cone30_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_photon_converted_etabin7_extrap") );
558 m_graph_cone30_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_photon_converted_etabin8_extrap") );
559 m_graph_cone30_photon_converted.push_back( new TGraph() );//No corrections for photons with |eta|>2.37
560
561 m_graph_cone30_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_electron_etabin0_extrap") );
562 m_graph_cone30_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_electron_etabin1_extrap") );
563 m_graph_cone30_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_electron_etabin2_extrap") );
564 m_graph_cone30_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_electron_etabin3_extrap") );
565 m_graph_cone30_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_electron_etabin4_extrap") );
566 m_graph_cone30_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_electron_etabin5_extrap") );
567 m_graph_cone30_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_electron_etabin6_extrap") );
568 m_graph_cone30_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_electron_etabin7_extrap") );
569 m_graph_cone30_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_electron_etabin8_extrap") );
570 m_graph_cone30_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone30_electron_etabin9_extrap") );
571
572 m_graph_cone20_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_photon_unconverted_etabin0_extrap") );
573 m_graph_cone20_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_photon_unconverted_etabin1_extrap") );
574 m_graph_cone20_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_photon_unconverted_etabin2_extrap") );
575 m_graph_cone20_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_photon_unconverted_etabin3_extrap") );
576 m_graph_cone20_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_photon_unconverted_etabin4_extrap") );
577 m_graph_cone20_photon_unconverted.push_back( new TGraph() );//No corrections for photons in the crack region
578 m_graph_cone20_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_photon_unconverted_etabin6_extrap") );
579 m_graph_cone20_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_photon_unconverted_etabin7_extrap") );
580 m_graph_cone20_photon_unconverted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_photon_unconverted_etabin8_extrap") );
581 m_graph_cone20_photon_unconverted.push_back( new TGraph() );//No corrections for photons with |eta|>2.37
582
583 m_graph_cone20_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_photon_converted_etabin0_extrap") );
584 m_graph_cone20_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_photon_converted_etabin1_extrap") );
585 m_graph_cone20_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_photon_converted_etabin2_extrap") );
586 m_graph_cone20_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_photon_converted_etabin3_extrap") );
587 m_graph_cone20_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_photon_converted_etabin4_extrap") );
588 m_graph_cone20_photon_converted.push_back( new TGraph() );//No corrections for photons in the crack region
589 m_graph_cone20_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_photon_converted_etabin6_extrap") );
590 m_graph_cone20_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_photon_converted_etabin7_extrap") );
591 m_graph_cone20_photon_converted.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_photon_converted_etabin8_extrap") );
592 m_graph_cone20_photon_converted.push_back( new TGraph() );//No corrections for photons with |eta|>2.37
593
594 m_graph_cone20_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_electron_etabin0_extrap") );
595 m_graph_cone20_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_electron_etabin1_extrap") );
596 m_graph_cone20_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_electron_etabin2_extrap") );
597 m_graph_cone20_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_electron_etabin3_extrap") );
598 m_graph_cone20_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_electron_etabin4_extrap") );
599 m_graph_cone20_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_electron_etabin5_extrap") );
600 m_graph_cone20_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_electron_etabin6_extrap") );
601 m_graph_cone20_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_electron_etabin7_extrap") );
602 m_graph_cone20_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_electron_etabin8_extrap") );
603 m_graph_cone20_electron.push_back( (TGraph*) file_ptleakagecorr->Get("graph_cone20_electron_etabin9_extrap") );
604 }
605 }
606
608 if( !m_corr_file.empty()){
609 load2015Corr();
610 }else{
611 ATH_MSG_WARNING("Correction file for 2015 data/mc not specified, tool not initialized for 2015 corrections\n");
612 }
613 }
614
616 std::unique_ptr<TFile> file_ptleakagecorr(TFile::Open(m_corr_file.c_str(), "READ"));
617 if(!file_ptleakagecorr){
618 ATH_MSG_WARNING("Correction file for 2015 data/mc not found, "<<m_corr_file<<". tool not initialized for 2015 corrections\n");
619 m_corr_file = "";
620 }else{
621 if(!file_ptleakagecorr->GetListOfKeys()->Contains("mean_f_topoetcone40_eta_1.15_1.37_converted_ok")){
622 ATH_MSG_ERROR("Correction file for 2015 data/mc is not right, "<<m_corr_file<<". Tool not initialized for 2015 corrections\n");
623 m_corr_file = "";
624 } else {
625
626 // ******************************
627 // Global fit corrections *******
628 // ******************************
629
630 static const int nEta = 10;
631 static const TString etaLab[nEta] = { "0.0_0.1", "0.1_0.6", "0.6_0.8", "0.8_1.15", "1.15_1.37", "1.37_1.52", "1.52_1.81", "1.81_2.01", "2.01_2.37", "2.37_2.47" };
632 static const TString pLab[5] = { "_unconverted", "_converted_ok", "_converted_trouble", "_author_1_electron", "_author_16_electron" };
633 static const TString dRLab[3] = { "20", "30", "40" };
634
644
651
656
660 }
661
662 for (int iPart = 0; iPart < 5; iPart++) {
663
664 for (int iEta = 0; iEta < 10; iEta++) {
665
666 // No parametrisation in the crack or above |eta| = 2.37 for photons
667 if (iPart < 3 && (iEta == 5 || iEta == 9))
668 continue;
669
670 for (int idR = 0; idR < 3; idR++) {
671 // The LogLog fit is a quick-and-dirty solution to get rid of negative leakage at low ET for unconverted and converted_ok photons
672 TString fN = (m_useLogLogFit && iPart < 2) ? "mean_flog_histo_topoetcone" : "mean_f_topoetcone";
673 fN += dRLab[idR]; fN += "_eta_"; fN += etaLab[iEta]; fN += pLab[iPart];
674 TString gN;
675 // Trouble categories are converted_trouble photons and author 16 electrons. Below 250 GeV, one uses the mean of the leakage histo
676 // instead of a fit to the mean of the CB vs ET
677 if (m_trouble_categories && (iPart == 2 || iPart == 4)) {
678 gN = "mean_g_histo_topoetcone"; gN += dRLab[idR]; gN += "_eta_"; gN += etaLab[iEta]; gN += pLab[iPart];
679 }
680 if (idR == 2) {
681 if (iPart == 0) {
682 m_function_2015_cone40_photon_unconverted.at(iEta) = ((TF1*)file_ptleakagecorr->Get(fN));
683 ATH_MSG_DEBUG("TF1 name : " << fN << " ptr = " << m_function_2015_cone40_photon_unconverted.at(iEta));
684 } else if (iPart == 1) {
685 m_function_2015_cone40_photon_converted_ok.at(iEta) = ((TF1*)file_ptleakagecorr->Get(fN));
686 ATH_MSG_DEBUG("TF1 name : " << fN << " ptr = " << m_function_2015_cone40_photon_converted_ok.at(iEta));
687 } else if (iPart == 2) {
688 m_function_2015_cone40_photon_converted_trouble.at(iEta) = ((TF1*)file_ptleakagecorr->Get(fN));
689 ATH_MSG_DEBUG("TF1 name : " << fN << " ptr = " << m_function_2015_cone40_photon_converted_trouble.at(iEta));
691 m_graph_histoMean_2015_cone40_photon_converted_trouble.at(iEta) = ((TGraph*)file_ptleakagecorr->Get(gN));
692 ATH_MSG_DEBUG("TGraph name (trouble categories at low ET) : " << gN << " ptr = " << m_graph_histoMean_2015_cone40_photon_converted_trouble.at(iEta));
693 }
694 } else if (iPart == 3) {
695 m_function_2015_cone40_author_1_electron.at(iEta) = ((TF1*)file_ptleakagecorr->Get(fN));
696 ATH_MSG_DEBUG("TF1 name : " << fN << " ptr = " << m_function_2015_cone40_author_1_electron.at(iEta));
697 } else if (iPart == 4) {
698 m_function_2015_cone40_author_16_electron.at(iEta) = ((TF1*)file_ptleakagecorr->Get(fN));
699 ATH_MSG_DEBUG("TF1 name : " << fN << " ptr = " << m_function_2015_cone40_author_16_electron.at(iEta));
701 m_graph_histoMean_2015_cone40_author_16_electron.at(iEta) = ((TGraph*)file_ptleakagecorr->Get(gN));
702 ATH_MSG_DEBUG("TGraph name (trouble categories at low ET) : " << gN << " ptr = " << m_graph_histoMean_2015_cone40_author_16_electron.at(iEta));
703 }
704 }
705
706 } else if (idR == 1) {
707 if (iPart == 0) {
708 m_function_2015_cone30_photon_unconverted.at(iEta) = ((TF1*)file_ptleakagecorr->Get(fN));
709 ATH_MSG_DEBUG("TF1 name : " << fN << " ptr = " << m_function_2015_cone30_photon_unconverted.at(iEta));
710 } else if (iPart == 1) {
711 m_function_2015_cone30_photon_converted_ok.at(iEta) = ((TF1*)file_ptleakagecorr->Get(fN));
712 ATH_MSG_DEBUG("TF1 name : " << fN << " ptr = " << m_function_2015_cone30_photon_converted_ok.at(iEta));
713 } else if (iPart == 2) {
714 m_function_2015_cone30_photon_converted_trouble.at(iEta) = ((TF1*)file_ptleakagecorr->Get(fN));
715 ATH_MSG_DEBUG("TF1 name : " << fN << " ptr = " << m_function_2015_cone30_photon_converted_trouble.at(iEta));
717 m_graph_histoMean_2015_cone30_photon_converted_trouble.at(iEta) = ((TGraph*)file_ptleakagecorr->Get(gN));
718 ATH_MSG_DEBUG("TGraph name (trouble categories at low ET) : " << gN << " ptr = " << m_graph_histoMean_2015_cone30_photon_converted_trouble.at(iEta));
719 }
720 } else if (iPart == 3) {
721 m_function_2015_cone30_author_1_electron.at(iEta) = ((TF1*)file_ptleakagecorr->Get(fN));
722 ATH_MSG_DEBUG("TF1 name : " << fN << " ptr = " << m_function_2015_cone30_author_1_electron.at(iEta));
723 } else if (iPart == 4) {
724 m_function_2015_cone30_author_16_electron.at(iEta) = ((TF1*)file_ptleakagecorr->Get(fN));
725 ATH_MSG_DEBUG("TF1 name : " << fN << " ptr = " << m_function_2015_cone30_author_16_electron.at(iEta));
727 m_graph_histoMean_2015_cone30_author_16_electron.at(iEta) = ((TGraph*)file_ptleakagecorr->Get(gN));
728 ATH_MSG_DEBUG("TGraph name (trouble categories at low ET) : " << gN << " ptr = " << m_graph_histoMean_2015_cone30_author_16_electron.at(iEta));
729 }
730 }
731
732 } else {
733 if (iPart == 0) {
734 m_function_2015_cone20_photon_unconverted.at(iEta) = ((TF1*)file_ptleakagecorr->Get(fN));
735 ATH_MSG_DEBUG("TF1 name : " << fN << " ptr = " << m_function_2015_cone20_photon_unconverted.at(iEta));
736 } else if (iPart == 1) {
737 m_function_2015_cone20_photon_converted_ok.at(iEta) = ((TF1*)file_ptleakagecorr->Get(fN));
738 ATH_MSG_DEBUG("TF1 name : " << fN << " ptr = " << m_function_2015_cone20_photon_converted_ok.at(iEta));
739 } else if (iPart == 2) {
740 m_function_2015_cone20_photon_converted_trouble.at(iEta) = ((TF1*)file_ptleakagecorr->Get(fN));
741 ATH_MSG_DEBUG("TF1 name : " << fN << " ptr = " << m_function_2015_cone20_photon_converted_trouble.at(iEta));
743 m_graph_histoMean_2015_cone20_photon_converted_trouble.at(iEta) = ((TGraph*)file_ptleakagecorr->Get(gN));
744 ATH_MSG_DEBUG("TGraph name (trouble categories at low ET) : " << gN << " ptr = " << m_graph_histoMean_2015_cone20_photon_converted_trouble.at(iEta));
745 }
746 } else if (iPart == 3) {
747 m_function_2015_cone20_author_1_electron.at(iEta) = ((TF1*)file_ptleakagecorr->Get(fN));
748 ATH_MSG_DEBUG("TF1 name : " << fN << " ptr = " << m_function_2015_cone20_author_1_electron.at(iEta));
749 } else if (iPart == 4) {
750 m_function_2015_cone20_author_16_electron.at(iEta) = ((TF1*)file_ptleakagecorr->Get(fN));
751 ATH_MSG_DEBUG("TF1 name : " << fN << " ptr = " << m_function_2015_cone20_author_16_electron.at(iEta));
753 m_graph_histoMean_2015_cone20_author_16_electron.at(iEta) = ((TGraph*)file_ptleakagecorr->Get(gN));
754 ATH_MSG_DEBUG("TGraph name (trouble categories at low ET) : " << gN << " ptr = " << m_graph_histoMean_2015_cone20_author_16_electron.at(iEta));
755 }
756 }
757 }
758
759 } // dR bin
760
761 } // eta bin
762
763 } // particle type
764
765 } // root file : no good format
766 } // root file not found
767 }
768
770 if( !m_corr_ddshift_file.empty() && !m_corr_ddsmearing_file.empty()){
771 loadDDCorr();
772 }else{
773 ATH_MSG_WARNING("Data-driven correction files not specified, tool not initialized for data-driven corrections\n");
774 }
775 }
776
778 std::unique_ptr< TFile > file_ddshift_corr( TFile::Open( m_corr_ddshift_file.c_str(), "READ" ) );
779 std::unique_ptr< TFile > file_ddsmearingcorr( TFile::Open( m_corr_ddsmearing_file.c_str(), "READ" ) );
780
781 if(!file_ddshift_corr || !file_ddsmearingcorr){
782 ATH_MSG_WARNING("Correction file for data-driven corrections not found, tool not initialized for data-driven corrections\n");
785 }else{
786
787 // **********************************
788 // Data driven corrections **********
789 // https://cds.cern.ch/record/2008664
790 // **********************************
791
792 // Photon shift corrections
793 std::vector< std::shared_ptr<TGraphAsymmErrors> > graph_shift;
794 // Photon smearing corrections (to be applied in end caps only)
795 std::vector< std::shared_ptr<TGraphAsymmErrors> > graph_smearing;
796 for (int ig = 0; ig <= 13; ig++) {
797 graph_shift.emplace_back( dynamic_cast<TGraphAsymmErrors*>(file_ddshift_corr->Get(Form("graph_%i",ig))) );
798 graph_smearing.emplace_back( dynamic_cast<TGraphAsymmErrors*>(file_ddsmearingcorr->Get(Form("graph_%i",ig))) );
799 }
800 for (int ig = 0; ig <= 13; ig++) {
801 if (ig <= 7)
802 m_graph_dd_cone40_photon_shift.push_back( graph_shift.at(ig)->GetFunction("f") );
803 else
804 m_graph_dd_cone40_photon_shift.push_back( graph_shift.at(ig)->GetFunction("f_2") );
805 m_graph_dd_cone40_photon_smearing.push_back( graph_smearing.at(ig)->GetFunction("f_3") );
806 }
807
808 for (const auto& gr : graph_shift) {
809 if (gr == nullptr)
810 ATH_MSG_ERROR("Null pointer for one of the DD correction graphs");
811 }
812 for (const auto& gr : graph_smearing) {
813 if (gr == nullptr)
814 ATH_MSG_ERROR("Null pointer for one of the smearing graphs");
815 }
816 }
817 }
818
819 template <class T> void IsolationCorrection::FreeClear( T & cntr ) {
820 ATH_MSG_DEBUG("FreeClearing the container " << cntr.size());
821 for ( typename T::iterator it = cntr.begin();
822 it != cntr.end(); ++it ) {
823 if (*it) {
824 if (msgLvl(MSG::DEBUG)) {
825 ATH_MSG_DEBUG("Deleting " << *it << " " << typeid(*it).name());
826 ATH_MSG_DEBUG((*it)->GetName());
827 (*it)->Print();
828 }
829 delete * it;
830 }
831 }
832 cntr.clear();
833 }
834
836 m_eta_bins_fine.clear();
837 m_eta_bins_coarse.clear();
838
839 if (m_tool_ver == REL17_2) {
843
847
851
854
855 } else if (m_tool_ver == REL20_2 || m_tool_ver == REL21 || m_tool_ver == REL22) {
856
857 //---- Rel 20_2 pT leakage correction file
858
862
866
870
874
878
879
880 //---- Rel 20_2 pT leakage correction with histogram mean file
881
885
889
890 }
891
897 }
903 }
904
905 // For etcone, we only have very old corrections...
912
919
920 // photons: last eta bin isn't used
927
934
941
948
949 // -------------------------------------------------------------------------------------------
950 //Delete m_shower instance
951 delete m_shower;
952
953 }
954
955 //-----------------------------------------------------------------------
956 // User function
957 // Returns the pt leakage corrected isolation
958 //
960 float etaS2,
961 float etaPointing,
962 float etaCluster,
963 float radius,
964 bool is_mc,
965 float Etcone_value,
966 bool isConversion,
967 ParticleType parttype){
968
969 float pt_correction = GetPtCorrection(energy, etaS2, etaPointing, etaCluster, radius, is_mc, isConversion, parttype);
970 return Etcone_value - pt_correction;
971 }
972 //-----------------------------------------------------------------------
973
974 //-----------------------------------------------------------------------
975 // User function
976 // Returns the pt leakage corrected topo isolation
977 //
979 float etaS2,
980 float etaPointing,
981 float etaCluster,
982 float radius,
983 bool is_mc,
984 float Etcone_value,
985 bool isConversion,
986 ParticleType parttype,
987 Version ver){
988
989 float pt_correction = GetPtCorrectionTopo(energy, etaS2, etaPointing, etaCluster, radius, is_mc, isConversion, parttype, ver);
990 return Etcone_value - pt_correction;
991 }
992 //-----------------------------------------------------------------------
993
994
995 // ***************************************************************************************************************************
996 // ***************************************************************************************************************************
997 // Internal Functions Below.
998 // ***************************************************************************************************************************
999 // ***************************************************************************************************************************
1000
1001 //-----------------------------------------------------------------------
1002 // Internal function
1003 // Gets the pt correction factor
1004 //
1006 float etaS2, float etaPointing, float etaCluster,
1007 float radius,
1008 bool is_mc,
1009 bool isConversion, ParticleType parttype) const {
1010
1011 int newrad = GetRadius(radius);
1012 std::vector<float> mc_correction_slopes_ptr;
1013 std::vector<float> mc_correction_offsets_ptr;
1014 std::vector<float> data_correction_slopes_ptr;
1015
1016 //TODO: when implementing ptcorr for etconeXX change this
1017
1018 switch(newrad){
1019 case 20:
1020 if (parttype == PHOTON) {
1021 // photons
1022 if(isConversion) {
1023 // converted
1026 } else {
1027 // unconverted
1030 }
1031 } else {
1032 // electrons
1033 mc_correction_slopes_ptr = m_mc_rel17_leakage_correction_slopes_electron_20;
1034 mc_correction_offsets_ptr = m_mc_rel17_leakage_correction_offsets_electron_20;
1035 }
1036 break;
1037 case 30:
1038 if (parttype == PHOTON) {
1039 // photons
1040 if(isConversion) {
1041 // converted
1044 } else {
1045 // unconverted
1048 }
1049 } else {
1050 // electrons
1051 mc_correction_slopes_ptr = m_mc_rel17_leakage_correction_slopes_electron_30;
1052 mc_correction_offsets_ptr = m_mc_rel17_leakage_correction_offsets_electron_30;
1053 }
1054 break;
1055 case 40:
1056 if (parttype == PHOTON) {
1057 // photons
1058 if(isConversion) {
1059 // converted
1062 } else {
1063 // unconverted
1066 }
1067 } else {
1068 // electrons
1069 mc_correction_slopes_ptr = m_mc_rel17_leakage_correction_slopes_electron_40;
1070 mc_correction_offsets_ptr = m_mc_rel17_leakage_correction_offsets_electron_40;
1071 }
1072 break;
1073 default:
1074 ATH_MSG_WARNING("Unable to retrieve leakage correction for topoIso cone with radius = " << radius << ".\n--- Radii must be one of {.20, .30, .40} OR {20, 30, 40}.\n");
1075 return 0.;
1076 }
1077
1078 float scale_factor = GetPtCorrectionFactor(etaS2, mc_correction_slopes_ptr, data_correction_slopes_ptr);
1079 float offset = 0.;
1080 if (!mc_correction_offsets_ptr.empty()) offset = GetPtCorrectionFactor(etaS2, mc_correction_offsets_ptr);
1081
1082 //avoid warnings
1083 if(is_mc) is_mc = true;
1084 return offset + GetPtCorrectionValue(energy, etaPointing, etaCluster, scale_factor);
1085
1086 }
1087 //-----------------------------------------------------------------------
1088
1089 //-----------------------------------------------------------------------
1090 // Internal function
1091 // Gets the pt correction factor for topoIso
1092 //
1094 float etaS2, float etaPointing, float etaCluster,
1095 float radius,
1096 bool /*is_mc*/,
1097 bool isConversion, ParticleType parttype, Version ver,
1098 int convFlag_int, int author, float conv_radius, float conv_ratio) const {
1099 double correction_value = 0.;
1100 if (ver== REL17_2) {
1101 correction_value = GetPtCorrection_FromGraph(energy,etaS2,etaPointing,etaCluster,radius,isConversion,parttype);
1102 } else if (m_tool_ver == REL20_2 || m_tool_ver == REL21 || m_tool_ver == REL22){
1103 correction_value = GetPtCorrection_FromGraph_2015(energy, etaS2, radius, convFlag_int, author, conv_radius, conv_ratio, parttype);
1104 }
1105
1106 return correction_value;
1107 }
1108 //-----------------------------------------------------------------------
1109
1110
1111 //-----------------------------------------------------------------------
1112 // Internal function
1113 // Used to retrieve the correct radius
1115 int newrad = 0;
1116 // avoid roundoff errors by adding 0.1
1117 if(radius < 1) newrad = (int)(radius * 100 + 0.1);
1118 else newrad = (int)radius;
1119 return newrad;
1120 }
1121 //-----------------------------------------------------------------------
1122
1123
1124 //-----------------------------------------------------------------------
1125 // Internal function
1126 // Used to retrieve the correct (fine) eta bin number
1127 //
1129 int eta_bin=-1;
1130 float fabs_eta = fabs(eta);
1131 for (unsigned int i=0; i < m_nBinsEtaFine; ++i) {
1132 if ((fabs_eta >= m_eta_bins_fine[i]) && (fabs_eta < m_eta_bins_fine[i+1])) {
1133 eta_bin = i;
1134 break;
1135 }
1136 }
1137 return eta_bin;
1138 }
1139 //-----------------------------------------------------------------------
1140
1141
1142 //-----------------------------------------------------------------------
1143 // Internal function
1144 // Used to retrieve the correct (coarse) eta bin number
1145 //
1147 int eta_bin=-1;
1148 float fabs_eta = fabs(eta);
1149 for (unsigned int i=0; i < m_nBinsEtaCoarse; ++i) {
1150 if ((fabs_eta >= m_eta_bins_coarse[i]) && (fabs_eta < m_eta_bins_coarse[i+1])) {
1151 eta_bin = i;
1152 break;
1153 }
1154 }
1155 return eta_bin;
1156 }
1157 //-----------------------------------------------------------------------
1158
1159 //-----------------------------------------------------------------------
1160 // Internal function
1161 // Returns the appropriate corrections value
1162 //
1164 const std::vector<float>& mc_leakage_corrections_ptr,
1165 const std::vector<float>& data_leakage_corrections_ptr) const {
1166 if(mc_leakage_corrections_ptr.empty() && data_leakage_corrections_ptr.empty())
1167 return 0.;
1168
1169 int eta_bin_fine = GetEtaBinFine(eta);
1170 int eta_bin_coarse = GetEtaBinCoarse(eta);
1171
1172 float correction = 0.;
1173 if (!mc_leakage_corrections_ptr.empty() && (eta_bin_fine >= 0)) correction += mc_leakage_corrections_ptr[eta_bin_fine];
1174 if (!data_leakage_corrections_ptr.empty() && (eta_bin_coarse >= 0)) correction += data_leakage_corrections_ptr[eta_bin_coarse];
1175
1176 return correction;
1177 }
1178 //-----------------------------------------------------------------------
1179
1180 //-----------------------------------------------------------------------
1181 // Internal function
1182 // Does the final pt scaling
1183 float IsolationCorrection::GetPtCorrectionValue(float energy, float etaPointing, float etaCluster, float scale_factor) {
1184 // apply the correction to et
1185 double etaForPt = ((fabs(etaPointing - etaCluster) < 0.15) ? etaPointing : etaCluster);
1186 double et = (fabs(etaForPt)<99.) ? energy/cosh(etaForPt) : 0.;
1187
1188 return scale_factor * et;
1189 }
1190 //-----------------------------------------------------------------------
1191
1192
1193 //-----------------------------------------------------------------------
1194 // Internal function
1195 // Does the correction for REL17_2 from TGraph stored into isolation_leakage_corrections.root file
1196 // Returns the correction value in MeV
1197 float IsolationCorrection::GetPtCorrection_FromGraph(float energy,float etaS2,float etaPointing,float etaCluster,float radius,bool isConversion,ParticleType parttype) const
1198 {
1199 int newrad = GetRadius(radius);
1200 double etaForPt = ((fabs(etaPointing - etaCluster) < 0.15) ? etaPointing : etaCluster);
1201 double et = (fabs(etaForPt)<99.) ? energy/cosh(etaForPt) : 0.;
1202 int etabin = GetEtaBinFine(etaS2);
1203 if( m_corr_file.empty() ){
1204 ATH_MSG_WARNING("IsolationCorrection::GetPtCorrection_FromGraph: the file containing the isolation leakage corrections is not initialized.\nNo correction is applied.\n");
1205 return 0;
1206 }
1207 if (etabin < 0) return 0; // must have eta in fiducial region
1208
1209 if( (etabin == 9 || etabin == 5) && parttype == PHOTON ){
1210 //No correction for photons with |etaS2|>2.37 or 1.37<|etaS2|<1.52
1211 return 0.;
1212 }
1213 double correction_value_mev = -1e6;
1214 switch(newrad){
1215 case 20:
1216 if(parttype == ELECTRON)
1217 correction_value_mev = GeV*m_graph_cone20_electron[etabin]->Eval(et/GeV);
1218 else
1219 if(isConversion) correction_value_mev = GeV*m_graph_cone20_photon_converted[etabin]->Eval(et/GeV);
1220 else correction_value_mev = GeV*m_graph_cone20_photon_unconverted[etabin]->Eval(et/GeV);
1221 break;
1222 case 30:
1223 if(parttype == ELECTRON)
1224 correction_value_mev = GeV*m_graph_cone30_electron[etabin]->Eval(et/GeV);
1225 else
1226 if(isConversion) correction_value_mev = GeV*m_graph_cone30_photon_converted[etabin]->Eval(et/GeV);
1227 else correction_value_mev = GeV*m_graph_cone30_photon_unconverted[etabin]->Eval(et/GeV);
1228 break;
1229 case 40:
1230 if(parttype == ELECTRON)
1231 correction_value_mev = GeV*m_graph_cone40_electron[etabin]->Eval(et/GeV);
1232 else
1233 if(isConversion) correction_value_mev = GeV*m_graph_cone40_photon_converted[etabin]->Eval(et/GeV);
1234 else correction_value_mev = GeV*m_graph_cone40_photon_unconverted[etabin]->Eval(et/GeV);
1235 break;
1236 default:
1237 ATH_MSG_WARNING("Unable to retrieve leakage correction for topoIso cone with radius = " << radius << ".\n--- Radii must be one of {.20, .30, .40} OR {20, 30, 40}.\n");
1238 return 0.;
1239 }
1240 return correction_value_mev;
1241
1242 }
1243
1244 //-----------------------------------------------------------------------
1245 // Internal function
1246 // Does the correction for REL18 from TGraph stored into isolation_ptcorrections.root file
1247 // Returns the correction value in MeV
1248
1249 int IsolationCorrection::GetConversionType(int conversion_flag, float conv_radius, float conv_ratio) {
1250 // ph_convFlag==0
1251 if(conversion_flag == 0) return 0;
1252 // ((ph_convFlag==1)||(ph_convFlag==2&&ph_ptconv_ratio>0.3)||(ph_convFlag==2&&ph_ptconv_ratio<0.3&&ph_truth_Rconv>140.))
1253 if( (conversion_flag == 1) || ((conversion_flag == 2 && conv_ratio > 0.3) || (conversion_flag == 2 && conv_ratio < 0.3 && conv_radius > 140.)) ) return 1;
1254 // (ph_convFlag==2&&ph_ptconv_ratio<0.3&&ph_truth_Rconv<140.)
1255 if(conversion_flag == 2 && conv_radius < 140.) return 2;
1256 return 0;
1257 }
1258
1259 float IsolationCorrection::GetPtCorrection_FromGraph_2015(float energy, float etaS2, float radius, int conversion_flag, int author, float conv_radius, float conv_ratio, ParticleType parttype) const {
1260 int newrad = GetRadius(radius);
1261 double etaForPt = etaS2; //((fabs(etaPointing - etaCluster) < 0.15) ? etaPointing : etaCluster);
1262 double et = energy/cosh(etaForPt); //(fabs(etaForPt)<99.) ? energy/cosh(etaForPt) : 0.;
1263 int etabin = GetEtaBinFine(etaS2);
1264
1265 int conversion_type = 0;
1266 if(parttype == PHOTON) conversion_type = GetConversionType(conversion_flag, conv_radius, conv_ratio);
1267
1268 // for test
1269 if (m_forcePartType && parttype == PHOTON) conversion_type = conv_radius > 800 ? 0 : (conv_radius > 140 ? 1 : 2);
1270
1271 if( m_corr_file.empty() ){
1272 ATH_MSG_WARNING("In IsolationCorrection::GetPtCorrection_FromGraph_2015: the file containing the isolation leakage corrections is not initialized.\nNo correction is applied.\n");
1273 return 0;
1274 }
1275
1276 if (etabin < 0) return 0; // must have eta in fiducial region
1277 if(parttype == PHOTON) if( (etabin == 9 || etabin == 5) ) return 0; // No correction for photons with |etaS2|>2.37 or 1.37<|etaS2|<1.52
1278
1279 double correction_value_mev = 0;
1280
1281 float pt_threshold = 250000.;
1282
1283 //if(parttype == PHOTON) ATH_MSG_INFO("Applying 2015 corrections photon etaBin "<<etabin<<" Pt: "<<et<<" || "<< conversion_type <<" "<< author <<" "<< conv_radius <<" "<< conv_ratio <<"\n");
1284 //else ATH_MSG_INFO("Applying 2015 corrections electron etaBin "<<etabin<<" Pt: "<<et<<" || "<< conversion_type <<" "<< author <<" "<< conv_radius <<" "<< conv_ratio <<"\n");
1285 //TODO: switch author_1 with author_16 in the right places, invert function and histomean
1286 switch(newrad){
1287 case 20:
1288 if(parttype == ELECTRON){
1289 if(author == 1) correction_value_mev = m_function_2015_cone20_author_1_electron[etabin]->Eval(et);
1290 if(author == 16){
1291 if(m_trouble_categories && et < pt_threshold) correction_value_mev = m_graph_histoMean_2015_cone20_author_16_electron[etabin]->Eval(et);
1292 else correction_value_mev = m_function_2015_cone20_author_16_electron[etabin]->Eval(et);
1293 }
1294 }else{
1295 if(conversion_type == 0) correction_value_mev = m_function_2015_cone20_photon_unconverted[etabin]->Eval(et);
1296 if(conversion_type == 1) correction_value_mev = m_function_2015_cone20_photon_converted_ok[etabin]->Eval(et);
1297 if(conversion_type == 2){
1298 if(m_trouble_categories && et < pt_threshold) correction_value_mev = m_graph_histoMean_2015_cone20_photon_converted_trouble[etabin]->Eval(et);
1299 else correction_value_mev = m_function_2015_cone20_photon_converted_trouble[etabin]->Eval(et);
1300 }
1301 }
1302 break;
1303 case 30:
1304 if(parttype == ELECTRON){
1305 if(author == 1) correction_value_mev = m_function_2015_cone30_author_1_electron[etabin]->Eval(et);
1306 if(author == 16) {
1307 if(m_trouble_categories && et < pt_threshold) correction_value_mev = m_graph_histoMean_2015_cone30_author_16_electron[etabin]->Eval(et);
1308 else correction_value_mev = m_function_2015_cone30_author_16_electron[etabin]->Eval(et);
1309 }
1310 }else{
1311 if(conversion_type == 0) correction_value_mev = m_function_2015_cone30_photon_unconverted[etabin]->Eval(et);
1312 if(conversion_type == 1) correction_value_mev = m_function_2015_cone30_photon_converted_ok[etabin]->Eval(et);
1313 if(conversion_type == 2){
1314 if(m_trouble_categories && et < pt_threshold) correction_value_mev = m_graph_histoMean_2015_cone30_photon_converted_trouble[etabin]->Eval(et);
1315 else correction_value_mev = m_function_2015_cone30_photon_converted_trouble[etabin]->Eval(et);
1316 }
1317 }
1318 break;
1319 case 40:
1320 if(parttype == ELECTRON){
1321 if(author == 1) correction_value_mev = m_function_2015_cone40_author_1_electron[etabin]->Eval(et);
1322 if(author == 16){
1323 if(m_trouble_categories && et < pt_threshold) correction_value_mev = m_graph_histoMean_2015_cone40_author_16_electron[etabin]->Eval(et);
1324 else correction_value_mev = m_function_2015_cone40_author_16_electron[etabin]->Eval(et);
1325 }
1326 }else{
1327 if(conversion_type == 0) correction_value_mev = m_function_2015_cone40_photon_unconverted[etabin]->Eval(et);
1328 if(conversion_type == 1) correction_value_mev = m_function_2015_cone40_photon_converted_ok[etabin]->Eval(et);
1329 if(conversion_type == 2){
1330 if(m_trouble_categories && et < pt_threshold) correction_value_mev = m_graph_histoMean_2015_cone40_photon_converted_trouble[etabin]->Eval(et);
1331 else correction_value_mev = m_function_2015_cone40_photon_converted_trouble[etabin]->Eval(et);
1332 }
1333 }
1334 break;
1335 default:
1336 ATH_MSG_WARNING("Unable to retrieve leakage correction for topoIso cone with radius = " << radius << ".\n--- Radii must be one of {.20, .30, .40} OR {20, 30, 40}.\n");
1337 return 0.;
1338 }
1339 //ATH_MSG_INFO(" Correction: "<< correction_value_mev <<"\n");
1340 if (et > 20e3)
1341 ATH_MSG_VERBOSE("Electron ? " << (parttype == ELECTRON) << " author / conversion type = " << (parttype == ELECTRON ? author : conversion_type) << " et = " << et << " eta = " << etaS2 << " etabin = " << etabin << " correction: "<< correction_value_mev);
1342 return correction_value_mev;
1343 }
1344
1346 ATH_MSG_INFO("Print properties of the parametrisation");
1348 ATH_MSG_INFO("ptr = " << i);
1349 if (i) {
1350 ATH_MSG_INFO(typeid(i).name());
1351 i->Print();
1352 }
1353 }
1354 }
1355
1356
1357}
#define M_PI
Scalar eta() const
pseudorapidity method
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
#define ATH_MSG_INFO(x,...)
#define gr
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
void SetTroubleCategories(bool trouble_categories)
float GetPtCorrection(const xAOD::Egamma &, const xAOD::Iso::IsolationType) const
IsolationCorrection(const std::string &name)
float GetPtCorrectionFactor(float eta, const std::vector< float > &mc_leakage_corrections_ptr=std::vector< float >(), const std::vector< float > &data_leakage_corrections_ptr=std::vector< float >()) const
float GetPtCorrectionTopo(float energy, float etaS2, float etaPointing, float etaCluster, float radius, bool is_mc=true, bool isConversion=false, ParticleType parttype=ELECTRON, Version ver=REL17_2, int convFlag_int=0, int author=0, float conv_radius=0., float conv_ratio=0.) const
void SetToolVer(CP::IsolationCorrection::Version)
static int GetConversionType(int conversion_flag, float conv_radius, float conv_ratio)
float GetPtCorrectedTopoIsolation(float energy, float etaS2, float etaPointing, float etaCluster, float radius, bool is_mc, float Etcone_value, bool isConversion=false, ParticleType parttype=ELECTRON, Version ver=REL17_2)
StatusCode setupDD(const std::string &year)
int GetEtaBinFine(float eta) const
float GetPtCorrectedIsolation(const xAOD::Egamma &, const xAOD::Iso::IsolationType) const
void SetCorrectionFile(const std::string &corr_file, const std::string &corr_ddshift_file, const std::string &corr_ddsmearing_file)
float GetDDCorrection(const xAOD::Egamma &, const xAOD::Iso::IsolationType, const std::string &year)
void SetCorrectEtcone(bool correct_etcone)
int GetEtaBinCoarse(float eta) const
float GetPtCorrection_FromGraph(float energy, float etaS2, float etaPointing, float etaCluster, float radius, bool isConversion, ParticleType parttype) const
float GetEtaPointing(const xAOD::Egamma *)
static float getPtAtFirstMeasurement(const xAOD::TrackParticle *tp)
static int GetRadius(float radius)
static float GetPtCorrectionValue(float energy, float etaPointing, float etaCluster, float scale_factor)
float GetPtCorrection_FromGraph_2015(float energy, float etaS2, float radius, int conversion_flag, int author, float conv_radius, float conv_ratio, ParticleType parttype) const
Helper class to provide type-safe access to aux data.
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
AsgMessaging(const std::string &name)
Constructor with a name.
bool msgLvl(const MSG::Level lvl) const
Test the output level of the object.
bool eventType(EventType type) const
Check for one particular bitmask value.
@ IS_SIMULATION
true: simulation, false: data
const xAOD::Vertex * vertex(size_t index=0) const
Pointer to the xAOD::Vertex/es that match the photon candidate.
Definition Photon_v1.cxx:61
float parameterPX(unsigned int index) const
Returns the parameter x momentum component, for 'index'.
float parameterPY(unsigned int index) const
Returns the parameter y momentum component, for 'index'.
xAOD::ParameterPosition parameterPosition(unsigned int index) const
Return the ParameterPosition of the parameters at 'index'.
size_t numberOfParameters() const
Returns the number of additional parameters stored in the TrackParticle.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
const TrackParticle * trackParticle(size_t i) const
Get the pointer to a given track that was used in vertex reco.
Select isolated Photons, Electrons and Muons.
@ Electron
The object is an electron.
Definition ObjectType.h:46
xAOD::EgammaParameters::ConversionType conversionType(const xAOD::Photon *ph)
return the photon conversion type (see EgammaEnums)
float conversionRadius(const xAOD::Vertex *vx)
return the conversion radius or 9999.
IsolationFlavour isolationFlavour(IsolationType type)
convert Isolation Type into Isolation Flavour
IsolationType
Overall enumeration for isolation types in xAOD files.
@ topoetcone20
Topo-cluster ET-sum.
@ topoetcone
Topo-cluster ET-sum.
float coneSize(IsolationConeSize type)
convert Isolation Size into cone size
setScale setgFexType iEta
EventInfo_v1 EventInfo
Definition of the latest event info version.
setRawEt setRawPhi int
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Vertex_v1 Vertex
Define the latest version of the vertex class.
Egamma_v1 Egamma
Definition of the current "egamma version".
Definition Egamma.h:17
Photon_v1 Photon
Definition of the current "egamma version".
@ FirstMeasurement
Parameter defined at the position of the 1st measurement.
#define unlikely(x)