#!/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, print_desc, print_caf): print "** Current caf versions **" print " -p17 MC: caf p18.13.01" print " -p20 MC: caf p21.11.00" 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 requestStatus='unknown' if pXX=='p17': requestStatus=requestIdFilter.filterReqId_p17( request ) if pXX=='p20': requestStatus=requestIdFilter.filterReqId_p20( request ) if not myMB and requestStatus == 'unknown': continue if not myMB and requestStatus=='bad': continue n_tmb = -1 n_caf = -1 if request.has_key('n_caf_trees'): try: n_caf=request.get('n_caf_trees')[icaf] except: print " Does not work: " print " --> req:", request print " icaf=", icaf if request.has_key('n_tmb'): n_tmb=request.get('n_tmb') if int(n_caf) < int(n_tmb)-2 or int(n_caf)<=0: 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 not myD is None and myD.find("incl")>=0 and ( \ myP.find('w\+w')>= 0 or \ myP.find('w\+z')>= 0 or \ myP.find('z\+z')>= 0 ): description = request.get('description') if description.find("D0MESS-EFF") >= 0: print "***** REMOVED from listing (because not fully inclusive) *****" print " %s -> %s " % (request['requestid'], description) 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 += "============================================" if print_desc: format += " | %50s" % 'description' 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: info += " %7d" % int(request.get('nevt_caf_trees')[icaf]) if print_xsec: if request.has_key('xsec'): info += " %e %e" % (request.get('xsec'),request.get('dxsec')) else: info += " %18s %12s" % ('?',' ') if print_top_mass: info += " %5s" % request.get('topmass') info+=" %+9s %+9s" % (reco,gene) if print_zb_sample: info += " %-40s" % request.get('minb_dataset')[0:40] if print_desc: info += " | %s" % request.get('description') 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 if print_caf != 'noPrintOut': file_cfg=open(print_caf+".cfg",'w') file_cfg.write("## Requests list for csg MC\n") file_cfg.write("## sam def: %s \n" % print_caf) file_cfg.write("## N[evts]: %s \n" % num_evt) file_cfg.write("## requests is the occurence of the MCReqID processor\n") file_cfg.write("\n") csg_vers = 'unknown' if pXX == 'p17': csg_vers = 'csg-p18.13.01-v4' if pXX == 'p20': csg_vers = 'csg-p21.11.00-v4' samdef = "sam create dataset definition " samdef += "--definitionName=%s --dimensions=\"version %s and global.requestid " % (print_caf,csg_vers) np=1 print "config file input: " file_cfg.write("requests_%s.noConfigCheck: true\n" % print_caf ) for p in pl: if int(np) == 1: file_cfg.write("requests_%s.AlpgenReqIDs: %s\n" % (print_caf, p) ) else: file_cfg.write("+requests_%s.AlpgenReqIDs: %s\n" % (print_caf, p) ) samdef += "%s" % p if int(np) != len(pl): samdef += "," np=np+1 samdef +="\"" print "CREATE SAM DEF: ", samdef print "=== Create file: %s" % (print_caf + ".cfg") file_cfg.write('\n') file_cfg.close() 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 -zb\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("-b", action="store_true", dest="zb", help="Include bad samples in listing (only cerfified for p20) [Default: false]", 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) parser.add_option("--InfoDesc",action="store_true",dest="InfoDesc", help="Add request description [Default: false]",default=False) # add dataset creation parser.add_option("--CAFE", action="store",type="string",dest="CAFE", help="Print out the command to get the dataset and write the normalization part of the config file. The argument is the dataset name you want to use [Default: not print out]",default="noPrintOut" ) # 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('+','\+') print "process = ",options.proc print "decay = ",options.decay 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, options.InfoDesc, options.CAFE ) 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, options.InfoDesc, options.CAFE ) 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, options.InfoDesc, options.CAFE ) 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, options.InfoDesc, options.CAFE ) 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, options.InfoDesc, options.CAFE ) 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, options.InfoDesc, options.CAFE ) 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, options.InfoDesc, options.CAFE ) if __name__ == '__main__': main()