ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/PsetManipulator.py
Revision: 1.32
Committed: Tue Nov 3 17:53:04 2009 UTC (15 years, 5 months ago) by slacapra
Content type: text/x-python
Branch: MAIN
Changes since 1.31: +14 -9 lines
Log Message:
fix problem in pickling pset.py with multicrab

File Contents

# Content
1 #!/usr/bin/env python
2
3 import os
4 import common
5 import imp
6 import pickle
7
8 from crab_util import *
9 from crab_exceptions import *
10
11 from ProdCommon.CMSConfigTools.ConfigAPI.CfgInterface import CfgInterface
12 from FWCore.ParameterSet.DictTypes import SortedKeysDict
13 from FWCore.ParameterSet.Modules import Service
14 from FWCore.ParameterSet.Types import *
15 from FWCore.ParameterSet.Modules import OutputModule
16
17 import FWCore.ParameterSet.Types as CfgTypes
18 import FWCore.ParameterSet.Modules as CfgModules
19
20 class PsetManipulator:
21 def __init__(self, pset):
22 """
23 Read in Pset object and initialize
24 """
25
26 self.pset = pset
27 #convert Pset
28 from FWCore.ParameterSet.Config import include
29 common.logger.debug("PsetManipulator::__init__: PSet file = "+self.pset)
30 # FUTURE: Can drop cfg mode for CMSSW < 2_1_x
31 if self.pset.endswith('py'):
32 handle = open(self.pset, 'r')
33 try: # Nested form for Python < 2.5
34 try:
35 self.cfo = imp.load_source("pycfg", self.pset, handle)
36 self.cmsProcess = self.cfo.process
37 except Exception, ex:
38 msg = "Your config file is not valid python: %s" % str(ex)
39 raise CrabException(msg)
40 finally:
41 handle.close()
42 else:
43 try:
44 self.cfo = include(self.pset)
45 self.cmsProcess = self.cfo
46 except Exception, ex:
47 msg = "Your cfg file is not valid, %s\n" % str(ex)
48 msg += " https://twiki.cern.ch/twiki/bin/view/CMS/SWGuideCrabFaq#Problem_with_ParameterSet_parsin\n"
49 msg += " may help you understand the problem."
50 raise CrabException(msg)
51 self.cfg = CfgInterface(self.cmsProcess)
52
53 def maxEvent(self, maxEv):
54 """
55 Set max event in the standalone untracked module
56 """
57 self.cfg.maxEvents.setMaxEventsInput(maxEv)
58 return
59
60 def skipEvent(self, skipEv):
61 """
62 Set max event in the standalone untracked module
63 """
64 self.cfg.inputSource.setSkipEvents(skipEv)
65 return
66
67 def psetWriter(self, name):
68 """
69 Write out modified CMSSW.py
70 """
71
72 pklFileName=common.work_space.jobDir()+name+".pkl"
73 pklFile = open(pklFileName,"w")
74 myPickle = pickle.Pickler(pklFile)
75 myPickle.dump(self.cmsProcess)
76 pklFile.close()
77 pklFile = open(pklFileName,"rb")
78 outFile = open(common.work_space.jobDir()+name,"w")
79 outFile.write("import FWCore.ParameterSet.Config as cms\n")
80 outFile.write("import pickle\n")
81 outFile.write("pickledCfg=\"\"\"")
82 outFile.write(pklFile.read())
83 outFile.write("\"\"\"\n")
84 outFile.write("process = pickle.loads(pickledCfg)\n")
85 pklFile.close()
86 outFile.close()
87
88 return
89
90 def getTFileService(self):
91 """ Get Output filename from TFileService and return it. If not existing, return None """
92 if not self.cfg.data.services.has_key('TFileService'):
93 return None
94 tFileService = self.cfg.data.services['TFileService']
95 if "fileName" in tFileService.parameterNames_():
96 fileName = getattr(tFileService,'fileName',None).value()
97 return fileName
98 return None
99
100 def getPoolOutputModule(self):
101 """ Get Output filename from PoolOutputModule and return it. If not existing, return None """
102 outputFinder = PoolOutputFinder()
103 for p in self.cfg.data.endpaths.itervalues():
104 p.visit(outputFinder)
105 return outputFinder.getList()
106
107 def getBadFilesSetting(self):
108 setting = False
109 try:
110 if self.cfg.data.source.skipBadFiles.value():
111 setting = True
112 except AttributeError:
113 pass # Either no source or no setting of skipBadFiles
114 return setting
115
116 class PoolOutputFinder(object):
117
118 def __init__(self):
119 self._poolList = []
120 def enter(self,visitee):
121 if isinstance(visitee,OutputModule) and visitee.type_() == "PoolOutputModule":
122 self._poolList.append(visitee.fileName.value())
123 def leave(self,visitee):
124 pass
125
126 def getList(self):
127 return self._poolList