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.157 by spiga, Sun Feb 17 20:13:00 2008 UTC vs.
Revision 1.205 by slacapra, Thu Jun 5 16:34:04 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 33 | Line 34 | class Cmssw(JobType):
34          self.executable = ''
35          self.executable_arch = self.scram.getArch()
36          self.tgz_name = 'default.tgz'
36        self.additional_tgz_name = 'additional.tgz'
37          self.scriptName = 'CMSSW.sh'
38 <        self.pset = ''      #scrip use case Da
39 <        self.datasetPath = '' #scrip use case Da
38 >        self.pset = ''
39 >        self.datasetPath = ''
40  
41          # set FJR file name
42          self.fjrFileName = 'crab_fjr.xml'
43  
44          self.version = self.scram.getSWVersion()
45 <
46 <        #
47 <        # Try to block creation in case of arch/version mismatch
48 <        #
49 <
50 <        a = string.split(self.version, "_")
51 <
52 <        if int(a[1]) == 1 and (int(a[2]) < 5 and self.executable_arch.find('slc4') == 0):
53 <            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)
54 <            common.logger.message(msg)
55 <        if int(a[1]) == 1 and (int(a[2]) >= 5 and self.executable_arch.find('slc3') == 0):
56 <            msg = "Error: CMS does not support %s with %s architecture"%(self.version, self.executable_arch)
45 >        version_array = self.version.split('_')
46 >        self.CMSSW_major = 0
47 >        self.CMSSW_minor = 0
48 >        self.CMSSW_patch = 0
49 >        try:
50 >            self.CMSSW_major = int(version_array[1])
51 >            self.CMSSW_minor = int(version_array[2])
52 >            self.CMSSW_patch = int(version_array[3])
53 >        except:
54 >            msg = "Cannot parse CMSSW version string: " + self.version + " for major and minor release number!"
55              raise CrabException(msg)
56  
59        common.taskDB.setDict('codeVersion',self.version)
60        self.setParam_('application', self.version)
61
57          ### collect Data cards
58  
59          if not cfg_params.has_key('CMSSW.datasetpath'):
# Line 73 | Line 68 | class Cmssw(JobType):
68              self.datasetPath = tmp
69              self.selectNoInput = 0
70  
76        # ML monitoring
77        # split dataset path style: /PreProdR3Minbias/SIM/GEN-SIM
78        if not self.datasetPath:
79            self.setParam_('dataset', 'None')
80            self.setParam_('owner', 'None')
81        else:
82            ## SL what is supposed to fail here?
83            try:
84                datasetpath_split = self.datasetPath.split("/")
85                # standard style
86                self.setParam_('datasetFull', self.datasetPath)
87                self.setParam_('dataset', datasetpath_split[1])
88                self.setParam_('owner', datasetpath_split[2])
89            except:
90                self.setParam_('dataset', self.datasetPath)
91                self.setParam_('owner', self.datasetPath)
92
93        self.setParam_('taskId', common.taskDB.dict('taskId'))
94
71          self.dataTiers = []
72 <
72 >        self.debugWrap = ''
73 >        self.debug_wrapper = cfg_params.get('USER.debug_wrapper',False)
74 >        if self.debug_wrapper: self.debugWrap='--debug'
75          ## now the application
76          self.executable = cfg_params.get('CMSSW.executable','cmsRun')
99        self.setParam_('exe', self.executable)
77          log.debug(6, "CMSSW::CMSSW(): executable = "+self.executable)
78  
79          if not cfg_params.has_key('CMSSW.pset'):
# Line 133 | Line 110 | class Cmssw(JobType):
110          # script_exe file as additional file in inputSandbox
111          self.scriptExe = cfg_params.get('USER.script_exe',None)
112          if self.scriptExe :
113 <           if not os.path.isfile(self.scriptExe):
114 <              msg ="ERROR. file "+self.scriptExe+" not found"
115 <              raise CrabException(msg)
116 <           self.additional_inbox_files.append(string.strip(self.scriptExe))
113 >            if not os.path.isfile(self.scriptExe):
114 >                msg ="ERROR. file "+self.scriptExe+" not found"
115 >                raise CrabException(msg)
116 >            self.additional_inbox_files.append(string.strip(self.scriptExe))
117  
141        #CarlosDaniele
118          if self.datasetPath == None and self.pset == None and self.scriptExe == '' :
119 <           msg ="Error. script_exe  not defined"
120 <           raise CrabException(msg)
119 >            msg ="Error. script_exe  not defined"
120 >            raise CrabException(msg)
121 >
122 >        # use parent files...
123 >        self.useParent = self.cfg_params.get('CMSSW.use_parent',False)
124  
125          ## additional input files
126          if cfg_params.has_key('USER.additional_input_files'):
# Line 161 | Line 140 | class Cmssw(JobType):
140                      if not os.path.exists(file):
141                          raise CrabException("Additional input file not found: "+file)
142                      pass
164                    # fname = string.split(file, '/')[-1]
165                    # storedFile = common.work_space.pathForTgz()+'share/'+fname
166                    # shutil.copyfile(file, storedFile)
143                      self.additional_inbox_files.append(string.strip(file))
144                  pass
145              pass
# Line 189 | Line 165 | class Cmssw(JobType):
165          if cfg_params.has_key('CMSSW.total_number_of_events'):
166              self.total_number_of_events = int(cfg_params['CMSSW.total_number_of_events'])
167              self.selectTotalNumberEvents = 1
168 +            if self.selectNumberOfJobs  == 1:
169 +                if (self.total_number_of_events != -1) and int(self.total_number_of_events) < int(self.theNumberOfJobs):
170 +                    msg = 'Must specify at least one event per job. total_number_of_events > number_of_jobs '
171 +                    raise CrabException(msg)
172          else:
173              self.total_number_of_events = 0
174              self.selectTotalNumberEvents = 0
175  
176 <        if self.pset != None: #CarlosDaniele
176 >        if self.pset != None:
177               if ( (self.selectTotalNumberEvents + self.selectEventsPerJob + self.selectNumberOfJobs) != 2 ):
178                   msg = 'Must define exactly two of total_number_of_events, events_per_job, or number_of_jobs.'
179                   raise CrabException(msg)
# Line 202 | Line 182 | class Cmssw(JobType):
182                   msg = 'Must specify  number_of_jobs.'
183                   raise CrabException(msg)
184  
185 <        ## source seed for pythia
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 +            self.incrementSeeds.append('theSource')
207  
208          self.sourceSeedVtx = cfg_params.get('CMSSW.vtx_seed',None)
209 +        if self.sourceSeedVtx:
210 +            print "vtx_seed is a deprecated parameter. Use preserve_seeds or increment_seeds in the future.\n","Added to increment_seeds."
211 +            self.incrementSeeds.append('VtxSmeared')
212  
213          self.sourceSeedG4 = cfg_params.get('CMSSW.g4_seed',None)
214 +        if self.sourceSeedG4:
215 +            print "g4_seed is a deprecated parameter. Use preserve_seeds or increment_seeds in the future.\n","Added to increment_seeds."
216 +            self.incrementSeeds.append('g4SimHits')
217  
218          self.sourceSeedMix = cfg_params.get('CMSSW.mix_seed',None)
219 +        if self.sourceSeedMix:
220 +            print "mix_seed is a deprecated parameter. Use preserve_seeds or increment_seeds in the future.\n","Added to increment_seeds."
221 +            self.incrementSeeds.append('mix')
222  
223          self.firstRun = cfg_params.get('CMSSW.first_run',None)
224  
# Line 234 | Line 243 | class Cmssw(JobType):
243              blockSites = self.DataDiscoveryAndLocation(cfg_params)
244          #DBSDLS-end
245  
237        self.tgzNameWithPath = self.getTarBall(self.executable)
246  
247          ## Select Splitting
248          if self.selectNoInput:
249 <            if self.pset == None: #CarlosDaniele
249 >            if self.pset == None:
250                  self.jobSplittingForScript()
251              else:
252                  self.jobSplittingNoInput()
# Line 246 | Line 254 | class Cmssw(JobType):
254              self.jobSplittingByBlocks(blockSites)
255  
256          # modify Pset
257 <        if self.pset != None: #CarlosDaniele
257 >        if self.pset != None:
258              try:
259 <                if (self.datasetPath): # standard job
260 <                    # allow to processa a fraction of events in a file
261 <                    PsetEdit.inputModule("INPUTFILE")
262 <                    PsetEdit.maxEvent(0)
255 <                    PsetEdit.skipEvent(0)
256 <                else:  # pythia like job
257 <                    PsetEdit.maxEvent(self.eventsPerJob)
258 <                    if (self.firstRun):
259 <                        PsetEdit.pythiaFirstRun(0)  #First Run
260 <                    if (self.sourceSeed) :
261 <                        PsetEdit.pythiaSeed(0)
262 <                        if (self.sourceSeedVtx) :
263 <                            PsetEdit.vtxSeed(0)
264 <                        if (self.sourceSeedG4) :
265 <                            PsetEdit.g4Seed(0)
266 <                        if (self.sourceSeedMix) :
267 <                            PsetEdit.mixSeed(0)
268 <                # add FrameworkJobReport to parameter-set
269 <                PsetEdit.addCrabFJR(self.fjrFileName)
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) # FUTURE: Job report addition not needed by CMSSW>1.5
262 >                PsetEdit.maxEvent(self.eventsPerJob)
263                  PsetEdit.psetWriter(self.configFilename())
264              except:
265 <                msg='Error while manipuliating ParameterSet: exiting...'
265 >                msg='Error while manipulating ParameterSet: exiting...'
266                  raise CrabException(msg)
267 +        self.tgzNameWithPath = self.getTarBall(self.executable)
268  
269      def DataDiscoveryAndLocation(self, cfg_params):
270  
# Line 299 | Line 293 | class Cmssw(JobType):
293          self.filesbyblock=self.pubdata.getFiles()
294          self.eventsbyblock=self.pubdata.getEventsPerBlock()
295          self.eventsbyfile=self.pubdata.getEventsPerFile()
296 +        self.parentFiles=self.pubdata.getParent()
297  
298          ## get max number of events
299 <        self.maxEvents=self.pubdata.getMaxEvents() ##  self.maxEvents used in Creator.py
299 >        self.maxEvents=self.pubdata.getMaxEvents()
300  
301          ## Contact the DLS and build a list of sites hosting the fileblocks
302          try:
# Line 325 | Line 320 | class Cmssw(JobType):
320  
321          return sites
322  
328    def setArgsList(self, argsList):
329        self.argsList = argsList
330
323      def jobSplittingByBlocks(self, blockSites):
324          """
325          Perform job splitting. Jobs run over an integer number of files
# Line 378 | Line 370 | class Cmssw(JobType):
370          else :
371              totalNumberOfJobs = self.ncjobs
372  
381
373          blocks = blockSites.keys()
374          blockCount = 0
375          # Backup variable in case self.maxEvents counted events in a non-included block
# Line 419 | Line 410 | class Cmssw(JobType):
410  
411                  # ---- Iterate over the files in the block until we've met the requested ---- #
412                  # ---- total # of events or we've gone over all the files in this block  ---- #
413 +                pString=''
414                  while ( (eventsRemaining > 0) and (fileCount < numFilesInBlock) and (jobCount < totalNumberOfJobs) ):
415                      file = files[fileCount]
416 +                    if self.useParent:
417 +                        parent = self.parentFiles[file]
418 +                        for f in parent :
419 +                            pString += '\\\"' + f + '\\\"\,'
420 +                        common.logger.debug(6, "File "+str(file)+" has the following parents: "+str(parent))
421 +                        common.logger.write("File "+str(file)+" has the following parents: "+str(parent))
422                      if newFile :
423                          try:
424                              numEventsInFile = self.eventsbyfile[file]
# Line 433 | Line 431 | class Cmssw(JobType):
431                          except KeyError:
432                              common.logger.message("File "+str(file)+" has unknown number of events: skipping")
433  
434 <
434 >                    eventsPerJobRequested = min(eventsPerJobRequested, eventsRemaining)
435                      # if less events in file remain than eventsPerJobRequested
436 <                    if ( filesEventCount - jobSkipEventCount < eventsPerJobRequested ) :
436 >                    if ( filesEventCount - jobSkipEventCount < eventsPerJobRequested):
437                          # if last file in block
438                          if ( fileCount == numFilesInBlock-1 ) :
439                              # end job using last file, use remaining events in block
440                              # close job and touch new file
441                              fullString = parString[:-2]
442 <                            list_of_lists.append([fullString,str(-1),str(jobSkipEventCount)])
442 >                            if self.useParent:
443 >                                fullParentString = pString[:-2]
444 >                                list_of_lists.append([fullString,fullParentString,str(-1),str(jobSkipEventCount)])
445 >                            else:
446 >                                list_of_lists.append([fullString,str(-1),str(jobSkipEventCount)])
447                              common.logger.debug(3,"Job "+str(jobCount+1)+" can run over "+str(filesEventCount - jobSkipEventCount)+" events (last file in block).")
448                              self.jobDestination.append(blockSites[block])
449                              common.logger.debug(5,"Job "+str(jobCount+1)+" Destination: "+str(self.jobDestination[jobCount]))
# Line 453 | Line 455 | class Cmssw(JobType):
455                              eventsRemaining = eventsRemaining - filesEventCount + jobSkipEventCount
456                              jobSkipEventCount = 0
457                              # reset file
458 +                            pString = ""
459                              parString = ""
460                              filesEventCount = 0
461                              newFile = 1
# Line 465 | Line 468 | class Cmssw(JobType):
468                      elif ( filesEventCount - jobSkipEventCount == eventsPerJobRequested ) :
469                          # close job and touch new file
470                          fullString = parString[:-2]
471 <                        list_of_lists.append([fullString,str(eventsPerJobRequested),str(jobSkipEventCount)])
471 >                        if self.useParent:
472 >                            fullParentString = pString[:-2]
473 >                            list_of_lists.append([fullString,fullParentString,str(eventsPerJobRequested),str(jobSkipEventCount)])
474 >                        else:
475 >                            list_of_lists.append([fullString,str(eventsPerJobRequested),str(jobSkipEventCount)])
476                          common.logger.debug(3,"Job "+str(jobCount+1)+" can run over "+str(eventsPerJobRequested)+" events.")
477                          self.jobDestination.append(blockSites[block])
478                          common.logger.debug(5,"Job "+str(jobCount+1)+" Destination: "+str(self.jobDestination[jobCount]))
# Line 476 | Line 483 | class Cmssw(JobType):
483                          eventsRemaining = eventsRemaining - eventsPerJobRequested
484                          jobSkipEventCount = 0
485                          # reset file
486 +                        pString = ""
487                          parString = ""
488                          filesEventCount = 0
489                          newFile = 1
# Line 485 | Line 493 | class Cmssw(JobType):
493                      else :
494                          # close job but don't touch new file
495                          fullString = parString[:-2]
496 <                        list_of_lists.append([fullString,str(eventsPerJobRequested),str(jobSkipEventCount)])
496 >                        if self.useParent:
497 >                            fullParentString = pString[:-2]
498 >                            list_of_lists.append([fullString,fullParentString,str(eventsPerJobRequested),str(jobSkipEventCount)])
499 >                        else:
500 >                            list_of_lists.append([fullString,str(eventsPerJobRequested),str(jobSkipEventCount)])
501                          common.logger.debug(3,"Job "+str(jobCount+1)+" can run over "+str(eventsPerJobRequested)+" events.")
502                          self.jobDestination.append(blockSites[block])
503                          common.logger.debug(5,"Job "+str(jobCount+1)+" Destination: "+str(self.jobDestination[jobCount]))
# Line 499 | Line 511 | class Cmssw(JobType):
511                          jobSkipEventCount = eventsPerJobRequested - (filesEventCount - jobSkipEventCount - self.eventsbyfile[file])
512                          # remove all but the last file
513                          filesEventCount = self.eventsbyfile[file]
514 <                        parString = ""
515 <                        parString += '\\\"' + file + '\\\"\,'
514 >                        if self.useParent:
515 >                            for f in parent : pString += '\\\"' + f + '\\\"\,'
516 >                        parString = '\\\"' + file + '\\\"\,'
517                      pass # END if
518                  pass # END while (iterate over files in the block)
519          pass # END while (iterate over blocks in the dataset)
# Line 520 | Line 533 | class Cmssw(JobType):
533          for block in blocks:
534              if block in jobsOfBlock.keys() :
535                  blockCounter += 1
536 <                screenOutput += "Block %5i: jobs %20s: sites: %s\n" % (blockCounter,spanRanges(jobsOfBlock[block]),','.join(self.blackWhiteListParser.checkWhiteList(self.blackWhiteListParser.checkBlackList(blockSites[block],block),block)))
536 >                screenOutput += "Block %5i: jobs %20s: sites: %s\n" % (blockCounter,spanRanges(jobsOfBlock[block]),
537 >                    ','.join(self.blackWhiteListParser.checkWhiteList(self.blackWhiteListParser.checkBlackList(blockSites[block],block),block)))
538                  if len(self.blackWhiteListParser.checkWhiteList(self.blackWhiteListParser.checkBlackList(blockSites[block],block),block)) == 0:
539                      noSiteBlock.append( spanRanges(jobsOfBlock[block]) )
540                      bloskNoSite.append( blockCounter )
# Line 602 | Line 616 | class Cmssw(JobType):
616              if (self.firstRun):
617                  ## pythia first run
618                  args.append(str(self.firstRun)+str(i))
605            if (self.sourceSeed):
606                args.append(str(self.sourceSeed)+str(i))
607                if (self.sourceSeedVtx):
608                    ## + vtx random seed
609                    args.append(str(self.sourceSeedVtx)+str(i))
610                if (self.sourceSeedG4):
611                    ## + G4 random seed
612                    args.append(str(self.sourceSeedG4)+str(i))
613                if (self.sourceSeedMix):
614                    ## + Mix random seed
615                    args.append(str(self.sourceSeedMix)+str(i))
616                pass
617            pass
619              self.list_of_args.append(args)
619        pass
620  
621          return
622  
623  
624 <    def jobSplittingForScript(self):#CarlosDaniele
624 >    def jobSplittingForScript(self):
625          """
626          Perform job splitting based on number of job
627          """
# Line 637 | Line 637 | class Cmssw(JobType):
637          # argument is seed number.$i
638          self.list_of_args = []
639          for i in range(self.total_number_of_jobs):
640            ## Since there is no input, any site is good
641           # self.jobDestination.append(["Any"])
640              self.jobDestination.append([""])
643            ## no random seed
641              self.list_of_args.append([str(i)])
642          return
643  
644      def split(self, jobParams):
645  
649        common.jobDB.load()
650        #### Fabio
646          njobs = self.total_number_of_jobs
647          arglist = self.list_of_args
648          # create the empty structure
649          for i in range(njobs):
650              jobParams.append("")
651  
652 +        listID=[]
653 +        listField=[]
654          for job in range(njobs):
655              jobParams[job] = arglist[job]
656 <            # print str(arglist[job])
657 <            # print jobParams[job]
658 <            common.jobDB.setArguments(job, jobParams[job])
659 <            common.logger.debug(5,"Job "+str(job)+" Destination: "+str(self.jobDestination[job]))
660 <            common.jobDB.setDestination(job, self.jobDestination[job])
656 >            listID.append(job+1)
657 >            job_ToSave ={}
658 >            concString = ' '
659 >            argu=''
660 >            if len(jobParams[job]):
661 >                argu +=   concString.join(jobParams[job] )
662 >            job_ToSave['arguments']= str(job+1)+' '+argu
663 >            job_ToSave['dlsDestination']= self.jobDestination[job]
664 >            listField.append(job_ToSave)
665 >            msg="Job "+str(job)+" Arguments:   "+str(job+1)+" "+argu+"\n"  \
666 >            +"                     Destination: "+str(self.jobDestination[job])
667 >            common.logger.debug(5,msg)
668 >        common._db.updateJob_(listID,listField)
669 >        self.argsList = (len(jobParams[0])+1)
670  
665        common.jobDB.save()
671          return
672  
668    def getJobTypeArguments(self, nj, sched):
669        result = ''
670        for i in common.jobDB.arguments(nj):
671            result=result+str(i)+" "
672        return result
673
673      def numberOfJobs(self):
675        # Fabio
674          return self.total_number_of_jobs
675  
676      def getTarBall(self, exe):
677          """
678          Return the TarBall with lib and exe
679          """
682
683        # if it exist, just return it
684        #
685        # Marco. Let's start to use relative path for Boss XML files
686        #
680          self.tgzNameWithPath = common.work_space.pathForTgz()+'share/'+self.tgz_name
681          if os.path.exists(self.tgzNameWithPath):
682              return self.tgzNameWithPath
# Line 697 | Line 690 | class Cmssw(JobType):
690  
691          # First of all declare the user Scram area
692          swArea = self.scram.getSWArea_()
700        #print "swArea = ", swArea
701        # swVersion = self.scram.getSWVersion()
702        # print "swVersion = ", swVersion
693          swReleaseTop = self.scram.getReleaseTop_()
704        #print "swReleaseTop = ", swReleaseTop
694  
695          ## check if working area is release top
696          if swReleaseTop == '' or swArea == swReleaseTop:
697 +            common.logger.debug(3,"swArea = "+swArea+" swReleaseTop ="+swReleaseTop)
698              return
699  
700          import tarfile
# Line 747 | Line 737 | class Cmssw(JobType):
737  
738              ## Now check if any data dir(s) is present
739              swAreaLen=len(swArea)
740 +            self.dataExist = False
741              for root, dirs, files in os.walk(swArea):
742                  if "data" in dirs:
743 +                    self.dataExist=True
744                      common.logger.debug(5,"data "+root+"/data"+" to be tarred")
745                      tar.add(root+"/data",root[swAreaLen:]+"/data")
746  
747 <            ### Removed ProdAgent Api dependencies ###
748 <            ### Add ProdAgent dir to tar
749 <            #paDir = 'ProdAgentApi'
750 <            #pa = os.environ['CRABDIR'] + '/' + 'ProdAgentApi'
751 <            #if os.path.isdir(pa):
752 <            #    tar.add(pa,paDir)
747 >            ### CMSSW ParameterSet
748 >            if not self.pset is None:
749 >                cfg_file = common.work_space.jobDir()+self.configFilename()
750 >                tar.add(cfg_file,self.configFilename())
751 >                common.logger.debug(5,"File added to "+self.tgzNameWithPath+" : "+str(tar.getnames()))
752 >
753  
754              ## Add ProdCommon dir to tar
755              prodcommonDir = 'ProdCommon'
756 <            prodcommonPath = os.environ['CRABDIR'] + '/' + 'ProdCommon'
756 >            prodcommonPath = os.environ['CRABDIR'] + '/' + 'external/'
757              if os.path.isdir(prodcommonPath):
758                  tar.add(prodcommonPath,prodcommonDir)
759 +            common.logger.debug(5,"Files added to "+self.tgzNameWithPath+" : "+str(tar.getnames()))
760 +
761 +            ##### ML stuff
762 +            ML_file_list=['report.py', 'DashboardAPI.py', 'Logger.py', 'ProcInfo.py', 'apmon.py']
763 +            path=os.environ['CRABDIR'] + '/python/'
764 +            for file in ML_file_list:
765 +                tar.add(path+file,file)
766 +            common.logger.debug(5,"Files added to "+self.tgzNameWithPath+" : "+str(tar.getnames()))
767  
768 +            ##### Utils
769 +            Utils_file_list=['parseCrabFjr.py','writeCfg.py', 'fillCrabFjr.py']
770 +            for file in Utils_file_list:
771 +                tar.add(path+file,file)
772              common.logger.debug(5,"Files added to "+self.tgzNameWithPath+" : "+str(tar.getnames()))
773 +
774 +            ##### AdditionalFiles
775 +            for file in self.additional_inbox_files:
776 +                tar.add(file,string.split(file,'/')[-1])
777 +            common.logger.debug(5,"Files added to "+self.tgzNameWithPath+" : "+str(tar.getnames()))
778 +
779              tar.close()
780          except :
781              raise CrabException('Could not create tar-ball')
# Line 776 | Line 786 | class Cmssw(JobType):
786              raise CrabException('Input sandbox size of ' + str(float(tarballinfo.st_size)/1024.0/1024.0) + ' MB is larger than the allowed ' + str(self.MaxTarBallSize) + ' MB input sandbox limit and not supported by the used GRID submission system. Please make sure that no unnecessary files are in all data directories in your local CMSSW project area as they are automatically packed into the input sandbox.')
787  
788          ## create tar-ball with ML stuff
779        self.MLtgzfile =  common.work_space.pathForTgz()+'share/MLfiles.tgz'
780        try:
781            tar = tarfile.open(self.MLtgzfile, "w:gz")
782            path=os.environ['CRABDIR'] + '/python/'
783            for file in ['report.py', 'DashboardAPI.py', 'Logger.py', 'ProcInfo.py', 'apmon.py', 'parseCrabFjr.py']:
784                tar.add(path+file,file)
785            common.logger.debug(5,"Files added to "+self.MLtgzfile+" : "+str(tar.getnames()))
786            tar.close()
787        except :
788            raise CrabException('Could not create ML files tar-ball')
789
790        return
789  
790 <    def additionalInputFileTgz(self):
793 <        """
794 <        Put all additional files into a tar ball and return its name
795 <        """
796 <        import tarfile
797 <        tarName=  common.work_space.pathForTgz()+'share/'+self.additional_tgz_name
798 <        tar = tarfile.open(tarName, "w:gz")
799 <        for file in self.additional_inbox_files:
800 <            tar.add(file,string.split(file,'/')[-1])
801 <        common.logger.debug(5,"Files added to "+self.additional_tgz_name+" : "+str(tar.getnames()))
802 <        tar.close()
803 <        return tarName
804 <
805 <    def wsSetupEnvironment(self, nj):
790 >    def wsSetupEnvironment(self, nj=0):
791          """
792          Returns part of a job script which prepares
793          the execution environment for the job 'nj'.
794          """
795 +        if (self.CMSSW_major >= 2 and self.CMSSW_minor >= 1) or (self.CMSSW_major >= 3):
796 +            psetName = 'pset.py'
797 +        else:
798 +            psetName = 'pset.cfg'
799          # Prepare JobType-independent part
800 <        txt = ''
800 >        txt = '\n#Written by cms_cmssw::wsSetupEnvironment\n'
801          txt += 'echo ">>> setup environment"\n'
802          txt += 'if [ $middleware == LCG ]; then \n'
803          txt += self.wsSetupCMSLCGEnvironment_()
804          txt += 'elif [ $middleware == OSG ]; then\n'
805          txt += '    WORKING_DIR=`/bin/mktemp  -d $OSG_WN_TMP/cms_XXXXXXXXXXXX`\n'
806          txt += '    if [ ! $? == 0 ] ;then\n'
807 <        txt += '        echo "SET_CMS_ENV 10016 ==> OSG $WORKING_DIR could not be created on WN `hostname`"\n'
808 <        txt += '        echo "JOB_EXIT_STATUS = 10016"\n'
809 <        txt += '        echo "JobExitCode=10016" | tee -a $RUNTIME_AREA/$repo\n'
821 <        txt += '        dumpStatus $RUNTIME_AREA/$repo\n'
822 <        txt += '        exit 1\n'
807 >        txt += '        echo "ERROR ==> OSG $WORKING_DIR could not be created on WN `hostname`"\n'
808 >        txt += '        job_exit_code=10016\n'
809 >        txt += '        func_exit\n'
810          txt += '    fi\n'
811          txt += '    echo ">>> Created working directory: $WORKING_DIR"\n'
812          txt += '\n'
# Line 827 | Line 814 | class Cmssw(JobType):
814          txt += '    cd $WORKING_DIR\n'
815          txt += '    echo ">>> current directory (WORKING_DIR): $WORKING_DIR"\n'
816          txt += self.wsSetupCMSOSGEnvironment_()
830        #txt += '    echo "### Set SCRAM ARCH to ' + self.executable_arch + ' ###"\n'
831        #txt += '    export SCRAM_ARCH='+self.executable_arch+'\n'
817          txt += 'fi\n'
818  
819          # Prepare JobType-specific part
# Line 839 | Line 824 | class Cmssw(JobType):
824          txt += scram+' project CMSSW '+self.version+'\n'
825          txt += 'status=$?\n'
826          txt += 'if [ $status != 0 ] ; then\n'
827 <        txt += '    echo "SET_EXE_ENV 10034 ==>ERROR CMSSW '+self.version+' not found on `hostname`" \n'
828 <        txt += '    echo "JOB_EXIT_STATUS = 10034"\n'
829 <        txt += '    echo "JobExitCode=10034" | tee -a $RUNTIME_AREA/$repo\n'
845 <        txt += '    dumpStatus $RUNTIME_AREA/$repo\n'
846 <        txt += '    if [ $middleware == OSG ]; then \n'
847 <        txt += '        cd $RUNTIME_AREA\n'
848 <        txt += '        echo ">>> current directory (RUNTIME_AREA): $RUNTIME_AREA"\n'
849 <        txt += '        echo ">>> Remove working directory: $WORKING_DIR"\n'
850 <        txt += '        /bin/rm -rf $WORKING_DIR\n'
851 <        txt += '        if [ -d $WORKING_DIR ] ;then\n'
852 <        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'
853 <        txt += '            echo "JOB_EXIT_STATUS = 10018"\n'
854 <        txt += '            echo "JobExitCode=10018" | tee -a $RUNTIME_AREA/$repo\n'
855 <        txt += '            dumpStatus $RUNTIME_AREA/$repo\n'
856 <        txt += '        fi\n'
857 <        txt += '    fi \n'
858 <        txt += '    exit 1 \n'
827 >        txt += '    echo "ERROR ==> CMSSW '+self.version+' not found on `hostname`" \n'
828 >        txt += '    job_exit_code=10034\n'
829 >        txt += '    func_exit\n'
830          txt += 'fi \n'
831          txt += 'cd '+self.version+'\n'
861        ########## FEDE FOR DBS2 ######################
832          txt += 'SOFTWARE_DIR=`pwd`\n'
833          txt += 'echo ">>> current directory (SOFTWARE_DIR): $SOFTWARE_DIR" \n'
864        ###############################################
865        ### needed grep for bug in scramv1 ###
834          txt += 'eval `'+scram+' runtime -sh | grep -v SCRAMRT_LSB_JOBNAME`\n'
835 +        txt += 'if [ $? != 0 ] ; then\n'
836 +        txt += '    echo "ERROR ==> Problem with the command: "\n'
837 +        txt += '    echo "eval \`'+scram+' runtime -sh | grep -v SCRAMRT_LSB_JOBNAME \` at `hostname`"\n'
838 +        txt += '    job_exit_code=10034\n'
839 +        txt += '    func_exit\n'
840 +        txt += 'fi \n'
841          # Handle the arguments:
842          txt += "\n"
843          txt += "## number of arguments (first argument always jobnumber)\n"
844          txt += "\n"
845 <        txt += "if [ $nargs -lt "+str(len(self.argsList[nj].split()))+" ]\n"
845 >        txt += "if [ $nargs -lt "+str(self.argsList)+" ]\n"
846          txt += "then\n"
847 <        txt += "    echo 'SET_EXE_ENV 1 ==> ERROR Too few arguments' +$nargs+ \n"
848 <        txt += '    echo "JOB_EXIT_STATUS = 50113"\n'
849 <        txt += '    echo "JobExitCode=50113" | tee -a $RUNTIME_AREA/$repo\n'
876 <        txt += '    dumpStatus $RUNTIME_AREA/$repo\n'
877 <        txt += '    if [ $middleware == OSG ]; then \n'
878 <        txt += '        cd $RUNTIME_AREA\n'
879 <        txt += '        echo ">>> current directory (RUNTIME_AREA): $RUNTIME_AREA"\n'
880 <        txt += '        echo ">>> Remove working directory: $WORKING_DIR"\n'
881 <        txt += '        /bin/rm -rf $WORKING_DIR\n'
882 <        txt += '        if [ -d $WORKING_DIR ] ;then\n'
883 <        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'
884 <        txt += '            echo "JOB_EXIT_STATUS = 50114"\n'
885 <        txt += '            echo "JobExitCode=50114" | tee -a $RUNTIME_AREA/$repo\n'
886 <        txt += '            dumpStatus $RUNTIME_AREA/$repo\n'
887 <        txt += '        fi\n'
888 <        txt += '    fi \n'
889 <        txt += "    exit 1\n"
847 >        txt += "    echo 'ERROR ==> Too few arguments' +$nargs+ \n"
848 >        txt += '    job_exit_code=50113\n'
849 >        txt += "    func_exit\n"
850          txt += "fi\n"
851          txt += "\n"
852  
853          # Prepare job-specific part
854          job = common.job_list[nj]
895        ### FEDE FOR DBS OUTPUT PUBLICATION
855          if (self.datasetPath):
856              txt += '\n'
857              txt += 'DatasetPath='+self.datasetPath+'\n'
# Line 908 | Line 867 | class Cmssw(JobType):
867              txt += 'PrimaryDataset=null\n'
868              txt += 'DataTier=null\n'
869              txt += 'ApplicationFamily=MCDataTier\n'
870 <        if self.pset != None: #CarlosDaniele
870 >        if self.pset != None:
871              pset = os.path.basename(job.configFilename())
872              txt += '\n'
873              txt += 'cp  $RUNTIME_AREA/'+pset+' .\n'
874              if (self.datasetPath): # standard job
875 <                txt += 'InputFiles=${args[1]}\n'
876 <                txt += 'MaxEvents=${args[2]}\n'
877 <                txt += 'SkipEvents=${args[3]}\n'
875 >                txt += 'InputFiles=${args[1]}; export InputFiles\n'
876 >                if (self.useParent):  
877 >                    txt += 'ParentFiles=${args[2]}; export ParentFiles\n'
878 >                    txt += 'MaxEvents=${args[3]}; export MaxEvents\n'
879 >                    txt += 'SkipEvents=${args[4]}; export SkipEvents\n'
880 >                else:
881 >                    txt += 'MaxEvents=${args[2]}; export MaxEvents\n'
882 >                    txt += 'SkipEvents=${args[3]}; export SkipEvents\n'
883                  txt += 'echo "Inputfiles:<$InputFiles>"\n'
884 <                txt += 'sed "s#\'INPUTFILE\'#$InputFiles#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
884 >                if (self.useParent): txt += 'echo "ParentFiles:<$ParentFiles>"\n'
885                  txt += 'echo "MaxEvents:<$MaxEvents>"\n'
922                txt += 'sed "s#int32 input = 0#int32 input = $MaxEvents#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
886                  txt += 'echo "SkipEvents:<$SkipEvents>"\n'
924                txt += 'sed "s#uint32 skipEvents = 0#uint32 skipEvents = $SkipEvents#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
887              else:  # pythia like job
888 <                seedIndex=1
888 >                txt += 'PreserveSeeds='  + ','.join(self.preserveSeeds)  + '; export PreserveSeeds\n'
889 >                txt += 'IncrementSeeds=' + ','.join(self.incrementSeeds) + '; export IncrementSeeds\n'
890 >                txt += 'echo "PreserveSeeds: <$PreserveSeeds>"\n'
891 >                txt += 'echo "IncrementSeeds:<$IncrementSeeds>"\n'
892                  if (self.firstRun):
893 <                    txt += 'FirstRun=${args['+str(seedIndex)+']}\n'
893 >                    txt += 'FirstRun=${args[1]}; export FirstRun\n'
894                      txt += 'echo "FirstRun: <$FirstRun>"\n'
930                    txt += 'sed "s#uint32 firstRun = 0#uint32 firstRun = $FirstRun#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
931                    seedIndex=seedIndex+1
895  
896 <                if (self.sourceSeed):
934 <                    txt += 'Seed=${args['+str(seedIndex)+']}\n'
935 <                    txt += 'sed "s#uint32 sourceSeed = 0#uint32 sourceSeed = $Seed#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
936 <                    seedIndex=seedIndex+1
937 <                    ## the following seeds are not always present
938 <                    if (self.sourceSeedVtx):
939 <                        txt += 'VtxSeed=${args['+str(seedIndex)+']}\n'
940 <                        txt += 'echo "VtxSeed: <$VtxSeed>"\n'
941 <                        txt += 'sed "s#uint32 VtxSmeared = 0#uint32 VtxSmeared = $VtxSeed#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
942 <                        seedIndex += 1
943 <                    if (self.sourceSeedG4):
944 <                        txt += 'G4Seed=${args['+str(seedIndex)+']}\n'
945 <                        txt += 'echo "G4Seed: <$G4Seed>"\n'
946 <                        txt += 'sed "s#uint32 g4SimHits = 0#uint32 g4SimHits = $G4Seed#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
947 <                        seedIndex += 1
948 <                    if (self.sourceSeedMix):
949 <                        txt += 'mixSeed=${args['+str(seedIndex)+']}\n'
950 <                        txt += 'echo "MixSeed: <$mixSeed>"\n'
951 <                        txt += 'sed "s#uint32 mix = 0#uint32 mix = $mixSeed#" '+pset+' > tmp && mv -f tmp '+pset+'\n'
952 <                        seedIndex += 1
953 <                    pass
954 <                pass
955 <            txt += 'mv -f '+pset+' pset.cfg\n'
896 >            txt += 'mv -f ' + pset + ' ' + psetName + '\n'
897  
957        if len(self.additional_inbox_files) > 0:
958            txt += 'if [ -e $RUNTIME_AREA/'+self.additional_tgz_name+' ] ; then\n'
959            txt += '  tar xzvf $RUNTIME_AREA/'+self.additional_tgz_name+'\n'
960            txt += 'fi\n'
961            pass
898  
899 <        if self.pset != None: #CarlosDaniele
900 <            txt += '\n'
965 <            txt += 'echo "***** cat pset.cfg *********"\n'
966 <            txt += 'cat pset.cfg\n'
967 <            txt += 'echo "****** end pset.cfg ********"\n'
899 >        if self.pset != None:
900 >            # FUTURE: Can simply for 2_1_x and higher
901              txt += '\n'
902 <            ### FEDE FOR DBS OUTPUT PUBLICATION
903 <            txt += 'PSETHASH=`EdmConfigHash < pset.cfg` \n'
902 >            if self.debug_wrapper==True:
903 >                txt += 'echo "***** cat ' + psetName + ' *********"\n'
904 >                txt += 'cat ' + psetName + '\n'
905 >                txt += 'echo "****** end ' + psetName + ' ********"\n'
906 >                txt += '\n'
907 >            txt += 'PSETHASH=`edmConfigHash < ' + psetName + '` \n'
908              txt += 'echo "PSETHASH = $PSETHASH" \n'
972            ##############
909              txt += '\n'
910          return txt
911  
912 <    def wsBuildExe(self, nj=0):
912 >    def wsUntarSoftware(self, nj=0):
913          """
914          Put in the script the commands to build an executable
915          or a library.
916          """
917  
918 <        txt = ""
918 >        txt = '\n#Written by cms_cmssw::wsUntarSoftware\n'
919  
920          if os.path.isfile(self.tgzNameWithPath):
921              txt += 'echo ">>> tar xzvf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+' :" \n'
922              txt += 'tar xzvf $RUNTIME_AREA/'+os.path.basename(self.tgzNameWithPath)+'\n'
923 +            if  self.debug_wrapper:
924 +                txt += 'ls -Al \n'
925              txt += 'untar_status=$? \n'
926              txt += 'if [ $untar_status -ne 0 ]; then \n'
927 <            txt += '   echo "SET_EXE 1 ==> ERROR Untarring .tgz file failed"\n'
928 <            txt += '   echo "JOB_EXIT_STATUS = $untar_status" \n'
929 <            txt += '   echo "JobExitCode=$untar_status" | tee -a $RUNTIME_AREA/$repo\n'
992 <            txt += '   if [ $middleware == OSG ]; then \n'
993 <            txt += '       cd $RUNTIME_AREA\n'
994 <            txt += '        echo ">>> current directory (RUNTIME_AREA): $RUNTIME_AREA"\n'
995 <            txt += '        echo ">>> Remove working directory: $WORKING_DIR"\n'
996 <            txt += '       /bin/rm -rf $WORKING_DIR\n'
997 <            txt += '       if [ -d $WORKING_DIR ] ;then\n'
998 <            txt += '           echo "SET_EXE 50999 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after Untarring .tgz file failed"\n'
999 <            txt += '           echo "JOB_EXIT_STATUS = 50999"\n'
1000 <            txt += '           echo "JobExitCode=50999" | tee -a $RUNTIME_AREA/$repo\n'
1001 <            txt += '           dumpStatus $RUNTIME_AREA/$repo\n'
1002 <            txt += '       fi\n'
1003 <            txt += '   fi \n'
1004 <            txt += '   \n'
1005 <            txt += '   exit 1 \n'
927 >            txt += '   echo "ERROR ==> Untarring .tgz file failed"\n'
928 >            txt += '   job_exit_code=$untar_status\n'
929 >            txt += '   func_exit\n'
930              txt += 'else \n'
931              txt += '   echo "Successful untar" \n'
932              txt += 'fi \n'
933              txt += '\n'
1010            #### Removed ProdAgent API dependencies
934              txt += 'echo ">>> Include ProdCommon in PYTHONPATH:"\n'
935              txt += 'if [ -z "$PYTHONPATH" ]; then\n'
936 <            #### FEDE FOR DBS OUTPUT PUBLICATION
1014 <            txt += '   export PYTHONPATH=$SOFTWARE_DIR/ProdCommon\n'
936 >            txt += '   export PYTHONPATH=$RUNTIME_AREA/ProdCommon\n'
937              txt += 'else\n'
938 <            txt += '   export PYTHONPATH=$SOFTWARE_DIR/ProdCommon:${PYTHONPATH}\n'
938 >            txt += '   export PYTHONPATH=$RUNTIME_AREA/ProdCommon:${PYTHONPATH}\n'
939              txt += 'echo "PYTHONPATH=$PYTHONPATH"\n'
1018            ###################
940              txt += 'fi\n'
941              txt += '\n'
942  
# Line 1023 | Line 944 | class Cmssw(JobType):
944  
945          return txt
946  
947 +    def wsBuildExe(self, nj=0):
948 +        """
949 +        Put in the script the commands to build an executable
950 +        or a library.
951 +        """
952 +
953 +        txt = '\n#Written by cms_cmssw::wsBuildExe\n'
954 +        txt += 'echo ">>> moving CMSSW software directories in `pwd`" \n'
955 +
956 +        txt += 'rm -r lib/ module/ \n'
957 +        txt += 'mv $RUNTIME_AREA/lib/ . \n'
958 +        txt += 'mv $RUNTIME_AREA/module/ . \n'
959 +        if self.dataExist == True:
960 +            txt += 'rm -r src/ \n'
961 +            txt += 'mv $RUNTIME_AREA/src/ . \n'
962 +        if len(self.additional_inbox_files)>0:
963 +            for file in self.additional_inbox_files:
964 +                txt += 'mv $RUNTIME_AREA/'+os.path.basename(file)+' . \n'
965 +        txt += 'mv $RUNTIME_AREA/ProdCommon/ . \n'
966 +
967 +        txt += 'if [ -z "$PYTHONPATH" ]; then\n'
968 +        txt += '   export PYTHONPATH=$SOFTWARE_DIR/ProdCommon\n'
969 +        txt += 'else\n'
970 +        txt += '   export PYTHONPATH=$SOFTWARE_DIR/ProdCommon:${PYTHONPATH}\n'
971 +        txt += 'echo "PYTHONPATH=$PYTHONPATH"\n'
972 +        txt += 'fi\n'
973 +        txt += '\n'
974 +
975 +        return txt
976 +
977      def modifySteeringCards(self, nj):
978          """
979          modify the card provided by the user,
# Line 1030 | Line 981 | class Cmssw(JobType):
981          """
982  
983      def executableName(self):
984 <        if self.scriptExe: #CarlosDaniele
984 >        if self.scriptExe:
985              return "sh "
986          else:
987              return self.executable
988  
989      def executableArgs(self):
990 +        # FUTURE: This function tests the CMSSW version. Can be simplified as we drop support for old versions
991          if self.scriptExe:#CarlosDaniele
992              return   self.scriptExe + " $NJob"
993          else:
994 <            # if >= CMSSW_1_5_X, add -j crab_fjr.xml
995 <            version_array = self.scram.getSWVersion().split('_')
996 <            major = 0
997 <            minor = 0
998 <            try:
999 <                major = int(version_array[1])
1000 <                minor = int(version_array[2])
1001 <            except:
1050 <                msg = "Cannot parse CMSSW version string: " + "_".join(version_array) + " for major and minor release number!"
1051 <                raise CrabException(msg)
1052 <            if major >= 1 and minor >= 5 :
1053 <                return " -j " + self.fjrFileName + " -p pset.cfg"
994 >            ex_args = ""
995 >            # FUTURE: This tests the CMSSW version. Can remove code as versions deprecated
996 >            # Framework job report
997 >            if (self.CMSSW_major >= 1 and self.CMSSW_minor >= 5) or (self.CMSSW_major >= 2):
998 >                ex_args += " -j $RUNTIME_AREA/crab_fjr_$NJob.xml"
999 >            # Type of config file
1000 >            if self.CMSSW_major >= 2 :
1001 >                ex_args += " -p pset.py"
1002              else:
1003 <                return " -p pset.cfg"
1003 >                ex_args += " -p pset.cfg"
1004 >            return ex_args
1005  
1006      def inputSandbox(self, nj):
1007          """
1008          Returns a list of filenames to be put in JDL input sandbox.
1009          """
1010          inp_box = []
1062        # # dict added to delete duplicate from input sandbox file list
1063        # seen = {}
1064        ## code
1011          if os.path.isfile(self.tgzNameWithPath):
1012              inp_box.append(self.tgzNameWithPath)
1013 <        if os.path.isfile(self.MLtgzfile):
1014 <            inp_box.append(self.MLtgzfile)
1069 <        ## config
1070 <        if not self.pset is None:
1071 <            inp_box.append(common.work_space.pathForTgz() + 'job/' + self.configFilename())
1072 <        ## additional input files
1073 <        tgz = self.additionalInputFileTgz()
1074 <        inp_box.append(tgz)
1013 >        wrapper = os.path.basename(str(common._db.queryTask('scriptName')))
1014 >        inp_box.append(common.work_space.pathForTgz() +'job/'+ wrapper)
1015          return inp_box
1016  
1017      def outputSandbox(self, nj):
# Line 1097 | Line 1037 | class Cmssw(JobType):
1037          Returns part of a job script which renames the produced files.
1038          """
1039  
1040 <        txt = '\n'
1040 >        txt = '\n#Written by cms_cmssw::wsRenameOutput\n'
1041          txt += 'echo ">>> current directory (SOFTWARE_DIR): $SOFTWARE_DIR" \n'
1042          txt += 'echo ">>> current directory content:"\n'
1043 <        txt += 'ls \n'
1043 >        if self.debug_wrapper:
1044 >            txt += 'ls -Al\n'
1045          txt += '\n'
1046  
1106        txt += 'output_exit_status=0\n'
1107
1108        for fileWithSuffix in (self.output_file_sandbox):
1109            output_file_num = self.numberFile_(fileWithSuffix, '$NJob')
1110            txt += '\n'
1111            txt += '# check output file\n'
1112            txt += 'if [ -e ./'+fileWithSuffix+' ] ; then\n'
1113            txt += '    mv '+fileWithSuffix+' $RUNTIME_AREA/'+output_file_num+'\n'
1114            txt += '    ln -s $RUNTIME_AREA/'+output_file_num+' $RUNTIME_AREA/'+fileWithSuffix+'\n'
1115            txt += 'else\n'
1116            txt += '    exit_status=60302\n'
1117            txt += '    echo "ERROR: Output file '+fileWithSuffix+' not found"\n'
1118            if common.scheduler.name().upper() == 'CONDOR_G':
1119                txt += '    if [ $middleware == OSG ]; then \n'
1120                txt += '        echo "prepare dummy output file"\n'
1121                txt += '        echo "Processing of job output failed" > $RUNTIME_AREA/'+output_file_num+'\n'
1122                txt += '    fi \n'
1123            txt += 'fi\n'
1124
1047          for fileWithSuffix in (self.output_file):
1048              output_file_num = self.numberFile_(fileWithSuffix, '$NJob')
1049              txt += '\n'
# Line 1129 | Line 1051 | class Cmssw(JobType):
1051              txt += 'if [ -e ./'+fileWithSuffix+' ] ; then\n'
1052              if (self.copy_data == 1):  # For OSG nodes, file is in $WORKING_DIR, should not be moved to $RUNTIME_AREA
1053                  txt += '    mv '+fileWithSuffix+' '+output_file_num+'\n'
1054 <                txt += '    ln -s `pwd`/'+output_file_num+' $RUNTIME_AREA/'+fileWithSuffix+'\n'
1054 >                #txt += '    ln -s `pwd`/'+output_file_num+' $RUNTIME_AREA/'+fileWithSuffix+'\n'
1055              else:
1056                  txt += '    mv '+fileWithSuffix+' $RUNTIME_AREA/'+output_file_num+'\n'
1057                  txt += '    ln -s $RUNTIME_AREA/'+output_file_num+' $RUNTIME_AREA/'+fileWithSuffix+'\n'
1058              txt += 'else\n'
1059 <            txt += '    exit_status=60302\n'
1060 <            txt += '    echo "ERROR: Output file '+fileWithSuffix+' not found"\n'
1139 <            txt += '    echo "JOB_EXIT_STATUS = $exit_status"\n'
1140 <            txt += '    output_exit_status=$exit_status\n'
1059 >            txt += '    job_exit_code=60302\n'
1060 >            txt += '    echo "WARNING: Output file '+fileWithSuffix+' not found"\n'
1061              if common.scheduler.name().upper() == 'CONDOR_G':
1062                  txt += '    if [ $middleware == OSG ]; then \n'
1063                  txt += '        echo "prepare dummy output file"\n'
# Line 1152 | Line 1072 | class Cmssw(JobType):
1072          txt += '\n'
1073          txt += 'echo ">>> current directory (SOFTWARE_DIR): $SOFTWARE_DIR" \n'
1074          txt += 'echo ">>> current directory content:"\n'
1075 <        txt += 'ls \n'
1075 >        if self.debug_wrapper:
1076 >            txt += 'ls -Al\n'
1077          txt += '\n'
1078          txt += 'cd $RUNTIME_AREA\n'
1079          txt += 'echo ">>> current directory (RUNTIME_AREA):  $RUNTIME_AREA"\n'
# Line 1185 | Line 1106 | class Cmssw(JobType):
1106              req='Member("VO-cms-' + \
1107                   self.version + \
1108                   '", other.GlueHostApplicationSoftwareRunTimeEnvironment)'
1109 <        ## SL add requirement for OS version only if SL4
1189 <        #reSL4 = re.compile( r'slc4' )
1190 <        if self.executable_arch: # and reSL4.search(self.executable_arch):
1109 >        if self.executable_arch:
1110              req+=' && Member("VO-cms-' + \
1111                   self.executable_arch + \
1112                   '", other.GlueHostApplicationSoftwareRunTimeEnvironment)'
1113  
1114          req = req + ' && (other.GlueHostNetworkAdapterOutboundIP)'
1115 +        if common.scheduler.name() == "glitecoll":
1116 +            req += ' && other.GlueCEStateStatus == "Production" '
1117  
1118          return req
1119  
1120      def configFilename(self):
1121          """ return the config filename """
1122 <        return self.name()+'.cfg'
1122 >        # FUTURE: Can remove cfg mode for CMSSW >= 2_1_x
1123 >        if (self.CMSSW_major >= 2 and self.CMSSW_minor >= 1) or (self.CMSSW_major >= 3):
1124 >          return self.name()+'.py'
1125 >        else:
1126 >          return self.name()+'.cfg'
1127  
1128      def wsSetupCMSOSGEnvironment_(self):
1129          """
1130          Returns part of a job script which is prepares
1131          the execution environment and which is common for all CMS jobs.
1132          """
1133 <        txt = '    echo ">>> setup CMS OSG environment:"\n'
1133 >        txt = '\n#Written by cms_cmssw::wsSetupCMSOSGEnvironment_\n'
1134 >        txt += '    echo ">>> setup CMS OSG environment:"\n'
1135          txt += '    echo "set SCRAM ARCH to ' + self.executable_arch + '"\n'
1136          txt += '    export SCRAM_ARCH='+self.executable_arch+'\n'
1137          txt += '    echo "SCRAM_ARCH = $SCRAM_ARCH"\n'
# Line 1213 | Line 1139 | class Cmssw(JobType):
1139          txt += '      # Use $OSG_APP/cmssoft/cms/cmsset_default.sh to setup cms software\n'
1140          txt += '        source $OSG_APP/cmssoft/cms/cmsset_default.sh '+self.version+'\n'
1141          txt += '    else\n'
1142 <        txt += '        echo "SET_CMS_ENV 10020 ==> ERROR $OSG_APP/cmssoft/cms/cmsset_default.sh file not found"\n'
1143 <        txt += '        echo "JOB_EXIT_STATUS = 10020"\n'
1144 <        txt += '        echo "JobExitCode=10020" | tee -a $RUNTIME_AREA/$repo\n'
1219 <        txt += '        dumpStatus $RUNTIME_AREA/$repo\n'
1220 <        txt += '\n'
1221 <        txt += '        cd $RUNTIME_AREA\n'
1222 <        txt += '        echo ">>> current directory (RUNTIME_AREA): $RUNTIME_AREA"\n'
1223 <        txt += '        echo ">>> Remove working directory: $WORKING_DIR"\n'
1224 <        txt += '        /bin/rm -rf $WORKING_DIR\n'
1225 <        txt += '        if [ -d $WORKING_DIR ] ;then\n'
1226 <        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'
1227 <        txt += '            echo "JOB_EXIT_STATUS = 10017"\n'
1228 <        txt += '            echo "JobExitCode=10017" | tee -a $RUNTIME_AREA/$repo\n'
1229 <        txt += '            dumpStatus $RUNTIME_AREA/$repo\n'
1230 <        txt += '        fi\n'
1231 <        txt += '\n'
1232 <        txt += '        exit 1\n'
1142 >        txt += '        echo "ERROR ==> $OSG_APP/cmssoft/cms/cmsset_default.sh file not found"\n'
1143 >        txt += '        job_exit_code=10020\n'
1144 >        txt += '        func_exit\n'
1145          txt += '    fi\n'
1146          txt += '\n'
1147 <        txt += '    echo "SET_CMS_ENV 0 ==> setup cms environment ok"\n'
1147 >        txt += '    echo "==> setup cms environment ok"\n'
1148          txt += '    echo "SCRAM_ARCH = $SCRAM_ARCH"\n'
1149  
1150          return txt
1151  
1240    ### OLI_DANIELE
1152      def wsSetupCMSLCGEnvironment_(self):
1153          """
1154          Returns part of a job script which is prepares
1155          the execution environment and which is common for all CMS jobs.
1156          """
1157 <        txt = '    echo ">>> setup CMS LCG environment:"\n'
1157 >        txt = '\n#Written by cms_cmssw::wsSetupCMSLCGEnvironment_\n'
1158 >        txt += '    echo ">>> setup CMS LCG environment:"\n'
1159          txt += '    echo "set SCRAM ARCH and BUILD_ARCH to ' + self.executable_arch + ' ###"\n'
1160          txt += '    export SCRAM_ARCH='+self.executable_arch+'\n'
1161          txt += '    export BUILD_ARCH='+self.executable_arch+'\n'
1162          txt += '    if [ ! $VO_CMS_SW_DIR ] ;then\n'
1163 <        txt += '        echo "SET_CMS_ENV 10031 ==> ERROR CMS software dir not found on WN `hostname`"\n'
1164 <        txt += '        echo "JOB_EXIT_STATUS = 10031" \n'
1165 <        txt += '        echo "JobExitCode=10031" | tee -a $RUNTIME_AREA/$repo\n'
1254 <        txt += '        dumpStatus $RUNTIME_AREA/$repo\n'
1255 <        txt += '        exit 1\n'
1163 >        txt += '        echo "ERROR ==> CMS software dir not found on WN `hostname`"\n'
1164 >        txt += '        job_exit_code=10031\n'
1165 >        txt += '        func_exit\n'
1166          txt += '    else\n'
1167          txt += '        echo "Sourcing environment... "\n'
1168          txt += '        if [ ! -s $VO_CMS_SW_DIR/cmsset_default.sh ] ;then\n'
1169 <        txt += '            echo "SET_CMS_ENV 10020 ==> ERROR cmsset_default.sh file not found into dir $VO_CMS_SW_DIR"\n'
1170 <        txt += '            echo "JOB_EXIT_STATUS = 10020"\n'
1171 <        txt += '            echo "JobExitCode=10020" | tee -a $RUNTIME_AREA/$repo\n'
1262 <        txt += '            dumpStatus $RUNTIME_AREA/$repo\n'
1263 <        txt += '            exit 1\n'
1169 >        txt += '            echo "ERROR ==> cmsset_default.sh file not found into dir $VO_CMS_SW_DIR"\n'
1170 >        txt += '            job_exit_code=10020\n'
1171 >        txt += '            func_exit\n'
1172          txt += '        fi\n'
1173          txt += '        echo "sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
1174          txt += '        source $VO_CMS_SW_DIR/cmsset_default.sh\n'
1175          txt += '        result=$?\n'
1176          txt += '        if [ $result -ne 0 ]; then\n'
1177 <        txt += '            echo "SET_CMS_ENV 10032 ==> ERROR problem sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
1178 <        txt += '            echo "JOB_EXIT_STATUS = 10032"\n'
1179 <        txt += '            echo "JobExitCode=10032" | tee -a $RUNTIME_AREA/$repo\n'
1272 <        txt += '            dumpStatus $RUNTIME_AREA/$repo\n'
1273 <        txt += '            exit 1\n'
1177 >        txt += '            echo "ERROR ==> problem sourcing $VO_CMS_SW_DIR/cmsset_default.sh"\n'
1178 >        txt += '            job_exit_code=10032\n'
1179 >        txt += '            func_exit\n'
1180          txt += '        fi\n'
1181          txt += '    fi\n'
1182          txt += '    \n'
1183 <        txt += '    echo "SET_CMS_ENV 0 ==> setup cms environment ok"\n'
1183 >        txt += '    echo "==> setup cms environment ok"\n'
1184          return txt
1185  
1280    ### FEDE FOR DBS OUTPUT PUBLICATION
1186      def modifyReport(self, nj):
1187          """
1188          insert the part of the script that modifies the FrameworkJob Report
1189          """
1190 <
1191 <        txt = ''
1287 <        try:
1288 <            publish_data = int(self.cfg_params['USER.publish_data'])
1289 <        except KeyError:
1290 <            publish_data = 0
1190 >        txt = '\n#Written by cms_cmssw::modifyReport\n'
1191 >        publish_data = int(self.cfg_params.get('USER.publish_data',0))
1192          if (publish_data == 1):
1193 <            txt += 'echo ">>> Modify Job Report:" \n'
1194 <            ################ FEDE FOR DBS2 #############################################
1294 <            #txt += 'chmod a+x $SOFTWARE_DIR/ProdAgentApi/FwkJobRep/ModifyJobReport.py\n'
1295 <            txt += 'chmod a+x $SOFTWARE_DIR/ProdCommon/ProdCommon/FwkJobRep/ModifyJobReport.py\n'
1296 <            #############################################################################
1193 >            processedDataset = self.cfg_params['USER.publish_data_name']
1194 >            LFNBaseName = LFNBase(processedDataset)
1195  
1196 <            txt += 'if [ -z "$SE" ]; then\n'
1197 <            txt += '    SE="" \n'
1198 <            txt += 'fi \n'
1199 <            txt += 'if [ -z "$SE_PATH" ]; then\n'
1200 <            txt += '    SE_PATH="" \n'
1201 <            txt += 'fi \n'
1202 <            txt += 'echo "SE = $SE"\n'
1305 <            txt += 'echo "SE_PATH = $SE_PATH"\n'
1196 >            txt += 'if [ $copy_exit_status -eq 0 ]; then\n'
1197 >            txt += '    FOR_LFN=%s_${PSETHASH}/\n'%(LFNBaseName)
1198 >            txt += 'else\n'
1199 >            txt += '    FOR_LFN=/copy_problems/ \n'
1200 >            txt += '    SE=""\n'
1201 >            txt += '    SE_PATH=""\n'
1202 >            txt += 'fi\n'
1203  
1204 <            processedDataset = self.cfg_params['USER.publish_data_name']
1204 >            txt += 'echo ">>> Modify Job Report:" \n'
1205 >            txt += 'chmod a+x $SOFTWARE_DIR/ProdCommon/ProdCommon/FwkJobRep/ModifyJobReport.py\n'
1206              txt += 'ProcessedDataset='+processedDataset+'\n'
1309            #### LFN=/store/user/<user>/processedDataset_PSETHASH
1310            txt += 'if [ "$SE_PATH" == "" ]; then\n'
1311            #### FEDE: added slash in LFN ##############
1312            txt += '    FOR_LFN=/copy_problems/ \n'
1313            txt += 'else \n'
1314            txt += '    tmp=`echo $SE_PATH | awk -F \'store\' \'{print$2}\'` \n'
1315            #####  FEDE TO BE CHANGED, BECAUSE STORE IS HARDCODED!!!! ########
1316            txt += '    FOR_LFN=/store$tmp \n'
1317            txt += 'fi \n'
1207              txt += 'echo "ProcessedDataset = $ProcessedDataset"\n'
1208 +            txt += 'echo "SE = $SE"\n'
1209 +            txt += 'echo "SE_PATH = $SE_PATH"\n'
1210              txt += 'echo "FOR_LFN = $FOR_LFN" \n'
1211              txt += 'echo "CMSSW_VERSION = $CMSSW_VERSION"\n\n'
1212 <            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'
1213 <            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'
1323 <
1212 >            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'
1213 >            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'
1214              txt += 'modifyReport_result=$?\n'
1325            txt += 'echo modifyReport_result = $modifyReport_result\n'
1215              txt += 'if [ $modifyReport_result -ne 0 ]; then\n'
1216 <            txt += '    exit_status=1\n'
1217 <            txt += '    echo "ERROR: Problem with ModifyJobReport"\n'
1216 >            txt += '    modifyReport_result=70500\n'
1217 >            txt += '    job_exit_code=$modifyReport_result\n'
1218 >            txt += '    echo "ModifyReportResult=$modifyReport_result" | tee -a $RUNTIME_AREA/$repo\n'
1219 >            txt += '    echo "WARNING: Problem with ModifyJobReport"\n'
1220              txt += 'else\n'
1221 <            txt += '    mv NewFrameworkJobReport.xml crab_fjr_$NJob.xml\n'
1221 >            txt += '    mv NewFrameworkJobReport.xml $RUNTIME_AREA/crab_fjr_$NJob.xml\n'
1222              txt += 'fi\n'
1332        else:
1333            txt += 'echo "no data publication required"\n'
1223          return txt
1224  
1225 <    def cleanEnv(self):
1226 <        txt = ''
1227 <        txt += 'if [ $middleware == OSG ]; then\n'
1228 <        txt += '    cd $RUNTIME_AREA\n'
1229 <        txt += '    echo ">>> current directory (RUNTIME_AREA): $RUNTIME_AREA"\n'
1230 <        txt += '    echo ">>> Remove working directory: $WORKING_DIR"\n'
1231 <        txt += '    /bin/rm -rf $WORKING_DIR\n'
1232 <        txt += '    if [ -d $WORKING_DIR ] ;then\n'
1233 <        txt += '        echo "SET_EXE 60999 ==> OSG $WORKING_DIR could not be deleted on WN `hostname` after cleanup of WN"\n'
1234 <        txt += '        echo "JOB_EXIT_STATUS = 60999"\n'
1235 <        txt += '        echo "JobExitCode=60999" | tee -a $RUNTIME_AREA/$repo\n'
1236 <        txt += '        dumpStatus $RUNTIME_AREA/$repo\n'
1225 >    def wsParseFJR(self):
1226 >        """
1227 >        Parse the FrameworkJobReport to obtain useful infos
1228 >        """
1229 >        txt = '\n#Written by cms_cmssw::wsParseFJR\n'
1230 >        txt += 'echo ">>> Parse FrameworkJobReport crab_fjr.xml"\n'
1231 >        txt += 'if [ -s $RUNTIME_AREA/crab_fjr_$NJob.xml ]; then\n'
1232 >        txt += '    if [ -s $RUNTIME_AREA/parseCrabFjr.py ]; then\n'
1233 >        txt += '        cmd_out=`python $RUNTIME_AREA/parseCrabFjr.py --input $RUNTIME_AREA/crab_fjr_$NJob.xml --dashboard $MonitorID,$MonitorJobID '+self.debugWrap+'`\n'
1234 >        if self.debug_wrapper :
1235 >            txt += '        echo "Result of parsing the FrameworkJobReport crab_fjr.xml: $cmd_out"\n'
1236 >        txt += '        executable_exit_status=`python $RUNTIME_AREA/parseCrabFjr.py --input $RUNTIME_AREA/crab_fjr_$NJob.xml --exitcode`\n'
1237 >        txt += '        if [ $executable_exit_status -eq 50115 ];then\n'
1238 >        txt += '            echo ">>> crab_fjr.xml contents: "\n'
1239 >        txt += '            cat $RUNTIME_AREA/crab_fjr_NJob.xml\n'
1240 >        txt += '            echo "Wrong FrameworkJobReport --> does not contain useful info. ExitStatus: $executable_exit_status"\n'
1241 >        txt += '        elif [ $executable_exit_status -eq -999 ];then\n'
1242 >        txt += '            echo "ExitStatus from FrameworkJobReport not available. not available. Using exit code of executable from command line."\n'
1243 >        txt += '        else\n'
1244 >        txt += '            echo "Extracted ExitStatus from FrameworkJobReport parsing output: $executable_exit_status"\n'
1245 >        txt += '        fi\n'
1246 >        txt += '    else\n'
1247 >        txt += '        echo "CRAB python script to parse CRAB FrameworkJobReport crab_fjr.xml is not available, using exit code of executable from command line."\n'
1248          txt += '    fi\n'
1249 +          #### Patch to check input data reading for CMSSW16x Hopefully we-ll remove it asap
1250 +
1251 +        if self.datasetPath:
1252 +          # VERIFY PROCESSED DATA
1253 +            txt += '    if [ $executable_exit_status -eq 0 ];then\n'
1254 +            txt += '      echo ">>> Verify list of processed files:"\n'
1255 +            txt += '      echo $InputFiles |tr -d \'\\\\\' |tr \',\' \'\\n\'|tr -d \'"\' > input-files.txt\n'
1256 +            txt += '      python $RUNTIME_AREA/parseCrabFjr.py --input $RUNTIME_AREA/crab_fjr_$NJob.xml --lfn > processed-files.txt\n'
1257 +            txt += '      cat input-files.txt  | sort | uniq > tmp.txt\n'
1258 +            txt += '      mv tmp.txt input-files.txt\n'
1259 +            txt += '      echo "cat input-files.txt"\n'
1260 +            txt += '      echo "----------------------"\n'
1261 +            txt += '      cat input-files.txt\n'
1262 +            txt += '      cat processed-files.txt | sort | uniq > tmp.txt\n'
1263 +            txt += '      mv tmp.txt processed-files.txt\n'
1264 +            txt += '      echo "----------------------"\n'
1265 +            txt += '      echo "cat processed-files.txt"\n'
1266 +            txt += '      echo "----------------------"\n'
1267 +            txt += '      cat processed-files.txt\n'
1268 +            txt += '      echo "----------------------"\n'
1269 +            txt += '      diff -q input-files.txt processed-files.txt\n'
1270 +            txt += '      fileverify_status=$?\n'
1271 +            txt += '      if [ $fileverify_status -ne 0 ]; then\n'
1272 +            txt += '         executable_exit_status=30001\n'
1273 +            txt += '         echo "ERROR ==> not all input files processed"\n'
1274 +            txt += '         echo "      ==> list of processed files from crab_fjr.xml differs from list in pset.cfg"\n'
1275 +            txt += '         echo "      ==> diff input-files.txt processed-files.txt"\n'
1276 +            txt += '      fi\n'
1277 +            txt += '    fi\n'
1278 +            txt += '\n'
1279 +        txt += 'else\n'
1280 +        txt += '    echo "CRAB FrameworkJobReport crab_fjr.xml is not available, using exit code of executable from command line."\n'
1281          txt += 'fi\n'
1282          txt += '\n'
1283 +        txt += 'echo "ExeExitCode=$executable_exit_status" | tee -a $RUNTIME_AREA/$repo\n'
1284 +        txt += 'echo "EXECUTABLE_EXIT_STATUS = $executable_exit_status"\n'
1285 +        txt += 'job_exit_code=$executable_exit_status\n'
1286 +
1287          return txt
1288  
1289      def setParam_(self, param, value):
# Line 1365 | Line 1301 | class Cmssw(JobType):
1301              nd[e]=0
1302          return nd.keys()
1303  
1304 <
1369 <    def checkOut(self, limit):
1304 >    def outList(self):
1305          """
1306          check the dimension of the output files
1307          """
1308 <        txt = 'echo ">>> Starting output sandbox limit check :"\n'
1308 >        txt = ''
1309 >        txt += 'echo ">>> list of expected files on output sandbox"\n'
1310          listOutFiles = []
1311 <        txt += 'stdoutFile=`ls *stdout` \n'
1312 <        txt += 'stderrFile=`ls *stderr` \n'
1311 >        stdout = 'CMSSW_$NJob.stdout'
1312 >        stderr = 'CMSSW_$NJob.stderr'
1313          if (self.return_data == 1):
1314              for file in (self.output_file+self.output_file_sandbox):
1315                  listOutFiles.append(self.numberFile_(file, '$NJob'))
1316 <            listOutFiles.append('$stdoutFile')
1317 <            listOutFiles.append('$stderrFile')
1316 >            listOutFiles.append(stdout)
1317 >            listOutFiles.append(stderr)
1318          else:
1319              for file in (self.output_file_sandbox):
1320                  listOutFiles.append(self.numberFile_(file, '$NJob'))
1321 <            listOutFiles.append('$stdoutFile')
1322 <            listOutFiles.append('$stderrFile')
1323 <  
1388 <        txt += 'echo "OUTPUT files: '+string.join(listOutFiles,' ')+'"\n'
1321 >            listOutFiles.append(stdout)
1322 >            listOutFiles.append(stderr)
1323 >        txt += 'echo "output files: '+string.join(listOutFiles,' ')+'"\n'
1324          txt += 'filesToCheck="'+string.join(listOutFiles,' ')+'"\n'
1325 <       # txt += 'echo "OUTPUT files: '+str(allOutFiles)+'";\n'
1391 <        txt += 'ls -gGhrta;\n'
1392 <        txt += 'sum=0;\n'
1393 <        txt += 'for file in $filesToCheck ; do\n'
1394 <        txt += '    if [ -e $file ]; then\n'
1395 <        txt += '        tt=`ls -gGrta $file | awk \'{ print $3 }\'`\n'
1396 <        txt += '        sum=`expr $sum + $tt`\n'
1397 <        txt += '    else\n'
1398 <        txt += '        echo "WARNING: output file $file not found!"\n'
1399 <        txt += '    fi\n'
1400 <        txt += 'done\n'
1401 <        txt += 'echo "Total Output dimension: $sum";\n'
1402 <        txt += 'limit='+str(limit)+';\n'
1403 <        txt += 'echo "OUTPUT FILES LIMIT SET TO: $limit";\n'
1404 <        txt += 'if [ $limit -lt $sum ]; then\n'
1405 <        txt += '    echo "WARNING: output files have to big size - something will be lost;"\n'
1406 <        txt += '    echo "         checking the output file sizes..."\n'
1407 <        txt += '    tot=0;\n'
1408 <        txt += '    for filefile in $filesToCheck ; do\n'
1409 <        txt += '        dimFile=`ls -gGrta $filefile | awk \'{ print $3 }\';`\n'
1410 <        txt += '        tot=`expr $tot + $tt`;\n'
1411 <        txt += '        if [ $limit -lt $dimFile ]; then\n'
1412 <        txt += '            echo "deleting file: $filefile";\n'
1413 <        txt += '            rm -f $filefile\n'
1414 <        txt += '        elif [ $limit -lt $tot ]; then\n'
1415 <        txt += '            echo "deleting file: $filefile";\n'
1416 <        txt += '            rm -f $filefile\n'
1417 <        txt += '        else\n'
1418 <        txt += '            echo "saving file: $filefile"\n'
1419 <        txt += '        fi\n'
1420 <        txt += '    done\n'
1421 <
1422 <        txt += '    ls -agGhrt;\n'
1423 <        txt += '    echo "WARNING: output files are too big in dimension: can not put in the output_sandbox.";\n'
1424 <        txt += '    echo "JOB_EXIT_STATUS = 70000";\n'
1425 <        txt += '    exit_status=70000;\n'
1426 <        txt += 'else'
1427 <        txt += '    echo "Total Output dimension $sum is fine.";\n'
1428 <        txt += 'fi\n'
1429 <        txt += 'echo "Ending output sandbox limit check"\n'
1325 >        txt += 'export filesToCheck\n'
1326          return txt

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines