def OptionsFromItems(items): import sys from Configuration.Applications.Options import parser,threeValued #three valued options for (index,item) in enumerate(items): for (opt,value) in threeValued: if (str(item) in opt) and (index==len(items)-1 or items[index+1].startswith('-')): items.insert(index+1,value) (options,args) = parser.parse_args(items) if not options.conditions or options.conditions=="help": from Configuration.AlCa import autoCond possible="" for k in autoCond.autoCond: possible+="\nauto:"+k+" -> "+str(autoCond.autoCond[k]) raise Exception("the --conditions option is mandatory. Possibilities are: "+possible) ################################# # Check parameters for validity # ################################# # check in case of ALCAOUTPUT case for alca splitting if options.triggerResultsProcess == None and "ALCAOUTPUT" in options.step: print("ERROR: If ALCA splitting is requested, the name of the process in which the alca producers ran needs to be specified. E.g. via --triggerResultsProcess RECO") sys.exit(1) if not options.evt_type: options.evt_type=sys.argv[1] #now adjust the given parameters before passing it to the ConfigBuilder #trail a "/" to dirin and dirout if options.dirin!='' and (not options.dirin.endswith('/')): options.dirin+='/' if options.dirout!='' and (not options.dirout.endswith('/')): options.dirout+='/' # Build the IO files if necessary. # The default form of the files is: # <type>_<energy>_<step>.root prec_step = {"NONE":"", "FILTER":"", "ALL":"", "LHE":"", "GEN":"", "reGEN":"", "SIM":"GEN", "reSIM":"SIM", "DIGI":"SIM", "reDIGI":"DIGI", "L1REPACK":"RAW", "HLT":"RAW", "RECO":"DIGI", "ALCA":"RECO", "ANA":"RECO", "SKIM":"RECO", "DIGI2RAW":"DIGI", "RAW2DIGI":"DIGI2RAW", "RAW2RECO":"DIGI2RAW", "DATAMIX":"DIGI", "DIGI2RAW":"DATAMIX", "HARVESTING":"RECO", "ALCAHARVEST":"RECO", "PAT":"RECO", "NANO":"PAT", "PATGEN":"GEN"} trimmedEvtType=options.evt_type.split('/')[-1] #get the list of steps, without their options options.trimmedStep=[] for s in options.step.split(','): step=s.split(':')[0] options.trimmedStep.append(step) first_step=options.trimmedStep[0] #replace step aliases # this does not affect options.trimmedStep which still contains 'NONE' stepsAliases={ 'NONE':'', 'ALL':'GEN,SIM,DIGI,L1,DIGI2RAW,HLT:GRun,RAW2DIGI,RECO,POSTRECO,VALIDATION,DQM', 'DATA_CHAIN':'RAW2DIGI,RECO,POSTRECO,DQM' } if options.step in stepsAliases: options.step=stepsAliases[options.step] options.step = options.step.replace("SIM_CHAIN","GEN,SIM,DIGI,L1,DIGI2RAW") # add on the end of job sequence... addEndJob = True if ("FASTSIM" in options.step and not "VALIDATION" in options.step) or "HARVESTING" in options.step or "ALCAHARVEST" in options.step or "ALCAOUTPUT" in options.step or options.step == "": addEndJob = False if ("SKIM" in options.step and not "RECO" in options.step): addEndJob = False if ("ENDJOB" in options.step): addEndJob = False if ('DQMIO' in options.datatier): addEndJob = False if addEndJob: options.step=options.step+',ENDJOB' #determine the type of file on input if options.filetype==defaultOptions.filetype: if options.filein.lower().endswith(".lhe") or options.filein.lower().endswith(".lhef") or options.filein.startswith("lhe:"): options.filetype="LHE" elif options.filein.startswith("mcdb:"): print("This is a deprecated way of selecting lhe files from article number. Please use lhe:article argument to --filein") options.filein=options.filein.replace('mcdb:','lhe:') options.filetype="LHE" else: options.filetype="EDM" filesuffix = {"LHE": "lhe", "EDM": "root", "MCDB": "", "DQM":"root"}[options.filetype] if options.filein=="" and not (first_step in ("ALL","GEN","LHE","SIM_CHAIN")): options.dirin="file:"+options.dirin.replace('file:','') options.filein=trimmedEvtType+"_"+prec_step[first_step]+"."+filesuffix # Prepare the canonical file name for output / config file etc # (EventType_STEP1_STEP2_..._PU) standardFileName = "" standardFileName = trimmedEvtType+"_"+"_".join(options.trimmedStep) standardFileName = standardFileName.replace(",","_").replace(".","_") if options.pileup != "NoPileUp": standardFileName += "_PU" # if no output file name given, set it to default if options.fileout=="" and not first_step in ("HARVESTING", "ALCAHARVEST"): options.fileout = standardFileName+".root" # Prepare the name of the config file if not options.python_filename: options.python_filename = standardFileName+'.py' print(options.step) # Setting name of process # if not set explicitly it needs some thinking if not options.name: if 'reSIM' in options.trimmedStep: options.name = 'RESIM' elif 'reDIGI' in options.trimmedStep: options.name = 'REDIGI' elif 'HLT' in options.trimmedStep: options.name = 'HLT' elif 'RECO' in options.trimmedStep: options.name = 'RECO' elif options.trimmedStep == ['NONE'] and options.filetype in ('LHE', 'MCDB'): options.name = 'LHE' elif len(options.trimmedStep)==0: options.name = 'PROCESS' else: options.name = options.trimmedStep[-1] # check to be sure that people run the harvesting as a separate step isHarvesting = False isOther = False if "HARVESTING" in options.trimmedStep and len(options.trimmedStep) > 1: raise Exception("The Harvesting step must be run alone") # if not specified by user try to guess whether MC or DATA if not options.isData and not options.isMC: if 'SIM' in options.trimmedStep: options.isMC=True if 'CFWRITER' in options.trimmedStep: options.isMC=True if 'DIGI' in options.trimmedStep: options.isMC=True if 'DIGI2RAW' in options.trimmedStep: options.isMC=True if (not (options.eventcontent == None)) and 'SIM' in options.eventcontent: options.isMC=True if 'SIM' in options.datatier: options.isMC=True if options.isMC: print('We have determined that this is simulation (if not, rerun cmsDriver.py with --data)') else: print('We have determined that this is real data (if not, rerun cmsDriver.py with --mc)') if options.profile: if options.profile and options.prefix: raise Exception("--profile and --prefix are incompatible") profilerType = 'pp' profileOpts = options.profile.split(':') if len(profileOpts): profilerType = profileOpts[0].replace("=", " ") if profilerType == "pp": options.profileTypeLabel = "performance" elif profilerType == "mp": options.profileTypeLabel = "memory" elif profilerType.startswith("fp "): options.profileTypeLabel = profilerType.replace("fp ", "") else: raise Exception("Not a valid profiler type %s. Alternatives are pp, mp, fp=<function>."%(profilerType)) options.prefix = "igprof -t cmsRun -%s" % profilerType # If an "era" argument was supplied make sure it is one of the valid possibilities if options.era : from Configuration.StandardSequences.Eras import eras from FWCore.ParameterSet.Config import Modifier, ModifierChain # Split the string by commas to check individual eras requestedEras = options.era.split(",") # Check that the entry is a valid era for eraName in requestedEras : if not hasattr( eras, eraName ) : # Not valid, so print a helpful message validOptions="" # Create a stringified list of valid options to print to the user for key in eras.__dict__ : if isinstance( eras.__dict__[key], Modifier ) or isinstance( eras.__dict__[key], ModifierChain ) : if validOptions!="" : validOptions+=", " validOptions+="'"+key+"'" raise Exception( "'%s' is not a valid option for '--era'. Valid options are %s." % (eraName, validOptions) ) # If the "--fast" option was supplied automatically enable the fastSim era if options.fast : if options.era: options.era+=",fastSim" else : options.era="fastSim" # options incompatible with fastsim if options.fast and not options.scenario == "pp": raise Exception("ERROR: the --option fast is only compatible with the default scenario (--scenario=pp)") if options.fast and 'HLT' in options.trimmedStep: raise Exception("ERROR: the --option fast is incompatible with HLT (HLT is no longer available in FastSim)") return options
def OptionsFromItems(items): import sys from Configuration.Applications.Options import parser,threeValued #three valued options for (index,item) in enumerate(items): for (opt,value) in threeValued: if (str(item) in opt) and (index==len(items)-1 or items[index+1].startswith('-')): items.insert(index+1,value) (options,args) = parser.parse_args(items) if not options.conditions or options.conditions=="help": from Configuration.AlCa import autoCond possible="" for k in autoCond.autoCond: possible+="\nauto:"+k+" -> "+str(autoCond.autoCond[k]) raise Exception("the --conditions option is mandatory. Possibilities are: "+possible) ################################# # Check parameters for validity # ################################# # check in case of ALCAOUTPUT case for alca splitting if options.triggerResultsProcess == None and "ALCAOUTPUT" in options.step: print("ERROR: If ALCA splitting is requested, the name of the process in which the alca producers ran needs to be specified. E.g. via --triggerResultsProcess RECO") sys.exit(1) if not options.evt_type: options.evt_type=sys.argv[1] #now adjust the given parameters before passing it to the ConfigBuilder #trail a "/" to dirin and dirout if options.dirin!='' and (not options.dirin.endswith('/')): options.dirin+='/' if options.dirout!='' and (not options.dirout.endswith('/')): options.dirout+='/' # Build the IO files if necessary. # The default form of the files is: # <type>_<energy>_<step>.root prec_step = {"NONE":"", "FILTER":"", "ALL":"", "LHE":"", "GEN":"", "reGEN":"", "SIM":"GEN", "reSIM":"SIM", "DIGI":"SIM", "reDIGI":"DIGI", "L1REPACK":"RAW", "HLT":"RAW", "RECO":"DIGI", "ALCA":"RECO", "ANA":"RECO", "SKIM":"RECO", "DIGI2RAW":"DIGI", "RAW2DIGI":"DIGI2RAW", "RAW2RECO":"DIGI2RAW", "DATAMIX":"DIGI", "DIGI2RAW":"DATAMIX", "HARVESTING":"RECO", "ALCAHARVEST":"RECO", "PAT":"RECO", "NANO":"PAT", "PATGEN":"GEN"} trimmedEvtType=options.evt_type.split('/')[-1] #get the list of steps, without their options options.trimmedStep=[] for s in options.step.split(','): step=s.split(':')[0] options.trimmedStep.append(step) first_step=options.trimmedStep[0] #replace step aliases # this does not affect options.trimmedStep which still contains 'NONE' stepsAliases={ 'NONE':'', 'ALL':'GEN,SIM,DIGI,L1,DIGI2RAW,HLT:GRun,RAW2DIGI,RECO,POSTRECO,VALIDATION,DQM', 'DATA_CHAIN':'RAW2DIGI,RECO,POSTRECO,DQM' } if options.step in stepsAliases: options.step=stepsAliases[options.step] options.step = options.step.replace("SIM_CHAIN","GEN,SIM,DIGI,L1,DIGI2RAW") # add on the end of job sequence... addEndJob = True if ("FASTSIM" in options.step and not "VALIDATION" in options.step) or "HARVESTING" in options.step or "ALCAHARVEST" in options.step or "ALCAOUTPUT" in options.step or options.step == "": addEndJob = False if ("SKIM" in options.step and not "RECO" in options.step): addEndJob = False if ("ENDJOB" in options.step): addEndJob = False if ('DQMIO' in options.datatier): addEndJob = False if addEndJob: options.step=options.step+',ENDJOB' #determine the type of file on input if options.filetype==defaultOptions.filetype: if options.filein.lower().endswith(".lhe") or options.filein.lower().endswith(".lhef") or options.filein.startswith("lhe:"): options.filetype="LHE" elif options.filein.startswith("mcdb:"): print("This is a deprecated way of selecting lhe files from article number. Please use lhe:article argument to --filein") options.filein=options.filein.replace('mcdb:','lhe:') options.filetype="LHE" else: options.filetype="EDM" filesuffix = {"LHE": "lhe", "EDM": "root", "MCDB": "", "DQM":"root"}[options.filetype] if options.filein=="" and not (first_step in ("ALL","GEN","LHE","SIM_CHAIN")): options.dirin="file:"+options.dirin.replace('file:','') options.filein=trimmedEvtType+"_"+prec_step[first_step]+"."+filesuffix # Prepare the canonical file name for output / config file etc # (EventType_STEP1_STEP2_..._PU) standardFileName = "" standardFileName = trimmedEvtType+"_"+"_".join(options.trimmedStep) standardFileName = standardFileName.replace(",","_").replace(".","_") if options.pileup != "NoPileUp": standardFileName += "_PU" # if no output file name given, set it to default if options.fileout=="" and not first_step in ("HARVESTING", "ALCAHARVEST"): options.fileout = standardFileName+".root" # Prepare the name of the config file if not options.python_filename: options.python_filename = standardFileName+'.py' print(options.step) # Setting name of process # if not set explicitly it needs some thinking if not options.name: if 'reSIM' in options.trimmedStep: options.name = 'RESIM' elif 'reDIGI' in options.trimmedStep: options.name = 'REDIGI' elif 'HLT' in options.trimmedStep: options.name = 'HLT' elif 'RECO' in options.trimmedStep: options.name = 'RECO' elif options.trimmedStep == ['NONE'] and options.filetype in ('LHE', 'MCDB'): options.name = 'LHE' elif len(options.trimmedStep)==0: options.name = 'PROCESS' else: options.name = options.trimmedStep[-1] # check to be sure that people run the harvesting as a separate step isHarvesting = False isOther = False if "HARVESTING" in options.trimmedStep and len(options.trimmedStep) > 1: raise Exception("The Harvesting step must be run alone") # if not specified by user try to guess whether MC or DATA if not options.isData and not options.isMC: if 'LHE' in options.trimmedStep or 'LHE' in options.datatier: options.isMC=True if 'GEN' in options.trimmedStep or 'GEN' in options.datatier: options.isMC=True if 'SIM' in options.trimmedStep: options.isMC=True if 'CFWRITER' in options.trimmedStep: options.isMC=True if 'DIGI' in options.trimmedStep: options.isMC=True if 'DIGI2RAW' in options.trimmedStep: options.isMC=True if (not (options.eventcontent == None)) and 'SIM' in options.eventcontent: options.isMC=True if 'SIM' in options.datatier: options.isMC=True if 'VALIDATION' in options.trimmedStep: options.isMC=True if options.era and 'Phase2' in options.era: options.isMC=True if options.isMC: print('We have determined that this is simulation (if not, rerun cmsDriver.py with --data)') else: print('We have determined that this is real data (if not, rerun cmsDriver.py with --mc)') options.isData=True if options.profile: if options.profile and options.prefix: raise Exception("--profile and --prefix are incompatible") profilerType = 'pp' profileOpts = options.profile.split(':') if len(profileOpts): profilerType = profileOpts[0].replace("=", " ") if profilerType == "pp": options.profileTypeLabel = "performance" elif profilerType == "mp": options.profileTypeLabel = "memory" elif profilerType.startswith("fp "): options.profileTypeLabel = profilerType.replace("fp ", "") else: raise Exception("Not a valid profiler type %s. Alternatives are pp, mp, fp=<function>."%(profilerType)) options.prefix = "igprof -t cmsRun -%s" % profilerType # If an "era" argument was supplied make sure it is one of the valid possibilities if options.era : from Configuration.StandardSequences.Eras import eras # Split the string by commas to check individual eras requestedEras = options.era.split(",") # Check that the entry is a valid era for eraName in requestedEras : if not hasattr( eras, eraName ) or not checkModifier(getattr(eras,eraName)): # Not valid, so print a helpful message validOptions="" # Create a stringified list of valid options to print to the user for key in eras.__dict__ : if checkModifier(eras.__dict__[key]): if validOptions!="" : validOptions+=", " validOptions+="'"+key+"'" raise Exception( "'%s' is not a valid option for '--era'. Valid options are %s." % (eraName, validOptions) ) # If the "--fast" option was supplied automatically enable the fastSim era if options.fast : if options.era: options.era+=",fastSim" else : options.era="fastSim" # options incompatible with fastsim if options.fast and not options.scenario == "pp": raise Exception("ERROR: the --option fast is only compatible with the default scenario (--scenario=pp)") if options.fast and 'HLT' in options.trimmedStep: raise Exception("ERROR: the --option fast is incompatible with HLT (HLT is no longer available in FastSim)") return options
def OptionsFromItems(items): import sys from Configuration.Applications.Options import parser, threeValued # three valued options for (index, item) in enumerate(items): for (opt, value) in threeValued: if (str(item) in opt) and (index == len(items) - 1 or items[index + 1].startswith("-")): items.insert(index + 1, value) (options, args) = parser.parse_args(items) if not options.conditions or options.conditions == "help": from Configuration.AlCa import autoCond possible = "" for k in autoCond.autoCond: possible += "\nauto:" + k + " -> " + autoCond.autoCond[k] raise Exception("the --conditions option is mandatory. Possibilities are: " + possible) ################################# # Check parameters for validity # ################################# # check in case of ALCAOUTPUT case for alca splitting if options.triggerResultsProcess == None and "ALCAOUTPUT" in options.step: print "ERROR: If ALCA splitting is requested, the name of the process in which the alca producers ran needs to be specified. E.g. via --triggerResultsProcess RECO" sys.exit(1) if not options.evt_type: options.evt_type = sys.argv[1] # now adjust the given parameters before passing it to the ConfigBuilder # trail a "/" to dirin and dirout if options.dirin != "" and (not options.dirin.endswith("/")): options.dirin += "/" if options.dirout != "" and (not options.dirout.endswith("/")): options.dirout += "/" # Build the IO files if necessary. # The default form of the files is: # <type>_<energy>_<step>.root prec_step = { "NONE": "", "FILTER": "", "ALL": "", "LHE": "", "GEN": "", "reGEN": "", "SIM": "GEN", "reSIM": "SIM", "DIGI": "SIM", "reDIGI": "DIGI", "L1REPACK": "RAW", "HLT": "RAW", "RECO": "DIGI", "ALCA": "RECO", "ANA": "RECO", "SKIM": "RECO", "DIGI2RAW": "DIGI", "RAW2DIGI": "DIGI2RAW", "RAW2RECO": "DIGI2RAW", "DATAMIX": "DIGI", "DIGI2RAW": "DATAMIX", "HARVESTING": "RECO", "ALCAHARVEST": "RECO", } trimmedEvtType = options.evt_type.split("/")[-1] # get the list of steps, without their options options.trimmedStep = [] for s in options.step.split(","): step = s.split(":")[0] options.trimmedStep.append(step) first_step = options.trimmedStep[0] # replace step aliases # this does not affect options.trimmedStep which still contains 'NONE' stepsAliases = { "NONE": "", "ALL": "GEN,SIM,DIGI,L1,DIGI2RAW,HLT:GRun,RAW2DIGI,RECO,POSTRECO,VALIDATION,DQM", "DATA_CHAIN": "RAW2DIGI,RECO,POSTRECO,DQM", } if options.step in stepsAliases: options.step = stepsAliases[options.step] options.step = options.step.replace("SIM_CHAIN", "GEN,SIM,DIGI,L1,DIGI2RAW") # add on the end of job sequence... addEndJob = True if ( ("FASTSIM" in options.step and not "VALIDATION" in options.step) or "HARVESTING" in options.step or "ALCAHARVEST" in options.step or "ALCAOUTPUT" in options.step or options.step == "" ): addEndJob = False if "SKIM" in options.step and not "RECO" in options.step: addEndJob = False if "ENDJOB" in options.step: addEndJob = False if "DQMROOT" in options.datatier: addEndJob = False if addEndJob: options.step = options.step + ",ENDJOB" # determine the type of file on input if options.filetype == defaultOptions.filetype: if ( options.filein.lower().endswith(".lhe") or options.filein.lower().endswith(".lhef") or options.filein.startswith("lhe:") ): options.filetype = "LHE" elif options.filein.startswith("mcdb:"): print "This is a deprecated way of selecting lhe files from article number. Please use lhe:article argument to --filein" options.filein = options.filein.replace("mcdb:", "lhe:") options.filetype = "LHE" else: options.filetype = "EDM" filesuffix = {"LHE": "lhe", "EDM": "root", "MCDB": "", "DQM": "root"}[options.filetype] if options.filein == "" and not (first_step in ("ALL", "GEN", "LHE", "SIM_CHAIN")): options.dirin = "file:" + options.dirin.replace("file:", "") options.filein = trimmedEvtType + "_" + prec_step[first_step] + "." + filesuffix # Prepare the canonical file name for output / config file etc # (EventType_STEP1_STEP2_..._PU) standardFileName = "" standardFileName = trimmedEvtType + "_" + "_".join(options.trimmedStep) standardFileName = standardFileName.replace(",", "_").replace(".", "_") if options.pileup != "NoPileUp": standardFileName += "_PU" # if no output file name given, set it to default if options.fileout == "" and not first_step in ("HARVESTING", "ALCAHARVEST"): options.fileout = standardFileName + ".root" # Prepare the name of the config file if not options.python_filename: options.python_filename = standardFileName + ".py" print options.step # Setting name of process # if not set explicitly it needs some thinking if not options.name: if "reSIM" in options.trimmedStep: options.name = "RESIM" elif "reDIGI" in options.trimmedStep: options.name = "REDIGI" elif "HLT" in options.trimmedStep: options.name = "HLT" elif "RECO" in options.trimmedStep: options.name = "RECO" elif options.trimmedStep == ["NONE"] and options.filetype in ("LHE", "MCDB"): options.name = "LHE" elif len(options.trimmedStep) == 0: options.name = "PROCESS" else: options.name = options.trimmedStep[-1] # check to be sure that people run the harvesting as a separate step isHarvesting = False isOther = False if "HARVESTING" in options.trimmedStep and len(options.trimmedStep) > 1: raise Exception("The Harvesting step must be run alone") # if not specified by user try to guess whether MC or DATA if not options.isData and not options.isMC: if "SIM" in options.trimmedStep: options.isMC = True if "CFWRITER" in options.trimmedStep: options.isMC = True if "DIGI" in options.trimmedStep: options.isMC = True if (not (options.eventcontent == None)) and "SIM" in options.eventcontent: options.isMC = True if "SIM" in options.datatier: options.isMC = True if options.isMC: print "We have determined that this is simulation (if not, rerun cmsDriver.py with --data)" else: print "We have determined that this is real data (if not, rerun cmsDriver.py with --mc)" if options.profile: if options.profile and options.prefix: raise Exception("--profile and --prefix are incompatible") profilerType = "pp" profileOpts = options.profile.split(":") if len(profileOpts): profilerType = profileOpts[0].replace("=", " ") if profilerType == "pp": options.profileTypeLabel = "performance" elif profilerType == "mp": options.profileTypeLabel = "memory" elif profilerType.startswith("fp "): options.profileTypeLabel = profilerType.replace("fp ", "") else: raise Exception("Not a valid profiler type %s. Alternatives are pp, mp, fp=<function>." % (profilerType)) options.prefix = "igprof -t cmsRun -%s" % profilerType return options