ATLAS Offline Software
Loading...
Searching...
No Matches
JetDefinition.py
Go to the documentation of this file.
1# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
2
3"""
4
5JetDefinition: A module for classes encoding definitions of jets and
6related objects for configuring jet reconstruction
7
8Various classes encode definitions of different types of components used in Jet Reco.
9They are :
10
11 - JetInputExternal : describes how to build a source container, typically external to the jet domain. This includes input to jet finding (ex: CaloCluster, Track) but also other sources like EventDensity...
12
13 - JetInputConstit : describes specifically an input constituents container (an input to a PseudoJetAlgorithm), thus referring to a JetInputExternal as the primary source.
14 - JetInputConstitSeq : a subclass of JetInputConstit, describing how a constituents container is build from a JetConstituentModSequence (ex: PU or Origin correction).
15 - JetConstitModifier : describes a constituent modifier tool to be used in a JetConstituentModSequence
16
17 - JetDefinition : describes a full jet reco sequence. Uses a JetInputConstit and a list of JetModifier
18 - JetModifier : describes a JetModifier c++ tool.
19
20Author: TJ Khoo, P-A Delsart
21
22"""
23
24__all__ = [ "JetDefinition","xAODType", "JetModifier", "JetConstitModifier" , "JetInputConstitSeq", "JetInputExternal"]
25
26from AthenaCommon import Logging
27jetlog = Logging.logging.getLogger('JetDefinition')
28
29from xAODBase.xAODType import xAODType
30from .Utilities import make_lproperty, onlyAttributesAreProperties, clonable, make_alias
31
32from copy import deepcopy
33
34def formatRvalue(parameter):
35 """Define the convention that we write R truncating the decimal point
36 if R>=1, then we write R*10.
37 (Code from JetRecUtils )
38 """
39 # impose precision limits where there could be ambiguity
40 if int(10*parameter)>=1 and int(100*parameter % 10):
41 #jetlog.warning('Radius parameter {0} exceeds allowable precision of 0.1'.format(parameter))
42 raise ValueError('Bad radius parameter')
43 if int(parameter)>=1:
44 return "{0:.0f}".format(10*parameter)
45 else:
46 return "{0:.1g}".format(10*parameter).replace('.','')
47
48
49# Could also split off a VR name builder
50def buildJetAlgName(finder, mainParam,
51 variableRMassScale= -1.0, variableRMinRadius=-1.0):
52 """variableRMassScale (Rho) in MeV """
53 if ( variableRMassScale >= 0.0 and variableRMinRadius >= 0.0):
54 rmaxstr = formatRvalue(mainParam)
55 rminstr = formatRvalue(variableRMinRadius)
56 return f"{finder}VR{str(int(variableRMassScale/1000))}Rmax{rmaxstr}Rmin{rminstr}"
57 return finder + formatRvalue(mainParam)
58
59
60
61def _condAlwaysPass(condflags):
62 return True,""
63
64from AthenaCommon.SystemOfUnits import MeV
65
66@clonable
67@onlyAttributesAreProperties
68class JetDefinition(object):
69 _allowedattributes = ['_cflags','_contextDic'] # onlyAttributesAreProperties will add all properties to this list.
70 def __init__(self,
71 algorithm, # The fastjet clustering algorithm
72 radius, # The jet radius specifier (clustering cutoff)
73 inputdef, # The input JetConstit
74 ptmin=5e3*MeV, # The pt cutoff for fastjet in MeV
75 ghostdefs=None, # The list of alias to JetGhosts to ghost-associate
76 modifiers=None, # The list of alias to JetModifiers to execute after jet finding
77 extrainputs=None, # The list of additional input types needed for jet finding
78 standardRecoMode = False, #
79 prefix = "", # allows to tune the full JetContainer name
80 suffix = "", # allows to tune the full JetContainer name
81 infix = "", # allows to tune the full JetContainer name
82 # As a rough convention, the 'infix' should not be used to distinguish
83 # different jet constituents as input. Rather, these variations should
84 # be described with different 'label' values in the JetInput definition
85 context = "default", # describe a context for which this definition will be used. See StandardJetContext
86 VRMinR = -1.0, # Minimum radius for VR jet finding
87 VRMassSc = -1.0, # Mass scale for VR jet finding, in MeV
88 ghostarea = 0.01, # area resolution when evaluating jet area using "ghosts"
89 byVertex = False, # Reconstruct the jets by vertex
90 lock = False, # lock the properties of this instance to avoid accidental overwrite after __init__
91 ):
92
93 self._locked = False # unlock during init
94 # Should add some type checking here
95 # Could use JetContainerInfo conversion
96 if algorithm not in ["Kt","AntiKt","CamKt"]:
97 jetlog.error("FastJet algorithm specification was not one of Kt, AntiKt, CamKt!")
98 raise KeyError("Invalid fastjet algorithm choice: {0}".format(self.algorithm))
99 self._algorithm = algorithm
100
101 self._radius = radius
102 self._inputdef = inputdef
103 self._prefix = prefix
104 self._suffix = suffix
105 self._infix = infix
106 self._context = context
107 self._VRMinRadius = VRMinR
108 self._VRMassScale = VRMassSc
109 self._ghostarea = ghostarea
110 self._defineName()
111
112 self.ptmin = ptmin # The pt down to which FastJet is run
113
114 # Avoid modifying default args
115 self.ghostdefs = ghostdefs if ghostdefs is not None else [] # Objects to ghost-associate
116 self.modifiers = modifiers if modifiers is not None else [] # Tools to modify the jet
117 self.extrainputs = extrainputs if extrainputs is not None else [] # Any extra input dependencies
118
119 self.standardRecoMode = standardRecoMode
120
121 self.byVertex = byVertex
122
123 # used internally to resolve dependencies
124 self._prereqDic = {}
125 self._prereqOrder = []
126 self._internalAtt = {}
127 self._cflags = None # pointer to AthenaConfiguration.ConfigFlags. Mainly to allow to invoke building of input dependencies which are outside Jet domain during std reco
128 self._contextDic = None # pointer to the context dictionnary. Convenient shortcut used to configure input or modifier dependencies
129 self._locked = lock
130
131
132 def __hash__(self):
133 return hash((self.basename,self._inputdef,self.ptmin,str(self.ghostdefs),str(self.modifiers),str(self.extrainputs),self.byVertex))
134
135 def __eq__(self,rhs):
136 return self.__hash__() == rhs.__hash__()
137
138 def __ne__(self,rhs):
139 return (not self.__eq__(rhs))
140
141 def lock(self):
142 if not self._locked:
143 self._locked = True
144
145 # After dependency solving, we hold a reference to the AthConfigFlags,
146 # which if unmodified is meant to function as a singleton throughout the
147 # configuration. A full deep copy of this is expensive, and slows down
148 # the HLT menu generation a lot due to copies in caches.
149 # So we explicitly avoid the deepcopy of the flags here, and further
150 # check that the flags are locked, to prevent accidental unlocking
151 def __deepcopy__(self, memo):
152 cls = self.__class__
153 result = cls.__new__(cls)
154 memo[id(self)] = result
155 set_without_deepcopy = ['_cflags']
156 for k, v in self.__dict__.items():
157 if k in set_without_deepcopy:
158 if v:
159 assert(v.locked())
160 setattr(result, k, v)
161 else:
162 setattr(result, k, deepcopy(v, memo))
163 return result
164
165 # Define core attributes as properties, with
166 # custom setter/getter such that if changed, these
167 # force resetting of the jet name
168 @make_lproperty
169 def algorithm(self): pass
170
171 @algorithm.lsetter
172 def algorithm(self,algorithm):
173 self._algorithm = algorithm
174 self._defineName()
175
176 @make_lproperty
177 def radius(self): pass
178
179 @radius.lsetter
180 def radius(self,radius):
181 self._radius = radius
182 self._defineName()
183
184 @make_lproperty
185 def inputdef(self): pass
186
187 @inputdef.lsetter
188 def inputdef(self,inputdef):
189 self._inputdef = inputdef
190 self._defineName()
191
192 @make_lproperty
193 def prefix(self): pass
194
195 @make_lproperty
196 def suffix(self): pass
197
198 @make_lproperty
199 def infix(self): pass
200
201 @make_lproperty
202 def basename(self): pass
203
204 @basename.lsetter
205 def basename(self,v):
206 raise Exception("Can NOT set property basename of JetDefinition ",self," Change prefix, infix or suffix instead.")
207
208 @make_lproperty
209 def ptmin(self): pass
210
211 @make_lproperty
212 def ghostdefs(self): pass
213 @make_lproperty
214 def modifiers(self): pass
215 @make_lproperty
216 def extrainputs(self): pass
217 @make_lproperty
218 def standardRecoMode(self): pass
219 @make_lproperty
220 def byVertex(self): pass
221
222 @make_lproperty
223 def VRMinRadius(self): pass
224 @make_lproperty
225 def VRMassScale(self): pass
226
227 @make_lproperty
228 def context(self): pass
229
230 @make_lproperty
231 def ghostarea(self): pass
232
233
234 def fullname(self):
235 return self.prefix+self.basename+self.infix+"Jets"+self.suffix
236
237 def _defineName(self):
238 self._basename = buildJetAlgName(self.algorithm,self.radius,self.VRMassScale,self.VRMinRadius)+self.inputdef.label # .label
239 if self.inputdef.basetype == xAODType.CaloCluster:
240 # Omit cluster origin correction from jet name
241 # Keep the origin correction explicit because sometimes we may not
242 # wish to apply it, whereas PFlow corrections are applied implicitly
243 self._basename = self.basename.replace("Origin","")
244 pass
245
246 # Define a string conversion for printing
247 def __str__(self):
248 return f"JetDefinition({self.fullname()})"
249 # Need to override __repr__ for printing in lists etc
250 __repr__ = __str__
251
252
253
254
255@clonable
256@onlyAttributesAreProperties
257class JetModifier(object):
258 """Helper to define the config of a IJetModifier tool.
259 Tools that typically have more complex properties set should have
260 their own dedicated helper 'createfn' functions defined"""
261
262 def __init__(self,tooltype,toolname,
263 createfn=None,
264 filterfn=_condAlwaysPass,
265 prereqs=None,modspec=None,
266 **properties
267 ):
268 # For the easy cases where no helper function is needed.
269 # They will be ignored in the case of a helper,
270 # but are still required such that it's obvious what
271 # the tool name and type are when defining the config.
272 self.tooltype = tooltype
273 self.toolname = toolname
274
275 # The helper function may take 2 parameters:
276 # a "modifier specification" string and the jet
277 # definition
278
279 # The helper function always returns the desired
280 # modifier, and a ComponentAccumulator instance,
281 # in case additional supporting tools/services
282 # need to be set up.
283 if createfn is None:
285 else:
286 self.createfn = createfn
287 self.modspec = modspec
288
289 # Prereqs is normally a list.
290 # However, in special cases, the prereqs may
291 # depend on either or both of modspec and jetdef,
292 # in which case a helper function can be defined.
293 self.prereqs = prereqs if prereqs is not None else []
294
295 # a function taking a CondFlags as argument and deciding if this JetModifier is compatible
296 # with the conditions.
297 # The function must return a tuple : (bool, "reason of failure")
298 self.filterfn = filterfn
299
300 # These will be set as the Gaudi properties of the C++ tool
301 self.properties = properties
302
303
304
305
306 @make_lproperty
307 def tooltype(self):pass
308 @make_lproperty
309 def toolname(self):pass
310 @make_lproperty
311 def createfn(self):pass
312 @make_lproperty
313 def modspec(self):pass
314 @make_lproperty
315 def prereqs(self):pass
316 @make_lproperty
317 def filterfn(self):pass
318 @make_lproperty
319 def properties(self):pass
320
321
322
323 def __hash__(self):
324 return hash((self.toolname,self.tooltype,self.createfn.__name__,self.modspec,str(self.prereqs)))
325
326 def __eq__(self,rhs):
327 return self.__hash__() == rhs.__hash__()
328
329 def __ne__(self,rhs):
330 return (not self.__eq__(rhs))
331
332 # Define a string conversion for printing
333 def __str__(self):
334 return "JetModifier({0}/{1})".format(self.tooltype,self.toolname)
335 # Need to override __repr__ for printing in lists etc
336 __repr__ = __str__
337
338 def getGenericModifier(self,jetdef, modspec):
339 """returns a real tool instance accoding to this definition : simply instantiating from
340 class self.tooltype and with name self.toolname ( actually : self.toolname.format(modspec) )
341 Since this function will be called as a callback from JetRecConfig as 'func(jetdef, modspec)', it must accept
342 the jetdef argument, even if unused in this case.
343 """
344 from AthenaConfiguration.ComponentFactory import CompFactory
345 name = self.toolname.format(modspec=modspec)
346 tool = CompFactory.getComp(self.tooltype)(name)
347 return tool
348
349
350
351
352
353
354@clonable
355@onlyAttributesAreProperties
356class JetInputExternal(object):
357 """This class allows to declare primary data sources to jet finding which are typically outside of jet domain.
358 Such sources can be container of particles (ex: clusters, selection of tracks,...) but also
359 other object needed by some JetModifier (ex: EventDensity or track-vertex association map).
360
361 The class is mainly here to hold a helper function (algoBuilder) in charge of configuring the proper algorithm to build the source.
362 If this function is None, then we expect the container pre-exists in the evt store.
363
364 Arguments to the constructor :
365 - name : container name in event store
366 - objtype : the xAODType (ex: xAODType.TruthParticle, xAODType.CaloCluster, ...)
367 - algoBuilder [optional] : a function returning a configured algorithm which build the container
368 the function is called as algoBuilder(parentjetdef, specs) where
369 parentjetdef is the JetDefinition for which this input building is called.
370 specs is self.specs
371 If omitted, it is assumed the container pre-exists in the event store.
372 - specs [optional] : a string (or anything) which specifies some options, and passed to the algoBuilder function
373 - filterfn : a function taking a CondFlags as argument and deciding if this JetModifier is compatible
374 with the conditions (same as JetModifier.filterfn )
375 The function must return a tuple : (bool, "reason of failure")
376 - prereqs : a list of prerequisites (str) for this input definition. If any, these str must match the name of other existing JetInputExternal instances.
377 """
378 def __init__(self, name, objtype, algoBuilder=None, specs=None, containername=None, filterfn= _condAlwaysPass, prereqs=None):
379 self.name = name
380 self.basetype = objtype
381
382 self.algoBuilder = algoBuilder if algoBuilder is not None else buildNothing # buildNothing returns None (see below)
383
384 # In certain cases (EventShape) we need to configure the concrete
385 # output container name based on the jetdef and specs, so can
386 # pass in a (lambda) function to define this.
387 if containername:
388 self.containername = containername
389 else:
390 # Ordinarily we just return the name
391 self.containername = lambda dummyjetdef,dummyspecs : self.name
392
393 self.specs = specs
394 self.filterfn = filterfn
395 self.prereqs = prereqs if prereqs is not None else []
396
397 @make_lproperty
398 def name(self): pass
399 @make_lproperty
400 def algoBuilder(self): pass
401 @make_lproperty
402 def basetype(self): pass
403 @make_lproperty
404 def specs(self): pass
405 @make_lproperty
406 def filterfn(self):pass
407 @make_lproperty
408 def prereqs(self):pass
409
410 # make outputname an alias of name so JetInputExternal shares an interface with JetInputConstitSeq.
411 outputname = make_alias("name")
412
413 # Define a string conversion for printing
414 def __str__(self):
415 return f"JetInputExternal({self.name},type={str(self.basetype)})"
416
417 def __hash__(self):
418 return hash((
419 self.name,str(self.basetype),str(self.algoBuilder),
420 self.containername(None,None),str(self.prereqs),
421 str(self.filterfn),str(self.specs)))
422
423 # Need to override __repr__ for printing in lists etc
424 __repr__ = __str__
425
426 def __eq__(self,other):
427 return hash(self) == hash(other)
428
429 def __ne__(self,rhs):
430 return (not self.__eq__(rhs))
431
432
433
434
435
436from enum import IntEnum, auto
437class JetInputType(IntEnum):
438 """We reproduce the Enum from in xAODJet/​JetContainerInfo.h, xAOD::JetInput : loading the C++ library
439 can slow down a lot the configuration.
440 Note : this is different from the xAODType which describes *only* c++ types whereas JetInputType describes
441 categories of inputs to jets.
442 """
443 LCTopo=0
444 EMTopo=auto()
445 TopoTower=auto()
446 Tower=auto()
447 Truth=auto()
448 TruthWZ=auto()
449 Track=auto()
450 PFlow=auto()
451 LCPFlow=auto() # LC PFlow
452 EMPFlow=auto() # EM Pflow at EM scale
453 EMPFlowByVertex=auto() # EM Pflow by vertex
454 EMCPFlow=auto() # EM Pflow calibrated to LC scale
455 Jet=auto()
456 LCTopoOrigin=auto()
457 EMTopoOrigin=auto()
458 TrackCaloCluster=auto()
459 TruthDressedWZ=auto() # Truth jets without prompt e/mu (or dressed photons) or prompt gammas
460 EMTopoOriginSK=auto()
461 EMTopoOriginCS=auto()
462 EMTopoOriginVor=auto()
463 EMTopoOriginCSSK=auto()
464 EMTopoOriginVorSK=auto()
465 LCTopoOriginSK=auto()
466 LCTopoOriginCS=auto()
467 LCTopoOriginVor=auto()
468 LCTopoOriginCSSK=auto()
469 LCTopoOriginVorSK=auto()
470 EMPFlowSK=auto()
471 EMPFlowCS=auto()
472 EMPFlowVor=auto()
473 EMPFlowCSSK=auto()
474 EMPFlowVorSK=auto()
475 TruthCharged=auto() # Truth jets with only charged particles
476 EMTopoOriginTime=auto()
477 EMTopoOriginSKTime=auto()
478 EMTopoOriginCSSKTime=auto()
479 EMTopoOriginVorSKTime=auto()
480 EMPFlowTime=auto()
481 EMPFlowSKTime=auto()
482 EMPFlowCSSKTime=auto()
483 EMPFlowVorSKTime=auto()
484 HI=auto()
485 HIClusters=auto()
486 Other = 100
487 Uncategorized= 1000
488
490 """Returns a default JetInputType for a given xAODType """
491 _xaodTojetinputMap = {
492 xAODType.CaloCluster : JetInputType.LCTopo,
493 xAODType.ParticleFlow : JetInputType.EMPFlow,
494 xAODType.FlowElement : JetInputType.EMPFlow,
495 xAODType.TrackParticle : JetInputType.Track,
496 xAODType.TruthParticle : JetInputType.Truth,
497 xAODType.Jet : JetInputType.Jet,
498 }
499 return _xaodTojetinputMap.get(xt, JetInputType.Other)
500
501@clonable
502@onlyAttributesAreProperties
503class JetInputConstit(object):
504 """Configuration for simplest constituents (or ghost constituents) to jets.
505 This describes what can be the input to a PseudoJetAlgorithm.
506 The containername attribute must correspond to an existing JetInputExternal so the system knows how to build this
507 source container (if necessary).
508 """
509
511 self,
512 name, # identifies this constit source, must be unique.
513 objtype, # The type of xAOD object from which to build the jets
514 containername, # The key of the source container in the event store.
515 prereqs=None, # will contain references to JetInputExternal
516 label=None, # used to describe a category for these constits. if None, will default to name
517 jetinputtype=None, # The JetInputType category. Can be passed as a string.
518 # if None, set according to objtype.
519 filterfn=_condAlwaysPass,
520 byVertex=False,
521 lock=False, # lock all properties of this instance
522 ):
523
524 self.name = name
525 self.containername = containername
526 self.prereqs = prereqs if prereqs is not None else []
527 self.label = label or name
528
529 self.basetype = objtype
530 self.filterfn = filterfn
531
532 jetinputtype = jetinputtype or JetInputType.fromxAODType(objtype)
533 if isinstance(jetinputtype, str):
534 jetinputtype = JetInputType[jetinputtype]
535 self.jetinputtype = jetinputtype
536 self.byVertex = byVertex
537 self._locked = lock
538
539 def __hash__(self):
540 return hash((self.name,self.containername,self.label,str(self.basetype),str(self.filterfn),str(self.jetinputtype),str(self.byVertex)))
541
542 def __eq__(self,rhs):
543 return self.__hash__() == rhs.__hash__()
544
545 def __ne__(self,rhs):
546 return (not self.__eq__(rhs))
547
548 @make_lproperty
549 def basetype(self): pass
550
551 @make_lproperty
552 def name(self): pass
553
554 @make_lproperty
555 def containername(self): pass
556
557 @make_lproperty
558 def prereqs(self): pass
559
560 @make_lproperty
561 def filterfn(self):pass
562
563 @make_lproperty
564 def jetinputtype(self): pass
565
566 # make an alias on containername so JetInputConstit and JetInputConstitSeq share an interface
567 inputname = make_alias("containername")
568
569 # Define a string conversion for printing
570 def __str__(self):
571 return f"JetInputConstit({self.name},type={str(self.basetype)})"
572 # Need to override __repr__ for printing in lists etc
573 __repr__ = __str__
574
575
576
577@clonable
578@onlyAttributesAreProperties
580 """Configuration for JetConstituentModSequence.
581 Describes the constituents which need to be build with a JetConstituentModSequence.
582 Uses a list of aliases to JetConstitModifier to describe the modif steps.
583 """
584 def __init__(self,
585 name,
586 objtype, # The type of xAOD object from which to build the jets
587 modifiers=None, # Modifications to be applied to constituents prior to jet finding
588 inputname=None, # input collection which will be transformed into the source constituents
589 outputname=None, # output collection, will be set to self.containername
590 prereqs = None, # will contain references to JetInputExternal
591 label = None,
592 jetinputtype=None,
593 filterfn=_condAlwaysPass,
594 byVertex=False,
595 lock = False, # lock all properties of this instance
596 ):
597
598 _prereqs = prereqs if prereqs is not None else []
599 JetInputConstit.__init__(self,name, objtype, outputname, prereqs=_prereqs, jetinputtype=jetinputtype, filterfn=filterfn,label=label,lock=False, finalinit=False, byVertex=byVertex)
600 self.inputname = inputname or name
601 self.modifiers = modifiers if modifiers is not None else []
602
603
604 self._locked = lock
605
606 @make_lproperty
607 def modifiers(self): pass
608
609 @make_lproperty
610 def inputname(self): pass
611 @make_lproperty
612 def label(self): pass
613
614
615
616 def __hash__(self):
617 return hash((self._basetype,str(self._modifiers)))
618
619 def __eq__(self,rhs):
620 return self.__hash__() == rhs.__hash__()
621
622 def __ne__(self,rhs):
623 return (not self.__eq__(rhs))
624
625
626 # Define a string conversion for printing
627 def __str__(self):
628 return f"JetInputConstitSeq({self.name}, {self.inputname} , {self.containername})"
629 # Need to override __repr__ for printing in lists etc
630 __repr__ = __str__
631
632
633
634@clonable
635@onlyAttributesAreProperties
636class JetConstitModifier(object):
637 """Configuration for a constituent modifier tool to be used in a JetConstituentModSequence.
638 See StandardJetConstits.py for usage of this class.
639
640 the properties argument in __init__ defines directly the properties of the final tool :
641 if the tool has the property "PtMin" then passing 'dict(PtMin=10*GeV)' will result in 'tool.PtMin = 10*GeV'
642 IMPORTANT : If a property is itself an other tool, we can pass a function returning the tool like in 'dict(TheSubTool = mySubToolFunc)'
643 The function will be called only when appropriate in the form 'tool.TheSubTool = mySubToolFunc(constitseq)'
644 """
645 def __init__(self,
646 name,
647 tooltype,
648 prereqs=None,
649 properties=None,
650 ):
651 self.name = name
652 self.tooltype = tooltype
653 self.properties = properties if properties is not None else {}
654 self.prereqs = prereqs if prereqs is not None else []
655 self.filterfn = _condAlwaysPass # we might want to make this a proper attribute in the future
656
657 @make_lproperty
658 def name(self): pass
659 @make_lproperty
660 def tooltype(self): pass
661 @make_lproperty
662 def properties(self): pass
663 @make_lproperty
664 def prereqs(self): pass
665
666
667
668
670 return None
virtual void lock()=0
Interface to allow an object to lock itself when made const in SG.
__init__(self, name, tooltype, prereqs=None, properties=None)
__init__(self, algorithm, radius, inputdef, ptmin=5e3 *MeV, ghostdefs=None, modifiers=None, extrainputs=None, standardRecoMode=False, prefix="", suffix="", infix="", context="default", VRMinR=-1.0, VRMassSc=-1.0, ghostarea=0.01, byVertex=False, lock=False)
__init__(self, name, objtype, modifiers=None, inputname=None, outputname=None, prereqs=None, label=None, jetinputtype=None, filterfn=_condAlwaysPass, byVertex=False, lock=False)
__init__(self, name, objtype, containername, prereqs=None, label=None, jetinputtype=None, filterfn=_condAlwaysPass, byVertex=False, lock=False)
__init__(self, name, objtype, algoBuilder=None, specs=None, containername=None, filterfn=_condAlwaysPass, prereqs=None)
__init__(self, tooltype, toolname, createfn=None, filterfn=_condAlwaysPass, prereqs=None, modspec=None, **properties)
getGenericModifier(self, jetdef, modspec)
std::string replace(std::string s, const std::string &s2, const std::string &s3)
Definition hcg.cxx:312
buildJetAlgName(finder, mainParam, variableRMassScale=-1.0, variableRMinRadius=-1.0)
_condAlwaysPass(condflags)