Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
JESCalibStep.cxx
Go to the documentation of this file.
1 
3 /*
4  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
5 */
6 
7 // EtaMassJESCalibStep.cxx
8 // Implementation file for class EtaMassJESCalibStep
9 // Author: Max Swiatlowski <mswiatlo@cern.ch>
11 
14 
15 #include "TFile.h"
16 
18 
20  : asg::AsgTool( name ){ }
21 
22 
24  ATH_MSG_DEBUG ("Initializing " << name() << " Use spline="<<m_useSpline);
25 
26  if(! m_useSpline){
27  if(!readMCJESFromText()) {
28  ATH_MSG_ERROR("Problem when reading constant file : "<< m_constantFileName);
29  return StatusCode::FAILURE;
30  }
31  } else { // use spline
32  if(!readMCJESFromHists()) {
33  ATH_MSG_ERROR("Problem when reading constant file : "<< m_histoFileName);
34  return StatusCode::FAILURE;
35  }
36  }
37 
38  ATH_CHECK( m_vartoolE.retrieve() );
39  ATH_CHECK( m_vartoolEta.retrieve() );
40 
41  return StatusCode::SUCCESS;
42 }
43 
45  ATH_MSG_DEBUG("Calibrating jet collection.");
46 
47 
48  // Change this to EtaMassJES? Or only if Mass is applied?
49  const xAOD::JetAttributeAccessor::AccessorWrapper<xAOD::JetFourMom_t> jesScaleMomAcc("JetEtaJESScaleMomentum");
50 
51  for(xAOD::Jet* jet: jets){
52 
53  const xAOD::JetFourMom_t jetStartP4 = jet->jetP4();
54 
55  // Extract the maximum energy, and store in the context
57  double varE {m_vartoolE->getValue(*jet,jc)};
58  double varEta {m_vartoolEta->getValue(*jet,jc)};
59  double Emax = getEmaxJES(varEta);
60 
61  // Extract JES from the text handling tool
62  double jesCorrection = getJES(varE, varEta, Emax);
63  int ieta=getEtaBin(varEta);
64 
65 
66  xAOD::JetFourMom_t calibP4 = jetStartP4 * jesCorrection;
67 
68 
69  const float etaCorr = calibP4.eta() + getEtaCorr(jesCorrection*varE, varEta) ; //m_textTool_Eta->getValue(*jet, jc);
70  ATH_MSG_DEBUG("eta = "<<etaCorr);
71 
72  // Apply the eta correction, use TLV from ROOT to do some math for us
73  TLorentzVector TLVjet;
74  TLVjet.SetPtEtaPhiM( calibP4.P()/cosh(etaCorr), etaCorr, calibP4.phi(), calibP4.M() );
75  calibP4.SetPxPyPzE( TLVjet.Px(), TLVjet.Py(), TLVjet.Pz(), TLVjet.E() );
76  ATH_MSG_DEBUG("JES = "<<jesCorrection << " e="<<varE << " eta="<<jetStartP4.Eta()<< " ieta="<< ieta << " post_pt= ="<< calibP4.Pt() << " etaCorr="<< etaCorr);
77 
78  // Set the decorations of this scale
79  jesScaleMomAcc.setAttribute(*jet, calibP4);
80  jet->setJetP4(calibP4);
81  }
82 
83  return StatusCode::SUCCESS;
84 }
85 
86 
88 {
89  // Open the input file
90  std::string local_path=static_cast<std::string> (m_constantFileName);
92  if(fileName=="") return false;
93 
94  TEnv config(fileName.c_str());
95 
96  std::string jetAlgo=static_cast<std::string> (m_jetAlgo);
97 
98  std::vector<double> etaBins = VectorizeD(config.GetValue("JES.EtaBins","")," ");
99  if (etaBins.size()==0){ // default binning
100  for (int i=0;i<=90; i++)
101  etaBins.push_back(0.1*i-4.5);
102  }
103 
104  ATH_MSG_DEBUG("Number eta bins: " << etaBins.size());
105 
106  m_etaBinAxis = new TAxis(etaBins.size()-1,&etaBins[0]);// this is to search for eta bin
107 
108  for (uint ieta=0; ieta<etaBins.size()-1; ++ieta)
109  {
110  TString key=Form("JES.%s_Bin%d",jetAlgo.c_str(),ieta);
111  ATH_MSG_VERBOSE("reading: " << key << " = "<< config.GetValue(key,""));
112  std::vector<double> params = VectorizeD(config.GetValue(key,"")," ");
113  m_nPar = params.size();
114  ATH_MSG_VERBOSE("Number of parameters: " << m_nPar);
115  for (uint ipar=0;ipar<m_nPar;++ipar) m_JESFactors[ieta][ipar] = params[ipar];
116  if(m_lowPtExtrap > 0) {
117  //Calculate the slope of the response curve at the minPt for each eta bin
118  //Used in the GetLowPtJES method when Pt < minPt
119  const double *factors = m_JESFactors[ieta];
120  double Ecutoff = m_minPt_JES*cosh(etaBins[ieta]);
121  const double Rcutoff = getLogPolN(factors,Ecutoff);
122  const double Slope = getLogPolNSlope(factors,Ecutoff);
123  if(Slope > Rcutoff/Ecutoff) ATH_MSG_FATAL("Slope of calibration curve at minimum ET is too steep for the JES factors of etabin " << ieta << ", eta = " << etaBins[ieta] );
124 
125  m_JES_MinPt_E[ieta] = Ecutoff;
126  m_JES_MinPt_R[ieta] = Rcutoff;
127  m_JES_MinPt_Slopes[ieta] = Slope;
128 
129  //Calculate the parameters for a 2nd order polynomial extension to the calibration curve below minimum ET
130  //Used in the GetLowPtJES method when Pt < minPt
131  if(m_lowPtExtrap == 2) {
132  ATH_MSG_ERROR("LowPtJESExtrapolationMethod==2 not supported yet");
133  return false;
134  }
135  }
136 
137 
138  key=Form("EtaCorr.%s_Bin%d",jetAlgo.c_str(),ieta);
139  ATH_MSG_VERBOSE("reading: " << key << " = "<< config.GetValue(key,""));
140  params = VectorizeD(config.GetValue(key,"")," ");
141  m_nPar = params.size();
142  ATH_MSG_VERBOSE("Number of parameters: " << m_nPar);
143  for (uint ipar=0;ipar<m_nPar;++ipar) m_etaCorrFactors[ieta][ipar] = params[ipar];
144 
145  key=Form("EmaxJES.%s_Bin%d",jetAlgo.c_str(),ieta);
146  ATH_MSG_VERBOSE("reading: " << key << " = "<< config.GetValue(key,""));
147  params = VectorizeD(config.GetValue(key,"")," ");
148  m_energyFreezeJES[ieta] = params[0];
149  }
150  return true;
151 }
152 
153 
154 
156 {
157  // Open the input file
158  std::string local_path=static_cast<std::string> (m_constantFileName);
160 
161  TEnv config(fileName.c_str());
162  if(fileName=="") return false;
163 
164  std::string jetAlgo=static_cast<std::string> (m_jetAlgo);
165 
166  std::vector<double> etaBins = VectorizeD(config.GetValue("JES.EtaBins","")," ");
167  if (etaBins.size()==0){ // default binning
168  for (int i=0;i<=90; i++)
169  etaBins.push_back(0.1*i-4.5);
170  }
171 
172  ATH_MSG_DEBUG("Number eta bins: " << etaBins.size());
173 
174  m_etaBinAxis = new TAxis(etaBins.size()-1,&etaBins[0]);// this is to search for eta bin
175 
176  std::string calibHistFile = PathResolverFindCalibFile(m_histoFileName);
177  loadSplineHists(calibHistFile, "etaJes");
178 
179  //Protections for high order extrapolation methods at low Et (Et < _minPt_JES)
180  if(m_lowPtExtrap != 1) {
181  ATH_MSG_ERROR("Only linear extrapolations are supported for p-splines currently. Please change the config file to reflect this");
182  return false;
183  }
184 
185  for (uint ieta=0;ieta<etaBins.size()-1;++ieta) {
186  //Calculate the slope of the response curve at the minPt for each eta bin
187  //Used in the GetLowPtJES method when Pt < minPt
188  double Ecutoff= m_minPt_JES*cosh(etaBins[ieta]);
189  const double Rcutoff = getSplineCorr(ieta, Ecutoff);
190  const double Slope = getSplineSlope(ieta, Ecutoff);
191  if(Slope > Rcutoff/Ecutoff) ATH_MSG_WARNING("Slope of calibration curve at minimum ET is too steep for the JES factors of etabin " << ieta << ", eta = " << etaBins[ieta] );
192 
193  m_JES_MinPt_E[ieta] = Ecutoff;
194  m_JES_MinPt_R[ieta] = Rcutoff;
195  m_JES_MinPt_Slopes[ieta] = Slope;
196 
197  TString key=Form("EmaxJES.%s_Bin%d",jetAlgo.c_str(),ieta);
198  ATH_MSG_VERBOSE("reading: " << key << " = "<< config.GetValue(key,""));
199  std::vector<double> params = VectorizeD(config.GetValue(key,"")," ");
200  m_energyFreezeJES[ieta] = params[0];
201 
202  key=Form("EtaCorr.%s_Bin%d",jetAlgo.c_str(),ieta);
203  ATH_MSG_VERBOSE("reading: " << key << " = "<< config.GetValue(key,""));
204  params = VectorizeD(config.GetValue(key,"")," ");
205  m_nPar = params.size();
206  ATH_MSG_VERBOSE("Number of parameters: " << m_nPar);
207  for (uint ipar=0;ipar<m_nPar;++ipar) m_etaCorrFactors[ieta][ipar] = params[ipar];
208 
209 
210  }
211  return true;
212 }
213 
214 
215 double EtaMassJESCalibStep::getJES(const double X, const double Y, const double Emax) const
216 {
217 
218  if ( X/cosh(Y) < m_minPt_JES ) { // WARNING !! Won't work if X is actually pT
219  double R = getLowPtJES(X,Y);
220  return 1.0/R;
221  }
222 
223  double JES_R;
224  int binEta = getEtaBin(Y);
225  const double *factors = m_JESFactors[binEta];
226 
227 
228  double E = X;
229  if( m_freezeJESatHighE && (E>Emax) && (Emax!=-1)) {
230  E = Emax;
231  }
232 
233  double R = 1.;
234 
235  if(m_useSpline){
236  R = getSplineCorr(binEta, E);
237  return 1.0/R;
238  } else {
239  R = getLogPolN(factors,E);
240  }
241 
242  JES_R = 1/R;
243 
244  return JES_R;
245 }
246 
247 
248 double EtaMassJESCalibStep::getLowPtJES(double E_uncorr, double eta_det) const {
249  int ieta = getEtaBin(eta_det);
250  double R=1;
251  // This correspond to m_lowPtExtrap == 0 in the old EtaJESCorrection tool. Not supporting other cases yet.
252  if (m_lowPtExtrap == 0) {
253  const double *factors = m_JESFactors[ieta];
254  double E = m_minPt_JES*cosh(eta_det);
255  R= getLogPolN(factors,E);
256  } if (m_lowPtExtrap == 1) {
257  double Ecutoff = m_JES_MinPt_E[ieta];
258  double Rcutoff = m_JES_MinPt_R[ieta];
259  double slope = m_JES_MinPt_Slopes[ieta];
260  R = slope*(E_uncorr-Ecutoff)+Rcutoff;
261  }
262  else ATH_MSG_WARNING("Incorrect specification of low Pt JES extrapolation, please check the value of the LowPtJESExtrapolationMethod config flag.");
263 
264  return R;
265 }
266 
267 
268 double EtaMassJESCalibStep::getEtaCorr( double X, double Y) const
269 {
270  int binEta = getEtaBin(Y);
271  const double *factors = m_etaCorrFactors[binEta];
272 
273  if ( X < m_minPt_EtaCorr*cosh(Y) )
274  X = m_minPt_EtaCorr*cosh(Y);
276 
277  double eta_corr = getLogPolN(factors,X);
278 
279  return -eta_corr;
280 }
281 
282 double EtaMassJESCalibStep::getEmaxJES(const double Y) const
283 {
284  int binEta = getEtaBin(Y);
285  double emaxJES = m_energyFreezeJES[binEta];
286 
287  return emaxJES;
288 }
289 
290 double EtaMassJESCalibStep::getLogPolN(const double *factors, double x) const
291 {
292  double y=0;
293  for ( uint i=0; i<m_nPar; ++i )
294  y += factors[i]*TMath::Power(log(x),Int_t(i));
295  return y;
296 }
297 
298 
299 
300 int EtaMassJESCalibStep::getEtaBin(double eta_det) const
301 {
302  int bin = std::as_const(m_etaBinAxis)->FindBin(eta_det);
303  if (bin<=0) return 0;
304  if (bin>m_etaBinAxis->GetNbins()) return bin-2; // overflow
305  return bin-1;
306 }
307 
308 double EtaMassJESCalibStep::getLogPolNSlope(const double *factors, double x) const {
309  double y=0;
310  const double inv_x = 1. / x;
311  for ( uint i=0; i<m_nPar; ++i )
312  y += i*factors[i]*TMath::Power(log(x),Int_t(i-1))*inv_x;
313  return y;
314 }
315 
316 
317 void EtaMassJESCalibStep::loadSplineHists(const std::string & fileName, const std::string &etajes_name)
318 {
319  std::unique_ptr<TFile> tmpF(TFile::Open( fileName.c_str() ));
320  TList *etajes_l = static_cast<TList*>( tmpF->Get(etajes_name.c_str()));
321 
322  m_etajesFactors.resize( etajes_l->GetSize() );
323  if(etajes_l->GetSize() != m_etaBinAxis->GetNbins()+1){
324  ATH_MSG_WARNING("Do not have the correct number of eta bins for " << fileName << "\t" << etajes_name << "\t" << etajes_l->GetSize() );
325  }
326 
327  for(int i=0 ; i<m_etaBinAxis->GetNbins(); i++){
328  auto *pTH1 = dynamic_cast<TH1*>(etajes_l->At(i));
329  if (not pTH1) continue;
330  m_etajesFactors[i].reset(pTH1);
331  m_etajesFactors[i]->SetDirectory(nullptr);
332  }
333  tmpF->Close();
334 }
335 
336 
337 double EtaMassJESCalibStep::getSplineSlope(const int ieta, const double minE) const {
338  // Don't want to use interpolation here, so instead just use the values at the bin centers near the cutoff
339  int minBin = m_etajesFactors[ieta]->FindBin(minE);
340 
341  double rFirst = m_etajesFactors[ ieta ]->GetBinContent(minBin);
342  double rSecond = m_etajesFactors[ ieta ]->GetBinContent(minBin+1);
343  double binWidth = m_etajesFactors[ ieta ]->GetBinCenter(minBin+1) - m_etajesFactors[ ieta ]->GetBinCenter(minBin);
344  double slope = (rSecond - rFirst) / binWidth;
345 
346  return slope;
347 }
348 
349 
350 double EtaMassJESCalibStep::getSplineCorr(const int etaBin, double E) const {
351  double R = m_etajesFactors[ etaBin ]->Interpolate(E);
352  return R;
353 }
EtaMassJESCalibStep::initialize
virtual StatusCode initialize() override
Dummy implementation of the initialisation function.
Definition: JESCalibStep.cxx:23
EtaMassJESCalibStep::m_etaBinAxis
TAxis * m_etaBinAxis
Definition: JESCalibStep.h:96
EtaMassJESCalibStep::getEtaBin
int getEtaBin(double eta_det) const
Definition: JESCalibStep.cxx:300
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
EtaMassJESCalibStep::m_nPar
unsigned int m_nPar
Definition: JESCalibStep.h:85
EtaMassJESCalibStep::m_JES_MinPt_R
double m_JES_MinPt_R[s_nEtaBins]
Definition: JESCalibStep.h:93
JetHelper::JetContext
Class JetContext Designed to read AOD information related to the event, N vertices,...
Definition: JetContext.h:24
EtaMassJESCalibStep::m_etaCorrFactors
double m_etaCorrFactors[s_nEtaBins][s_nParMax]
Definition: JESCalibStep.h:89
xAOD::JetAttributeAccessor::AccessorWrapper::setAttribute
void setAttribute(SG::AuxElement &p, const TYPE &v) const
Definition: JetAccessors.h:54
EtaMassJESCalibStep::EtaMassJESCalibStep
EtaMassJESCalibStep(const std::string &name="EtaMassJESCalibStep")
Definition: JESCalibStep.cxx:19
python.base_data.config
config
Definition: base_data.py:21
ConvertOldUJHistosToNewHistos.etaBins
list etaBins
Definition: ConvertOldUJHistosToNewHistos.py:145
EtaMassJESCalibStep::m_energyFreezeJES
double m_energyFreezeJES[s_nEtaBins]
Definition: JESCalibStep.h:90
asg
Definition: DataHandleTestTool.h:28
bin
Definition: BinsDiffFromStripMedian.h:43
defineDB.jets
jets
Definition: JetTagCalibration/share/defineDB.py:24
EtaMassJESCalibStep::getLowPtJES
double getLowPtJES(double E_uncorr, double eta_det) const
deal with low pt jets
Definition: JESCalibStep.cxx:248
EtaMassJESCalibStep::getEtaCorr
double getEtaCorr(double X, double Y=0) const
return Eta correction
Definition: JESCalibStep.cxx:268
Trk::binEta
@ binEta
Definition: BinningType.h:54
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
x
#define x
binWidth
void binWidth(TH1 *h)
Definition: listroot.cxx:80
EtaMassJESCalibStep::m_jetAlgo
Gaudi::Property< std::string > m_jetAlgo
jet collection to be calibrated
Definition: JESCalibStep.h:67
EtaMassJESCalibStep::m_lowPtExtrap
Gaudi::Property< float > m_lowPtExtrap
Definition: JESCalibStep.h:70
config
Definition: PhysicsAnalysis/AnalysisCommon/AssociationUtils/python/config.py:1
Monitored::X
@ X
Definition: HistogramFillerUtils.h:24
EtaMassJESCalibStep::m_JESFactors
double m_JESFactors[s_nEtaBins][s_nParMax]
Definition: JESCalibStep.h:88
JESCalibStep.h
EtaMassJESCalibStep::loadSplineHists
void loadSplineHists(const std::string &fileName, const std::string &etajes_name)
Definition: JESCalibStep.cxx:317
EtaMassJESCalibStep::calibrate
virtual StatusCode calibrate(xAOD::JetContainer &) const override
Apply calibration to a jet container.
Definition: JESCalibStep.cxx:44
EtaMassJESCalibStep::getSplineCorr
double getSplineCorr(const int etaBin, double E) const
Definition: JESCalibStep.cxx:350
EtaMassJESCalibStep::m_JES_MinPt_E
double m_JES_MinPt_E[s_nEtaBins]
Definition: JESCalibStep.h:92
uint
unsigned int uint
Definition: LArOFPhaseFill.cxx:20
xAOD::etaBin
setSAddress setEtaMS setDirPhiMS setDirZMS setBarrelRadius setEndcapAlpha setEndcapRadius setInterceptInner setEtaMap etaBin
Definition: L2StandAloneMuon_v1.cxx:148
jet
Definition: JetCalibTools_PlotJESFactors.cxx:23
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:85
EtaMassJESCalibStep::getJES
double getJES(const double X, const double Y=0, const double Emax=-1) const
return MCJES calibration factor
Definition: JESCalibStep.cxx:215
EtaMassJESCalibStep::getLogPolNSlope
double getLogPolNSlope(const double *factors, double x) const
Definition: JESCalibStep.cxx:308
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
EtaMassJESCalibStep::m_JES_MinPt_Slopes
double m_JES_MinPt_Slopes[s_nEtaBins]
Definition: JESCalibStep.h:91
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
EtaMassJESCalibStep::m_minPt_JES
Gaudi::Property< float > m_minPt_JES
Definition: JESCalibStep.h:68
EtaMassJESCalibStep::m_vartoolEta
ToolHandle< JetHelper::IVarTool > m_vartoolEta
interface for xAOD::jet variable to be defined by user, this must correspond to jet Eta in currect ve...
Definition: JESCalibStep.h:82
AnalysisUtils::Delta::R
double R(const INavigable4Momentum *p1, const double v_eta, const double v_phi)
Definition: AnalysisMisc.h:49
EtaMassJESCalibStep::m_maxE_EtaCorr
Gaudi::Property< float > m_maxE_EtaCorr
Definition: JESCalibStep.h:74
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
EtaMassJESCalibStep::readMCJESFromHists
bool readMCJESFromHists()
Definition: JESCalibStep.cxx:155
Monitored::Y
@ Y
Definition: HistogramFillerUtils.h:24
EtaMassJESCalibStep::m_vartoolE
ToolHandle< JetHelper::IVarTool > m_vartoolE
Definition: JESCalibStep.h:80
xAOD::JetFourMom_t
ROOT::Math::LorentzVector< ROOT::Math::PtEtaPhiM4D< double > > JetFourMom_t
Base 4 Momentum type for Jet.
Definition: JetTypes.h:17
EtaMassJESCalibStep::getLogPolN
double getLogPolN(const double *factors, double x) const
Definition: JESCalibStep.cxx:290
PathResolver.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
VP1PartSpect::E
@ E
Definition: VP1PartSpectFlags.h:21
EtaMassJESCalibStep::readMCJESFromText
bool readMCJESFromText()
Definition: JESCalibStep.cxx:87
EtaMassJESCalibStep::m_minPt_EtaCorr
Gaudi::Property< float > m_minPt_EtaCorr
Definition: JESCalibStep.h:73
PathResolverFindCalibFile
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
Definition: PathResolver.cxx:431
EtaMassJESCalibStep::m_histoFileName
Gaudi::Property< std::string > m_histoFileName
Definition: JESCalibStep.h:76
xAOD::Jet_v1
Class describing a jet.
Definition: Jet_v1.h:57
y
#define y
GlobalVariables.Emax
Emax
Definition: GlobalVariables.py:185
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
xAOD::JetAttributeAccessor::AccessorWrapper< xAOD::JetFourMom_t >
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
EtaMassJESCalibStep::m_useSpline
Gaudi::Property< bool > m_useSpline
Definition: JESCalibStep.h:77
EtaMassJESCalibStep::getEmaxJES
double getEmaxJES(const double Y) const
return Emax
Definition: JESCalibStep.cxx:282
JetCalibUtils::VectorizeD
VecD VectorizeD(const TString &str, const TString &sep=" ")
Definition: JetCalibUtils.cxx:25
jobOptions.fileName
fileName
Definition: jobOptions.SuperChic_ALP2.py:39
PowhegControl_ttFCNC_NLO.params
params
Definition: PowhegControl_ttFCNC_NLO.py:226
EtaMassJESCalibStep::getSplineSlope
double getSplineSlope(const int ieta, const double minE) const
Definition: JESCalibStep.cxx:337
EtaMassJESCalibStep::m_constantFileName
Gaudi::Property< std::string > m_constantFileName
name of the text file
Definition: JESCalibStep.h:65
EtaMassJESCalibStep::m_etajesFactors
std::vector< std::unique_ptr< TH1 > > m_etajesFactors
Definition: JESCalibStep.h:98
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
EtaMassJESCalibStep::m_freezeJESatHighE
Gaudi::Property< bool > m_freezeJESatHighE
Definition: JESCalibStep.h:69