CMS 3D CMS Logo

VBF.py
Go to the documentation of this file.
1 import math
2 from ROOT import TLorentzVector
3 from PhysicsTools.HeppyCore.utils.deltar import deltaPhi, deltaR2
4 
5 class VBF( object ):
6  '''Computes and holds VBF quantities'''
7  def __init__(self, jets, diLepton, vbfMvaCalc, cjvPtCut):
8  '''jets: jets cleaned from the diLepton legs.
9  diLepton: the di-tau, for example. Necessary to compute input variables for MVA selection
10  '''
11  self.cjvPtCut = cjvPtCut
12  self.vbfMvaCalc = vbfMvaCalc
13  self.jets = jets
14  # the MET is taken from the di-lepton, because it can depend on it
15  # e.g. recoil corrections, mva met
16  self.met = diLepton.met()
17  self.leadJets = jets[:2] # taking first 2 jets (leading ones)
18  self.otherJets = jets[2:]
19  self.centralJets = self.findCentralJets( self.leadJets, self.otherJets )
20 
21  # delta eta
22  self.deta = self.leadJets[0].eta() - self.leadJets[1].eta()
23 
24  # below, the variables for the MVA selection
25  # delta phi
26  self.dphi = deltaPhi(self.leadJets[0].phi(), self.leadJets[1].phi())
27  dijetp4 = self.leadJets[0].p4() + self.leadJets[1].p4()
28  # mass of the di-jet system
29  self.mjj = dijetp4.M()
30  # pt of di-jet system
31  self.dijetpt = dijetp4.pt()
32  # phi of di-jet system
33  self.dijetphi = dijetp4.phi()
34  # higgs momentum (defined as the di-lepton momentum + the met momentum)
35  # don't access longitudinal quantities!
36  self.higgsp4 = diLepton.p4() + self.met.p4()
37  # delta phi between dijet system and higgs system
38  self.dphidijethiggs = deltaPhi( self.dijetphi, self.higgsp4.phi() )
39  # ?
40  visDiLepton = diLepton.leg1 ().p4 () + diLepton.leg2 ().p4 ()
41  self.visjeteta = min (
42  abs (self.leadJets[0].eta () - visDiLepton.eta ()),
43  abs (self.leadJets[1].eta () - visDiLepton.eta ()))
44  # visible higgs pt = di-lepton pt
45  self.ptvis = visDiLepton.pt()
46 
48  if self.vbfMvaCalc is not None:
49  self.mva = self.vbfMvaCalc.val( self.mjj,
50  abs(self.deta),
51  self.visjeteta,
52  self.ptvis )
53  else:
54  self.mva = -99.
55 
56 # double mjj , // the invariant mass of the two tag jets
57 # double dEta , // the pseudorapidity difference between the two tag jets
58 # double dPhi , // the phi difference between the two tag jets
59 # double ditau_pt , // the vector sum of the pT of the tau + electron/muon + MET
60 # double dijet_pt , // the vector sum of the pT of the two tag jets
61 # double dPhi_hj , // the phi difference between the di-tau vector and the di-jet vector
62 # double C1 , // the pseudorapidity difference between the *visible* di-tau vector and the closest tag jet
63 # double C2 // the *visible* pT of the di-tau
64 
65 
66  def findCentralJets( self, leadJets, otherJets ):
67  '''Finds all jets between the 2 leading jets, for central jet veto.'''
68  if not len(otherJets):
69  return []
70  etamin = leadJets[0].eta()
71  etamax = leadJets[1].eta()
72  if etamin > etamax:
73  etamin, etamax = etamax, etamin
74  def isCentral( jet ):
75  if jet.pt()<self.cjvPtCut:
76  return False
77  eta = jet.eta()
78  if etamin < eta and eta < etamax:
79  return True
80  else:
81  return False
82  centralJets = list(filter( isCentral, otherJets ))
83  return centralJets
84 
85  def calcP4(self, jets):
86  '''returns the sum p4 of a collection of objects.
87  FIXME: remove this function, which is a bit stupid
88  '''
89  p4 = TLorentzVector()
90  for jet in jets:
91  p4 += TLorentzVector(jet.px(), jet.py(), jet.pz(), jet.energy())
92  return p4
93 
94  def __str__(self):
95  header = 'VBF : deta={deta:4.2f}, Mjj={mjj:4.2f}, #centjets={ncentjets}'
96  header = header.format( deta=self.deta, mjj=self.mjj, ncentjets=len(self.centralJets))
97  leadJets = map( str, self.leadJets )
98  centralJets = map( str, self.centralJets)
99  tmp = [header]
100  tmp.append('MVA input variables: dphi={dphi:4.2f}, dijetpt={dijetpt:4.2f}, dijetphi={dijetphi:4.2f}, dphidijethiggs={dphidijethiggs:4.2f}, visjeteta={visjeteta:4.2f}, ptvis={ptvis:4.2f}'.format(
101  dphi = self.dphi,
102  dijetpt = self.dijetpt,
103  dijetphi = self.dijetphi,
104  dphidijethiggs = self.dphidijethiggs,
105  visjeteta = self.visjeteta,
106  ptvis = self.ptvis
107  ))
108  tmp.append('Leading Jets:')
109  tmp.extend( leadJets )
110  tmp.append('Central Jets:')
111  tmp.extend( centralJets )
112  return '\n'.join( tmp )
VBF.VBF.otherJets
otherJets
Definition: VBF.py:18
resolutioncreator_cfi.object
object
Definition: resolutioncreator_cfi.py:4
VBF.VBF.deta
deta
Definition: VBF.py:22
VBF.VBF.met
met
Definition: VBF.py:16
VBF.VBF.ptvis
ptvis
Definition: VBF.py:45
join
static std::string join(char **cmd)
Definition: RemoteFile.cc:17
VBF.VBF.leadJets
leadJets
Definition: VBF.py:17
VBF.VBF.mjj
mjj
Definition: VBF.py:29
VBF.VBF.dphidijethiggs
dphidijethiggs
Definition: VBF.py:38
VBF.VBF.mva
mva
self.ptvis = diLepton.pt() new VBF MVA, based on 4 variables
Definition: VBF.py:49
VBF.VBF.__init__
def __init__(self, jets, diLepton, vbfMvaCalc, cjvPtCut)
Definition: VBF.py:7
SiPixelRawToDigiRegional_cfi.deltaPhi
deltaPhi
Definition: SiPixelRawToDigiRegional_cfi.py:9
PVValHelper::eta
Definition: PVValidationHelpers.h:69
VBF.VBF.visjeteta
visjeteta
Definition: VBF.py:41
VBF.VBF.calcP4
def calcP4(self, jets)
Definition: VBF.py:85
ALCARECOTkAlBeamHalo_cff.filter
filter
Definition: ALCARECOTkAlBeamHalo_cff.py:27
VBF.VBF.jets
jets
Definition: VBF.py:13
p4
double p4[4]
Definition: TauolaWrapper.h:92
VBF.VBF.cjvPtCut
cjvPtCut
Definition: VBF.py:11
heppy_batch.val
val
Definition: heppy_batch.py:351
VBF.VBF.dijetphi
dijetphi
Definition: VBF.py:33
VBF.VBF.dphi
dphi
Definition: VBF.py:26
format
VBF.VBF
Definition: VBF.py:5
VBF.VBF.__str__
def __str__(self)
Definition: VBF.py:94
list
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger list("!*", "!HLTx*" if it matches 2 triggers or more) will accept the event if all the matching triggers are FAIL. It will reject the event if any of the triggers are PASS or EXCEPTION(this matches the behavior of "!*" before the partial wildcard feature was incorporated). Triggers which are in the READY state are completely ignored.(READY should never be returned since the trigger paths have been run
deltar
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
genParticles_cff.map
map
Definition: genParticles_cff.py:11
VBF.VBF.findCentralJets
def findCentralJets(self, leadJets, otherJets)
Definition: VBF.py:66
VBF.VBF.higgsp4
higgsp4
Definition: VBF.py:36
VBF.VBF.dijetpt
dijetpt
Definition: VBF.py:31
VBF.VBF.centralJets
centralJets
Definition: VBF.py:19
VBF.VBF.vbfMvaCalc
vbfMvaCalc
Definition: VBF.py:12