6 from Vispa.Share.BasicDataAccessor
import BasicDataAccessor
7 from Vispa.Share.RelativeDataAccessor
import RelativeDataAccessor
8 from Vispa.Share.ParticleDataAccessor
import ParticleDataAccessor
9 from Vispa.Plugins.EventBrowser.EventFileAccessor
import EventFileAccessor
10 from Vispa.Main.Exceptions
import exception_traceback
11 from Vispa.Plugins.EdmBrowser.ParticleDataList
import defaultParticleDataList
14 return id(self)==
id(other)
16 return id(self)!=
id(other)
20 if hasattr(container,
'GetEntries'):
22 entries = container.GetEntries()
23 for entry
in xrange(entries):
26 raise cmserror(
"Looping of %s failed" %container)
28 elif hasattr(container,
'size'):
30 if hasattr(container,
'ids'):
31 container = container.ids()
33 entries = container.size()
34 for entry
in xrange(entries):
35 yield container[entry]
50 class EdmDataAccessor(BasicDataAccessor, RelativeDataAccessor, ParticleDataAccessor, EventFileAccessor):
53 logging.debug(__name__ +
": __init__")
77 if not id(object)
in self._edmChildrenObjects.keys():
79 if levels>1
and id(object)
in self._edmChildren.keys():
81 if not self.
isRead(child, levels-1):
86 """ Get children of an object """
87 if id(object)
in self._edmChildren.keys()
and self.
isRead(object):
93 """ Get children of an object """
94 if id(object)
in self._edmChildren.keys()
and self.
isRead(object):
100 """ Get motherRelations of an object """
101 if id(object)
in self._edmMotherRelations.keys():
107 """ Get daughterRelations of an object """
108 if id(object)
in self._edmDaughterRelations.keys():
117 if id(object)
in self._edmLabel.keys():
119 return splitlabel[len(splitlabel)-1]
128 return ".".
join(splitlabel[1:-1])
131 typ=str(object.__class__)
133 typ=typ.split(
"\'")[1]
135 typ=typ.split(
".")[len(typ.split(
"."))-1]
136 return typ.strip(
" ")
144 while id(entry)
in self._edmParent.keys()
and self.
_edmParent[
id(entry)]!=
None:
151 while id(entry)
in self._edmParent.keys()
and self.
_edmParent[
id(entry)]!=
None:
157 """ get all method properties of an object """
159 for attr
in dir(object):
160 prop=getattr(object,attr)
161 if not attr.startswith(
"__")
and (self.
_underscore or attr.strip(
"_")==attr):
162 objects+=[(attr,prop)]
166 """ get object and resolve references """
168 ref_types=[
"edm::Ref",
"edm::RefProd",
"edm::RefToBase",
"edm::RefToBaseProd",
"edm::Ptr"]
171 if typshort
in ref_types:
173 if hasattr(object,
"isNull")
and object.isNull():
174 value=
"ERROR: "+self.
getType(object)+
" object is null"
175 elif hasattr(object,
"isAvailable")
and not object.isAvailable():
176 value=
"ERROR: "+self.
getType(object)+
" object is not available"
179 if type(value)==type(
None):
180 value=
"ERROR: Could not get "+self.
getType(object)
183 except Exception, message:
184 value=
"ERROR: "+str(message)
188 """ get string value of a method """
189 if not callable(object):
193 if not object.__doc__
or str(object.__doc__)==
"":
194 return "ERROR: Empty __doc__ string"
195 docs=str(object.__doc__).
split(
"\n")
198 for p
in doc[doc.find(
"(")+1:doc.find(
")")].
split(
","):
199 if p!=
"" and not "=" in p:
201 if len(parameters)!=0:
203 typestring=doc[:doc.find(
"(")]
204 split_typestring=typestring.split(
" ")
207 for i
in reversed(range(len(split_typestring))):
208 templates+=split_typestring[i].
count(
"<")
209 templates-=split_typestring[i].
count(
">")
213 typ=
" ".
join(split_typestring[:end_typestring])
214 hidden_types=[
"iterator",
"Iterator"]
215 root_types=[
"ROOT::"]
216 if typ==
"" or "void" in typ
or True in [t
in typ
for t
in hidden_types]:
218 from ROOT
import TClass
219 if True in [t
in typ
for t
in root_types]
and TClass.GetClass(typ)==
None:
220 return "ERROR: Cannot display object of type "+typ
224 except Exception, message:
225 value=
"ERROR: "+str(message)
226 if "Buffer" in str(type(value)):
227 return "ERROR: Cannot display object of type "+typ
233 return typ==
"list" or typ[-6:].lower()==
"vector" or typ[-3:].lower()==
"map" or typ[-10:].lower()==
"collection" or hasattr(object,
"size")
237 if hasattr(a,
"px")
and hasattr(a,
"py")
and hasattr(a,
"pz")
and hasattr(a,
"energy")
and \
238 hasattr(b,
"px")
and hasattr(b,
"py")
and hasattr(b,
"pz")
and hasattr(b,
"energy"):
239 same=a.px()==b.px()
and a.py()==b.py()
and a.pz()==b.pz()
and a.energy()==b.energy()
243 """ get list of daughter objects from properties """
247 hidden_attr=[
"front",
"back",
"IsA",
"clone",
"masterClone",
"masterClonePtr",
"mother",
"motherRef",
"motherPtr",
"daughter",
"daughterRef",
"daughterPtr",
"is_back_safe"]
250 if attr1
in hidden_attr:
252 elif attr1
in broken_attr:
253 objectdict[attr1]=(
"ERROR: Cannot read property",
False)
257 objectdict[attr1]=(value,ref)
258 for name
in sorted(objectdict.keys()):
259 objects+=[(name,objectdict[name][0],objectdict[name][1],self.
_propertyType(objectdict[name][0]))]
263 for o
in all(object):
268 elif "GenParticle" in str(value):
269 name=defaultParticleDataList.getNameFromId(value.pdgId())
271 name=self.
getType(value)+
" ["+str(n)+
"]"
272 objects+=[(name,value,ref,typ)]
275 for name,mother,ref,propertyType
in objects:
276 if hasattr(mother,
"numberOfDaughters")
and hasattr(mother,
"daughter"):
277 for n
in range(mother.numberOfDaughters()):
279 daughter=mother.daughter(n)
281 for na,da,re,st
in objects:
285 if not id(mother)
in self._edmDaughterRelations.keys():
288 if not id(daughter)
in self._edmMotherRelations.keys():
291 except Exception, message:
292 logging.error(
"Cannot read candidate relations: "+str(message))
296 if type(value)
in (bool,):
298 elif type(value)
in (int, long):
300 elif type(value)
in (float,):
302 elif type(value)
in (complex,str,unicode):
308 """ Make list of all properties """
309 logging.debug(__name__ +
": properties: "+self.
label(object))
313 objectproperties_sorted=[]
314 if id(object)
in self._edmChildrenObjects.keys():
316 if propertyType!=
None:
317 objectproperties[name]=(value,propertyType)
318 objectproperties_sorted+=[name]
320 properties+=[(
"Category",
"Object info",
"")]
322 properties+=[(
"String",
"label",shortlabel)]
323 properties+=[(
"String",
"type",self.
getType(object))]
326 properties+=[(
"String",
"object",objectlabel)]
328 if shortlabel.strip(
".")!=branchlabel.strip(
"."):
329 properties+=[(
"String",
"branch",branchlabel)]
331 properties+=[(
"Category",
"Branch info",
"")]
332 properties+=[(
"String",
"Type",branchlabel.split(
"_")[0])]
333 properties+=[(
"String",
"Label",branchlabel.split(
"_")[1])]
334 properties+=[(
"String",
"Product",branchlabel.split(
"_")[2])]
335 properties+=[(
"String",
"Process",branchlabel.split(
"_")[3])]
337 for property
in [
"pdgId",
"charge",
"status"]:
338 if property
in objectproperties.keys():
339 properties+=[(objectproperties[property][1],property,objectproperties[property][0])]
340 del objectproperties[property]
342 if "px" in objectproperties.keys():
343 properties+=[(
"Category",
"Vector",
"")]
344 for property
in [
"energy",
"px",
"py",
"pz",
"mass",
"pt",
"eta",
"phi",
"p",
"theta",
"y",
"rapidity",
"et",
"mt",
"mtSqr",
"massSqr"]:
345 if property
in objectproperties.keys():
346 properties+=[(objectproperties[property][1],property,objectproperties[property][0])]
347 del objectproperties[property]
349 if "x" in objectproperties.keys():
350 properties+=[(
"Category",
"Vector",
"")]
351 for property
in [
"x",
"y",
"z"]:
352 if property
in objectproperties.keys():
353 properties+=[(objectproperties[property][1],property,objectproperties[property][0])]
354 del objectproperties[property]
356 if False in [str(value[0]).startswith(
"ERROR")
for value
in objectproperties.values()]:
357 properties+=[(
"Category",
"Values",
"")]
358 for property
in objectproperties_sorted:
359 if property
in objectproperties.keys():
360 if not str(objectproperties[property][0]).startswith(
"ERROR"):
361 properties+=[(objectproperties[property][1],property,objectproperties[property][0])]
362 del objectproperties[property]
364 if len(objectproperties.keys())>0:
365 properties+=[(
"Category",
"Errors",
"")]
366 for property
in objectproperties_sorted:
367 if property
in objectproperties.keys():
368 properties+=[(objectproperties[property][1],property,objectproperties[property][0])]
370 return tuple(properties)
373 """ read edm objects recursive """
374 logging.debug(__name__ +
": readObjectsRecursive (levels="+str(levels)+
"): "+label)
376 if not id(edmobject)
in self._edmLabel.keys():
377 if not isinstance(edmobject,(int,float,long,complex,str,unicode,bool)):
380 type(edmobject).__eq__=eq
381 type(edmobject).__ne__=ne
387 if not id(mother)
in self._edmChildren.keys():
392 return [edmobject],
True
398 """ read daughter objects of an edmobject """
399 logging.debug(__name__ +
": readDaughtersRecursive (levels="+str(levels)+
"): "+str(edmobject))
401 if not id(edmobject)
in self._edmChildrenObjects.keys():
407 for name,daughter,ref,propertyType
in daughters:
409 if propertyType==
None:
414 if id(edmobject)
in self._edmLabel.keys()
and self.
_edmLabel[
id(edmobject)]!=
"":
420 logging.warning(
"Did not read all daughter objects. Maximum is set to "+str(self.
maxDaughters)+
".")
424 def read(self,object,levels=1):
425 """ reads contents of a branch """
426 logging.debug(__name__ +
": read")
427 if isinstance(object,BranchDummy):
428 if hasattr(object,
"product"):
429 return object.product
433 self._events.getByLabel(object.branchtuple[2],object.branchtuple[3],object.branchtuple[4],object.branchtuple[1])
434 if object.branchtuple[1].isValid():
435 product=object.branchtuple[1].product()
436 if not isinstance(product,(int,float,long,complex,str,unicode,bool)):
439 type(product).__eq__=eq
440 type(product).__ne__=ne
443 self._dataObjects.insert(self._dataObjects.index(object),product)
444 self._dataObjects.remove(object)
446 object.product=product
450 logging.info(
"Branch is not valid: "+object.branchtuple[0]+
".")
455 object.unreadable=
True
456 logging.warning(
"Unable to read branch "+object.branchtuple[0]+
" : "+
exception_traceback())
458 if self.
isRead(object,levels):
465 """ Goto event number index in file.
498 """ Open edm file and show first event """
501 if os.path.splitext(filename)[1].lower()==
".txt":
502 file =
open(filename)
503 for line
in file.readlines():
505 linecontent=[l.strip(
" \n").rstrip(
".")
for l
in line.split(
"\"")]
506 self.
_branches+=[(linecontent[0]+
"_"+linecontent[1]+
"_"+linecontent[3]+
"_"+linecontent[5],
None,linecontent[1],linecontent[3],linecontent[5])]
508 linecontent=line.strip(
"\n").
split(
" ")[0].
split(
"_")
509 if len(linecontent)>3:
510 self.
_branches+=[(linecontent[0]+
"_"+linecontent[1]+
"_"+linecontent[2]+
"_"+linecontent[3],
None,linecontent[1],linecontent[2],linecontent[3])]
511 elif os.path.splitext(filename)[1].lower()==
".root":
512 from DataFormats.FWLite
import Events, Handle
515 branches=self._events.object().getBranchDescriptions()
516 for branch
in branches:
518 branchname=branch.friendlyClassName()+
"_"+branch.moduleLabel()+
"_"+branch.productInstanceName()+
"_"+branch.processName()
519 handle=
Handle(branch.fullClassName())
520 self.
_branches+=[(branchname,handle,branch.moduleLabel(),branch.productInstanceName(),branch.processName())]
522 logging.warning(
"Cannot read branch "+branchname+
":"+str(e))
523 self._branches.sort(
lambda x, y: cmp(x[0], y[0]))
528 charge=self.property(object,
"pdgId")
537 return defaultParticleDataList.isQuarkId(particleId)
543 return defaultParticleDataList.isLeptonId(particleId)
549 return defaultParticleDataList.isGluonId(particleId)
555 return defaultParticleDataList.isBosonId(particleId)
561 if not hasattr(defaultParticleDataList,
"isPhotonId"):
563 return defaultParticleDataList.isPhotonId(particleId)
569 if not hasattr(defaultParticleDataList,
"isHiggsId"):
571 return defaultParticleDataList.isHiggsId(particleId)
575 if hasattr(defaultParticleDataList,
"isPhotonId")
and defaultParticleDataList.isPhotonId(particleId):
576 return self.LINE_STYLE_WAVE
577 elif defaultParticleDataList.isGluonId(particleId):
578 return self.LINE_STYLE_SPIRAL
579 elif defaultParticleDataList.isBosonId(particleId):
580 return self.LINE_STYLE_DASH
581 return self.LINE_STYLE_SOLID
585 if defaultParticleDataList.isLeptonId(particleId):
586 return QColor(244, 164, 96)
587 elif defaultParticleDataList.isQuarkId(particleId):
588 return QColor(0, 100, 0)
589 elif hasattr(defaultParticleDataList,
"isHiggsId")
and defaultParticleDataList.isHiggsId(particleId):
590 return QColor(247, 77, 251)
591 elif defaultParticleDataList.isBosonId(particleId):
592 return QColor(253, 74, 74)
593 return QColor(176, 179, 177)
596 charge=self.property(object,
"charge")
608 return self._underscore
622 result=self.
read(branch,0)
623 if isinstance(result,BranchDummy):
624 self._dataObjects.remove(result)
625 if hasattr(result,
"invalid"):
626 self._filteredBranches.remove(result.branchtuple)
def readDaughtersRecursive
def setUnderscoreProperties
def getShortLabelWithType
static std::string join(char **cmd)