21 __author__  = 
"Sebastien Binet" 
   31     'char',      
'unsigned char',      
'signed char',
 
   32     'short',     
'unsigned short',
 
   33     'int',       
'unsigned int',
 
   34     'long',      
'unsigned long',
 
   35     'long long', 
'unsigned long long', 
'ulonglong',
 
   60         print (
"## initializing...")
 
   63         self.
Type = cppyy.gbl.RootType
 
   69         klassNames = [klassName]
 
   70         print (
"## loading dictionary... [%s]" % klassName)
 
   73         if klassName.startswith(
"std::_"):
 
   78         if klassName 
in _cpp_builtins:
 
   83             loaded = getattr (self.
gbl, klassName)
 
   84         except Exception 
as e:
 
   85             print (
"Error loading dict. for [%s]" % klassName)
 
   88             print (
"Failed to load dict for [%s]" % klassName)
 
   90         klass = self.
Type.ByName(klassName)
 
   92         if not klass.IsStruct() 
and not klass.IsClass():
 
   95         for i 
in range(klass.BaseSize()):
 
   96             baseKlassName = klass.BaseAt(i).Name()
 
   97             klassNames.extend (self.
loadDicts(baseKlassName))
 
  106         for i 
in range(klass.DataMemberSize()):
 
  107             d = klass.DataMemberAt(i)
 
  109             offset = 
'<s>' if d.IsStatic() 
else d.Offset()
 
  110             fullname = 
'::'.
join([scope, d.Name(SFQ)])
 
  111             typename = d.TypeOf().Name(SFQ)
 
  112             dataMembers.append( 
DataMember(offset, fullname, typename) )
 
  117         for i 
in range(klass.FunctionMemberSize()):
 
  118             f = klass.FunctionMemberAt(i)
 
  119             fctMembers.append( 
FctMember( f.Name(SFQ),
 
  120                                           f.TypeOf().Name(SFQ) ) )
 
  128         print (
"## loading all relevant dictionaries...")
 
  130             klassNames = self.loadDicts(klassName)
 
  132         except Exception 
as err:
 
  135             print (
"## ERROR while trying to load dict for [%s]" % klassName)
 
  136             print (
"##  -Most probably you DIDN'T give a fully qualified name !")
 
  137             print (
"##   Ex: try 'Analysis::Muon' instead of 'Muon'")
 
  139             print (
"##  -Could also mean that you are missing a dictionary ")
 
  140             print (
"##   of one of the base classes...")
 
  148         print (
"## infos for class [%s]:" % klassName)
 
  149         print (
"## sizeof(%s) = %i" % \
 
  151                 self.Type.SizeOf(self.Type.ByName(klassName))))
 
  153         print (
"## (offset, data member name, data member type)")
 
  157         for klass 
in klassNames:
 
  158             line = 
"%s %s %s" % (
 
  159                 "-" * (40-len(klass)//2-1),
 
  161                 "-" * (40-len(klass)//2-1) )
 
  165             dataMembers = self.dumpDataMembers( self.Type.ByName(klass) )
 
  166             for i 
in dataMembers:
 
  167                 line = 
"%3s %s %-50s %s %s" % ( 
str(i.offset),
 
  176     def save(self, fileName = "./columbo.out" ):
 
  177         file = 
open(os.path.expandvars(os.path.expanduser(fileName)),
 
  179         for line 
in self.report:
 
  180             file.writelines(line + os.linesep)
 
  187 if __name__ == 
'__main__':
 
  188     if len(sys.argv) > 1:
 
  189         klassName = sys.argv[1]
 
  191         klassName = 
"xAOD::TruthParticle_v1" 
  195     columbo.inspect(klassName)