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

Comparing COMP/CRAB/python/multicrab.py (file contents):
Revision 1.4 by slacapra, Mon Nov 10 16:42:22 2008 UTC vs.
Revision 1.30 by slacapra, Tue Nov 22 18:42:26 2011 UTC

# Line 25 | Line 25 | class MultiCrab:
25          print self.prog_name + ' running on ' +  time.ctime(time.time())
26          print '  working directory   ' + self.continue_dir
27  
28        crabs=[]
28  
29      def processContinueOption_(self,opts):
30  
# Line 67 | Line 66 | class MultiCrab:
66  
67      def createWorkSpace(self):
68          # create WorkingDir for Multicrab
69 <        if 'MULTICRAB.working_dir' in self.opts.keys():    
70 <            self.continue_dir = os.path.abspath(self.opts['MULTICRAB.working_dir'])
69 >        import os
70 >        if not self.continue_dir:
71 >            prefix = self.prog_name + '_'
72 >            self.continue_dir = findLastWorkDir(prefix)
73 >            pass
74 >        # if 'MULTICRAB.working_dir' in self.opts.keys():    
75 >        #     self.continue_dir = os.path.abspath(self.opts['MULTICRAB.working_dir'])
76 >        if self.ui_working_dir:
77 >            self.continue_dir = os.path.abspath(self.ui_working_dir)
78          else:
79              current_time = time.strftime('%y%m%d_%H%M%S', time.localtime(time.time()))
80              self.continue_dir = os.getcwd() + '/' + self.prog_name + '_' + current_time
# Line 84 | Line 90 | class MultiCrab:
90              msg = 'Directory '+str(self.continue_dir) +' already exist.\n'
91              raise CrabException(msg)
92  
93 <        shutil.copyfile('multicrab.cfg',self.continue_dir+'/multicrab.cfg')
93 >        os.putenv("MULTICRAB_WORKDIR",self.continue_dir)
94 >        shutil.copyfile(self.cfg_fname,self.continue_dir+'/multicrab.cfg')
95          
96          return
97          
# Line 99 | Line 106 | class MultiCrab:
106              if ( opt == '-cfg' ):
107                  if self.flag_continue:
108                      raise CrabException('-continue and -cfg cannot coexist.')
109 <                if opts[opt] : self.cfg_fname = opts[opt]
109 >                if opts[opt] :
110 >                    self.cfg_fname = opts[opt]
111 >                    del opts[opt] # do not pass cfg further on
112                  else : processHelpOptions()
113                  pass
114              pass
# Line 116 | Line 125 | class MultiCrab:
125  
126          # Load cfg-file
127  
128 +        cfg_params = {}
129          if self.cfg_fname != None:
130              if os.path.exists(self.cfg_fname):
131 <                self.cfg_params = self.loadMultiConfig(self.cfg_fname)
131 >                cfg_params = self.loadMultiConfig(self.cfg_fname)
132                  pass
133              else:
134                  msg = 'cfg-file '+self.cfg_fname+' not found.'
# Line 129 | Line 139 | class MultiCrab:
139          # process the [CRAB] section
140  
141          lhp = len('MULTICRAB.')
142 <        for k in self.cfg_params.keys():
142 >        for k in cfg_params.keys():
143              if len(k) >= lhp and k[:lhp] == 'MULTICRAB.':
144                  opt = '-'+k[lhp:]
145                  if len(opt) >= 3 and opt[:3] == '-__': continue
146                  if opt not in opts.keys():
147 <                    opts[opt] = self.cfg_params[k]
147 >                    opts[opt] = cfg_params[k]
148                      pass
149                  pass
150              pass
# Line 142 | Line 152 | class MultiCrab:
152          self.cfg_params_dataset = {}
153          common_opts = {}
154          # first get common sections
155 <        for sec in self.cfg_params:
155 >        for sec in cfg_params:
156              if sec in ['MULTICRAB']:
157 <                cfg_common=self.cfg_params[sec]
157 >                if 'cfg' in cfg_params[sec]:
158 >                    common_opts['cfg']=cfg_params[sec]['cfg']
159                  continue
160              if sec in ['COMMON']:
161 <                common_opts=self.cfg_params[sec]
161 >                common_opts.update(cfg_params[sec])
162                  continue
163              pass
164  
165 +        crab_cfg='crab.cfg'
166 +        if common_opts.has_key('cfg') : crab_cfg=common_opts['cfg']
167 +
168          # then Dataset's specific
169 <        for sec in self.cfg_params:
169 >        for sec in cfg_params:
170              if sec in ['MULTICRAB', 'COMMON']: continue
157            self.cfg_params_dataset[sec]=self.cfg_params[sec]
171              # add common to all dataset
172 +            self.cfg_params_dataset[sec]=cfg_params[sec]
173              for key in common_opts:
174 <                self.cfg_params_dataset[sec][key]=common_opts[key]
174 >                if not self.cfg_params_dataset[sec].has_key(key):
175 >                    self.cfg_params_dataset[sec][key]=common_opts[key]
176              pass
177  
163        self.cfg=cfg_common['cfg']
164
178          # read crab.cfg file and search for storage_path
179 <        cfg_params = loadConfig(self.cfg,{})
180 <        self.storage_path = cfg_params.get("USER.storage_path",None)
179 >        crab_cfg_params = loadConfig(crab_cfg,{})
180 >        # also USER.ui_working_dir USER.outputdir and USER.logdir need special treatment
181 >        if cfg_params.has_key("COMMON"):
182 >            self.user_remote_dir = cfg_params["COMMON"].get("user.user_remote_dir", crab_cfg_params.get("USER.user_remote_dir",None))
183 >            self.outputdir = cfg_params["COMMON"].get("user.outputdir", crab_cfg_params.get("USER.outputdir",None))
184 >            self.logdir = cfg_params["COMMON"].get("user.logdir", crab_cfg_params.get("USER.logdir",None))
185 >            self.ui_working_dir = cfg_params["COMMON"].get("user.ui_working_dir", crab_cfg_params.get("USER.ui_working_dir",None))
186 >            self.publish_data_name = cfg_params["COMMON"].get("user.publish_data_name", crab_cfg_params.get("USER.publish_data_name",None))
187 >        else:
188 >            self.user_remote_dir = crab_cfg_params.get("USER.user_remote_dir",None)
189 >            self.outputdir = crab_cfg_params.get("USER.outputdir",None)
190 >            self.logdir = crab_cfg_params.get("USER.logdir",None)
191 >            self.ui_working_dir = crab_cfg_params.get("USER.ui_working_dir",None)
192 >            self.publish_data_name = crab_cfg_params.get("USER.publish_data_name",None)
193 >
194          return
195  
196      def loadMultiConfig(self, file):
# Line 185 | Line 211 | class MultiCrab:
211  
212      def run(self):
213          #run crabs
214 +        runFileName = self.continue_dir+'/multicrab.exe'
215 +        runFile = open(runFileName,"w")
216          for sec in self.cfg_params_dataset:
217              options={}
218              if self.flag_continue:
# Line 193 | Line 221 | class MultiCrab:
221              options['-USER.ui_working_dir']=sec
222              # options from multicrab.cfg
223              for opt in self.cfg_params_dataset[sec]:
224 <                tmp="-"+string.upper(opt.split(".")[0])+"."+opt.split(".")[1]
224 >                tmp = "-"+str(opt)
225 >                if len(opt.split("."))==2:
226 >                    tmp="-"+string.upper(opt.split(".")[0])+"."+opt.split(".")[1]
227 >                
228                  options[tmp]=self.cfg_params_dataset[sec][opt]
229 +
230 +            # check if user_remote_dir is set in multicrab.cfg
231 +            # protect against no user_remote_dir
232 +            self.user_remote_dir =self.cfg_params_dataset[sec].get("user.user_remote_dir",self.user_remote_dir)
233 +            if not self.user_remote_dir:
234 +                self.user_remote_dir = "./"
235              # add section to storage_path if exist in crab.cfg
236 <            if self.storage_path:
237 <                options["-USER.user_remote_dir"]=self.storage_path+"/"+sec
236 >            if not self.cfg_params_dataset.has_key("USER.user_remote_dir") and self.user_remote_dir:
237 >                options["-USER.user_remote_dir"]=self.user_remote_dir+"/"+sec
238 >            # print options["-USER.user_remote_dir"]
239 >            # also for ui_working_dir
240 >            if not self.cfg_params_dataset.has_key("USER.ui_working_dir") and self.ui_working_dir:
241 >                options["-USER.ui_working_dir"]=self.ui_working_dir+"/"+sec
242 >            # if ui_working_dir is set, change -c dir accordnigly
243 >                if self.flag_continue:
244 >                    options['-c']=self.ui_working_dir+"/"+sec
245 >
246 >            # also for logDir
247 >            if not self.cfg_params_dataset.has_key("USER.logdir") and self.logdir:
248 >                options["-USER.logdir"]=self.logdir+"/"+sec
249 >            # also for outputdir
250 >            if not self.cfg_params_dataset.has_key("USER.outputdir") and self.outputdir:
251 >                options["-USER.outputdir"]=self.outputdir+"/"+sec
252 >            # also for publish_data_name
253 >            if not self.cfg_params_dataset.has_key("USER.publish_data_name") and self.publish_data_name:
254 >                options["-USER.publish_data_name"]=self.publish_data_name+"_"+sec
255 >
256              # Input options (command)
257              for opt in self.opts:
258 <                options[opt]=self.opts[opt]
259 <            try:
260 <                #print options
261 <                crab = Crab(options)
262 <                crab.run()
208 <                common.apmon.free()
209 <            except CrabException, e:
210 <                print '\n' + common.prog_name + ': ' + str(e) + '\n'
211 <                if common.logger:
212 <                    common.logger.write('ERROR: '+str(e)+'\n')
258 >                if opt != '-c':
259 >                    options[opt]=self.opts[opt]
260 >                # options[opt]=self.opts[opt]
261 >                    if self.flag_continue and options.has_key("-cfg"):
262 >                        del options['-cfg']
263                      pass
264 +
265 +            # write crab command to be executed later...
266 +            cmd='crab '
267 +            for o in options:
268 +                if options[o]==None:
269 +                    cmd+=str(o)+' '
270 +                else:
271 +                    options[o] = ''.join(options[o].split())
272 +                    cmd+=str(o)+'='+str(options[o])+' '
273                  pass
274 <            pass
274 >            cmd+="\n"
275 >            #print cmd
276 >
277 >            runFile.write(cmd)
278 >
279 >            # SL this does not work for complex, multi include pset.py
280 >
281 >            # crab = Crab()
282 >            # try:
283 >            #     crab.initialize_(options)
284 >            #     crab.run()
285 >            #     del crab
286 >            #     print 'Log file is %s%s.log'%(common.work_space.logDir(),common.prog_name)  
287 >            #     print '\n##############################  E N D  ####################################\n'
288 >            # except CrabException, e:
289 >            #     del crab
290 >            #     print '\n' + common.prog_name + ': ' + str(e) + '\n'
291 >            #     pass
292 >            # pass
293 >            # if (common.logger): common.logger.delete()
294          pass
295 +        return self.continue_dir
296          
218        #common.apmon.free()
297  
298   ###########################################################################
299   if __name__ == '__main__':
# Line 236 | Line 314 | if __name__ == '__main__':
314      # Create, initialize, and run a Crab object
315      try:
316          multicrab = MultiCrab(options)
317 <        multicrab.run()
317 >        continue_dir = multicrab.run()
318 >        import os
319 >        sys.exit(continue_dir)
320      except CrabException, e:
321          print '\n' + common.prog_name + ': ' + str(e) + '\n'
322  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines