CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
List of all members | Public Member Functions | Public Attributes
JetReCalibrator.JetReCalibrator Class Reference

Public Member Functions

def __init__
 
def correct
 
def correctAll
 
def getCorrection
 
def rawP4forType1MET_
 

Public Attributes

 calculateType1METCorr
 
 doResidualJECs
 
 globalTag
 
 jecPath
 
 JetCorrector
 
 jetFlavour
 
 JetUncertainty
 
 L1JetPar
 
 L2JetPar
 
 L3JetPar
 
 ResJetPar
 
 separateJetCorrectors
 
 type1METParams
 
 upToLevel
 
 vPar
 
 vParL1
 
 vParL2
 
 vParL3
 
 vParL3Res
 

Detailed Description

Definition at line 8 of file JetReCalibrator.py.

Constructor & Destructor Documentation

def JetReCalibrator.JetReCalibrator.__init__ (   self,
  globalTag,
  jetFlavour,
  doResidualJECs,
  jecPath,
  upToLevel = 3,
  calculateSeparateCorrections = False,
  calculateType1METCorrection = False,
  type1METParams = {'jetPtThreshold':15.,
  skipEMfractionThreshold 
)

Definition at line 11 of file JetReCalibrator.py.

11 
12  calculateType1METCorrection=False, type1METParams={'jetPtThreshold':15., 'skipEMfractionThreshold':0.9, 'skipMuons':True} ):
13  """Create a corrector object that reads the payloads from the text dumps of a global tag under
14  CMGTools/RootTools/data/jec (see the getJec.py there to make the dumps).
15  It will apply the L1,L2,L3 and possibly the residual corrections to the jets.
16  If configured to do so, it will also compute the type1 MET corrections."""
17  self.globalTag = globalTag
18  self.jetFlavour = jetFlavour
19  self.doResidualJECs = doResidualJECs
20  self.jecPath = jecPath
21  self.upToLevel = upToLevel
22  self.calculateType1METCorr = calculateType1METCorrection
23  self.type1METParams = type1METParams
24  # Make base corrections
25  path = os.path.expandvars(jecPath) #"%s/src/CMGTools/RootTools/data/jec" % os.environ['CMSSW_BASE'];
26  self.L1JetPar = ROOT.JetCorrectorParameters("%s/%s_L1FastJet_%s.txt" % (path,globalTag,jetFlavour),"");
27  self.L2JetPar = ROOT.JetCorrectorParameters("%s/%s_L2Relative_%s.txt" % (path,globalTag,jetFlavour),"");
28  self.L3JetPar = ROOT.JetCorrectorParameters("%s/%s_L3Absolute_%s.txt" % (path,globalTag,jetFlavour),"");
29  self.vPar = ROOT.vector(ROOT.JetCorrectorParameters)()
30  self.vPar.push_back(self.L1JetPar);
31  if upToLevel >= 2: self.vPar.push_back(self.L2JetPar);
32  if upToLevel >= 3: self.vPar.push_back(self.L3JetPar);
33  # Add residuals if needed
34  if doResidualJECs :
35  self.ResJetPar = ROOT.JetCorrectorParameters("%s/%s_L2L3Residual_%s.txt" % (path,globalTag,jetFlavour))
36  self.vPar.push_back(self.ResJetPar);
37  #Step3 (Construct a FactorizedJetCorrector object)
38  self.JetCorrector = ROOT.FactorizedJetCorrector(self.vPar)
39  if os.path.exists("%s/%s_Uncertainty_%s.txt" % (path,globalTag,jetFlavour)):
40  self.JetUncertainty = ROOT.JetCorrectionUncertainty("%s/%s_Uncertainty_%s.txt" % (path,globalTag,jetFlavour));
41  elif os.path.exists("%s/Uncertainty_FAKE.txt" % path):
42  self.JetUncertainty = ROOT.JetCorrectionUncertainty("%s/Uncertainty_FAKE.txt" % path);
43  else:
44  print('Missing JEC uncertainty file "%s/%s_Uncertainty_%s.txt", so jet energy uncertainties will not be available' % (path,globalTag,jetFlavour))
45  self.JetUncertainty = None
46  self.separateJetCorrectors = {}
47  if calculateSeparateCorrections or calculateType1METCorrection:
48  self.vParL1 = ROOT.vector(ROOT.JetCorrectorParameters)()
49  self.vParL1.push_back(self.L1JetPar)
50  self.separateJetCorrectors["L1"] = ROOT.FactorizedJetCorrector(self.vParL1)
51  if upToLevel >= 2 and calculateSeparateCorrections:
52  self.vParL2 = ROOT.vector(ROOT.JetCorrectorParameters)()
53  for i in [self.L1JetPar,self.L2JetPar]: self.vParL2.push_back(i)
54  self.separateJetCorrectors["L1L2"] = ROOT.FactorizedJetCorrector(self.vParL2)
55  if upToLevel >= 3 and calculateSeparateCorrections:
56  self.vParL3 = ROOT.vector(ROOT.JetCorrectorParameters)()
57  for i in [self.L1JetPar,self.L2JetPar,self.L3JetPar]: self.vParL3.push_back(i)
58  self.separateJetCorrectors["L1L2L3"] = ROOT.FactorizedJetCorrector(self.vParL3)
59  if doResidualJECs and calculateSeparateCorrections:
60  self.vParL3Res = ROOT.vector(ROOT.JetCorrectorParameters)()
61  for i in [self.L1JetPar,self.L2JetPar,self.L3JetPar,self.ResJetPar]: self.vParL3Res.push_back(i)
62  self.separateJetCorrectors["L1L2L3Res"] = ROOT.FactorizedJetCorrector(self.vParL3Res)
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47

Member Function Documentation

def JetReCalibrator.JetReCalibrator.correct (   self,
  jet,
  rho,
  delta = 0,
  addCorr = False,
  addShifts = False,
  metShift = [0,
  type1METCorr = [0 
)
Corrects a jet energy (optionally shifting it also by delta times the JEC uncertainty)

   If addCorr, set jet.corr to the correction.
   If addShifts, set also the +1 and -1 jet shifts 

   The metShift vector will accumulate the x and y changes to the MET from the JEC, i.e. the 
   negative difference between the new and old jet momentum, for jets eligible for type1 MET 
   corrections, and after subtracting muons. The pt cut is applied to the new corrected pt.
   This shift can be applied on top of the *OLD TYPE1 MET*, but only if there was no change 
   in the L1 corrections nor in the definition of the type1 MET (e.g. jet pt cuts).

   The type1METCorr vector, will accumulate the x, y, sumEt type1 MET corrections, to be
   applied to the *RAW MET* (if the feature was turned on in the constructor of the class).

Definition at line 98 of file JetReCalibrator.py.

References JetReCalibrator.JetReCalibrator.calculateType1METCorr, CastorPulseContainmentCorrection.getCorrection(), HcalPulseContainmentCorrection.getCorrection(), AddCorrectionsToGenericMET.getCorrection(), FactorizedJetCorrector.getCorrection(), JetReCalibrator.JetReCalibrator.getCorrection(), JetCorrExtractorT< T >.getCorrection(), FactorizedJetCorrectorCalculator.getCorrection(), JetReCalibrator.JetReCalibrator.rawP4forType1MET_(), JetReCalibrator.JetReCalibrator.separateJetCorrectors, JetReCalibrator.JetReCalibrator.type1METParams, and objects.JetAnalyzer.JetAnalyzer.type1METParams.

Referenced by KalmanMuonCorrector.KalmanMuonCorrector.correct_all(), and JetReCalibrator.JetReCalibrator.correctAll().

98 
99  def correct(self,jet,rho,delta=0,addCorr=False,addShifts=False, metShift=[0,0],type1METCorr=[0,0,0]):
100  """Corrects a jet energy (optionally shifting it also by delta times the JEC uncertainty)
101 
102  If addCorr, set jet.corr to the correction.
103  If addShifts, set also the +1 and -1 jet shifts
104 
105  The metShift vector will accumulate the x and y changes to the MET from the JEC, i.e. the
106  negative difference between the new and old jet momentum, for jets eligible for type1 MET
107  corrections, and after subtracting muons. The pt cut is applied to the new corrected pt.
108  This shift can be applied on top of the *OLD TYPE1 MET*, but only if there was no change
109  in the L1 corrections nor in the definition of the type1 MET (e.g. jet pt cuts).
110 
111  The type1METCorr vector, will accumulate the x, y, sumEt type1 MET corrections, to be
112  applied to the *RAW MET* (if the feature was turned on in the constructor of the class).
113  """
114  raw = jet.rawFactor()
115  corr = self.getCorrection(jet,rho,delta)
116  if addCorr:
117  jet.corr = corr
118  for sepcorr in self.separateJetCorrectors.keys():
119  setattr(jet,"CorrFactor_"+sepcorr,self.getCorrection(jet,rho,delta=0,corrector=self.separateJetCorrectors[sepcorr]))
120  if addShifts:
121  for cdelta,shift in [(1.0, "JECUp"), (-1.0, "JECDown")]:
122  cshift = self.getCorrection(jet,rho,delta+cdelta)
123  setattr(jet, "corr"+shift, cshift)
124  if corr <= 0:
125  return False
126  newpt = jet.pt()*raw*corr
127  if newpt > self.type1METParams['jetPtThreshold']:
128  rawP4forT1 = self.rawP4forType1MET_(jet)
129  if rawP4forT1 and rawP4forT1.Pt()*corr > self.type1METParams['jetPtThreshold']:
130  metShift[0] -= rawP4forT1.Px() * (corr - 1.0/raw)
131  metShift[1] -= rawP4forT1.Py() * (corr - 1.0/raw)
132  if self.calculateType1METCorr:
133  l1corr = self.getCorrection(jet,rho,delta=0,corrector=self.separateJetCorrectors["L1"])
134  #print "\tfor jet with raw pt %.5g, eta %.5g, dpx = %.5g, dpy = %.5g" % (
135  # jet.pt()*raw, jet.eta(),
136  # rawP4forT1.Px()*(corr - l1corr),
137  # rawP4forT1.Py()*(corr - l1corr))
138  type1METCorr[0] -= rawP4forT1.Px() * (corr - l1corr)
139  type1METCorr[1] -= rawP4forT1.Py() * (corr - l1corr)
140  type1METCorr[2] += rawP4forT1.Et() * (corr - l1corr)
141  jet.setCorrP4(jet.p4() * (corr * raw))
142  return True
def JetReCalibrator.JetReCalibrator.correctAll (   self,
  jets,
  rho,
  delta = 0,
  addCorr = False,
  addShifts = False,
  metShift = [0.,
  type1METCorr = [0. 
)
Applies 'correct' to all the jets, discard the ones that have bad corrections (corrected pt <= 0)

Definition at line 143 of file JetReCalibrator.py.

References ElectronCalibrator.Run2ElectronCalibrator.correct(), FFTJetCorrector< Jet, Adjustable >.correct(), FFTJetCorrectorSequence< Jet, InitialConverter, FinalConverter >.correct(), MomentumScaleCorrector.correct(), JetReCalibrator.JetReCalibrator.correct(), l1tpf_calo::SingleCaloClusterer.correct(), l1tpf_calo::SimpleCaloLinkerBase.correct(), and print().

144  def correctAll(self,jets,rho,delta=0, addCorr=False, addShifts=False, metShift=[0.,0.], type1METCorr=[0.,0.,0.]):
145  """Applies 'correct' to all the jets, discard the ones that have bad corrections (corrected pt <= 0)"""
146  badJets = []
147  if metShift != [0.,0. ]: raise RuntimeError("input metShift tuple is not initialized to zeros")
148  if type1METCorr != [0.,0.,0.]: raise RuntimeError("input type1METCorr tuple is not initialized to zeros")
149  for j in jets:
150  ok = self.correct(j,rho,delta,addCorr=addCorr,addShifts=addShifts,metShift=metShift,type1METCorr=type1METCorr)
151  if not ok: badJets.append(j)
152  if len(badJets) > 0:
153  print("Warning: %d out of %d jets flagged bad by JEC." % (len(badJets), len(jets)))
154  for bj in badJets:
155  jets.remove(bj)
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47
def JetReCalibrator.JetReCalibrator.getCorrection (   self,
  jet,
  rho,
  delta = 0,
  corrector = None 
)

Definition at line 63 of file JetReCalibrator.py.

References JetReCalibrator.JetReCalibrator.JetCorrector, JetReCalibrator.JetReCalibrator.JetUncertainty, SiStripPI.max, and print().

Referenced by JetReCalibrator.JetReCalibrator.correct().

63 
64  def getCorrection(self,jet,rho,delta=0,corrector=None):
65  if not corrector: corrector = self.JetCorrector
66  if corrector != self.JetCorrector and delta!=0: raise RuntimeError('Configuration not supported')
67  corrector.setJetEta(jet.eta())
68  corrector.setJetPt(jet.pt()*jet.rawFactor())
69  corrector.setJetA(jet.jetArea())
70  corrector.setRho(rho)
71  corr = corrector.getCorrection()
72  if delta != 0:
73  if not self.JetUncertainty: raise RuntimeError("Jet energy scale uncertainty shifts requested, but not available")
74  self.JetUncertainty.setJetEta(jet.eta())
75  self.JetUncertainty.setJetPt(corr * jet.pt() * jet.rawFactor())
76  try:
77  jet.jetEnergyCorrUncertainty = self.JetUncertainty.getUncertainty(True)
78  except RuntimeError as r:
79  print("Caught %s when getting uncertainty for jet of pt %.1f, eta %.2f\n" % (r,corr * jet.pt() * jet.rawFactor(),jet.eta()))
80  jet.jetEnergyCorrUncertainty = 0.5
81  #print " jet with corr pt %6.2f has an uncertainty %.2f " % (jet.pt()*jet.rawFactor()*corr, jet.jetEnergyCorrUncertainty)
82  corr *= max(0, 1+delta*jet.jetEnergyCorrUncertainty)
83  return corr
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Definition: Utilities.cc:47
def JetReCalibrator.JetReCalibrator.rawP4forType1MET_ (   self,
  jet 
)
Return the raw 4-vector, after subtracting the muons (if requested),
   or None if the jet fails the EMF cut.

Definition at line 84 of file JetReCalibrator.py.

References sistrip::SpyUtilities.range(), JetReCalibrator.JetReCalibrator.type1METParams, and objects.JetAnalyzer.JetAnalyzer.type1METParams.

Referenced by JetReCalibrator.JetReCalibrator.correct().

84 
85  def rawP4forType1MET_(self, jet):
86  """Return the raw 4-vector, after subtracting the muons (if requested),
87  or None if the jet fails the EMF cut."""
88  p4 = jet.p4() * jet.rawFactor()
89  emf = ( jet.physObj.neutralEmEnergy() + jet.physObj.chargedEmEnergy() )/p4.E()
90  if emf > self.type1METParams['skipEMfractionThreshold']:
91  return None
92  if self.type1METParams['skipMuons']:
93  for idau in range(jet.numberOfDaughters()):
94  pfcand = jet.daughter(idau)
95  if pfcand.isGlobalMuon() or pfcand.isStandAloneMuon():
96  p4 -= pfcand.p4()
97  return p4
const uint16_t range(const Frame &aFrame)

Member Data Documentation

JetReCalibrator.JetReCalibrator.calculateType1METCorr

Definition at line 21 of file JetReCalibrator.py.

Referenced by JetReCalibrator.JetReCalibrator.correct().

JetReCalibrator.JetReCalibrator.doResidualJECs

Definition at line 18 of file JetReCalibrator.py.

JetReCalibrator.JetReCalibrator.globalTag

Definition at line 16 of file JetReCalibrator.py.

JetReCalibrator.JetReCalibrator.jecPath

Definition at line 19 of file JetReCalibrator.py.

JetReCalibrator.JetReCalibrator.JetCorrector

Definition at line 37 of file JetReCalibrator.py.

Referenced by JetReCalibrator.JetReCalibrator.getCorrection().

JetReCalibrator.JetReCalibrator.jetFlavour

Definition at line 17 of file JetReCalibrator.py.

JetReCalibrator.JetReCalibrator.JetUncertainty

Definition at line 39 of file JetReCalibrator.py.

Referenced by JetReCalibrator.JetReCalibrator.getCorrection().

JetReCalibrator.JetReCalibrator.L1JetPar

Definition at line 25 of file JetReCalibrator.py.

JetReCalibrator.JetReCalibrator.L2JetPar

Definition at line 26 of file JetReCalibrator.py.

JetReCalibrator.JetReCalibrator.L3JetPar

Definition at line 27 of file JetReCalibrator.py.

JetReCalibrator.JetReCalibrator.ResJetPar

Definition at line 34 of file JetReCalibrator.py.

JetReCalibrator.JetReCalibrator.separateJetCorrectors

Definition at line 45 of file JetReCalibrator.py.

Referenced by JetReCalibrator.JetReCalibrator.correct().

JetReCalibrator.JetReCalibrator.type1METParams

Definition at line 22 of file JetReCalibrator.py.

Referenced by JetReCalibrator.JetReCalibrator.correct(), and JetReCalibrator.JetReCalibrator.rawP4forType1MET_().

JetReCalibrator.JetReCalibrator.upToLevel

Definition at line 20 of file JetReCalibrator.py.

JetReCalibrator.JetReCalibrator.vPar

Definition at line 28 of file JetReCalibrator.py.

JetReCalibrator.JetReCalibrator.vParL1

Definition at line 47 of file JetReCalibrator.py.

JetReCalibrator.JetReCalibrator.vParL2

Definition at line 51 of file JetReCalibrator.py.

JetReCalibrator.JetReCalibrator.vParL3

Definition at line 55 of file JetReCalibrator.py.

JetReCalibrator.JetReCalibrator.vParL3Res

Definition at line 59 of file JetReCalibrator.py.