def insertDBSRunsFromRun(apiRef, dSRun): """ Take a DataStructs run and create a DBSRun out of it """ run = DbsRun(RunNumber=long(dSRun.run), NumberOfEvents=0, NumberOfLumiSections=0, TotalLuminosity=0, StoreNumber=0, StartOfRun=0, EndOfRun=0) if apiRef: apiRef.insertRun(run) return run
# import sys from DBSAPI.dbsApi import DbsApi from DBSAPI.dbsException import * from DBSAPI.dbsApiException import * from DBSAPI.dbsRun import DbsRun from DBSAPI.dbsOptions import DbsOptionParser optManager = DbsOptionParser() (opts, args) = optManager.getOpt() api = DbsApi(opts.__dict__) run = DbsRun( RunNumber=1, NumberOfEvents=101, #NumberOfLumiSections= 20, #TotalLuminosity= 2222, #EndOfRun= 'RightNow', ) print "Creating a run" try: api.updateRun(run) print "Result: %s" % run except DbsApiException, ex: print "Caught API Exception %s: %s " % (ex.getClassName(), ex.getErrorMessage()) if ex.getErrorCode() not in (None, ""):
apiObj.run(tierName1 + "sjhd lk", excep = True) apiObj.run(tierName1, "", excep = True) f.write("\n***********************insertTier API tests***************************") apiObj = DbsUnitTestApi(api.insertRun, f) apiObj.setVerboseLevel(opts.verbose) f.write("\n\n***********************insertRun API tests***************************") runNumber1 = 101 + int(time.time()%10000) runNumber2 = 102 + int(time.time()%10000) runNumber3 = 103 + int(time.time()%10000) run1 = DbsRun (RunNumber=runNumber1, NumberOfEvents= 100, NumberOfLumiSections= 20, TotalLuminosity= 2222, StoreNumber= 123, StartOfRun= 1234, EndOfRun= 1234, ) apiObj.run(run1, excep = False) run2 = DbsRun (RunNumber=runNumber2, NumberOfEvents= 100, NumberOfLumiSections= 20, TotalLuminosity= 2222, StoreNumber= 123, StartOfRun= 1234, EndOfRun= 1234, ) apiObj.run(run2, excep = False)
apiObj = DbsUnitTestApi(api.insertBlock, f) path = "/" + str(proc1['PrimaryDataset']['Name']) + "/" + str(proc1['Name']) + "/" + tierName1 + "-" + tierName2 print "PATH: %s" % path #Insert Block block1 = DbsFileBlock (Name = path+'#01234-0567', Path = path) apiObj.run(path, block1 , excep = False) #Insert Run apiObj = DbsUnitTestApi(api.insertRun, f) runNumber1 = 101 + int(time.time()%1000) run1 = DbsRun (RunNumber=runNumber1, NumberOfEvents= 100, NumberOfLumiSections= 20, TotalLuminosity= 2222, StoreNumber= 123, StartOfRun= 'now', EndOfRun= 'never', ) apiObj.run(run1, excep = False) #Insert Lumi Section apiObj = DbsUnitTestApi(api.insertLumiSection, f) lumiNumber1 = 111 + int(time.time()%100) lumiNumber2 = 112 + int(time.time()%100) lumi1 = DbsLumiSection (LumiSectionNumber=lumiNumber1, StartEventNumber=100, EndEventNumber=200, LumiStartTime='notime', LumiEndTime='neverending',
def createDBSFiles(fjrFileInfo, jobType=None, apiRef=None): """ _createDBSFiles_ Create a list of DBS File instances from the file details contained in a FwkJobRep.FileInfo instance describing an output file Does not insert files, returns as list of DbsFile objects Does insert runs and lumisections if DBS API reference is passed """ results = [] inputLFNs = [x['LFN'] for x in fjrFileInfo.inputFiles] checksum = fjrFileInfo.checksums['cksum'] adler32sum = fjrFileInfo.checksums.get('adler32', '') nEvents = int(fjrFileInfo['TotalEvents']) if len(fjrFileInfo.dataset) <= 0: logging.error("No dataset info found in FWJobReport!") return results # // # // Set FileType #// if 'FileType' in fjrFileInfo: fileType = fjrFileInfo['FileType'] else: fileType = 'EDM' # # FIXME: at this point I should use the mc or data event type from # the jobreport. Until this is supported by the framework, # we use the workaround that mc job reports have an empty # lumisections list (stripped in DBSInterface) # lumiList = [] if (len(fjrFileInfo.getLumiSections()) > 0): # # insert runs (for data files from detector) # if (apiRef != None): for runinfo in fjrFileInfo.runs: run = DbsRun( RunNumber=long(runinfo), NumberOfEvents=0, NumberOfLumiSections=0, TotalLuminosity=0, StoreNumber=0, StartOfRun=0, EndOfRun=0, ) apiRef.insertRun(run) # # insert lumisections (for data files from detector) # associate files with lumisections (for all data files) # for lumiinfo in fjrFileInfo.getLumiSections(): lumi = DbsLumiSection( LumiSectionNumber=long(lumiinfo['LumiSectionNumber']), StartEventNumber=0, EndEventNumber=0, LumiStartTime=0, LumiEndTime=0, RunNumber=long(lumiinfo['RunNumber']), ) # Isnt needed, causes monster slowdown #if ( apiRef != None ): # apiRef.insertLumiSection(lumi) lumiList.append(lumi) logging.debug("Lumi associated to file is: %s" % ([x for x in lumiList])) # // # // Dataset info related to files and creation of DbsFile object #// for dataset in fjrFileInfo.dataset: primary = createPrimaryDataset(dataset) if jobType == "Merge": algo = createMergeAlgorithm(dataset) else: algo = createAlgorithmForInsert(dataset) processed = createProcessedDataset(primary, algo, dataset) dbsFileInstance = DbsFile( Checksum=checksum, Adler32=adler32sum, NumberOfEvents=nEvents, LogicalFileName=fjrFileInfo['LFN'], FileSize=int(fjrFileInfo['Size']), Status="VALID", ValidationStatus='VALID', FileType=fileType, Dataset=processed, TierList=makeTierList(dataset['DataTier']), AlgoList=[algo], LumiList=lumiList, ParentList=inputLFNs, BranchList=fjrFileInfo.branches, ) results.append(dbsFileInstance) return results
Name="TestProcessedDS001-Parent", PhysicsGroup="BPositive", Status="VALID", TierList=['GEN', 'SIM'], AlgoList=[algo], ) api.insertProcessedDataset(parent_procds) # Lets say child dataset will have two runs api.insertRun( DbsRun( RunNumber=1, NumberOfEvents=100, NumberOfLumiSections=10, TotalLuminosity=1111, StoreNumber=1234, StartOfRun='now', EndOfRun='never', )) api.insertRun( DbsRun( RunNumber=2, NumberOfEvents=200, NumberOfLumiSections=20, TotalLuminosity=2222, StoreNumber=5678, StartOfRun='now', EndOfRun='never', ))
procGrandChild = DbsProcessedDataset ( PrimaryDataset=primary, Name="TestProcessedDS003", PhysicsGroup="BPositive", Status="Valid", TierList=['SIM', 'GEN'], AlgoList=[algo], ParentList=['/test_primary_001' + mytime + '/TestProcessedDS002' + mytime + '/GEN-SIM'] ) run = DbsRun ( RunNumber=1, NumberOfEvents= 100, NumberOfLumiSections= 20, TotalLuminosity= 2222, StoreNumber= 123, StartOfRun= 12345, EndOfRun= 45678, ) lumi1 = DbsLumiSection ( LumiSectionNumber=1222, StartEventNumber=100, EndEventNumber=200, LumiStartTime=1234, LumiEndTime=1234, RunNumber=1, ) lumi2 = DbsLumiSection ( LumiSectionNumber=1333,
algoObjM = DbsAlgorithm(ExecutableName=algoExeM, ApplicationVersion=algoVerM, ApplicationFamily=algoFamM, ParameterSetID=DbsQueryableParameterSet( Hash=psHashM, Name=psNameM, Version=psVerM, Type=psTypeM, Annotation=psAnnoM, Content=psConM)) runObj = DbsRun( RunNumber=runNumber, NumberOfEvents=runNumEvents, NumberOfLumiSections=numLumi, TotalLuminosity=totalLumi, StoreNumber=storeNum, StartOfRun=startRun, EndOfRun=endRun, ) procObj1 = DbsProcessedDataset(PrimaryDataset=primObj, Name=procName1, AcquisitionEra=era, GlobalTag=tag, PhysicsGroup=phyGrp, Status=procStatus, TierList=[tier1, tier2], AlgoList=[algoObj1, algoObj2], XtCrossSection=1.1)
def insertFilesForDBSBuffer(self, files, procDataset, algos, jobType="NotMerge", insertDetectorData=False, maxFiles=100, maxSize=99999999, timeOut=None, fileCommitLength=5): """ _insertFiles_ list of files inserted in DBS """ #TODO: Whats the purpose of insertDetectorData if len(files) < 1: return affectedBlocks = [] insertFiles = [] addedRuns = [] seName = None #Get the algos in insertable form # logging.error("About to input algos") # logging.error(algos) ialgos = [ DBSWriterObjects.createAlgorithmForInsert(dict(algo)) for algo in algos ] #print ialgos for outFile in files: # // # // Convert each file into a DBS File object #// lumiList = [] #Somehing similar should be the real deal when multiple runs/lumi could be returned from wmbs file for runlumiinfo in outFile.getRuns(): lrun = long(runlumiinfo.run) run = DbsRun( RunNumber=lrun, NumberOfEvents=0, NumberOfLumiSections=0, TotalLuminosity=0, StoreNumber=0, StartOfRun=0, EndOfRun=0, ) #Only added if not added by another file in this loop, why waste a call to DBS if lrun not in addedRuns: self.dbs.insertRun(run) addedRuns.append( lrun) #save it so we do not try to add it again to DBS logging.debug("run %s added to DBS " % str(lrun)) for alsn in runlumiinfo: lumi = DbsLumiSection( LumiSectionNumber=long(alsn), StartEventNumber=0, EndEventNumber=0, LumiStartTime=0, LumiEndTime=0, RunNumber=lrun, ) lumiList.append(lumi) logging.debug("lumi list created for the file") dbsfile = DbsFile( #Checksum = str(outFile['cksum']), NumberOfEvents=outFile['events'], LogicalFileName=outFile['lfn'], FileSize=int(outFile['size']), Status="VALID", ValidationStatus='VALID', FileType='EDM', Dataset=procDataset, TierList=DBSWriterObjects.makeTierList( procDataset['Path'].split('/')[3]), AlgoList=ialgos, LumiList=lumiList, ParentList=outFile.getParentLFNs(), #BranchHash = outFile['BranchHash'], ) #Set checksums by hand #dbsfile['Checksum'] = 0 #Set a default? for entry in outFile['checksums'].keys(): #This should be a dictionary with a cktype key and cksum value if entry.lower() == 'cksum': dbsfile['Checksum'] = str(outFile['checksums'][entry]) elif entry.lower() == 'adler32': dbsfile['Adler32'] = str(outFile['checksums'][entry]) elif entry.lower() == 'md5': dbsfile['Md5'] = str(outFile['checksums'][entry]) #This check comes from ProdAgent, not sure if its required if len(outFile["locations"]) > 0: seName = list(outFile["locations"])[0] logging.debug("SEname associated to file is: %s" % seName) else: msg = "Error in DBSWriter.insertFiles\n" msg += "No SEname associated to file" #print "FAKING seName for now" #seName="cmssrm.fnal.gov" raise DBSWriterError(msg) insertFiles.append(dbsfile) # //Processing Jobs: # // Insert the lists of sorted files into the appropriate #// fileblocks sumSize = 0 sumFiles = 0 tmpFiles = [] blockList = [] #First, get the block. See if the block already exists try: fileBlock = DBSWriterObjects.getDBSFileBlock( self.dbs, procDataset, seName) fileBlock['files'] = [] #if not fileBlock in affectedBlocks: # affectedBlocks.append(fileBlock) except DbsException as ex: msg = "Error in DBSWriter.insertFilesForDBSBuffer\n" msg += "Cannot retrieve FileBlock for dataset:\n" msg += " %s\n" % procDataset['Path'] msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) filesToCommit = [] for file in insertFiles: # First see if the block is full if self.manageFileBlock(fileBlock=fileBlock, maxFiles=maxFiles, maxSize=maxSize, timeOut=timeOut, algos=ialgos, filesToCommit=filesToCommit, procDataset=procDataset): fileBlock['OpenForWriting'] = 0 if not fileBlock in affectedBlocks: affectedBlocks.append(fileBlock) # Then we need a new block try: fileBlock = DBSWriterObjects.getDBSFileBlock( self.dbs, procDataset, seName) fileBlock['files'] = [] except DbsException as ex: msg = "Error in DBSWriter.insertFilesForDBSBuffer\n" msg += "Cannot retrieve FileBlock for dataset:\n" msg += " %s\n" % procDataset['Path'] msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) fileBlock['files'].append(file['LogicalFileName']) filesToCommit.append(file) if len(filesToCommit) >= fileCommitLength: # Only commit the files if there are more of them then the maximum length try: self.dbs.insertFiles(procDataset, filesToCommit, fileBlock) filesToCommit = [] logging.debug("Inserted files: %s to FileBlock: %s" \ % ( ([ x['LogicalFileName'] for x in insertFiles ]),fileBlock['Name'])) except DbsException as ex: msg = "Error in DBSWriter.insertFiles\n" msg += "Cannot insert processed files:\n" msg += " %s\n" % ( [x['LogicalFileName'] for x in insertFiles], ) msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) if len(filesToCommit) > 0: try: self.dbs.insertFiles(procDataset, filesToCommit, fileBlock) filesToCommit = [] logging.debug("Inserted files: %s to FileBlock: %s" \ % ( ([ x['LogicalFileName'] for x in insertFiles ]),fileBlock['Name'])) except DbsException as ex: msg = "Error in DBSWriter.insertFiles\n" msg += "Cannot insert processed files:\n" msg += " %s\n" % ([x['LogicalFileName'] for x in insertFiles], ) msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg) if not fileBlock in affectedBlocks: affectedBlocks.append(fileBlock) ## Do bulk inserts now for DBS #filesToCommit = [] #count = 0 #count2 = 0 #for file in insertFiles: # count += 1 # #Try and close the box # logging.error("Should have a file") # logging.error(len(filesToCommit)) # count2 += len(filesToCommit) # if self.manageFileBlock(fileBlock = fileBlock, maxFiles = maxFiles, # maxSize = maxSize, timeOut = timeOut, algos = ialgos, # filesToCommit = filesToCommit, procDataset = procDataset): # fileBlock['OpenForWriting'] = '0' # if not fileBlock in affectedBlocks: # affectedBlocks.append(fileBlock) # # # # # Then we need a new block # try: # fileBlock = DBSWriterObjects.getDBSFileBlock( # self.dbs, # procDataset, # seName) # fileBlock['files'] = [] # except DbsException, ex: # msg = "Error in DBSWriter.insertFilesForDBSBuffer\n" # msg += "Cannot retrieve FileBlock for dataset:\n" # msg += " %s\n" % procDataset['Path'] # msg += "%s\n" % formatEx(ex) # raise DBSWriterError(msg) # #At this point, we should commit the block as is # fileBlock['files'].append(file['LogicalFileName']) # if jobType == "MergeSpecial": # for file in fileList: # file['Block'] = fileBlock # msg="calling: self.dbs.insertMergedFile(%s, %s)" % (str(file['ParentList']),str(file)) # logging.debug(msg) # try: # # # # # # NOTE To Anzar From Anzar (File cloning as in DBS API can be done here and then I can use Bulk insert on Merged files as well) # self.dbs.insertMergedFile(file['ParentList'], # file) # # except DbsException, ex: # msg = "Error in DBSWriter.insertFiles\n" # msg += "Cannot insert merged file:\n" # msg += " %s\n" % file['LogicalFileName'] # msg += "%s\n" % formatEx(ex) # raise DBSWriterError(msg) # logging.debug("Inserted merged file: %s to FileBlock: %s"%(file['LogicalFileName'],fileBlock['Name'])) # else: # filesToCommit.append(file) # if len(filesToCommit) >= fileCommitLength: # # Only commit the files if there are more of them then the maximum length # try: # logging.error("About to commit %i files" %(len(filesToCommit))) # count2 += len(filesToCommit) # self.dbs.insertFiles(procDataset, filesToCommit, fileBlock) # filesToCommit = [] # logging.debug("Inserted files: %s to FileBlock: %s" \ # % ( ([ x['LogicalFileName'] for x in insertFiles ]),fileBlock['Name'])) # # except DbsException, ex: # msg = "Error in DBSWriter.insertFiles\n" # msg += "Cannot insert processed files:\n" # msg += " %s\n" % ([ x['LogicalFileName'] for x in insertFiles ],) # msg += "%s\n" % formatEx(ex) # raise DBSWriterError(msg) # # # # ## If we still have files to commit, commit them #logging.error("Got to the end of the loop") #logging.error(len(filesToCommit)) #logging.error(count2) #if len(filesToCommit) > 0: # try: # logging.error("About to insert some files") # self.dbs.insertFiles(procDataset, filesToCommit, fileBlock) # filesToCommit = [] # logging.debug("Inserted files: %s to FileBlock: %s" \ # % ( ([ x['LogicalFileName'] for x in insertFiles ]),fileBlock['Name'])) # # except DbsException, ex: # msg = "Error in DBSWriter.insertFiles\n" # msg += "Cannot insert processed files:\n" # msg += " %s\n" % ([ x['LogicalFileName'] for x in insertFiles ],) # msg += "%s\n" % formatEx(ex) # raise DBSWriterError(msg) if not fileBlock in affectedBlocks: affectedBlocks.append(fileBlock) return list(affectedBlocks)
def insertFilesForDBSBuffer(self, files, procDataset, algos, jobType="NotMerge", insertDetectorData=False, maxFiles=100, maxSize=99999999, timeOut=None, fileCommitLength=5): """ _insertFiles_ list of files inserted in DBS """ #TODO: Whats the purpose of insertDetectorData if len(files) < 1: return affectedBlocks = [] insertFiles = [] addedRuns = [] seName = None #Get the algos in insertable form # logging.error("About to input algos") # logging.error(algos) ialgos = [ DBSWriterObjects.createAlgorithmForInsert(dict(algo)) for algo in algos ] #print ialgos for outFile in files: # // # // Convert each file into a DBS File object #// lumiList = [] #Somehing similar should be the real deal when multiple runs/lumi could be returned from wmbs file for runlumiinfo in outFile.getRuns(): lrun = long(runlumiinfo.run) run = DbsRun( RunNumber=lrun, NumberOfEvents=0, NumberOfLumiSections=0, TotalLuminosity=0, StoreNumber=0, StartOfRun=0, EndOfRun=0, ) #Only added if not added by another file in this loop, why waste a call to DBS if lrun not in addedRuns: self.dbs.insertRun(run) addedRuns.append( lrun) #save it so we do not try to add it again to DBS logging.debug("run %s added to DBS " % str(lrun)) for alsn in runlumiinfo: lumi = DbsLumiSection( LumiSectionNumber=long(alsn), StartEventNumber=0, EndEventNumber=0, LumiStartTime=0, LumiEndTime=0, RunNumber=lrun, ) lumiList.append(lumi) logging.debug("lumi list created for the file") dbsfile = DbsFile( #Checksum = str(outFile['cksum']), NumberOfEvents=outFile['events'], LogicalFileName=outFile['lfn'], FileSize=int(outFile['size']), Status="VALID", ValidationStatus='VALID', FileType='EDM', Dataset=procDataset, TierList=DBSWriterObjects.makeTierList( procDataset['Path'].split('/')[3]), AlgoList=ialgos, LumiList=lumiList, ParentList=outFile.getParentLFNs(), #BranchHash = outFile['BranchHash'], ) #Set checksums by hand #dbsfile['Checksum'] = 0 #Set a default? for entry in outFile['checksums'].keys(): #This should be a dictionary with a cktype key and cksum value if entry.lower() == 'cksum': dbsfile['Checksum'] = str(outFile['checksums'][entry]) elif entry.lower() == 'adler32': dbsfile['Adler32'] = str(outFile['checksums'][entry]) elif entry.lower() == 'md5': dbsfile['Md5'] = str(outFile['checksums'][entry]) #This check comes from ProdAgent, not sure if its required if len(outFile["locations"]) > 0: seName = list(outFile["locations"])[0] logging.debug("SEname associated to file is: %s" % seName) else: msg = "Error in DBSWriter.insertFiles\n" msg += "No SEname associated to file" #print "FAKING seName for now" #seName="cmssrm.fnal.gov" raise DBSWriterError(msg) insertFiles.append(dbsfile) # //Processing Jobs: # // Insert the lists of sorted files into the appropriate #// fileblocks sumSize = 0 sumFiles = 0 tmpFiles = [] blockList = [] #First, get the block. See if the block already exists try: fileBlock = DBSWriterObjects.getDBSFileBlock( self.dbs, procDataset, seName) fileBlock['files'] = [] #if not fileBlock in affectedBlocks: # affectedBlocks.append(fileBlock) except DbsException, ex: msg = "Error in DBSWriter.insertFilesForDBSBuffer\n" msg += "Cannot retrieve FileBlock for dataset:\n" msg += " %s\n" % procDataset['Path'] msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg)
api.insertRun (run) run = DbsRun ( RunNumber=1, NumberOfEvents= 100, NumberOfLumiSections= 20, TotalLuminosity= 2222, StoreNumber= 123, StartOfRun= 12345, EndOfRun= 45678, ) """ run = DbsRun( RunNumber=1, NumberOfEvents=0, TotalLuminosity=0, StoreNumber=0, ) api.insertRun(run) except DbsApiException, ex: print "Caught API Exception %s: %s " % (ex.getClassName(), ex.getErrorMessage()) if ex.getErrorCode() not in (None, ""): print "DBS Exception Error Code: ", ex.getErrorCode() print "Done"
def insertFilesForDBSBuffer(self, files, procDataset, algos, jobType="NotMerge", insertDetectorData=False): """ _insertFiles_ list of files inserted in DBS """ #TODO: Whats the purpose of insertDetectorData if len(files) < 1: return affectedBlocks = set() insertFiles = [] addedRuns = [] seName = None #Get the algos in insertable form ialgos = [ DBSWriterObjects.createAlgorithmForInsert(dict(algo)) for algo in algos ] for outFile in files: # // # // Convert each file into a DBS File object #// lumiList = [] #Somehing similar should be the real deal when multiple runs/lumi could be returned from wmbs file for runlumiinfo in outFile.getRuns(): lrun = long(runlumiinfo.run) run = DbsRun( RunNumber=lrun, NumberOfEvents=0, NumberOfLumiSections=0, TotalLuminosity=0, StoreNumber=0, StartOfRun=0, EndOfRun=0, ) #Only added if not added by another file in this loop, why waste a call to DBS if lrun not in addedRuns: self.dbs.insertRun(run) addedRuns.append( lrun) #save it so we do not try to add it again to DBS logging.debug("run %s added to DBS " % str(lrun)) for alsn in runlumiinfo: lumi = DbsLumiSection( LumiSectionNumber=long(alsn), StartEventNumber=0, EndEventNumber=0, LumiStartTime=0, LumiEndTime=0, RunNumber=lrun, ) lumiList.append(lumi) logging.debug("lumi list created for the file") dbsfile = DbsFile( Checksum=str(outFile['cksum']), NumberOfEvents=outFile['events'], LogicalFileName=outFile['lfn'], FileSize=int(outFile['size']), Status="VALID", ValidationStatus='VALID', FileType='EDM', Dataset=procDataset, TierList=DBSWriterObjects.makeTierList( procDataset['Path'].split('/')[3]), AlgoList=ialgos, LumiList=lumiList, ParentList=outFile.getParentLFNs(), #BranchHash = outFile['BranchHash'], ) #This check comes from ProdAgent, not sure if its required if len(outFile["locations"]) > 0: seName = list(outFile["locations"])[0] logging.debug("SEname associated to file is: %s" % seName) else: msg = "Error in DBSWriter.insertFiles\n" msg += "No SEname associated to file" #print "FAKING seName for now" #seName="cmssrm.fnal.gov" raise DBSWriterError(msg) insertFiles.append(dbsfile) # //Processing Jobs: # // Insert the lists of sorted files into the appropriate #// fileblocks try: fileBlock = DBSWriterObjects.getDBSFileBlock( self.dbs, procDataset, seName) except DbsException, ex: msg = "Error in DBSWriter.insertFiles\n" msg += "Cannot retrieve FileBlock for dataset:\n" msg += " %s\n" % procDataset['Path'] #msg += "In Storage Element:\n %s\n" % insertFiles.seName msg += "%s\n" % formatEx(ex) raise DBSWriterError(msg)