Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-10-19 04:58:01

0001 #!/usr/bin/env python3
0002 
0003 from argparse import ArgumentParser
0004 import logging
0005 import ROOT
0006 
0007 class TFileContext(object):
0008     def __init__(self, *args):
0009         self.tfile = ROOT.TFile(*args)
0010     def __enter__(self):
0011         return self.tfile
0012     def __exit__(self, type, value, traceback):
0013         self.tfile.Close()
0014 
0015 def display_results(t_data, style='twiki'):
0016     before = after = None
0017     if  (style == 'twiki'):
0018         header_fmt = ' | '.join( ['{:^6s}'] + ['{:^9s}' ] * (len(t_data.keys())-1) )
0019         row_fmt    = ' | '.join( ['{:6d}' ] + ['{:9.6f}'] * (len(t_data.keys())-1) )
0020         header_fmt = '| '+header_fmt+' |'
0021         row_fmt    = '| '+row_fmt   +' |'
0022     elif(style == 'latex'):
0023         before     = '\\begin{tabular}{' + 'c'*len(t_data.keys()) + '}'
0024         after      = '\\end{tabular}'
0025         header_fmt = ' & '.join( ['{:^6s}'] + ['{:^9s}' ] * (len(t_data.keys())-1) )  + ' \\\\\n\\hline'
0026         row_fmt    = ' & '.join( ['{:6d}' ] + ['{:9.6f}'] * (len(t_data.keys())-1) ) + ' \\\\'
0027     elif(style == 'csv'):
0028         header_fmt = ', '.join(  ['{:s}'  ]                *  len(t_data.keys())    )
0029         row_fmt    = ', '.join(  ['{:d}'  ] + ['{:f}'    ] * (len(t_data.keys())-1) )
0030     else:
0031         raise RuntimeError('Unknown style "%s" for table'%(style))
0032 
0033     if(before is not None): print(before)
0034     print( header_fmt.format(*t_data.keys()) )
0035     for i, run in enumerate(t_data['run']):
0036         print(row_fmt.format(run, *[t_data[k][i] for k in t_data.keys() if not k == 'run']))
0037     if(after is not None): print(after)
0038 
0039 
0040 def main():
0041     parser = ArgumentParser()
0042     parser.add_argument('fname'            , metavar='FILE')
0043     parser.add_argument('-p', '--partition', default='BPIX', help='Tracker partition (e.g. BPIX, FPIX, BPIXLYR1, etc.). Default: %(default)s')
0044     parser.add_argument('-l', '--list-content' , action='store_true', dest='list_content', help='List the contents of file and exit')
0045     parser.add_argument(      '--list-branches', action='store_true', help='List the branches of the tree and exit')
0046     parser.add_argument('-t', '--type'     , default='barycentre', choices=('barycentre', 'beamspot'), type=str.lower, help='Default: %(default)s')
0047     parser.add_argument(      '--label'    , default=None, help='Additional label that is appended to the folder name (i.e. PixelBaryCentreAnalyzer by default)')
0048     parser.add_argument(      '--quality'  , action='store_true', help='Read results with the WithPixelQuality flag (default: %(default)s)')
0049     parser.add_argument('-s', '--style'    , default='twiki', choices=('twiki', 'latex', 'csv'), type=str.lower, help='Table style for the output (default: %(default)s)')
0050     parser.add_argument(      '--loglevel' , metavar='LEVEL', default='WARNING', help='Level for the python logging module. Can be either a mnemonic string like DEBUG, INFO or WARNING or an integer (lower means more verbose).')
0051 
0052     args = parser.parse_args()
0053     loglevel = args.loglevel.upper() if not args.loglevel.isdigit() else int(args.loglevel)
0054     logging.basicConfig(format='%(levelname)s:%(module)s:%(funcName)s: %(message)s', level=loglevel)
0055     logging.debug('args: %s', args)
0056 
0057 
0058     folder    = 'PixelBaryCentreAnalyzer' if not args.quality          else 'PixelBaryCentreAnalyzerWithPixelQuality'
0059     tree_name = 'PixelBarycentre'         if args.type == 'barycentre' else 'BeamSpot'
0060     if(args.label is not None):
0061         tree_name += '_'+args.label
0062     columns = ['run'] + [(args.partition if args.type=='barycentre' else 'BS')+'.'+coord for coord in ('x', 'y', 'z')]
0063 
0064     with TFileContext(args.fname) as tfile:
0065         if(args.list_content):
0066             list_content(tfile)
0067             return 0
0068 
0069         tfolder = tfile.Get(folder)
0070         if(not tfolder):
0071             raise KeyError('Folder "%s" not found in "%s"' %(folder, args.fname))
0072 
0073         logging.debug('Opened folder "%s"', folder)
0074         tree = tfolder.Get(tree_name)
0075         if(not tree):
0076             logging.error('Tree "%s" not found; content of file "%s":', tree_name, args.fname)
0077             list_content(args.fname)
0078             raise KeyError(tree_name)
0079 
0080         if(args.list_branches):
0081             list_branches(tree, folder=folder)
0082             return 0
0083 
0084         rdf = ROOT.RDataFrame(tree)
0085         logging.info('Reading "%s"', tree_name)
0086         results = rdf.AsNumpy(columns)
0087 
0088     display_results(results, style=args.style)
0089 
0090     return 0
0091 
0092 
0093 def list_content(tfile):
0094     for tfolder in tfile.GetListOfKeys():
0095         for key in tfolder.ReadObj().GetListOfKeys():
0096             obj = key.ReadObj()
0097             print('%s\t%s/%s\t%d branches, %d entries' %(obj.ClassName(), tfolder.GetName(), key.GetName(), len(obj.GetListOfBranches()), obj.GetEntries()))
0098 
0099 
0100 def list_branches(tree, folder_name=''):
0101     branches = [b.GetName() for b in tree.GetListOfBranches()]
0102     logging.info('Branches (%s/%s): %d', (folder_name, tree.GetName(), len(branches)))
0103     print('\n'.join(branches))
0104 
0105 
0106 if __name__ == '__main__':
0107     exit(main())