ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/writeCfg.py
Revision: 1.7
Committed: Tue May 6 01:09:58 2008 UTC (16 years, 11 months ago) by ewv
Content type: text/x-python
Branch: MAIN
CVS Tags: CRAB_2_2_0_pre18
Changes since 1.6: +34 -32 lines
Log Message:
Support 2_1_x seeds

File Contents

# Content
1 #!/usr/bin/env python
2
3 import sys, getopt, string
4 import imp
5 import os
6 import random
7 from random import SystemRandom
8 _inst = SystemRandom()
9
10 from ProdCommon.CMSConfigTools.ConfigAPI.CfgInterface import CfgInterface
11 from FWCore.ParameterSet.DictTypes import SortedKeysDict
12 from FWCore.ParameterSet.Modules import Service
13 from FWCore.ParameterSet.Types import *
14 from FWCore.ParameterSet.Config import include
15
16 import FWCore.ParameterSet.Types as CfgTypes
17 import FWCore.ParameterSet.Modules as CfgModules
18
19 class ConfigException(Exception):
20 def __init__(self, msg):
21 Exception.__init__(self, msg)
22 self._msg = msg
23 return
24
25 def __str__(self):
26 return self._msg
27
28 def main(argv) :
29 """
30 writeCfg
31
32 - Read in existing, user supplied cfg or pycfg file
33 - Modify job specific parameters based on environment variables
34 - Write out modified cfg or pycfg file
35
36 required parameters: none
37
38 optional parameters:
39 --help : help
40 --debug : debug statements
41
42 """
43
44 # defaults
45 inputFileNames = None
46 firstRun = 0
47 sourceSeed = 0
48 vtxSeed = 0
49 g4Seed = 0
50 mixSeed = 0
51 debug = False
52 _MAXINT = 900000000
53 maxSeeds = 4 # Kludge, maximum # of seeds that any engine takes
54
55 try:
56 opts, args = getopt.getopt(argv, "", ["debug", "help"])
57 except getopt.GetoptError:
58 print main.__doc__
59 sys.exit(2)
60
61 try:
62 CMSSW = os.environ['CMSSW_VERSION']
63 parts = CMSSW.split('_')
64 CMSSW_major = int(parts[1])
65 CMSSW_minor = int(parts[2])
66 CMSSW_patch = int(parts[3])
67 except KeyError, ValueError:
68 msg = "Your environment doesn't specify the CMSSW version or specifies it incorrectly"
69 raise ConfigException(msg)
70
71 # Parse command line options
72 for opt, arg in opts :
73 if opt == "--help" :
74 print main.__doc__
75 sys.exit()
76 elif opt == "--debug" :
77 debug = True
78
79 # Parse remaining parameters
80
81 try:
82 fileName = args[0];
83 outFileName = args[1];
84 except IndexError:
85 print main.__doc__
86 sys.exit()
87
88 # Optional Parameters
89
90 maxEvents = int(os.environ.get('MaxEvents', '0'))
91 skipEvents = int(os.environ.get('SkipEvents','0'))
92 firstRun = int(os.environ.get('FirstRun', '0'))
93 nJob = int(os.environ.get('NJob', '0'))
94
95 inputFiles = os.environ.get('InputFiles','')
96 preserveSeeds = os.environ.get('PreserveSeeds','')
97 incrementSeeds = os.environ.get('IncrementSeeds','')
98
99 # Read Input cfg or python cfg file, FUTURE: Get rid cfg mode
100
101 if fileName.endswith('py'):
102 handle = open(fileName, 'r')
103 try: # Nested form for Python < 2.5
104 try:
105 cfo = imp.load_source("pycfg", fileName, handle)
106 cmsProcess = cfo.process
107 except Exception, ex:
108 msg = "Your pycfg file is not valid python: %s" % str(ex)
109 raise "Error: ",msg
110 finally:
111 handle.close()
112 else:
113 try:
114 cfo = include(fileName)
115 cmsProcess = cfo
116 except Exception, ex:
117 msg = "The cfg file is not valid, %s\n" % str(ex)
118 raise "Error: ",msg
119 cfg = CfgInterface(cmsProcess)
120
121 # Set parameters for job
122 inModule = cfg.inputSource
123 if maxEvents:
124 cfg.maxEvents.setMaxEventsInput(maxEvents)
125
126 if skipEvents:
127 inModule.setSkipEvents(skipEvents)
128
129 if inputFiles:
130 inputFiles = inputFiles.replace('\\','')
131 inputFiles = inputFiles.replace('"','')
132 inputFileNames = inputFiles.split(',')
133 inModule.setFileNames(*inputFileNames)
134
135 # Pythia parameters
136 if (firstRun):
137 inModule.setFirstRun(firstRun)
138
139 incrementSeedList = []
140 preserveSeedList = []
141
142 if incrementSeeds:
143 incrementSeedList = incrementSeeds.split(',')
144 if preserveSeeds:
145 preserveSeedList = preserveSeeds.split(',')
146
147 # FUTURE: This function tests the CMSSW version. Can be simplified as we drop support for old versions
148 if CMSSW_major < 2 or (CMSSW_major == 2 and CMSSW_minor == 0): # Treatment for seeds, CMSSW < 2_1_x
149 if cfg.data.services.has_key('RandomNumberGeneratorService'):
150 ranGenerator = cfg.data.services['RandomNumberGeneratorService']
151 ranModules = ranGenerator.moduleSeeds
152
153 sourceSeed = int(ranGenerator.sourceSeed.value())
154 if 'sourceSeed' in preserveSeedList:
155 pass
156 elif 'sourceSeed' in incrementSeedList:
157 ranGenerator.sourceSeed = CfgTypes.untracked(CfgTypes.uint32(sourceSeed+nJob))
158 else:
159 ranGenerator.sourceSeed = CfgTypes.untracked(CfgTypes.uint32(_inst.randint(1,_MAXINT)))
160
161 for seed in incrementSeedList:
162 curSeed = getattr(ranGenerator.moduleSeeds,seed,None)
163 if curSeed:
164 curValue = int(curSeed.value())
165 setattr(ranGenerator.moduleSeeds,seed,CfgTypes.untracked(CfgTypes.uint32(curValue+nJob)))
166 preserveSeedList.append(seed)
167
168 for seed in ranGenerator.moduleSeeds.parameterNames_():
169 if seed not in preserveSeedList:
170 curSeed = getattr(ranGenerator.moduleSeeds,seed,None)
171 if curSeed:
172 curValue = int(curSeed.value())
173 setattr(ranGenerator.moduleSeeds,seed,CfgTypes.untracked(CfgTypes.uint32(_inst.randint(1,_MAXINT))))
174 else: # Treatment for seeds, CMSSW 2_1_x and later
175 if cfg.data.services.has_key('RandomNumberGeneratorService'):
176 from IOMC.RandomEngine.RandomServiceHelper import RandomNumberServiceHelper
177
178 ranGenerator = cfg.data.services['RandomNumberGeneratorService']
179 randSvc = RandomNumberServiceHelper(ranGenerator)
180 # sourceSeed is different from the rest, John says will become "theSource"
181 if 'sourceSeed' in preserveSeedList:
182 pass
183 elif 'sourceSeed' in incrementSeedList:
184 sourceSeed = int(ranGenerator.sourceSeed.value())
185 ranGenerator.sourceSeed = CfgTypes.untracked(CfgTypes.uint32(sourceSeed+nJob))
186 else:
187 ranGenerator.sourceSeed = CfgTypes.untracked(CfgTypes.uint32(_inst.randint(1,_MAXINT)))
188
189 # Increment requested seed sets
190 for seedName in incrementSeedList:
191 curSeeds = randSvc.getNamedSeed(seedName)
192 newSeeds = [x+nJob for x in curSeeds]
193 randSvc.setNamedSeed(seedName,*newSeeds)
194 preserveSeedList.append(seedName)
195
196 # Randomize remaining seeds
197 randSvc.populate(*preserveSeedList)
198
199 # End version specific code
200
201 # Write out new config file in one format or the other, FUTURE: Get rid of cfg mode
202 outFile = open(outFileName,"w")
203 if outFileName.endswith('py'):
204 outFile.write("import FWCore.ParameterSet.Config as cms\n")
205 outFile.write(cmsProcess.dumpPython())
206 if (debug):
207 print "writeCfg output:"
208 print "import FWCore.ParameterSet.Config as cms"
209 print cmsProcess.dumpPython()
210 else:
211 outFile.write(str(cfg))
212 if (debug):
213 print "writeCfg output:"
214 print str(cfg)
215 outFile.close()
216
217
218 if __name__ == '__main__' :
219 exit_status = main(sys.argv[1:])
220 sys.exit(exit_status)