CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TriggerMatchAnalyzer.py
Go to the documentation of this file.
1 import ROOT
2 
3 from PhysicsTools.Heppy.analyzers.core.Analyzer import Analyzer
4 from PhysicsTools.Heppy.analyzers.core.AutoHandle import AutoHandle
5 from PhysicsTools.Heppy.analyzers.core.AutoFillTreeProducer import NTupleVariable
6 from PhysicsTools.HeppyCore.utils.deltar import matchObjectCollection, matchObjectCollection3
7 import PhysicsTools.HeppyCore.framework.config as cfg
8 
9 class TriggerMatchAnalyzer( Analyzer ):
10  def __init__(self, cfg_ana, cfg_comp, looperName ):
11  super(TriggerMatchAnalyzer,self).__init__(cfg_ana,cfg_comp,looperName)
12  self.processName = getattr(self.cfg_ana,"processName","PAT")
13  self.unpackPathNames = getattr(self.cfg_ana,"unpackPathNames",True)
14  self.label = self.cfg_ana.label
15  self.trgObjSelectors = []
16  self.trgObjSelectors.extend(getattr(self.cfg_ana,"trgObjSelectors",[]))
17  self.collToMatch = getattr(self.cfg_ana,"collToMatch",None)
19  self.collMatchSelectors.extend(getattr(self.cfg_ana,"collMatchSelectors",[]))
20  self.collMatchDRCut = getattr(self.cfg_ana,"collMatchDRCut",0.3)
21  if self.collToMatch and not hasattr(self.cfg_ana,"univoqueMatching"): raise RuntimeError("Please specify if the matching to trigger objects should be 1-to-1 or 1-to-many")
22  self.match1To1 = getattr(self.cfg_ana,"univoqueMatching",True)
23 
24  def declareHandles(self):
25  super(TriggerMatchAnalyzer, self).declareHandles()
26  self.handles['TriggerBits'] = AutoHandle( ('TriggerResults','','HLT'), 'edm::TriggerResults' )
27  self.handles['TriggerObjects'] = AutoHandle( ('selectedPatTrigger','',self.processName), 'std::vector<pat::TriggerObjectStandAlone>' )
28 
29  def beginLoop(self, setup):
30  super(TriggerMatchAnalyzer,self).beginLoop(setup)
31 
32  def process(self, event):
33  self.readCollections( event.input )
34  triggerBits = self.handles['TriggerBits'].product()
35  allTriggerObjects = self.handles['TriggerObjects'].product()
36  names = event.input.object().triggerNames(triggerBits)
37  for ob in allTriggerObjects: ob.unpackPathNames(names)
38  triggerObjects = [ob for ob in allTriggerObjects if False not in [sel(ob) for sel in self.trgObjSelectors]]
39 
40  setattr(event,'trgObjects_'+self.label,triggerObjects)
41 
42  if self.collToMatch:
43  tcoll = getattr(event,self.collToMatch)
44  doubleandselector = lambda lep,ob: False if False in [sel(lep,ob) for sel in self.collMatchSelectors] else True
45  pairs = matchObjectCollection3(tcoll,triggerObjects,deltaRMax=self.collMatchDRCut,filter=doubleandselector) if self.match1To1 else matchObjectCollection(tcoll,triggerObjects,self.collMatchDRCut,filter=doubleandselector)
46  for lep in tcoll: setattr(lep,'matchedTrgObj'+self.label,pairs[lep])
47 
48  if self.verbose:
49  print 'Verbose debug for triggerMatchAnalyzer %s'%self.label
50  for ob in getattr(event,'trgObjects_'+self.label):
51  types = ", ".join([str(f) for f in ob.filterIds()])
52  filters = ", ".join([str(f) for f in ob.filterLabels()])
53  paths = ", ".join([("%s***" if f in set(ob.pathNames(True)) else "%s")%f for f in ob.pathNames()]) # asterisks indicate final paths fired by this object, see pat::TriggerObjectStandAlone class
54  print 'Trigger object: pt=%.2f, eta=%.2f, phi=%.2f, collection=%s, type_ids=%s, filters=%s, paths=%s'%(ob.pt(),ob.eta(),ob.phi(),ob.collection(),types,filters,paths)
55  if self.collToMatch:
56  for lep in tcoll:
57  mstring = 'None'
58  if getattr(lep,'matchedTrgObj'+self.label):
59  mstring = 'trigger obj with pt=%.2f, eta=%.2f, phi=%.2f, collection=%s'%(ob.pt(),ob.eta(),ob.phi(),ob.collection())
60  print 'Lepton pt=%.2f, eta=%.2f, phi=%.2f matched to %s'%(lep.pt(),lep.eta(),lep.phi(),mstring)
61 
62  return True
63 
64 
65 setattr(TriggerMatchAnalyzer,"defaultConfig",cfg.Analyzer(
66  TriggerMatchAnalyzer, name="TriggerMatchAnalyzerDefault",
67  label='DefaultTrigObjSelection',
68  processName = 'PAT',
69  unpackPathNames = True,
70  trgObjSelectors = [],
71  collToMatch = None,
72  collMatchSelectors = [],
73  collMatchDRCut = 0.3,
74  univoqueMatching = True,
75  verbose = False
76 )
77 )
78 
79 
def matchObjectCollection
Definition: deltar.py:152
static std::string join(char **cmd)
Definition: RemoteFile.cc:18
def matchObjectCollection3
Definition: deltar.py:41