#!/usr/bin/python # -*- coding: iso-8859-1 -*- import sys import math import string import pickle import requestIdFilter import os import sys import re from optparse import OptionParser #python_db="/www-d0/WWW/docs/Run2Physics/cs/MC/RequestIdListTools/request_info.db" python_db="request_info.db" def make_list(theG,myP,myD,myG,myR,myMB, list_type,pXX, print_nevt , print_xsec, print_top_mass, print_zb_sample): option_pref='' if list_type=='proc_list': option_pref='-p' elif list_type=='decay_list': option_pref='-d' elif list_type=='gene_rel_list': option_pref='-g' elif list_type=='reco_rel_list': option_pref='-r' elif list_type=='mb_list': option_pref='' if theG=='unknown': print "Generator was not written in sam metadata..." print "This is usually the case for ssingletop CompHep, special prod" print " This is not yet supported" sys.exit(0) file_all= open(python_db,'r') list_all=pickle.load(file_all) req_list=list_all.keys() list_of_p={} for reqk in req_list: request=list_all.get(reqk) generator = request.get('generator') proc = requestIdFilter.change_prod( request ) decay= requestIdFilter.change_decay( request ) reco = request.get('rec_version') gene = request.get('gen_version') zb = request.get('minb_dataset') if generator=='not_found' or generator=='unknown' or generator=='single': continue if not pXX is None and reco.split('.')[0] != pXX: continue if not theG is None and generator != theG: continue pXX = reco.split('.')[0] icaf=-1 if pXX=='p17': icaf=1 elif pXX=='p20': icaf=0 else: continue if not myP is None and \ ( re.match(myP,proc) is None or re.match(myP,proc).end() != len(proc)): continue if not myD is None and \ ( re.match(myD,decay) is None): continue if not myR is None and \ ( re.match(myR,reco) is None or re.match(myR,reco) .end()!= len(reco)): continue if not myG is None and \ ( re.match(myG,gene) is None or re.match(myG,gene) .end()!= len(gene)): continue if myMB and requestIdFilter.filterBadZBoverlay(zb)=='bad': continue key=-1 value=-1 if list_type=='generators': key=generator value=generator elif list_type=='proc_list': key=proc value=proc elif list_type=='decay_list': key=decay value=decay elif list_type=='gene_rel_list': key=gene value=gene elif list_type=='reco_rel_list': key=reco value=reco elif list_type=='mb_list': key=zb value=zb elif list_type=='request_list': key=request.get('requestid') value=request else: print "nothing matches" continue list_of_p[key]=value pl=list_of_p.keys() pl.sort() num_evt=0 if list_type=='request_list': num_evt=0 separator="==========================" separator+="==================================" format="%+5s | %-50s" % ('reqId','process__decay__pXX') if print_nevt: format+= " %7s" % '#evts' separator+="=========" if print_xsec: format += " %12s %13s" %('Xsec [pb]','dXsec [pb]') separator+="============================" if print_top_mass: format += " %5s" % 'Mtop' separator += "========" format +=" %+9s %+9s" % ('reco. rel','gen. rel') separator+="======================" if print_zb_sample: format += " %-40s" % 'MB sample' separator += "============================================" print separator print format print separator for p in pl: request=list_of_p.get(p) proc = requestIdFilter.change_prod( request ) decay= requestIdFilter.change_decay( request ) reco = request.get('rec_version') gene = request.get('gen_version') proc__decay = "%s__%s__%s" % (proc,decay,pXX) info="%+5s | %-50s" % (p,proc__decay) if print_nevt and request.has_key('nevt_tmb'): info += " %7d" % int(request.get('nevt_tmb')) if print_xsec: if request.has_key('xsec'): info += " %e %e" % (request.get('xsec'),request.get('dxsec')) else: info += " %15s %10s" % ('?',' ') if print_top_mass and request.has_key('topmass'): info += " %5s" % request.get('topmass') info+=" %+9s %+9s" % (reco,gene) if print_zb_sample: info += " %-40s" % request.get('minb_dataset')[0:40] if request.has_key('nevt_tmb'): num_evt+=int(request.get('nevt_caf_trees')[icaf]) print info print separator print "Total number of events in caf trees: ",num_evt else: for p in pl: print "%s %s" %(option_pref,list_of_p[p]) file_all.close() def main(): """ Main function, deals with arguments and launch program""" usage_str="%prog [options] generator pXX (pXX is p17 or p20)" description_str = "getRequestsList gives a list of request id matching criteria in options\n" description_str += "A generator argument is requested.\n" description_str += "Any listing option (--xxxx) will prevent the requestID list to be printed\n" description_str += "It is recommended to specify as many as possible options among:\n" description_str += "-p, -d, -g, -r or -z\n" description_str += "getRequestsList -h or --help for more help" description_str += "\n" ### create option parser parser = OptionParser(usage=usage_str,description=description_str) # listing options parser.add_option("--generators", action="store_true",dest="generators", help="List of available generators") parser.add_option("--processes", action="store_true", dest="processes", help="List of available processes") parser.add_option("--decays", action="store_true", dest="decays", help="List of available decays, option -p is required") parser.add_option("--gen_releases", action="store_true", dest="gen_releases", help="List of generator rel.") parser.add_option("--rec_releases", action="store_true", dest="rec_releases", help="List of reco rel.") parser.add_option("--zbs" , action="store_true", dest="zbs", help="List of zb-overlay samples") # refine list of request id parser.add_option("-p", action="store", type="string", dest="proc", help="specify process id, eg z+0lp") parser.add_option("-d", action="store",type="string", dest="decay", help="specify decay id, eg ee+0lp or ee") parser.add_option("-g", action="store", type="string", dest="gen_v", help="specify generator release, eg p17.09.08") parser.add_option("-r", action="store", type="string", dest="rec_v", help="specify reco release, eg p17.09.08") parser.add_option("-z", action="store_true", dest="zb", help="filter out bad zb-overlay samples",default=False) # editing options parser.add_option("--InfoNevt",action="store_true",dest="InfoNevt", help="Add #evts(CAF) info [Default: false]",default=False) parser.add_option("--InfoXsec",action="store_true",dest="InfoXsec", help="Add Xsec(alpgen) info [Default: false]",default=False) parser.add_option("--InfoTop",action="store_true",dest="InfoTop", help="Add top mass info [Default: false]",default=False) parser.add_option("--InfoZB",action="store_true",dest="InfoZB", help="Add ZB sample info [Default: false]",default=False) # parse args (options, args) = parser.parse_args() if not options.proc is None: options.proc=options.proc.replace('+','\+') if not options.decay is None: options.decay=options.decay.replace('+','\+') pXX=None if options.generators or len(args) == 0: print "You must at least specify a generator." print "The list of available generator is: " if len(args)>=1: pXX=args[1] make_list(None,options.proc,options.decay,options.gen_v,options.rec_v,options.zb, 'generators',pXX, options.InfoNevt, options.InfoXsec, options.InfoTop , options.InfoZB ) print "==== TIP" print description_str sys.exit(0) myG=args[0] if len(args)==1: print " --> you must specify which MCs samples: p17 or p20" sys.exit(0) elif args[1] != 'p17' and args[1] != 'p20': print "You must specify which MCs samples: p17 or p20" print " --> %s is not supported", args[1] sys.exit(0) pXX=args[1] print "GENERATOR: %s, MC: %s" %( myG, pXX ) if not options.processes is None: make_list(myG,options.proc,options.decay,options.gen_v,options.rec_v,options.zb, 'proc_list',pXX, options.InfoNevt, options.InfoXsec, options.InfoTop,options.InfoZB) sys.exit(0) elif not options.decays is None: if options.proc is None: print "Option -p must be supply (ie process)" sys.exit(0) else: make_list(myG,options.proc,options.decay,options.gen_v,options.rec_v,options.zb, 'decay_list',pXX, options.InfoNevt, options.InfoXsec, options.InfoTop,options.InfoZB) print "==== TIP" print "One can filter only on the beginning of the decay string, eg:" print "ee, lnu, 2l+2nu..." sys.exit(0) elif not options.gen_releases is None: make_list(myG,options.proc,options.decay,options.gen_v,options.rec_v,options.zb, 'gene_rel_list',pXX, options.InfoNevt, options.InfoXsec, options.InfoTop,options.InfoZB) sys.exit(0) elif not options.rec_releases is None: make_list(myG,options.proc,options.decay,options.gen_v,options.rec_v,options.zb, 'reco_rel_list',pXX, options.InfoNevt, options.InfoXsec, options.InfoTop,options.InfoZB) sys.exit(0) elif not options.zbs is None: make_list(myG,options.proc,options.decay,options.gen_v,options.rec_v,options.zb, 'mb_list',pXX,options.InfoTop,options.InfoZB) print "==== TIP" print "One can filter only on the beginning of the zb-sample string" sys.exit(0) make_list(myG,options.proc,options.decay,options.gen_v,options.rec_v,options.zb, 'request_list',pXX, options.InfoNevt, options.InfoXsec, options.InfoTop,options.InfoZB) if __name__ == '__main__': main()