CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
cmsDriverOptions.py
Go to the documentation of this file.
1 #! /usr/bin/env python
2 
3 # A Pyrelval Wrapper
4 
5 import optparse
6 import sys
7 import os
8 import re
9 import Configuration.Applications
10 from Configuration.Applications.ConfigBuilder import ConfigBuilder, defaultOptions
11 import traceback
12 
13 
15  return
16 
18  return
19 
20 def OptionsFromCommand(command):
21  items=command.split()
22  if items[0] != 'cmsDriver.py':
23  return None
24  items.append('--evt_type')
25  items.append(items[1])
26  options=OptionsFromItems(items[2:])
27  options.arguments = command
28  return options
29 
31  import sys
32  options=OptionsFromItems(sys.argv[1:])
33  # memorize the command line arguments
34  options.arguments = reduce(lambda x, y: x+' '+y, sys.argv[1:])
35  return options
36 
37 def OptionsFromItems(items):
38  import sys
39  from Configuration.Applications.Options import parser,threeValued
40  #three valued options
41  for (index,item) in enumerate(items):
42  for (opt,value) in threeValued:
43  if (str(item) in opt) and (index==len(items)-1 or items[index+1].startswith('-')):
44  items.insert(index+1,value)
45 
46  (options,args) = parser.parse_args(items)
47 
48  if not options.conditions or options.conditions=="help":
49  from Configuration.AlCa import autoCond
50  possible=""
51  for k in autoCond.autoCond:
52  possible+="\nauto:"+k+" -> "+autoCond.autoCond[k]
53  raise Exception("the --conditions option is mandatory. Possibilities are: "+possible)
54 
55 
56  #################################
57  # Check parameters for validity #
58  #################################
59 
60  # check in case of ALCAOUTPUT case for alca splitting
61  if options.triggerResultsProcess == None and "ALCAOUTPUT" in options.step:
62  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"
63  sys.exit(1)
64 
65  if not options.evt_type:
66  options.evt_type=sys.argv[1]
67 
68  #now adjust the given parameters before passing it to the ConfigBuilder
69 
70  #trail a "/" to dirin and dirout
71  if options.dirin!='' and (not options.dirin.endswith('/')): options.dirin+='/'
72  if options.dirout!='' and (not options.dirout.endswith('/')): options.dirout+='/'
73 
74  # Build the IO files if necessary.
75  # The default form of the files is:
76  # <type>_<energy>_<step>.root
77  prec_step = {"NONE":"",
78  "FILTER":"",
79  "ALL":"",
80  "LHE":"",
81  "GEN":"",
82  "reGEN":"",
83  "SIM":"GEN",
84  "reSIM":"SIM",
85  "DIGI":"SIM",
86  "DIGIPREMIX":"SIM",
87  "reDIGI":"DIGI",
88  "L1REPACK":"RAW",
89  "HLT":"RAW",
90  "RECO":"DIGI",
91  "ALCA":"RECO",
92  "ANA":"RECO",
93  "SKIM":"RECO",
94  "DIGI2RAW":"DIGI",
95  "RAW2DIGI":"DIGI2RAW",
96  "RAW2RECO":"DIGI2RAW",
97  "DATAMIX":"DIGI",
98  "DIGI2RAW":"DATAMIX",
99  "HARVESTING":"RECO",
100  "ALCAHARVEST":"RECO"}
101 
102  trimmedEvtType=options.evt_type.split('/')[-1]
103 
104  #get the list of steps, without their options
105  options.trimmedStep=[]
106  for s in options.step.split(','):
107  step=s.split(':')[0]
108  options.trimmedStep.append(step)
109  first_step=options.trimmedStep[0]
110 
111  #replace step aliases
112  # this does not affect options.trimmedStep which still contains 'NONE'
113  stepsAliases={
114  'NONE':'',
115  'ALL':'GEN,SIM,DIGI,L1,DIGI2RAW,HLT:GRun,RAW2DIGI,RECO,POSTRECO,VALIDATION,DQM',
116  'DATA_CHAIN':'RAW2DIGI,RECO,POSTRECO,DQM'
117  }
118  if options.step in stepsAliases:
119  options.step=stepsAliases[options.step]
120 
121  options.step = options.step.replace("SIM_CHAIN","GEN,SIM,DIGI,L1,DIGI2RAW")
122 
123  # add on the end of job sequence...
124  addEndJob = True
125  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 == "":
126  addEndJob = False
127  if ("SKIM" in options.step and not "RECO" in options.step):
128  addEndJob = False
129  if ("ENDJOB" in options.step):
130  addEndJob = False
131  if ('DQMROOT' in options.datatier):
132  addEndJob = False
133  if addEndJob:
134  options.step=options.step+',ENDJOB'
135 
136 
137  #determine the type of file on input
138  if options.filetype==defaultOptions.filetype:
139  if options.filein.lower().endswith(".lhe") or options.filein.lower().endswith(".lhef") or options.filein.startswith("lhe:"):
140  options.filetype="LHE"
141  elif options.filein.startswith("mcdb:"):
142  print "This is a deprecated way of selecting lhe files from article number. Please use lhe:article argument to --filein"
143  options.filein=options.filein.replace('mcdb:','lhe:')
144  options.filetype="LHE"
145  else:
146  options.filetype="EDM"
147 
148  filesuffix = {"LHE": "lhe", "EDM": "root", "MCDB": "", "DQM":"root"}[options.filetype]
149 
150  if options.filein=="" and not (first_step in ("ALL","GEN","LHE","SIM_CHAIN")):
151  options.dirin="file:"+options.dirin.replace('file:','')
152  options.filein=trimmedEvtType+"_"+prec_step[first_step]+"."+filesuffix
153 
154 
155  # Prepare the canonical file name for output / config file etc
156  # (EventType_STEP1_STEP2_..._PU)
157  standardFileName = ""
158  standardFileName = trimmedEvtType+"_"+"_".join(options.trimmedStep)
159  standardFileName = standardFileName.replace(",","_").replace(".","_")
160  if options.pileup != "NoPileUp":
161  standardFileName += "_PU"
162 
163 
164  # if no output file name given, set it to default
165  if options.fileout=="" and not first_step in ("HARVESTING", "ALCAHARVEST"):
166  options.fileout = standardFileName+".root"
167 
168  # Prepare the name of the config file
169  if not options.python_filename:
170  options.python_filename = standardFileName+'.py'
171 
172  print options.step
173 
174 
175  # Setting name of process
176  # if not set explicitly it needs some thinking
177  if not options.name:
178  if 'reSIM' in options.trimmedStep:
179  options.name = 'RESIM'
180  elif 'reDIGI' in options.trimmedStep:
181  options.name = 'REDIGI'
182  elif 'HLT' in options.trimmedStep:
183  options.name = 'HLT'
184  elif 'RECO' in options.trimmedStep:
185  options.name = 'RECO'
186  elif options.trimmedStep == ['NONE'] and options.filetype in ('LHE', 'MCDB'):
187  options.name = 'LHE'
188  elif len(options.trimmedStep)==0:
189  options.name = 'PROCESS'
190  else:
191  options.name = options.trimmedStep[-1]
192 
193  # check to be sure that people run the harvesting as a separate step
194  isHarvesting = False
195  isOther = False
196 
197  if "HARVESTING" in options.trimmedStep and len(options.trimmedStep) > 1:
198  raise Exception("The Harvesting step must be run alone")
199 
200  # if not specified by user try to guess whether MC or DATA
201  if not options.isData and not options.isMC:
202  if 'SIM' in options.trimmedStep:
203  options.isMC=True
204  if 'CFWRITER' in options.trimmedStep:
205  options.isMC=True
206  if 'DIGI' in options.trimmedStep:
207  options.isMC=True
208  if 'DIGI2RAW' in options.trimmedStep:
209  options.isMC=True
210  if (not (options.eventcontent == None)) and 'SIM' in options.eventcontent:
211  options.isMC=True
212  if 'SIM' in options.datatier:
213  options.isMC=True
214  if options.isMC:
215  print 'We have determined that this is simulation (if not, rerun cmsDriver.py with --data)'
216  else:
217  print 'We have determined that this is real data (if not, rerun cmsDriver.py with --mc)'
218 
219  if options.profile:
220  if options.profile and options.prefix:
221  raise Exception("--profile and --prefix are incompatible")
222  profilerType = 'pp'
223  profileOpts = options.profile.split(':')
224  if len(profileOpts):
225  profilerType = profileOpts[0].replace("=", " ")
226 
227  if profilerType == "pp":
228  options.profileTypeLabel = "performance"
229  elif profilerType == "mp":
230  options.profileTypeLabel = "memory"
231  elif profilerType.startswith("fp "):
232  options.profileTypeLabel = profilerType.replace("fp ", "")
233  else:
234  raise Exception("Not a valid profiler type %s. Alternatives are pp, mp, fp=<function>."%(profilerType))
235 
236  options.prefix = "igprof -t cmsRun -%s" % profilerType
237 
238  return options
239 
static std::string join(char **cmd)
Definition: RemoteFile.cc:18