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

Comparing COMP/CRAB/python/cms_cmssw.py (file contents):
Revision 1.152 by fanzago, Wed Jan 9 16:05:10 2008 UTC vs.
Revision 1.178 by spiga, Sun Apr 20 09:34:40 2008 UTC

# Line 5 | Line 5 | from crab_util import *
5   from BlackWhiteListParser import BlackWhiteListParser
6   import common
7   import Scram
8 + from LFNBaseName import *
9  
10   import os, string, glob
11  
# Line 20 | Line 21 | class Cmssw(JobType):
21          # init BlackWhiteListParser
22          self.blackWhiteListParser = BlackWhiteListParser(cfg_params)
23  
24 <        try:
24 <            self.MaxTarBallSize = float(self.cfg_params['EDG.maxtarballsize'])
25 <        except KeyError:
26 <            self.MaxTarBallSize = 9.5
24 >        self.MaxTarBallSize = float(self.cfg_params.get('EDG.maxtarballsize',9.5))
25  
26          # number of jobs requested to be created, limit obj splitting
27          self.ncjobs = ncjobs
# Line 50 | Line 48 | class Cmssw(JobType):
48          # Try to block creation in case of arch/version mismatch
49          #
50  
51 <        a = string.split(self.version, "_")
52 <
53 <        if int(a[1]) == 1 and (int(a[2]) < 5 and self.executable_arch.find('slc4') == 0):
54 <            msg = "Warning: You are using %s version of CMSSW  with %s architecture. \n--> Did you compile your libraries with SLC3? Otherwise you can find some problems running on SLC4 Grid nodes.\n"%(self.version, self.executable_arch)
55 <            common.logger.message(msg)
56 <        if int(a[1]) == 1 and (int(a[2]) >= 5 and self.executable_arch.find('slc3') == 0):
57 <            msg = "Error: CMS does not support %s with %s architecture"%(self.version, self.executable_arch)
58 <            raise CrabException(msg)
51 > #        a = string.split(self.version, "_")
52 > #
53 > #        if int(a[1]) == 1 and (int(a[2]) < 5 and self.executable_arch.find('slc4') == 0):
54 > #            msg = "Warning: You are using %s version of CMSSW  with %s architecture. \n--> Did you compile your libraries with SLC3? Otherwise you can find some problems running on SLC4 Grid nodes.\n"%(self.version, self.executable_arch)
55 > #            common.logger.message(msg)
56 > #        if int(a[1]) == 1 and (int(a[2]) >= 5 and self.executable_arch.find('slc3') == 0):
57 > #            msg = "Error: CMS does not support %s with %s architecture"%(self.version, self.executable_arch)
58 > #            raise CrabException(msg)
59 > #
60  
62        common.taskDB.setDict('codeVersion',self.version)
63        self.setParam_('application', self.version)
61  
62          ### collect Data cards
63  
64 <        try:
68 <            tmp =  cfg_params['CMSSW.datasetpath']
69 <            log.debug(6, "CMSSW::CMSSW(): datasetPath = "+tmp)
70 <            if string.lower(tmp)=='none':
71 <                self.datasetPath = None
72 <                self.selectNoInput = 1
73 <            else:
74 <                self.datasetPath = tmp
75 <                self.selectNoInput = 0
76 <        except KeyError:
64 >        if not cfg_params.has_key('CMSSW.datasetpath'):
65              msg = "Error: datasetpath not defined "
66              raise CrabException(msg)
67 <
68 <        # ML monitoring
69 <        # split dataset path style: /PreProdR3Minbias/SIM/GEN-SIM
70 <        if not self.datasetPath:
71 <            self.setParam_('dataset', 'None')
84 <            self.setParam_('owner', 'None')
67 >        tmp =  cfg_params['CMSSW.datasetpath']
68 >        log.debug(6, "CMSSW::CMSSW(): datasetPath = "+tmp)
69 >        if string.lower(tmp)=='none':
70 >            self.datasetPath = None
71 >            self.selectNoInput = 1
72          else:
73 <            try:
74 <                datasetpath_split = self.datasetPath.split("/")
88 <                # standard style
89 <                self.setParam_('datasetFull', self.datasetPath)
90 <                self.setParam_('dataset', datasetpath_split[1])
91 <                self.setParam_('owner', datasetpath_split[2])
92 <            except:
93 <                self.setParam_('dataset', self.datasetPath)
94 <                self.setParam_('owner', self.datasetPath)
95 <
96 <        self.setParam_('taskId', common.taskDB.dict('taskId'))
73 >            self.datasetPath = tmp
74 >            self.selectNoInput = 0
75  
76          self.dataTiers = []
77  
78          ## now the application
79 <        try:
80 <            self.executable = cfg_params['CMSSW.executable']
103 <            self.setParam_('exe', self.executable)
104 <            log.debug(6, "CMSSW::CMSSW(): executable = "+self.executable)
105 <            msg = "Default executable cmsRun overridden. Switch to " + self.executable
106 <            log.debug(3,msg)
107 <        except KeyError:
108 <            self.executable = 'cmsRun'
109 <            self.setParam_('exe', self.executable)
110 <            msg = "User executable not defined. Use cmsRun"
111 <            log.debug(3,msg)
112 <            pass
79 >        self.executable = cfg_params.get('CMSSW.executable','cmsRun')
80 >        log.debug(6, "CMSSW::CMSSW(): executable = "+self.executable)
81  
82 <        try:
115 <            self.pset = cfg_params['CMSSW.pset']
116 <            log.debug(6, "Cmssw::Cmssw(): PSet file = "+self.pset)
117 <            if self.pset.lower() != 'none' :
118 <                if (not os.path.exists(self.pset)):
119 <                    raise CrabException("User defined PSet file "+self.pset+" does not exist")
120 <            else:
121 <                self.pset = None
122 <        except KeyError:
82 >        if not cfg_params.has_key('CMSSW.pset'):
83              raise CrabException("PSet file missing. Cannot run cmsRun ")
84 +        self.pset = cfg_params['CMSSW.pset']
85 +        log.debug(6, "Cmssw::Cmssw(): PSet file = "+self.pset)
86 +        if self.pset.lower() != 'none' :
87 +            if (not os.path.exists(self.pset)):
88 +                raise CrabException("User defined PSet file "+self.pset+" does not exist")
89 +        else:
90 +            self.pset = None
91  
92          # output files
93          ## stuff which must be returned always via sandbox
# Line 130 | Line 97 | class Cmssw(JobType):
97          self.output_file_sandbox.append(self.fjrFileName)
98  
99          # other output files to be returned via sandbox or copied to SE
100 <        try:
101 <            self.output_file = []
102 <            tmp = cfg_params['CMSSW.output_file']
103 <            if tmp != '':
104 <                tmpOutFiles = string.split(cfg_params['CMSSW.output_file'],',')
105 <                log.debug(7, 'cmssw::cmssw(): output files '+str(tmpOutFiles))
106 <                for tmp in tmpOutFiles:
107 <                    tmp=string.strip(tmp)
141 <                    self.output_file.append(tmp)
142 <                    pass
143 <            else:
144 <                log.message("No output file defined: only stdout/err and the CRAB Framework Job Report will be available\n")
100 >        self.output_file = []
101 >        tmp = cfg_params.get('CMSSW.output_file',None)
102 >        if tmp :
103 >            tmpOutFiles = string.split(tmp,',')
104 >            log.debug(7, 'cmssw::cmssw(): output files '+str(tmpOutFiles))
105 >            for tmp in tmpOutFiles:
106 >                tmp=string.strip(tmp)
107 >                self.output_file.append(tmp)
108                  pass
109 <            pass
147 <        except KeyError:
109 >        else:
110              log.message("No output file defined: only stdout/err and the CRAB Framework Job Report will be available\n")
111 <            pass
111 >        pass
112  
113          # script_exe file as additional file in inputSandbox
114 <        try:
115 <            self.scriptExe = cfg_params['USER.script_exe']
116 <            if self.scriptExe != '':
117 <               if not os.path.isfile(self.scriptExe):
118 <                  msg ="ERROR. file "+self.scriptExe+" not found"
119 <                  raise CrabException(msg)
158 <               self.additional_inbox_files.append(string.strip(self.scriptExe))
159 <        except KeyError:
160 <            self.scriptExe = ''
114 >        self.scriptExe = cfg_params.get('USER.script_exe',None)
115 >        if self.scriptExe :
116 >            if not os.path.isfile(self.scriptExe):
117 >                msg ="ERROR. file "+self.scriptExe+" not found"
118 >                raise CrabException(msg)
119 >            self.additional_inbox_files.append(string.strip(self.scriptExe))
120  
121          #CarlosDaniele
122          if self.datasetPath == None and self.pset == None and self.scriptExe == '' :
123 <           msg ="Error. script_exe  not defined"
124 <           raise CrabException(msg)
123 >            msg ="Error. script_exe  not defined"
124 >            raise CrabException(msg)
125  
126          ## additional input files
127 <        try:
127 >        if cfg_params.has_key('USER.additional_input_files'):
128              tmpAddFiles = string.split(cfg_params['USER.additional_input_files'],',')
129              for tmp in tmpAddFiles:
130                  tmp = string.strip(tmp)
# Line 189 | Line 148 | class Cmssw(JobType):
148                  pass
149              pass
150              common.logger.debug(5,"Additional input files: "+str(self.additional_inbox_files))
151 <        except KeyError:
193 <            pass
194 <
195 <        # files per job
196 <        try:
197 <            if (cfg_params['CMSSW.files_per_jobs']):
198 <                raise CrabException("files_per_jobs no longer supported.  Quitting.")
199 <        except KeyError:
200 <            pass
151 >        pass
152  
153          ## Events per job
154 <        try:
154 >        if cfg_params.has_key('CMSSW.events_per_job'):
155              self.eventsPerJob =int( cfg_params['CMSSW.events_per_job'])
156              self.selectEventsPerJob = 1
157 <        except KeyError:
157 >        else:
158              self.eventsPerJob = -1
159              self.selectEventsPerJob = 0
160  
161          ## number of jobs
162 <        try:
162 >        if cfg_params.has_key('CMSSW.number_of_jobs'):
163              self.theNumberOfJobs =int( cfg_params['CMSSW.number_of_jobs'])
164              self.selectNumberOfJobs = 1
165 <        except KeyError:
165 >        else:
166              self.theNumberOfJobs = 0
167              self.selectNumberOfJobs = 0
168  
169 <        try:
169 >        if cfg_params.has_key('CMSSW.total_number_of_events'):
170              self.total_number_of_events = int(cfg_params['CMSSW.total_number_of_events'])
171              self.selectTotalNumberEvents = 1
172 <        except KeyError:
172 >        else:
173              self.total_number_of_events = 0
174              self.selectTotalNumberEvents = 0
175  
# Line 231 | Line 182 | class Cmssw(JobType):
182                   msg = 'Must specify  number_of_jobs.'
183                   raise CrabException(msg)
184  
185 <        ## source seed for pythia
186 <        try:
187 <            self.sourceSeed = int(cfg_params['CMSSW.pythia_seed'])
188 <        except KeyError:
189 <            self.sourceSeed = None
190 <            common.logger.debug(5,"No seed given")
191 <
192 <        try:
193 <            self.sourceSeedVtx = int(cfg_params['CMSSW.vtx_seed'])
194 <        except KeyError:
195 <            self.sourceSeedVtx = None
196 <            common.logger.debug(5,"No vertex seed given")
197 <
198 <        try:
199 <            self.sourceSeedG4 = int(cfg_params['CMSSW.g4_seed'])
200 <        except KeyError:
201 <            self.sourceSeedG4 = None
202 <            common.logger.debug(5,"No g4 sim hits seed given")
185 >        ## New method of dealing with seeds
186 >        self.incrementSeeds = []
187 >        self.preserveSeeds = []
188 >        if cfg_params.has_key('CMSSW.preserve_seeds'):
189 >            tmpList = cfg_params['CMSSW.preserve_seeds'].split(',')
190 >            for tmp in tmpList:
191 >                tmp.strip()
192 >                self.preserveSeeds.append(tmp)
193 >        if cfg_params.has_key('CMSSW.increment_seeds'):
194 >            tmpList = cfg_params['CMSSW.increment_seeds'].split(',')
195 >            for tmp in tmpList:
196 >                tmp.strip()
197 >                self.incrementSeeds.append(tmp)
198 >
199 >        ## Old method of dealing with seeds
200 >        ## FUTURE: This is for old CMSSW and old CRAB. Can throw exceptions after a couple of CRAB releases and then
201 >        ## remove
202 >        self.sourceSeed = cfg_params.get('CMSSW.pythia_seed',None)
203 >        if self.sourceSeed:
204 >            print "pythia_seed is a deprecated parameter. Use preserve_seeds or increment_seeds in the future.\n","Added to increment_seeds."
205 >            self.incrementSeeds.append('sourceSeed')
206 >
207 >        self.sourceSeedVtx = cfg_params.get('CMSSW.vtx_seed',None)
208 >        if self.sourceSeedVtx:
209 >            print "vtx_seed is a deprecated parameter. Use preserve_seeds or increment_seeds in the future.\n","Added to increment_seeds."
210 >            self.incrementSeeds.append('VtxSmeared')
211 >
212 >        self.sourceSeedG4 = cfg_params.get('CMSSW.g4_seed',None)
213 >        if self.sourceSeedG4:
214 >            print "g4_seed is a deprecated parameter. Use preserve_seeds or increment_seeds in the future.\n","Added to increment_seeds."
215 >            self.incrementSeeds.append('g4SimHits')
216 >
217 >        self.sourceSeedMix = cfg_params.get('CMSSW.mix_seed',None)
218 >        if self.sourceSeedMix:
219 >            print "mix_seed is a deprecated parameter. Use preserve_seeds or increment_seeds in the future.\n","Added to increment_seeds."
220 >            self.incrementSeeds.append('mix')
221  
222 <        try:
254 <            self.sourceSeedMix = int(cfg_params['CMSSW.mix_seed'])
255 <        except KeyError:
256 <            self.sourceSeedMix = None
257 <            common.logger.debug(5,"No mix seed given")
222 >        self.firstRun = cfg_params.get('CMSSW.first_run',None)
223  
259        try:
260            self.firstRun = int(cfg_params['CMSSW.first_run'])
261        except KeyError:
262            self.firstRun = None
263            common.logger.debug(5,"No first run given")
224          if self.pset != None: #CarlosDaniele
225              import PsetManipulator as pp
226              PsetEdit = pp.PsetManipulator(self.pset) #Daniele Pset
227  
228          # Copy/return
229  
230 <        try:
231 <            self.copy_data = int(cfg_params['USER.copy_data'])
272 <        except KeyError:
273 <            self.copy_data = 0
274 <        try:
275 <            self.return_data = int(cfg_params['USER.return_data'])
276 <        except KeyError:
277 <            self.return_data = 0
230 >        self.copy_data = int(cfg_params.get('USER.copy_data',0))
231 >        self.return_data = int(cfg_params.get('USER.return_data',0))
232  
233          #DBSDLS-start
234          ## Initialize the variables that are extracted from DBS/DLS and needed in other places of the code
# Line 302 | Line 256 | class Cmssw(JobType):
256          # modify Pset
257          if self.pset != None: #CarlosDaniele
258              try:
259 <                if (self.datasetPath): # standard job
260 <                    # allow to processa a fraction of events in a file
307 <                    PsetEdit.inputModule("INPUTFILE")
308 <                    PsetEdit.maxEvent(0)
309 <                    PsetEdit.skipEvent(0)
310 <                else:  # pythia like job
311 <                    PsetEdit.maxEvent(self.eventsPerJob)
312 <                    if (self.firstRun):
313 <                        PsetEdit.pythiaFirstRun(0)  #First Run
314 <                    if (self.sourceSeed) :
315 <                        PsetEdit.pythiaSeed(0)
316 <                        if (self.sourceSeedVtx) :
317 <                            PsetEdit.vtxSeed(0)
318 <                        if (self.sourceSeedG4) :
319 <                            PsetEdit.g4Seed(0)
320 <                        if (self.sourceSeedMix) :
321 <                            PsetEdit.mixSeed(0)
322 <                # add FrameworkJobReport to parameter-set
259 >                # Add FrameworkJobReport to parameter-set, set max events.
260 >                # Reset later for data jobs by writeCFG which does all modifications
261                  PsetEdit.addCrabFJR(self.fjrFileName)
262 +                PsetEdit.maxEvent(self.eventsPerJob)
263                  PsetEdit.psetWriter(self.configFilename())
264              except:
265                  msg='Error while manipuliating ParameterSet: exiting...'
# Line 337 | Line 276 | class Cmssw(JobType):
276          ## Contact the DBS
277          common.logger.message("Contacting Data Discovery Services ...")
278          try:
340
279              self.pubdata=DataDiscovery.DataDiscovery(datasetPath, cfg_params)
280              self.pubdata.fetchDBSInfo()
281  
# Line 380 | Line 318 | class Cmssw(JobType):
318  
319          return sites
320  
321 <    def setArgsList(self, argsList):
322 <        self.argsList = argsList
321 >  # to Be Removed  DS -- BL
322 >  #  def setArgsList(self, argsList):
323 >  #      self.argsList = argsList
324  
325      def jobSplittingByBlocks(self, blockSites):
326          """
# Line 433 | Line 372 | class Cmssw(JobType):
372          else :
373              totalNumberOfJobs = self.ncjobs
374  
436
375          blocks = blockSites.keys()
376          blockCount = 0
377          # Backup variable in case self.maxEvents counted events in a non-included block
# Line 488 | Line 426 | class Cmssw(JobType):
426                          except KeyError:
427                              common.logger.message("File "+str(file)+" has unknown number of events: skipping")
428  
429 <
429 >                    eventsPerJobRequested = min(eventsPerJobRequested, eventsRemaining)
430                      # if less events in file remain than eventsPerJobRequested
431 <                    if ( filesEventCount - jobSkipEventCount < eventsPerJobRequested ) :
431 >                    if ( filesEventCount - jobSkipEventCount < eventsPerJobRequested):
432                          # if last file in block
433                          if ( fileCount == numFilesInBlock-1 ) :
434                              # end job using last file, use remaining events in block
# Line 554 | Line 492 | class Cmssw(JobType):
492                          jobSkipEventCount = eventsPerJobRequested - (filesEventCount - jobSkipEventCount - self.eventsbyfile[file])
493                          # remove all but the last file
494                          filesEventCount = self.eventsbyfile[file]
495 <                        parString = ""
558 <                        parString += '\\\"' + file + '\\\"\,'
495 >                        parString = '\\\"' + file + '\\\"\,'
496                      pass # END if
497                  pass # END while (iterate over files in the block)
498          pass # END while (iterate over blocks in the dataset)
# Line 575 | Line 512 | class Cmssw(JobType):
512          for block in blocks:
513              if block in jobsOfBlock.keys() :
514                  blockCounter += 1
515 <                screenOutput += "Block %5i: jobs %20s: sites: %s\n" % (blockCounter,spanRanges(jobsOfBlock[block]),','.join(self.blackWhiteListParser.checkWhiteList(self.blackWhiteListParser.checkBlackList(blockSites[block],block),block)))
515 >                screenOutput += "Block %5i: jobs %20s: sites: %s\n" % (blockCounter,spanRanges(jobsOfBlock[block]),
516 >                    ','.join(self.blackWhiteListParser.checkWhiteList(self.blackWhiteListParser.checkBlackList(blockSites[block],block),block)))
517                  if len(self.blackWhiteListParser.checkWhiteList(self.blackWhiteListParser.checkBlackList(blockSites[block],block),block)) == 0:
518                      noSiteBlock.append( spanRanges(jobsOfBlock[block]) )
519                      bloskNoSite.append( blockCounter )
# Line 595 | Line 533 | class Cmssw(JobType):
533              for range_jobs in noSiteBlock:
534                  msg += str(range_jobs) + virgola
535              msg += '\n               will not be submitted and this block of data can not be analyzed!\n'
536 +            if self.cfg_params.has_key('EDG.se_white_list'):
537 +                msg += 'WARNING: SE White List: '+self.cfg_params['EDG.se_white_list']+'\n'
538 +                msg += '(Hint: By whitelisting you force the job to run at this particular site(s).\n'
539 +                msg += 'Please check if the dataset is available at this site!)\n'
540 +            if self.cfg_params.has_key('EDG.ce_white_list'):
541 +                msg += 'WARNING: CE White List: '+self.cfg_params['EDG.ce_white_list']+'\n'
542 +                msg += '(Hint: By whitelisting you force the job to run at this particular site(s).\n'
543 +                msg += 'Please check if the dataset is available at this site!)\n'
544 +
545              common.logger.message(msg)
546  
547          self.list_of_args = list_of_lists
# Line 648 | Line 595 | class Cmssw(JobType):
595              if (self.firstRun):
596                  ## pythia first run
597                  args.append(str(self.firstRun)+str(i))
651            if (self.sourceSeed):
652                args.append(str(self.sourceSeed)+str(i))
653                if (self.sourceSeedVtx):
654                    ## + vtx random seed
655                    args.append(str(self.sourceSeedVtx)+str(i))
656                if (self.sourceSeedG4):
657                    ## + G4 random seed
658                    args.append(str(self.sourceSeedG4)+str(i))
659                if (self.sourceSeedMix):
660                    ## + Mix random seed
661                    args.append(str(self.sourceSeedMix)+str(i))
662                pass
663            pass
598              self.list_of_args.append(args)
665        pass
599  
600          return
601  
# Line 692 | Line 625 | class Cmssw(JobType):
625  
626      def split(self, jobParams):
627  
695        common.jobDB.load()
628          #### Fabio
629          njobs = self.total_number_of_jobs
630          arglist = self.list_of_args
# Line 700 | Line 632 | class Cmssw(JobType):
632          for i in range(njobs):
633              jobParams.append("")
634  
635 +        listID=[]
636 +        listField=[]
637          for job in range(njobs):
638              jobParams[job] = arglist[job]
639 <            # print str(arglist[job])
640 <            # print jobParams[job]
641 <            common.jobDB.setArguments(job, jobParams[job])
642 <            common.logger.debug(5,"Job "+str(job)+" Destination: "+str(self.jobDestination[job]))
643 <            common.jobDB.setDestination(job, self.jobDestination[job])
639 >            listID.append(job+1)
640 >            job_ToSave ={}
641 >            concString = ' '
642 >            argu=''
643 >            if len(jobParams[job]):
644 >                argu +=   concString.join(jobParams[job] )
645 >            job_ToSave['arguments']= str(job+1)+' '+argu## new BL--DS
646 >            job_ToSave['dlsDestination']= self.jobDestination[job]## new BL--DS
647 >            #common._db.updateJob_(job,job_ToSave)## new BL--DS
648 >            listField.append(job_ToSave)
649 >            msg="Job "+str(job)+" Arguments:   "+str(job+1)+" "+argu+"\n"  \
650 >            +"                     Destination: "+str(self.jobDestination[job])
651 >            common.logger.debug(5,msg)
652 >            #common.logger.debug(5,"Job "+str(job)+" Destination: "+str(self.jobDestination[job]))
653 >        common._db.updateJob_(listID,listField)## new BL--DS
654 >        ## Pay Attention Here....DS--BL
655 >        self.argsList = (len(jobParams[1])+1)
656  
711        common.jobDB.save()
657          return
658  
714    def getJobTypeArguments(self, nj, sched):
715        result = ''
716        for i in common.jobDB.arguments(nj):
717            result=result+str(i)+" "
718        return result
719
659      def numberOfJobs(self):
660          # Fabio
661          return self.total_number_of_jobs
# Line 751 | Line 690 | class Cmssw(JobType):
690  
691          ## check if working area is release top
692          if swReleaseTop == '' or swArea == swReleaseTop:
693 +            common.logger.debug(3,"swArea = "+swArea+" swReleaseTop ="+swReleaseTop)
694              return
695  
696          import tarfile
# Line 798 | Line 738 | class Cmssw(JobType):
738                      common.logger.debug(5,"data "+root+"/data"+" to be tarred")
739                      tar.add(root+"/data",root[swAreaLen:]+"/data")
740  
801            ### Removed ProdAgent Api dependencies ###
802            ### Add ProdAgent dir to tar
803            #paDir = 'ProdAgentApi'
804            #pa = os.environ['CRABDIR'] + '/' + 'ProdAgentApi'
805            #if os.path.isdir(pa):
806            #    tar.add(pa,paDir)
741  
742              ## Add ProdCommon dir to tar
743              prodcommonDir = 'ProdCommon'
# Line 826 | Line 760 | class Cmssw(JobType):
760          try:
761              tar = tarfile.open(self.MLtgzfile, "w:gz")
762              path=os.environ['CRABDIR'] + '/python/'
763 <            for file in ['report.py', 'DashboardAPI.py', 'Logger.py', 'ProcInfo.py', 'apmon.py', 'parseCrabFjr.py']:
763 >            for file in ['report.py', 'DashboardAPI.py', 'Logger.py', 'ProcInfo.py', 'apmon.py', 'parseCrabFjr.py','writeCfg.py', 'JobReportErrorCode.py']:
764                  tar.add(path+file,file)
765              common.logger.debug(5,"Files added to "+self.MLtgzfile+" : "+str(tar.getnames()))
766              tar.close()
# Line 848 | Line 782 | class Cmssw(JobType):
782          tar.close()
783          return tarName
784  
785 <    def wsSetupEnvironment(self, nj):
785 >    def wsSetupEnvironment(self, nj=0):
786          """
787          Returns part of a job script which prepares
788          the execution environment for the job 'nj'.
789          """
790          # Prepare JobType-independent part
791 <        txt = ''
791 >        txt = '\n#Written by cms_cmssw::wsSetupEnvironment\n'
792          txt += 'echo ">>> setup environment"\n'
793          txt += 'if [ $middleware == LCG ]; then \n'
794          txt += self.wsSetupCMSLCGEnvironment_()
795          txt += 'elif [ $middleware == OSG ]; then\n'
796          txt += '    WORKING_DIR=`/bin/mktemp  -d $OSG_WN_TMP/cms_XXXXXXXXXXXX`\n'
797          txt += '    if [ ! $? == 0 ] ;then\n'
798 <        txt += '        echo "SET_CMS_ENV 10016 ==> OSG $WORKING_DIR could not be created on WN `hostname`"\n'
799 <        txt += '        echo "JOB_EXIT_STATUS = 10016"\n'
800 <        txt += '        echo "JobExitCode=10016" | tee -a $RUNTIME_AREA/$repo\n'
867 <        txt += '        dumpStatus $RUNTIME_AREA/$repo\n'
868 <        txt += '        exit 1\n'
798 >        txt += '        echo "ERROR ==> OSG $WORKING_DIR could not be created on WN `hostname`"\n'
799 >        txt += '        job_exit_code=10016\n'
800 >        txt += '        func_exit\n'
801          txt += '    fi\n'
802          txt += '    echo ">>> Created working directory: $WORKING_DIR"\n'
803          txt += '\n'
# Line 885 | Line 817 | class Cmssw(JobType):
817          txt += scram+' project CMSSW '+self.version+'\n'
818          txt += 'status=$?\n'
819          txt += 'if [ $status != 0 ] ; then\n'
820 <        txt += '    echo "SET_EXE_ENV 10034 ==>ERROR CMSSW '+self.version+' not found on `hostname`" \n'
821 <        txt += '    echo "JOB_EXIT_STATUS = 10034"\n'
822 <        txt += '    echo "JobExitCode=10034" | tee -a $RUNTIME_AREA/$repo\n'
891 <        txt += '    dumpStatus $RUNTIME_AREA/$repo\n'
892 <        txt += '    if [ $middleware == OSG ]; then \n'
893 <        txt += '        cd $RUNTIME_AREA\n'
894 <        txt += '        echo ">>> current directory (RUNTIME_AREA): $RUNTIME_AREA"\n'
895 <        txt += '        echo ">>> Remove working directory: $WORKING_DIR"\n'
896 <        txt += '        /bin/rm -rf $WORKING_DIR\n'
897 <        txt += '        if [ -d $WORKING_DIR ] ;then\n'
898 <        txt += '            echo "SET_CMS_ENV 10018 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after CMSSW CMSSW_0_6_1 not found on `hostname`"\n'
899 <        txt += '            echo "JOB_EXIT_STATUS = 10018"\n'
900 <        txt += '            echo "JobExitCode=10018" | tee -a $RUNTIME_AREA/$repo\n'
901 <        txt += '            dumpStatus $RUNTIME_AREA/$repo\n'
902 <        txt += '        fi\n'
903 <        txt += '    fi \n'
904 <        txt += '    exit 1 \n'
820 >        txt += '    echo "ERROR ==> CMSSW '+self.version+' not found on `hostname`" \n'
821 >        txt += '    job_exit_code=10034\n'
822 >        txt += '    func_exit\n'
823          txt += 'fi \n'
824          txt += 'cd '+self.version+'\n'
825          ########## FEDE FOR DBS2 ######################
# Line 914 | Line 832 | class Cmssw(JobType):
832          txt += "\n"
833          txt += "## number of arguments (first argument always jobnumber)\n"
834          txt += "\n"
835 <        txt += "if [ $nargs -lt "+str(len(self.argsList[nj].split()))+" ]\n"
835 >        txt += "if [ $nargs -lt "+str(self.argsList)+" ]\n"
836          txt += "then\n"
837 <        txt += "    echo 'SET_EXE_ENV 1 ==> ERROR Too few arguments' +$nargs+ \n"
838 <        txt += '    echo "JOB_EXIT_STATUS = 50113"\n'
839 <        txt += '    echo "JobExitCode=50113" | tee -a $RUNTIME_AREA/$repo\n'
922 <        txt += '    dumpStatus $RUNTIME_AREA/$repo\n'
923 <        txt += '    if [ $middleware == OSG ]; then \n'
924 <        txt += '        cd $RUNTIME_AREA\n'
925 <        txt += '        echo ">>> current directory (RUNTIME_AREA): $RUNTIME_AREA"\n'
926 <        txt += '        echo ">>> Remove working directory: $WORKING_DIR"\n'
927 <        txt += '        /bin/rm -rf $WORKING_DIR\n'
928 <        txt += '        if [ -d $WORKING_DIR ] ;then\n'
929 <        txt += '            echo "SET_EXE_ENV 50114 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after Too few arguments for CRAB job wrapper"\n'
930 <        txt += '            echo "JOB_EXIT_STATUS = 50114"\n'
931 <        txt += '            echo "JobExitCode=50114" | tee -a $RUNTIME_AREA/$repo\n'
932 <        txt += '            dumpStatus $RUNTIME_AREA/$repo\n'
933 <        txt += '        fi\n'
934 <        txt += '    fi \n'
935 <        txt += "    exit 1\n"
837 >        txt += "    echo 'ERROR ==> Too few arguments' +$nargs+ \n"
838 >        txt += '    job_exit_code=50113\n'
839 >        txt += "    func_exit\n"
840          txt += "fi\n"
841          txt += "\n"
842  
# Line 954 | Line 858 | class Cmssw(JobType):
858              txt += 'PrimaryDataset=null\n'
859              txt += 'DataTier=null\n'
860              txt += 'ApplicationFamily=MCDataTier\n'
861 <        if self.pset != None: #CarlosDaniele
861 >        if self.pset != None:
862              pset = os.path.basename(job.configFilename())
863              txt += '\n'
864              txt += 'cp  $RUNTIME_AREA/'+pset+' .\n'
865              if (self.datasetPath): # standard job
866 <                txt += 'InputFiles=${args[1]}\n'
867 <                txt += 'MaxEvents=${args[2]}\n'
868 <                txt += 'SkipEvents=${args[3]}\n'
866 >                txt += 'InputFiles=${args[1]}; export InputFiles\n'
867 >                txt += 'MaxEvents=${args[2]}; export MaxEvents\n'
868 >                txt += 'SkipEvents=${args[3]}; export SkipEvents\n'
869                  txt += 'echo "Inputfiles:<$InputFiles>"\n'
966                txt += 'sed "s#\'INPUTFILE\'#$InputFiles#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
870                  txt += 'echo "MaxEvents:<$MaxEvents>"\n'
968                txt += 'sed "s#int32 input = 0#int32 input = $MaxEvents#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
871                  txt += 'echo "SkipEvents:<$SkipEvents>"\n'
970                txt += 'sed "s#uint32 skipEvents = 0#uint32 skipEvents = $SkipEvents#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
872              else:  # pythia like job
873 <                seedIndex=1
873 >                txt += 'PreserveSeeds='  + ','.join(self.preserveSeeds)  + '; export PreserveSeeds\n'
874 >                txt += 'IncrementSeeds=' + ','.join(self.incrementSeeds) + '; export IncrementSeeds\n'
875 >                txt += 'echo "PreserveSeeds: <$PreserveSeeds>"\n'
876 >                txt += 'echo "IncrementSeeds:<$IncrementSeeds>"\n'
877                  if (self.firstRun):
878 <                    txt += 'FirstRun=${args['+str(seedIndex)+']}\n'
878 >                    txt += 'FirstRun=${args[1]}; export FirstRun\n'
879                      txt += 'echo "FirstRun: <$FirstRun>"\n'
976                    txt += 'sed "s#uint32 firstRun = 0#uint32 firstRun = $FirstRun#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
977                    seedIndex=seedIndex+1
880  
979                if (self.sourceSeed):
980                    txt += 'Seed=${args['+str(seedIndex)+']}\n'
981                    txt += 'sed "s#uint32 sourceSeed = 0#uint32 sourceSeed = $Seed#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
982                    seedIndex=seedIndex+1
983                    ## the following seeds are not always present
984                    if (self.sourceSeedVtx):
985                        txt += 'VtxSeed=${args['+str(seedIndex)+']}\n'
986                        txt += 'echo "VtxSeed: <$VtxSeed>"\n'
987                        txt += 'sed "s#uint32 VtxSmeared = 0#uint32 VtxSmeared = $VtxSeed#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
988                        seedIndex += 1
989                    if (self.sourceSeedG4):
990                        txt += 'G4Seed=${args['+str(seedIndex)+']}\n'
991                        txt += 'echo "G4Seed: <$G4Seed>"\n'
992                        txt += 'sed "s#uint32 g4SimHits = 0#uint32 g4SimHits = $G4Seed#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
993                        seedIndex += 1
994                    if (self.sourceSeedMix):
995                        txt += 'mixSeed=${args['+str(seedIndex)+']}\n'
996                        txt += 'echo "MixSeed: <$mixSeed>"\n'
997                        txt += 'sed "s#uint32 mix = 0#uint32 mix = $mixSeed#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
998                        seedIndex += 1
999                    pass
1000                pass
881              txt += 'mv -f '+pset+' pset.cfg\n'
882  
883          if len(self.additional_inbox_files) > 0:
# Line 1006 | Line 886 | class Cmssw(JobType):
886              txt += 'fi\n'
887              pass
888  
889 <        if self.pset != None: #CarlosDaniele
889 >        if self.pset != None:
890              txt += '\n'
891              txt += 'echo "***** cat pset.cfg *********"\n'
892              txt += 'cat pset.cfg\n'
893              txt += 'echo "****** end pset.cfg ********"\n'
894              txt += '\n'
1015            ### FEDE FOR DBS OUTPUT PUBLICATION
895              txt += 'PSETHASH=`EdmConfigHash < pset.cfg` \n'
896              txt += 'echo "PSETHASH = $PSETHASH" \n'
1018            ##############
897              txt += '\n'
898          return txt
899  
900 <    def wsBuildExe(self, nj=0):
900 >    def wsUntarSoftware(self, nj=0):
901          """
902          Put in the script the commands to build an executable
903          or a library.
904          """
905  
906 <        txt = ""
906 >        txt = '\n#Written by cms_cmssw::wsUntarSoftware\n'
907  
908          if os.path.isfile(self.tgzNameWithPath):
909              txt += 'echo ">>> tar xzvf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+' :" \n'
910              txt += 'tar xzvf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+'\n'
911              txt += 'untar_status=$? \n'
912              txt += 'if [ $untar_status -ne 0 ]; then \n'
913 <            txt += '   echo "SET_EXE 1 ==> ERROR Untarring .tgz file failed"\n'
914 <            txt += '   echo "JOB_EXIT_STATUS = $untar_status" \n'
915 <            txt += '   echo "JobExitCode=$untar_status" | tee -a $RUNTIME_AREA/$repo\n'
1038 <            txt += '   if [ $middleware == OSG ]; then \n'
1039 <            txt += '       cd $RUNTIME_AREA\n'
1040 <            txt += '        echo ">>> current directory (RUNTIME_AREA): $RUNTIME_AREA"\n'
1041 <            txt += '        echo ">>> Remove working directory: $WORKING_DIR"\n'
1042 <            txt += '       /bin/rm -rf $WORKING_DIR\n'
1043 <            txt += '       if [ -d $WORKING_DIR ] ;then\n'
1044 <            txt += '           echo "SET_EXE 50999 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after Untarring .tgz file failed"\n'
1045 <            txt += '           echo "JOB_EXIT_STATUS = 50999"\n'
1046 <            txt += '           echo "JobExitCode=50999" | tee -a $RUNTIME_AREA/$repo\n'
1047 <            txt += '           dumpStatus $RUNTIME_AREA/$repo\n'
1048 <            txt += '       fi\n'
1049 <            txt += '   fi \n'
1050 <            txt += '   \n'
1051 <            txt += '   exit 1 \n'
913 >            txt += '   echo "ERROR ==> Untarring .tgz file failed"\n'
914 >            txt += '   job_exit_code=$untar_status\n'
915 >            txt += '   func_exit\n'
916              txt += 'else \n'
917              txt += '   echo "Successful untar" \n'
918              txt += 'fi \n'
919              txt += '\n'
1056            #### Removed ProdAgent API dependencies
920              txt += 'echo ">>> Include ProdCommon in PYTHONPATH:"\n'
921              txt += 'if [ -z "$PYTHONPATH" ]; then\n'
922 <            #### FEDE FOR DBS OUTPUT PUBLICATION
1060 <            txt += '   export PYTHONPATH=$SOFTWARE_DIR/ProdCommon\n'
922 >            txt += '   export PYTHONPATH=$RUNTIME_AREA/ProdCommon\n'
923              txt += 'else\n'
924 <            txt += '   export PYTHONPATH=$SOFTWARE_DIR/ProdCommon:${PYTHONPATH}\n'
924 >            txt += '   export PYTHONPATH=$RUNTIME_AREA/ProdCommon:${PYTHONPATH}\n'
925              txt += 'echo "PYTHONPATH=$PYTHONPATH"\n'
1064            ###################
926              txt += 'fi\n'
927              txt += '\n'
928  
# Line 1069 | Line 930 | class Cmssw(JobType):
930  
931          return txt
932  
933 +    def wsBuildExe(self, nj=0):
934 +        """
935 +        Put in the script the commands to build an executable
936 +        or a library.
937 +        """
938 +
939 +        txt = '\n#Written by cms_cmssw::wsBuildExe\n'
940 +        txt += 'echo ">>> moving CMSSW software directories in `pwd`" \n'
941 +
942 +        txt += 'rm -r lib/ module/ \n'
943 +        txt += 'mv $RUNTIME_AREA/lib/ . \n'
944 +        txt += 'mv $RUNTIME_AREA/module/ . \n'
945 +        txt += 'mv $RUNTIME_AREA/ProdCommon/ . \n'
946 +
947 +        txt += 'if [ -z "$PYTHONPATH" ]; then\n'
948 +        txt += '   export PYTHONPATH=$SOFTWARE_DIR/ProdCommon\n'
949 +        txt += 'else\n'
950 +        txt += '   export PYTHONPATH=$SOFTWARE_DIR/ProdCommon:${PYTHONPATH}\n'
951 +        txt += 'echo "PYTHONPATH=$PYTHONPATH"\n'
952 +        txt += 'fi\n'
953 +        txt += '\n'
954 +
955 +        return txt
956 +
957      def modifySteeringCards(self, nj):
958          """
959          modify the card provided by the user,
# Line 1082 | Line 967 | class Cmssw(JobType):
967              return self.executable
968  
969      def executableArgs(self):
970 +        # FUTURE: This function tests the CMSSW version. Can be simplified as we drop support for old versions
971          if self.scriptExe:#CarlosDaniele
972              return   self.scriptExe + " $NJob"
973          else:
1088            # if >= CMSSW_1_5_X, add -j crab_fjr.xml
974              version_array = self.scram.getSWVersion().split('_')
975              major = 0
976              minor = 0
# Line 1095 | Line 980 | class Cmssw(JobType):
980              except:
981                  msg = "Cannot parse CMSSW version string: " + "_".join(version_array) + " for major and minor release number!"
982                  raise CrabException(msg)
983 +
984 +            ex_args = ""
985 +            # FUTURE: This tests the CMSSW version. Can remove code as versions deprecated
986 +            # Framework job report
987              if major >= 1 and minor >= 5 :
988 <                return " -j " + self.fjrFileName + " -p pset.cfg"
988 >                ex_args += " -j $RUNTIME_AREA/crab_fjr_$NJob.xml"
989 >            # Type of cfg file
990 >            if major >= 2 :
991 >                ex_args += " -p pset.py"
992              else:
993 <                return " -p pset.cfg"
993 >                ex_args += " -p pset.cfg"
994 >            return ex_args
995  
996      def inputSandbox(self, nj):
997          """
# Line 1118 | Line 1011 | class Cmssw(JobType):
1011          ## additional input files
1012          tgz = self.additionalInputFileTgz()
1013          inp_box.append(tgz)
1014 +        ## executable
1015 +        wrapper = os.path.basename(str(common._db.queryTask('scriptName')))
1016 +        inp_box.append(common.work_space.pathForTgz() +'job/'+ wrapper)
1017          return inp_box
1018  
1019      def outputSandbox(self, nj):
# Line 1143 | Line 1039 | class Cmssw(JobType):
1039          Returns part of a job script which renames the produced files.
1040          """
1041  
1042 <        txt = '\n'
1042 >        txt = '\n#Written by cms_cmssw::wsRenameOutput\n'
1043          txt += 'echo ">>> current directory (SOFTWARE_DIR): $SOFTWARE_DIR" \n'
1044          txt += 'echo ">>> current directory content:"\n'
1045          txt += 'ls \n'
1046          txt += '\n'
1047  
1152        txt += 'output_exit_status=0\n'
1153
1154        for fileWithSuffix in (self.output_file_sandbox):
1155            output_file_num = self.numberFile_(fileWithSuffix, '$NJob')
1156            txt += '\n'
1157            txt += '# check output file\n'
1158            txt += 'if [ -e ./'+fileWithSuffix+' ] ; then\n'
1159            txt += '    mv '+fileWithSuffix+' $RUNTIME_AREA/'+output_file_num+'\n'
1160            txt += '    ln -s $RUNTIME_AREA/'+output_file_num+' $RUNTIME_AREA/'+fileWithSuffix+'\n'
1161            txt += 'else\n'
1162            txt += '    exit_status=60302\n'
1163            txt += '    echo "ERROR: Output file '+fileWithSuffix+' not found"\n'
1164            if common.scheduler.boss_scheduler_name == 'condor_g':
1165                txt += '    if [ $middleware == OSG ]; then \n'
1166                txt += '        echo "prepare dummy output file"\n'
1167                txt += '        echo "Processing of job output failed" > $RUNTIME_AREA/'+output_file_num+'\n'
1168                txt += '    fi \n'
1169            txt += 'fi\n'
1170
1048          for fileWithSuffix in (self.output_file):
1049              output_file_num = self.numberFile_(fileWithSuffix, '$NJob')
1050              txt += '\n'
# Line 1180 | Line 1057 | class Cmssw(JobType):
1057                  txt += '    mv '+fileWithSuffix+' $RUNTIME_AREA/'+output_file_num+'\n'
1058                  txt += '    ln -s $RUNTIME_AREA/'+output_file_num+' $RUNTIME_AREA/'+fileWithSuffix+'\n'
1059              txt += 'else\n'
1060 <            txt += '    exit_status=60302\n'
1061 <            txt += '    echo "ERROR: Output file '+fileWithSuffix+' not found"\n'
1062 <            txt += '    echo "JOB_EXIT_STATUS = $exit_status"\n'
1186 <            txt += '    output_exit_status=$exit_status\n'
1187 <            if common.scheduler.boss_scheduler_name == 'condor_g':
1060 >            txt += '    job_exit_code=60302\n'
1061 >            txt += '    echo "WARNING: Output file '+fileWithSuffix+' not found"\n'
1062 >            if common.scheduler.name().upper() == 'CONDOR_G':
1063                  txt += '    if [ $middleware == OSG ]; then \n'
1064                  txt += '        echo "prepare dummy output file"\n'
1065                  txt += '        echo "Processing of job output failed" > $RUNTIME_AREA/'+output_file_num+'\n'
# Line 1239 | Line 1114 | class Cmssw(JobType):
1114                   '", other.GlueHostApplicationSoftwareRunTimeEnvironment)'
1115  
1116          req = req + ' && (other.GlueHostNetworkAdapterOutboundIP)'
1117 +        if common.scheduler.name() == "glitecoll":
1118 +            req += ' && other.GlueCEStateStatus == "Production" '
1119  
1120          return req
1121  
# Line 1251 | Line 1128 | class Cmssw(JobType):
1128          Returns part of a job script which is prepares
1129          the execution environment and which is common for all CMS jobs.
1130          """
1131 <        txt = '    echo ">>> setup CMS OSG environment:"\n'
1131 >        txt = '\n#Written by cms_cmssw::wsSetupCMSOSGEnvironment_\n'
1132 >        txt += '    echo ">>> setup CMS OSG environment:"\n'
1133          txt += '    echo "set SCRAM ARCH to ' + self.executable_arch + '"\n'
1134          txt += '    export SCRAM_ARCH='+self.executable_arch+'\n'
1135          txt += '    echo "SCRAM_ARCH = $SCRAM_ARCH"\n'
# Line 1259 | Line 1137 | class Cmssw(JobType):
1137          txt += '      # Use $OSG_APP/cmssoft/cms/cmsset_default.sh to setup cms software\n'
1138          txt += '        source $OSG_APP/cmssoft/cms/cmsset_default.sh '+self.version+'\n'
1139          txt += '    else\n'
1140 <        txt += '        echo "SET_CMS_ENV 10020 ==> ERROR $OSG_APP/cmssoft/cms/cmsset_default.sh file not found"\n'
1141 <        txt += '        echo "JOB_EXIT_STATUS = 10020"\n'
1142 <        txt += '        echo "JobExitCode=10020" | tee -a $RUNTIME_AREA/$repo\n'
1265 <        txt += '        dumpStatus $RUNTIME_AREA/$repo\n'
1266 <        txt += '\n'
1267 <        txt += '        cd $RUNTIME_AREA\n'
1268 <        txt += '        echo ">>> current directory (RUNTIME_AREA): $RUNTIME_AREA"\n'
1269 <        txt += '        echo ">>> Remove working directory: $WORKING_DIR"\n'
1270 <        txt += '        /bin/rm -rf $WORKING_DIR\n'
1271 <        txt += '        if [ -d $WORKING_DIR ] ;then\n'
1272 <        txt += '            echo "SET_CMS_ENV 10017 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after $OSG_APP/cmssoft/cms/cmsset_default.sh file not found"\n'
1273 <        txt += '            echo "JOB_EXIT_STATUS = 10017"\n'
1274 <        txt += '            echo "JobExitCode=10017" | tee -a $RUNTIME_AREA/$repo\n'
1275 <        txt += '            dumpStatus $RUNTIME_AREA/$repo\n'
1276 <        txt += '        fi\n'
1277 <        txt += '\n'
1278 <        txt += '        exit 1\n'
1140 >        txt += '        echo "ERROR ==> $OSG_APP/cmssoft/cms/cmsset_default.sh file not found"\n'
1141 >        txt += '        job_exit_code=10020\n'
1142 >        txt += '        func_exit\n'
1143          txt += '    fi\n'
1144          txt += '\n'
1145 <        txt += '    echo "SET_CMS_ENV 0 ==> setup cms environment ok"\n'
1145 >        txt += '    echo "==> setup cms environment ok"\n'
1146          txt += '    echo "SCRAM_ARCH = $SCRAM_ARCH"\n'
1147  
1148          return txt
# Line 1289 | Line 1153 | class Cmssw(JobType):
1153          Returns part of a job script which is prepares
1154          the execution environment and which is common for all CMS jobs.
1155          """
1156 <        txt = '    echo ">>> setup CMS LCG environment:"\n'
1156 >        txt = '\n#Written by cms_cmssw::wsSetupCMSLCGEnvironment_\n'
1157 >        txt += '    echo ">>> setup CMS LCG environment:"\n'
1158          txt += '    echo "set SCRAM ARCH and BUILD_ARCH to ' + self.executable_arch + ' ###"\n'
1159          txt += '    export SCRAM_ARCH='+self.executable_arch+'\n'
1160          txt += '    export BUILD_ARCH='+self.executable_arch+'\n'
1161          txt += '    if [ ! $VO_CMS_SW_DIR ] ;then\n'
1162 <        txt += '        echo "SET_CMS_ENV 10031 ==> ERROR CMS software dir not found on WN `hostname`"\n'
1163 <        txt += '        echo "JOB_EXIT_STATUS = 10031" \n'
1164 <        txt += '        echo "JobExitCode=10031" | tee -a $RUNTIME_AREA/$repo\n'
1300 <        txt += '        dumpStatus $RUNTIME_AREA/$repo\n'
1301 <        txt += '        exit 1\n'
1162 >        txt += '        echo "ERROR ==> CMS software dir not found on WN `hostname`"\n'
1163 >        txt += '        job_exit_code=10031\n'
1164 >        txt += '        func_exit\n'
1165          txt += '    else\n'
1166          txt += '        echo "Sourcing environment... "\n'
1167          txt += '        if [ ! -s $VO_CMS_SW_DIR/cmsset_default.sh ] ;then\n'
1168 <        txt += '            echo "SET_CMS_ENV 10020 ==> ERROR cmsset_default.sh file not found into dir $VO_CMS_SW_DIR"\n'
1169 <        txt += '            echo "JOB_EXIT_STATUS = 10020"\n'
1170 <        txt += '            echo "JobExitCode=10020" | tee -a $RUNTIME_AREA/$repo\n'
1308 <        txt += '            dumpStatus $RUNTIME_AREA/$repo\n'
1309 <        txt += '            exit 1\n'
1168 >        txt += '            echo "ERROR ==> cmsset_default.sh file not found into dir $VO_CMS_SW_DIR"\n'
1169 >        txt += '            job_exit_code=10020\n'
1170 >        txt += '            func_exit\n'
1171          txt += '        fi\n'
1172          txt += '        echo "sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
1173          txt += '        source $VO_CMS_SW_DIR/cmsset_default.sh\n'
1174          txt += '        result=$?\n'
1175          txt += '        if [ $result -ne 0 ]; then\n'
1176 <        txt += '            echo "SET_CMS_ENV 10032 ==> ERROR problem sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
1177 <        txt += '            echo "JOB_EXIT_STATUS = 10032"\n'
1178 <        txt += '            echo "JobExitCode=10032" | tee -a $RUNTIME_AREA/$repo\n'
1318 <        txt += '            dumpStatus $RUNTIME_AREA/$repo\n'
1319 <        txt += '            exit 1\n'
1176 >        txt += '            echo "ERROR ==> problem sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
1177 >        txt += '            job_exit_code=10032\n'
1178 >        txt += '            func_exit\n'
1179          txt += '        fi\n'
1180          txt += '    fi\n'
1181          txt += '    \n'
1182 <        txt += '    echo "SET_CMS_ENV 0 ==> setup cms environment ok"\n'
1182 >        txt += '    echo "==> setup cms environment ok"\n'
1183          return txt
1184  
1185      ### FEDE FOR DBS OUTPUT PUBLICATION
# Line 1329 | Line 1188 | class Cmssw(JobType):
1188          insert the part of the script that modifies the FrameworkJob Report
1189          """
1190  
1191 <        txt = ''
1192 <        try:
1334 <            publish_data = int(self.cfg_params['USER.publish_data'])
1335 <        except KeyError:
1336 <            publish_data = 0
1191 >        txt = '\n#Written by cms_cmssw::modifyReport\n'
1192 >        publish_data = int(self.cfg_params.get('USER.publish_data',0))
1193          if (publish_data == 1):
1194 +            processedDataset = self.cfg_params['USER.publish_data_name']
1195 +            LFNBaseName = LFNBase(processedDataset)
1196 +
1197 +            txt += 'if [ $copy_exit_status -eq 0 ]; then\n'
1198 +            txt += '    FOR_LFN=%s_${PSETHASH}/\n'%(LFNBaseName)
1199 +            txt += 'else\n'
1200 +            txt += '    FOR_LFN=/copy_problems/ \n'
1201 +            txt += '    SE=""\n'
1202 +            txt += '    SE_PATH=""\n'
1203 +            txt += 'fi\n'
1204 +            
1205              txt += 'echo ">>> Modify Job Report:" \n'
1339            ################ FEDE FOR DBS2 #############################################
1340            #txt += 'chmod a+x $SOFTWARE_DIR/ProdAgentApi/FwkJobRep/ModifyJobReport.py\n'
1206              txt += 'chmod a+x $SOFTWARE_DIR/ProdCommon/ProdCommon/FwkJobRep/ModifyJobReport.py\n'
1342            #############################################################################
1343
1344            txt += 'if [ -z "$SE" ]; then\n'
1345            txt += '    SE="" \n'
1346            txt += 'fi \n'
1347            txt += 'if [ -z "$SE_PATH" ]; then\n'
1348            txt += '    SE_PATH="" \n'
1349            txt += 'fi \n'
1350            txt += 'echo "SE = $SE"\n'
1351            txt += 'echo "SE_PATH = $SE_PATH"\n'
1352
1353            processedDataset = self.cfg_params['USER.publish_data_name']
1207              txt += 'ProcessedDataset='+processedDataset+'\n'
1355            #### LFN=/store/user/<user>/processedDataset_PSETHASH
1356            txt += 'if [ "$SE_PATH" == "" ]; then\n'
1357            #### FEDE: added slash in LFN ##############
1358            txt += '    FOR_LFN=/copy_problems/ \n'
1359            txt += 'else \n'
1360            txt += '    tmp=`echo $SE_PATH | awk -F \'store\' \'{print$2}\'` \n'
1361            #####  FEDE TO BE CHANGED, BECAUSE STORE IS HARDCODED!!!! ########
1362            txt += '    FOR_LFN=/store$tmp \n'
1363            txt += 'fi \n'
1208              txt += 'echo "ProcessedDataset = $ProcessedDataset"\n'
1209 +            txt += 'echo "SE = $SE"\n'
1210 +            txt += 'echo "SE_PATH = $SE_PATH"\n'
1211              txt += 'echo "FOR_LFN = $FOR_LFN" \n'
1212              txt += 'echo "CMSSW_VERSION = $CMSSW_VERSION"\n\n'
1213 <            #txt += 'echo "$SOFTWARE_DIR/ProdAgentApi/FwkJobRep/ModifyJobReport.py crab_fjr_$NJob.xml $NJob $FOR_LFN $PrimaryDataset $DataTier $ProcessedDataset $ApplicationFamily $executable $CMSSW_VERSION $PSETHASH $SE $SE_PATH"\n'
1214 <            #txt += '$SOFTWARE_DIR/ProdAgentApi/FwkJobRep/ModifyJobReport.py crab_fjr_$NJob.xml $NJob $FOR_LFN $PrimaryDataset $DataTier $ProcessedDataset $ApplicationFamily $executable $CMSSW_VERSION $PSETHASH $SE $SE_PATH\n'
1369 <            txt += 'echo "$SOFTWARE_DIR/ProdCommon/ProdCommon/FwkJobRep/ModifyJobReport.py crab_fjr_$NJob.xml $NJob $FOR_LFN $PrimaryDataset $DataTier $ProcessedDataset $ApplicationFamily $executable $CMSSW_VERSION $PSETHASH $SE $SE_PATH"\n'
1370 <            txt += '$SOFTWARE_DIR/ProdCommon/ProdCommon/FwkJobRep/ModifyJobReport.py crab_fjr_$NJob.xml $NJob $FOR_LFN $PrimaryDataset $DataTier $ProcessedDataset $ApplicationFamily $executable $CMSSW_VERSION $PSETHASH $SE $SE_PATH\n'
1371 <
1213 >            txt += 'echo "$SOFTWARE_DIR/ProdCommon/ProdCommon/FwkJobRep/ModifyJobReport.py $RUNTIME_AREA/crab_fjr_$NJob.xml $NJob $FOR_LFN $PrimaryDataset $DataTier $ProcessedDataset $ApplicationFamily $executable $CMSSW_VERSION $PSETHASH $SE $SE_PATH"\n'
1214 >            txt += '$SOFTWARE_DIR/ProdCommon/ProdCommon/FwkJobRep/ModifyJobReport.py $RUNTIME_AREA/crab_fjr_$NJob.xml $NJob $FOR_LFN $PrimaryDataset $DataTier $ProcessedDataset $ApplicationFamily $executable $CMSSW_VERSION $PSETHASH $SE $SE_PATH\n'
1215              txt += 'modifyReport_result=$?\n'
1373            txt += 'echo modifyReport_result = $modifyReport_result\n'
1216              txt += 'if [ $modifyReport_result -ne 0 ]; then\n'
1217 <            txt += '    exit_status=1\n'
1218 <            txt += '    echo "ERROR: Problem with ModifyJobReport"\n'
1217 >            txt += '    modifyReport_result=70500\n'
1218 >            txt += '    job_exit_code=$modifyReport_result\n'
1219 >            txt += '    echo "ModifyReportResult=$modifyReport_result" | tee -a $RUNTIME_AREA/$repo\n'
1220 >            txt += '    echo "WARNING: Problem with ModifyJobReport"\n'
1221              txt += 'else\n'
1222 <            txt += '    mv NewFrameworkJobReport.xml crab_fjr_$NJob.xml\n'
1222 >            txt += '    mv NewFrameworkJobReport.xml $RUNTIME_AREA/crab_fjr_$NJob.xml\n'
1223              txt += 'fi\n'
1380        else:
1381            txt += 'echo "no data publication required"\n'
1382        return txt
1383
1384    def cleanEnv(self):
1385        txt = ''
1386        txt += 'if [ $middleware == OSG ]; then\n'
1387        txt += '    cd $RUNTIME_AREA\n'
1388        txt += '    echo ">>> current directory (RUNTIME_AREA): $RUNTIME_AREA"\n'
1389        txt += '    echo ">>> Remove working directory: $WORKING_DIR"\n'
1390        txt += '    /bin/rm -rf $WORKING_DIR\n'
1391        txt += '    if [ -d $WORKING_DIR ] ;then\n'
1392        txt += '        echo "SET_EXE 60999 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after cleanup of WN"\n'
1393        txt += '        echo "JOB_EXIT_STATUS = 60999"\n'
1394        txt += '        echo "JobExitCode=60999" | tee -a $RUNTIME_AREA/$repo\n'
1395        txt += '        dumpStatus $RUNTIME_AREA/$repo\n'
1396        txt += '    fi\n'
1397        txt += 'fi\n'
1398        txt += '\n'
1224          return txt
1225  
1226      def setParam_(self, param, value):
# Line 1413 | Line 1238 | class Cmssw(JobType):
1238              nd[e]=0
1239          return nd.keys()
1240  
1241 <
1417 <    def checkOut(self, limit):
1241 >    def outList(self):
1242          """
1243          check the dimension of the output files
1244          """
1245 <        txt = 'echo ">>> Starting output sandbox limit check :"\n'
1246 <        allOutFiles = ""
1245 >        txt = ''
1246 >        txt += 'echo ">>> list of expected files on output sandbox"\n'
1247          listOutFiles = []
1248 <        txt += 'stdoutFile=`ls *stdout` \n'
1249 <        txt += 'stderrFile=`ls *stderr` \n'
1248 >        stdout = 'CMSSW_$NJob.stdout'
1249 >        stderr = 'CMSSW_$NJob.stderr'
1250          if (self.return_data == 1):
1251 <            for fileOut in (self.output_file+self.output_file_sandbox):
1252 <                allOutFiles = allOutFiles + " " + self.numberFile_(fileOut, '$NJob') + " $stdoutFile $stderrFile"
1253 <        else:            
1254 <            for fileOut in (self.output_file_sandbox):
1255 <                txt += 'echo " '+fileOut+'";\n'
1256 <                allOutFiles = allOutFiles + " " + self.numberFile_(fileOut, '$NJob') + " $stdoutFile $stderrFile"
1257 <        txt += 'echo "OUTPUT files: '+str(allOutFiles)+'";\n'
1258 <        txt += 'ls -gGhrta;\n'
1259 <        txt += 'sum=0;\n'
1260 <        txt += 'for file in '+str(allOutFiles)+' ; do\n'
1261 <        txt += '    if [ -e $file ]; then\n'
1262 <        txt += '        tt=`ls -gGrta $file | awk \'{ print $3 }\'`\n'
1439 <        txt += '        sum=`expr $sum + $tt`\n'
1440 <        txt += '    else\n'
1441 <        txt += '        echo "WARNING: output file $file not found!"\n'
1442 <        txt += '    fi\n'
1443 <        txt += 'done\n'
1444 <        txt += 'echo "Total Output dimension: $sum";\n'
1445 <        txt += 'limit='+str(limit)+';\n'
1446 <        txt += 'echo "OUTPUT FILES LIMIT SET TO: $limit";\n'
1447 <        txt += 'if [ $limit -lt $sum ]; then\n'
1448 <        txt += '    echo "WARNING: output files have to big size - something will be lost;"\n'
1449 <        txt += '    echo "         checking the output file sizes..."\n'
1450 <        txt += '    tot=0;\n'
1451 <        txt += '    for filefile in '+str(allOutFiles)+' ; do\n'
1452 <        txt += '        dimFile=`ls -gGrta $filefile | awk \'{ print $3 }\';`\n'
1453 <        txt += '        tot=`expr $tot + $tt`;\n'
1454 <        txt += '        if [ $limit -lt $dimFile ]; then\n'
1455 <        txt += '            echo "deleting file: $filefile";\n'
1456 <        txt += '            rm -f $filefile\n'
1457 <        txt += '        elif [ $limit -lt $tot ]; then\n'
1458 <        txt += '            echo "deleting file: $filefile";\n'
1459 <        txt += '            rm -f $filefile\n'
1460 <        txt += '        else\n'
1461 <        txt += '            echo "saving file: $filefile"\n'
1462 <        txt += '        fi\n'
1463 <        txt += '    done\n'
1464 <
1465 <        txt += '    ls -agGhrt;\n'
1466 <        txt += '    echo "WARNING: output files are too big in dimension: can not put in the output_sandbox.";\n'
1467 <        txt += '    echo "JOB_EXIT_STATUS = 70000";\n'
1468 <        txt += '    exit_status=70000;\n'
1469 <        txt += 'else'
1470 <        txt += '    echo "Total Output dimension $sum is fine.";\n'
1471 <        txt += 'fi\n'
1472 <        txt += 'echo "Ending output sandbox limit check"\n'
1251 >            for file in (self.output_file+self.output_file_sandbox):
1252 >                listOutFiles.append(self.numberFile_(file, '$NJob'))
1253 >            listOutFiles.append(stdout)
1254 >            listOutFiles.append(stderr)
1255 >        else:
1256 >            for file in (self.output_file_sandbox):
1257 >                listOutFiles.append(self.numberFile_(file, '$NJob'))
1258 >            listOutFiles.append(stdout)
1259 >            listOutFiles.append(stderr)
1260 >        txt += 'echo "output files: '+string.join(listOutFiles,' ')+'"\n'
1261 >        txt += 'filesToCheck="'+string.join(listOutFiles,' ')+'"\n'
1262 >        txt += 'export filesToCheck\n'
1263          return txt

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines