ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/writeCfg.py
(Generate patch)

Comparing COMP/CRAB/python/writeCfg.py (file contents):
Revision 1.2 by ewv, Tue Feb 19 17:19:14 2008 UTC vs.
Revision 1.20 by ewv, Wed Jun 17 20:58:08 2009 UTC

# Line 1 | Line 1
1   #!/usr/bin/env python
2  
3 < import sys, getopt, string
3 > """
4 > Re-write config file and optionally convert to python
5 > """
6 >
7 > __revision__ = "$Id$"
8 > __version__ = "$Revision$"
9 >
10 > import getopt
11   import imp
12   import os
13 < import random
13 > import pickle
14 > import sys
15 > import xml.dom.minidom
16 >
17   from random import SystemRandom
8 _inst  = SystemRandom()
18  
19   from ProdCommon.CMSConfigTools.ConfigAPI.CfgInterface import CfgInterface
20 < from FWCore.ParameterSet.DictTypes import SortedKeysDict
21 < from FWCore.ParameterSet.Modules   import Service
13 < from FWCore.ParameterSet.Types     import *
14 < from FWCore.ParameterSet.Config import include
20 > from FWCore.ParameterSet.Config                       import include
21 > import FWCore.ParameterSet.Types as CfgTypes
22  
23 < import FWCore.ParameterSet.Types   as CfgTypes
17 < import FWCore.ParameterSet.Modules as CfgModules
23 > MyRandom  = SystemRandom()
24  
25 + class ConfigException(Exception):
26 +    """
27 +    Exceptions raised by writeCfg
28 +    """
29 +
30 +    def __init__(self, msg):
31 +        Exception.__init__(self, msg)
32 +        self._msg = msg
33 +        return
34 +
35 +    def __str__(self):
36 +        return self._msg
37  
38   def main(argv) :
39 <  """
40 <  writeCfg
39 >    """
40 >    writeCfg
41 >
42 >    - Read in existing, user supplied cfg or pickled pycfg file
43 >    - Modify job specific parameters based on environment variables and arguments.xml
44 >    - Write out modified cfg or pickled pycfg file
45 >
46 >    required parameters: none
47 >
48 >    optional parameters:
49 >    --help             :       help
50 >    --debug            :       debug statements
51 >
52 >    """
53 >
54 >    # defaults
55 >    inputFileNames  = None
56 >    parentFileNames = None
57 >    debug           = False
58 >    _MAXINT         = 900000000
59  
24  - Read in existing, user supplied cfg or pycfg file
25  - Modify job specific parameters based on environment variables
26  - Write out modified cfg or pycfg file
27
28  required parameters: none
29
30  optional parameters:
31  --help             :       help
32  --debug            :       debug statements
33
34  """
35
36  # defaults
37  maxEvents      = 0
38  skipEvents     = 0
39  inputFileNames = None
40  firstRun       = 0
41  sourceSeed     = 0
42  vtxSeed        = 0
43  g4Seed         = 0
44  mixSeed        = 0
45  debug          = False
46
47  try:
48    opts, args = getopt.getopt(argv, "", ["debug", "help","inputFiles=","maxEvents=","skipEvents="])
49  except getopt.GetoptError:
50    print main.__doc__
51    sys.exit(2)
52
53  # Parse command line parameters
54  for opt, arg in opts :
55    if opt  == "--help" :
56      print main.__doc__
57      sys.exit()
58    elif opt == "--debug" :
59      debug = True
60    elif opt == "--maxEvents":
61      maxEvents = int(arg)
62    elif opt == "--skipEvents":
63      skipEvents = int(arg)
64    elif opt == "--inputFiles":
65      inputFiles = arg
66      inputFiles = inputFiles.replace('\\','')
67      inputFiles = inputFiles.replace('"','')
68      inputFileNames = inputFiles.split(',')
69    elif opt == "--firstRun":
70      firstRun = int(arg)
71    elif opt == "--sourceSeed":
72      sourceSeed = int(arg)
73    elif opt == "--vtxSeed":
74      vtxSeed = int(arg)
75    elif opt == "--g4Seed":
76      g4Seed = int(arg)
77    elif opt == "--mixSeed":
78      mixSeed = int(arg)
79
80  # Parse remaining parameters
81
82  fileName    = args[0];
83  outFileName = args[1];
84
85  # Input cfg or python cfg file
86
87  if (fileName.endswith('py') or fileName.endswith('pycfg') ):
88    handle = open(fileName, 'r')
89    try:   # Nested form for Python < 2.5
90      try:
91        cfo = imp.load_source("pycfg", fileName, handle)
92      except Exception, ex:
93        msg = "Your pycfg file is not valid python: %s" % str(ex)
94        raise "Error: ",msg
95    finally:
96        handle.close()
97    cfg = CfgInterface(cfo.process)
98  else:
60      try:
61 <      cfo = include(fileName)
62 <      cfg = CfgInterface(cfo)
63 <    except Exception, ex:
64 <      msg =  "The cfg file is not valid, %s\n" % str(ex)
65 <      raise "Error: ",msg
66 <
67 <  # Set parameters for job
68 <
69 <  inModule = cfg.inputSource
70 <
71 <  cfg.maxEvents.setMaxEventsInput(maxEvents)
72 <
73 <  inModule.setSkipEvents(skipEvents)
74 <  if (inputFileNames):
75 <    inModule.setFileNames(*inputFileNames)
76 <
77 <  # Pythia parameters
78 <  if (firstRun):
79 <    inModule.setFirstRun(firstRun)
80 <  if (sourceSeed) :
81 <    ranGenerator = cfg.data.services['RandomNumberGeneratorService']
82 <    ranGenerator.sourceSeed = CfgTypes.untracked(CfgTypes.uint32(sourceSeed))
83 <    if (vtxSeed) :
84 <      ranModules   = ranGenerator.moduleSeeds
85 <      ranModules.VtxSmeared = CfgTypes.untracked(CfgTypes.uint32(vtxSeed))
86 <    if (g4Seed) :
87 <      ranModules   = ranGenerator.moduleSeeds
88 <      ranModules.g4SimHits = CfgTypes.untracked(CfgTypes.uint32(g4Seed))
89 <    if (mixSeed) :
90 <      ranModules   = ranGenerator.moduleSeeds
91 <      ranModules.mix = CfgTypes.untracked(CfgTypes.uint32(mixSeed))
92 <
93 <  # Randomize all seeds
94 <
95 <  print "There are ",cfg.seedCount()," seeds"
96 <  seedList = [random.randint(100,200) for i in range(cfg.seedCount)]
97 <  seedTuple = seedList.tuple()
98 <
99 <  cfg.insertSeeds(*seedTuple)
100 <
101 <  # Write out new config file
102 <
103 <  outFile = open(outFileName,"w")
104 <  outFile.write("import FWCore.ParameterSet.Config as cms\n")
105 <  outFile.write(cfo.dumpPython())
106 <  outFile.close()
107 <
108 <  if (debug):
109 <    print "writeCfg output:"
110 <    print "import FWCore.ParameterSet.Config as cms"
111 <    print cfo.dumpPython()
61 >        opts, args = getopt.getopt(argv, "", ["debug", "help"])
62 >    except getopt.GetoptError:
63 >        print main.__doc__
64 >        sys.exit(2)
65 >
66 >    try:
67 >        CMSSW  = os.environ['CMSSW_VERSION']
68 >        parts = CMSSW.split('_')
69 >        CMSSW_major = int(parts[1])
70 >        CMSSW_minor = int(parts[2])
71 >        CMSSW_patch = int(parts[3])
72 >    except (KeyError, ValueError):
73 >        msg = "Your environment doesn't specify the CMSSW version or specifies it incorrectly"
74 >        raise ConfigException(msg)
75 >
76 >    # Parse command line options
77 >    for opt, arg in opts :
78 >        if opt  == "--help" :
79 >            print main.__doc__
80 >            sys.exit()
81 >        elif opt == "--debug" :
82 >            debug = True
83 >
84 >    # Parse remaining parameters
85 >    try:
86 >        fileName    = args[0]
87 >        outFileName = args[1]
88 >    except IndexError:
89 >        print main.__doc__
90 >        sys.exit()
91 >
92 >  # Read in Environment, XML and get optional Parameters
93 >
94 >    nJob       = int(os.environ.get('NJob',      '0'))
95 >    preserveSeeds  = os.environ.get('PreserveSeeds','')
96 >    incrementSeeds = os.environ.get('IncrementSeeds','')
97 >
98 >  # Defaults
99 >
100 >    maxEvents  = 0
101 >    skipEvents = 0
102 >    firstEvent = -1
103 >    compHEPFirstEvent = 0
104 >    firstRun   = 0
105 >
106 >    dom = xml.dom.minidom.parse(os.environ['RUNTIME_AREA']+'/arguments.xml')
107 >
108 >    for elem in dom.getElementsByTagName("Job"):
109 >        if nJob == int(elem.getAttribute("JobID")):
110 >            if elem.getAttribute("MaxEvents"):
111 >                maxEvents = int(elem.getAttribute("MaxEvents"))
112 >            if elem.getAttribute("SkipEvents"):
113 >                skipEvents = int(elem.getAttribute("SkipEvents"))
114 >            if elem.getAttribute("FirstEvent"):
115 >                firstEvent = int(elem.getAttribute("FirstEvent"))
116 >            if elem.getAttribute("FirstRun"):
117 >                firstRun = int(elem.getAttribute("FirstRun"))
118 >
119 >            generator      = str(elem.getAttribute('Generator'))
120 >            inputFiles     = str(elem.getAttribute('InputFiles'))
121 >            parentFiles    = str(elem.getAttribute('ParentFiles'))
122 >
123 >  # Read Input cfg or python cfg file, FUTURE: Get rid cfg mode
124 >
125 >    if fileName.endswith('py'):
126 >        handle = open(fileName, 'r')
127 >        try:   # Nested form for Python < 2.5
128 >            try:
129 >                print "Importing .py file"
130 >                cfo = imp.load_source("pycfg", fileName, handle)
131 >                cmsProcess = cfo.process
132 >            except Exception, ex:
133 >                msg = "Your pycfg file is not valid python: %s" % str(ex)
134 >                raise ConfigException(msg)
135 >        finally:
136 >            handle.close()
137 >    else:
138 >        try:
139 >            print "Importing .cfg file"
140 >            cfo = include(fileName)
141 >            cmsProcess = cfo
142 >        except Exception, ex:
143 >            msg =  "The cfg file is not valid, %s\n" % str(ex)
144 >            raise ConfigException(msg)
145 >
146 >    cfg = CfgInterface(cmsProcess)
147 >
148 >    # Set parameters for job
149 >    print "Setting parameters"
150 >    inModule = cfg.inputSource
151 >    if maxEvents:
152 >        cfg.maxEvents.setMaxEventsInput(maxEvents)
153 >
154 >    if skipEvents:
155 >        inModule.setSkipEvents(skipEvents)
156 >
157 >    # Set "skip events" for various generators
158 >    if generator == 'comphep':
159 >        cmsProcess.source.CompHEPFirstEvent = CfgTypes.int32(firstEvent)
160 >    elif generator == 'lhe':
161 >        cmsProcess.LHESource.skipEvents = CfgTypes.untracked(CfgTypes.uint32(firstEvent))
162 >    elif firstEvent != -1: # (Old? Madgraph)
163 >        cmsProcess.source.firstEvent = CfgTypes.untracked(CfgTypes.uint32(firstEvent))
164 >
165 >    if inputFiles:
166 >        inputFileNames = inputFiles.split(',')
167 >        inModule.setFileNames(*inputFileNames)
168 >
169 >    # handle parent files if needed
170 >    if parentFiles:
171 >        parentFileNames = parentFiles.split(',')
172 >        inModule.setSecondaryFileNames(*parentFileNames)
173 >
174 >    # Pythia parameters
175 >    if (firstRun):
176 >        inModule.setFirstRun(firstRun)
177 >
178 >    incrementSeedList = []
179 >    preserveSeedList  = []
180 >
181 >    if incrementSeeds:
182 >        incrementSeedList = incrementSeeds.split(',')
183 >    if preserveSeeds:
184 >        preserveSeedList  = preserveSeeds.split(',')
185 >
186 >    # FUTURE: This function tests the CMSSW version and presence of old-style seed specification.
187 >    # Reduce when we drop support for old versions
188 >    if cfg.data.services.has_key('RandomNumberGeneratorService'): # There are random #'s to deal with
189 >        print "RandomNumberGeneratorService found, will attempt to change seeds"
190 >        ranGenerator = cfg.data.services['RandomNumberGeneratorService']
191 >        ranModules   = getattr(ranGenerator, "moduleSeeds", None)
192 >        oldSource    = getattr(ranGenerator, "sourceSeed",  None)
193 >        if ranModules != None or oldSource != None:     # Old format present, no matter the CMSSW version
194 >            print "Old-style random number seeds found, will be changed."
195 >            if oldSource != None:
196 >                sourceSeed = int(ranGenerator.sourceSeed.value())
197 >                if ('sourceSeed' in preserveSeedList) or ('theSource' in preserveSeedList):
198 >                    pass
199 >                elif ('sourceSeed' in incrementSeedList) or ('theSource' in incrementSeedList):
200 >                    ranGenerator.sourceSeed = CfgTypes.untracked(CfgTypes.uint32(sourceSeed+nJob))
201 >                else:
202 >                    ranGenerator.sourceSeed = CfgTypes.untracked(CfgTypes.uint32(MyRandom.randint(1, _MAXINT)))
203 >
204 >            for seed in incrementSeedList:
205 >                curSeed = getattr(ranGenerator.moduleSeeds, seed, None)
206 >                if curSeed:
207 >                    curValue = int(curSeed.value())
208 >                    setattr(ranGenerator.moduleSeeds, seed, CfgTypes.untracked(CfgTypes.uint32(curValue+nJob)))
209 >                    preserveSeedList.append(seed)
210 >
211 >            if ranModules != None:
212 >                for seed in ranGenerator.moduleSeeds.parameterNames_():
213 >                    if seed not in preserveSeedList:
214 >                        curSeed = getattr(ranGenerator.moduleSeeds, seed, None)
215 >                        if curSeed:
216 >                            curValue = int(curSeed.value())
217 >                            setattr(ranGenerator.moduleSeeds, seed,
218 >                                    CfgTypes.untracked(CfgTypes.uint32(MyRandom.randint(1,_MAXINT))))
219 >        elif CMSSW_major > 2 or (CMSSW_major == 2 and CMSSW_minor >= 1): # Treatment for  seeds, CMSSW 2_1_x and later
220 >            print "New-style random number seeds found, will be changed."
221 >            from IOMC.RandomEngine.RandomServiceHelper import RandomNumberServiceHelper
222 >            randSvc = RandomNumberServiceHelper(ranGenerator)
223 >
224 >            # Increment requested seed sets
225 >            for seedName in incrementSeedList:
226 >                curSeeds = randSvc.getNamedSeed(seedName)
227 >                newSeeds = [x+nJob for x in curSeeds]
228 >                randSvc.setNamedSeed(seedName, *newSeeds)
229 >                preserveSeedList.append(seedName)
230 >
231 >            # Randomize remaining seeds
232 >            randSvc.populate(*preserveSeedList)
233 >        else:
234 >            print "Neither old nor new seed format found!"
235 >
236 >      # End version specific code
237 >
238 >    # Write out new config file in one format or the other, FUTURE: Get rid of cfg mode
239 >    outFile = open(outFileName,"w")
240 >    if outFileName.endswith('py'):
241 >        outFile.write("import FWCore.ParameterSet.Config as cms\n")
242 >        outFile.write("import pickle\n")
243 >        outFile.write("pickledCfg=\"\"\"%s\"\"\"\n" % pickle.dumps(cmsProcess))
244 >        outFile.write("process = pickle.loads(pickledCfg)\n")
245 >        if (debug):
246 >            print "writeCfg output (May not be exact):"
247 >            print "import FWCore.ParameterSet.Config as cms"
248 >            print cmsProcess.dumpPython()
249 >    else:
250 >        outFile.write(cfg.data.dumpConfig())
251 >        if (debug):
252 >            print "writeCfg output:"
253 >            print str(cfg.data.dumpConfig())
254 >    outFile.close()
255  
256  
257   if __name__ == '__main__' :
258      exit_status = main(sys.argv[1:])
259      sys.exit(exit_status)
156

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines