CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Public Attributes | Static Public Attributes
GeneratorAnalyzer.GeneratorAnalyzer Class Reference
Inheritance diagram for GeneratorAnalyzer.GeneratorAnalyzer:

Public Member Functions

def __init__
 
def beginLoop
 
def countBPartons
 
def declareHandles
 
def fillGenLeptons
 
def fillTopQuarks
 
def fillWZQuarks
 
def initPDFWeights
 
def makeMCInfo
 
def makePDFWeights
 
def process
 

Public Attributes

 doPDFWeights
 
 pdfWeightInit
 
 pdfWeightTool
 

Static Public Attributes

 filterHiggsDecays = False,
 
list PDFWeights = []
 
 verbose = False,
 

Detailed Description

Do generator-level analysis of a ttH->leptons decay:

   Creates in the event:
     event.genParticles   = the gen particles (pruned, as default)
     event.genHiggsDecayMode =   0  for non-Higgs
                             15  for H -> tau tau
                             23  for H -> Z Z
                             24  for H -> W W
                             xx  for H -> xx yy zzz 

      event.gentauleps = [ gen electrons and muons from hard scattering not from tau decays ]
      event.gentaus    = [ gen taus from from hard scattering ]
      event.genleps    = [ gen electrons and muons from hard scattering not from tau decays ]
      event.genbquarks  = [ gen b quarks from top quark decays ]
      event.genwzquarks = [ gen quarks from hadronic W,Z decays ]

   If filterHiggsDecays is set to a list of Higgs decay modes,
   it will filter events that have those decay modes.
   e.g. [0, 15, 23, 24] will keep data, non-Higgs MC and Higgs decays to (tau, Z, W) 
   but will drop Higgs decays to other particles (e.g. bb).

Definition at line 23 of file GeneratorAnalyzer.py.

Constructor & Destructor Documentation

def GeneratorAnalyzer.GeneratorAnalyzer.__init__ (   self,
  cfg_ana,
  cfg_comp,
  looperName 
)

Definition at line 46 of file GeneratorAnalyzer.py.

46 
47  def __init__(self, cfg_ana, cfg_comp, looperName ):
48  super(GeneratorAnalyzer,self).__init__(cfg_ana,cfg_comp,looperName)
49  self.doPDFWeights = hasattr(self.cfg_ana, "PDFWeights") and len(self.cfg_ana.PDFWeights) > 0
50  if self.doPDFWeights:
self.pdfWeightInit = False

Member Function Documentation

def GeneratorAnalyzer.GeneratorAnalyzer.beginLoop (   self)

Definition at line 65 of file GeneratorAnalyzer.py.

65 
66  def beginLoop(self):
67  super(GeneratorAnalyzer,self).beginLoop()
def GeneratorAnalyzer.GeneratorAnalyzer.countBPartons (   self,
  event 
)

Definition at line 195 of file GeneratorAnalyzer.py.

References funct.abs(), and deltaR().

Referenced by GeneratorAnalyzer.GeneratorAnalyzer.makeMCInfo().

196  def countBPartons(self,event):
197  event.allBPartons = [ q for q in event.genParticles if abs(q.pdgId()) == 5 and abs(q.status()) == 2 and abs(q.pt()) > 15 ]
198  event.allBPartons.sort(key = lambda q : q.pt(), reverse = True)
199  event.bPartons = []
200  for q in event.allBPartons:
201  duplicate = False
202  for q2 in event.bPartons:
203  if deltaR(q.eta(),q.phi(),q2.eta(),q2.phi()) < 0.5:
204  duplicate = True
205  continue
206  if not duplicate: event.bPartons.append(q)
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double deltaR(double eta1, double eta2, double phi1, double phi2)
Definition: TreeUtility.cc:17
def GeneratorAnalyzer.GeneratorAnalyzer.declareHandles (   self)

Definition at line 56 of file GeneratorAnalyzer.py.

References GeneratorAnalyzer.GeneratorAnalyzer.doPDFWeights, and Analyzer.Analyzer.mchandles.

56 
57  def declareHandles(self):
58  super(GeneratorAnalyzer, self).declareHandles()
59 
60  #mc information
61  self.mchandles['genParticles'] = AutoHandle( 'prunedGenParticles',
62  'std::vector<reco::GenParticle>' )
63  if self.doPDFWeights:
64  self.mchandles['pdfstuff'] = AutoHandle( 'generator', 'GenEventInfoProduct' )
def GeneratorAnalyzer.GeneratorAnalyzer.fillGenLeptons (   self,
  event,
  particle,
  isTau = False,
  sourceId = 25 
)
Get the gen level light leptons (prompt and/or from tau decays)

Definition at line 68 of file GeneratorAnalyzer.py.

References funct.abs(), GeneratorAnalyzer.GeneratorAnalyzer.fillGenLeptons(), and benchmark_cfg.pdgId.

Referenced by GeneratorAnalyzer.GeneratorAnalyzer.fillGenLeptons(), GeneratorAnalyzer.GeneratorAnalyzer.fillTopQuarks(), and GeneratorAnalyzer.GeneratorAnalyzer.makeMCInfo().

68 
69  def fillGenLeptons(self, event, particle, isTau=False, sourceId=25):
70  """Get the gen level light leptons (prompt and/or from tau decays)"""
71 
72  for i in xrange( particle.numberOfDaughters() ):
73  dau = GenParticle(particle.daughter(i))
74  dau.sourceId = sourceId
75  dau.isTau = isTau
76  id = abs(dau.pdgId())
77  moid = abs(dau.mother().pdgId())
78  if id in [11,13]:
79  if isTau: event.gentauleps.append(dau)
80  else: event.genleps.append(dau)
81  elif id == 15:
82  if moid in [22,23,24]:
83  event.gentaus.append(dau)
84  self.fillGenLeptons(event, dau, True, sourceId)
85  elif id in [22,23,24]:
86  self.fillGenLeptons(event, dau, False, sourceId)
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
def GeneratorAnalyzer.GeneratorAnalyzer.fillTopQuarks (   self,
  event 
)
Get the b quarks from top decays into event.genbquarks

Definition at line 100 of file GeneratorAnalyzer.py.

References funct.abs(), GeneratorAnalyzer.GeneratorAnalyzer.fillGenLeptons(), GeneratorAnalyzer.GeneratorAnalyzer.fillWZQuarks(), and benchmark_cfg.pdgId.

Referenced by GeneratorAnalyzer.GeneratorAnalyzer.makeMCInfo().

101  def fillTopQuarks(self, event):
102  """Get the b quarks from top decays into event.genbquarks"""
103 
104  event.gentopquarks = [ p for p in event.genParticles if abs(p.pdgId()) == 6 and p.numberOfDaughters() > 0 and abs(p.daughter(0).pdgId()) != 6 ]
105  #if len(event.gentopquarks) != 2:
106  # print "Not two top quarks? \n%s\n" % event.gentopquarks
107 
108  for tq in event.gentopquarks:
109  for i in xrange( tq.numberOfDaughters() ):
110  dau = GenParticle(tq.daughter(i))
111  if abs(dau.pdgId()) == 5:
112  dau.sourceId = 6
113  event.genbquarks.append( dau )
114  elif abs(dau.pdgId()) == 24:
115  self.fillGenLeptons( event, dau, sourceId=6 )
116  self.fillWZQuarks( event, dau, True, sourceId=6 )
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
def GeneratorAnalyzer.GeneratorAnalyzer.fillWZQuarks (   self,
  event,
  particle,
  isWZ = False,
  sourceId = 25 
)
Descend daughters of 'particle', and add quarks from W,Z to event.genwzquarks
   isWZ is set to True if already processing daughters of W,Z's, to False before it

Definition at line 87 of file GeneratorAnalyzer.py.

References funct.abs(), and GeneratorAnalyzer.GeneratorAnalyzer.fillWZQuarks().

Referenced by GeneratorAnalyzer.GeneratorAnalyzer.fillTopQuarks(), GeneratorAnalyzer.GeneratorAnalyzer.fillWZQuarks(), and GeneratorAnalyzer.GeneratorAnalyzer.makeMCInfo().

87 
88  def fillWZQuarks(self, event, particle, isWZ=False, sourceId=25):
89  """Descend daughters of 'particle', and add quarks from W,Z to event.genwzquarks
90  isWZ is set to True if already processing daughters of W,Z's, to False before it"""
91 
92  for i in xrange( particle.numberOfDaughters() ):
93  dau = GenParticle(particle.daughter(i))
94  dau.sourceId = sourceId
95  id = abs(dau.pdgId())
96  if id <= 5 and isWZ:
97  event.genwzquarks.append(dau)
98  elif id in [22,23,24]:
99  self.fillWZQuarks(event, dau, True, sourceId)
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
def GeneratorAnalyzer.GeneratorAnalyzer.initPDFWeights (   self)

Definition at line 207 of file GeneratorAnalyzer.py.

References GeneratorAnalyzer.GeneratorAnalyzer.pdfWeightInit.

Referenced by GeneratorAnalyzer.GeneratorAnalyzer.makePDFWeights().

208  def initPDFWeights(self):
209  from ROOT import PdfWeightProducerTool
210  self.pdfWeightInit = True
211  self.pdfWeightTool = PdfWeightProducerTool()
212  for pdf in self.cfg_ana.PDFWeights:
213  self.pdfWeightTool.addPdfSet(pdf+".LHgrid")
214  self.pdfWeightTool.beginJob()
def GeneratorAnalyzer.GeneratorAnalyzer.makeMCInfo (   self,
  event 
)

Definition at line 117 of file GeneratorAnalyzer.py.

References funct.abs(), GeneratorAnalyzer.GeneratorAnalyzer.countBPartons(), GeneratorAnalyzer.GeneratorAnalyzer.fillGenLeptons(), GeneratorAnalyzer.GeneratorAnalyzer.fillTopQuarks(), GeneratorAnalyzer.GeneratorAnalyzer.fillWZQuarks(), alcazmumu_cfi.filter, GenParticlesHelper.hasAncestor(), genutils.isPromptLepton(), join(), combine.key, python.multivaluedict.map(), Analyzer.Analyzer.mchandles, min(), and benchmark_cfg.pdgId.

Referenced by GeneratorAnalyzer.GeneratorAnalyzer.process().

118  def makeMCInfo(self, event):
119  event.genParticles = map( GenParticle, self.mchandles['genParticles'].product() )
120 
121  if False:
122  for i,p in enumerate(event.genParticles):
123  print " %5d: pdgId %+5d status %3d pt %6.1f " % (i, p.pdgId(),p.status(),p.pt()),
124  if p.numberOfMothers() > 0:
125  imom, mom = p.motherRef().key(), p.mother()
126  print " | mother %5d pdgId %+5d status %3d pt %6.1f " % (imom, mom.pdgId(),mom.status(),mom.pt()),
127  else:
128  print " | no mother particle ",
129 
130  for j in xrange(min(3, p.numberOfDaughters())):
131  idau, dau = p.daughterRef(j).key(), p.daughter(j)
132  print " | dau[%d] %5d pdgId %+5d status %3d pt %6.1f " % (j,idau,dau.pdgId(),dau.status(),dau.pt()),
133  print ""
134 
135  event.genHiggsBoson = None
136  event.genleps = []
137  event.gentauleps = []
138  event.gentaus = []
139  event.genbquarks = []
140  event.genwzquarks = []
141  event.gentopquarks = []
142 
143  higgsBosons = [ p for p in event.genParticles if (p.pdgId() == 25) and p.numberOfDaughters() > 0 and abs(p.daughter(0).pdgId()) != 25 ]
144 
145  if len(higgsBosons) == 0:
146  event.genHiggsDecayMode = 0
147 
148  ## Matching that can be done also on non-Higgs events
149  ## First, top quarks
150  self.fillTopQuarks( event )
151  self.countBPartons( event )
152 
153  ## Then W,Z,gamma from hard scattering and that don't come from a top and don't rescatter
154  def hasAncestor(particle, filter):
155  for i in xrange(particle.numberOfMothers()):
156  mom = particle.mother(i)
157  if filter(mom) or hasAncestor(mom, filter):
158  return True
159  return False
160  def hasDescendent(particle, filter):
161  for i in xrange(particle.numberOfDaughters()):
162  dau = particle.daughter(i)
163  if filter(dau) or hasDescendent(dau, filter):
164  return True
165  return False
166 
167  bosons = [ gp for gp in event.genParticles if gp.status() > 2 and abs(gp.pdgId()) in [22,23,24] ]
168  for b in bosons:
169  if hasAncestor(b, lambda gp : abs(gp.pdgId()) == 6): continue
170  if hasDescendent(b, lambda gp : abs(gp.pdgId()) in [22,23,24] and gp.status() > 2): continue
171  self.fillGenLeptons(event, b, sourceId=abs(b.pdgId()))
172  self.fillWZQuarks(event, b, isWZ=True, sourceId=abs(b.pdgId()))
173  else:
174  if len(higgsBosons) > 1:
175  print "More than one higgs? \n%s\n" % higgsBosons
176 
177  event.genHiggsBoson = GenParticle(higgsBosons[-1])
178  event.genHiggsDecayMode = abs( event.genHiggsBoson.daughter(0).pdgId() )
179  self.fillTopQuarks( event )
180  self.countBPartons( event )
181  self.fillWZQuarks( event, event.genHiggsBoson )
182  self.fillGenLeptons( event, event.genHiggsBoson, sourceId=25 )
183  if self.cfg_ana.verbose:
184  print "Higgs boson decay mode: ", event.genHiggsDecayMode
185  print "Generator level prompt light leptons:\n", "\n".join(["\t%s" % p for p in event.genleps])
186  print "Generator level light leptons from taus:\n", "\n".join(["\t%s" % p for p in event.gentauleps])
187  print "Generator level prompt tau leptons:\n", "\n".join(["\t%s" % p for p in event.gentaus])
188  print "Generator level b quarks from top:\n", "\n".join(["\t%s" % p for p in event.genbquarks])
189  print "Generator level quarks from W, Z decays:\n", "\n".join(["\t%s" % p for p in event.genwzquarks])
190  # make sure prompt leptons have a non-zero sourceId
191  for p in event.genParticles:
192  if isPromptLepton(p, True, includeTauDecays=True, includeMotherless=False):
193  if getattr(p, 'sourceId', 0) == 0:
194  p.sourceId = 99
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
T min(T a, T b)
Definition: MathUtil.h:58
static std::string join(char **cmd)
Definition: RemoteFile.cc:18
bool hasAncestor(const reco::GenParticle *particle, int pdgId, int status)
does the particle have an ancestor with this pdgId and this status?
list key
Definition: combine.py:13
def isPromptLepton
Definition: genutils.py:49
def GeneratorAnalyzer.GeneratorAnalyzer.makePDFWeights (   self,
  event 
)

Definition at line 215 of file GeneratorAnalyzer.py.

References GeneratorAnalyzer.GeneratorAnalyzer.initPDFWeights(), Analyzer.Analyzer.mchandles, and GeneratorAnalyzer.GeneratorAnalyzer.pdfWeightInit.

Referenced by GeneratorAnalyzer.GeneratorAnalyzer.process().

216  def makePDFWeights(self, event):
217  if not self.pdfWeightInit: self.initPDFWeights()
218  self.pdfWeightTool.processEvent(self.mchandles['pdfstuff'].product())
219  event.pdfWeights = {}
220  for pdf in self.cfg_ana.PDFWeights:
221  ws = self.pdfWeightTool.getWeights(pdf+".LHgrid")
222  event.pdfWeights[pdf] = [w for w in ws]
223  #print "Produced %d weights for %s: %s" % (len(ws),pdf,event.pdfWeights[pdf])
def GeneratorAnalyzer.GeneratorAnalyzer.process (   self,
  iEvent,
  event 
)

Definition at line 224 of file GeneratorAnalyzer.py.

References GeneratorAnalyzer.GeneratorAnalyzer.doPDFWeights, GeneratorAnalyzer.GeneratorAnalyzer.makeMCInfo(), GeneratorAnalyzer.GeneratorAnalyzer.makePDFWeights(), and Analyzer.Analyzer.readCollections().

Referenced by ConfigBuilder.ConfigBuilder.__init__(), ConfigBuilder.ConfigBuilder.addExtraStream(), ConfigBuilder.ConfigBuilder.anyOf(), ConfigBuilder.ConfigBuilder.completeInputCommand(), ConfigBuilder.ConfigBuilder.doNotInlineEventContent(), ConfigBuilder.ConfigBuilder.PrintAllModules.leave(), looper.Looper.loop(), ConfigBuilder.ConfigBuilder.prepare(), ConfigBuilder.ConfigBuilder.prepare_ALCA(), ConfigBuilder.ConfigBuilder.prepare_DQM(), ConfigBuilder.ConfigBuilder.prepare_FASTSIM(), ConfigBuilder.ConfigBuilder.prepare_HARVESTING(), ConfigBuilder.ConfigBuilder.prepare_HLT(), ConfigBuilder.ConfigBuilder.prepare_LHE(), ConfigBuilder.ConfigBuilder.prepare_VALIDATION(), ConfigBuilder.ConfigBuilder.renameHLTprocessInSequence(), ConfigBuilder.ConfigBuilder.renameInputTagsInSequence(), and ConfigBuilder.ConfigBuilder.scheduleSequence().

225  def process(self, iEvent, event):
226  self.readCollections( iEvent )
227 
228  ## creating a "sub-event" for this analyzer
229  #myEvent = Event(event.iEv)
230  #setattr(event, self.name, myEvent)
231  #event = myEvent
232 
233  # if not MC, nothing to do
234  if not self.cfg_comp.isMC:
235  return True
236 
237  # do MC level analysis
238  self.makeMCInfo(event)
239 
240  # if MC and filtering on the Higgs decay mode,
241  # them do filter events
242  if self.cfg_ana.filterHiggsDecays:
243  if event.genHiggsDecayMode not in self.cfg_ana.filterHiggsDecays:
244  return False
245 
246  # do PDF weights, if requested
247  if self.doPDFWeights:
248  self.makePDFWeights(event)
249  return True
250 
setattr(GeneratorAnalyzer,"defaultConfig",cfg.Analyzer(

Member Data Documentation

GeneratorAnalyzer.GeneratorAnalyzer.doPDFWeights

Definition at line 48 of file GeneratorAnalyzer.py.

Referenced by GeneratorAnalyzer.GeneratorAnalyzer.declareHandles(), and GeneratorAnalyzer.GeneratorAnalyzer.process().

GeneratorAnalyzer.GeneratorAnalyzer.filterHiggsDecays = False,
static

Definition at line 252 of file GeneratorAnalyzer.py.

GeneratorAnalyzer.GeneratorAnalyzer.pdfWeightInit

Definition at line 50 of file GeneratorAnalyzer.py.

Referenced by GeneratorAnalyzer.GeneratorAnalyzer.initPDFWeights(), and GeneratorAnalyzer.GeneratorAnalyzer.makePDFWeights().

list GeneratorAnalyzer.GeneratorAnalyzer.PDFWeights = []
static

Definition at line 254 of file GeneratorAnalyzer.py.

GeneratorAnalyzer.GeneratorAnalyzer.pdfWeightTool

Definition at line 210 of file GeneratorAnalyzer.py.

GeneratorAnalyzer.GeneratorAnalyzer.verbose = False,
static

Definition at line 253 of file GeneratorAnalyzer.py.

Referenced by python.diff_provenance.difference.list_diff(), python.diffProv.difference.list_diff(), python.diff_provenance.difference.module_diff(), python.diffProv.difference.module_diff(), python.diff_provenance.difference.onefilemodules(), python.diffProv.difference.onefilemodules(), and VertexAnalyzer.VertexAnalyzer.process().