diff --git a/Framework/PythonInterface/plugins/algorithms/AlignAndFocusPowderFromFiles.py b/Framework/PythonInterface/plugins/algorithms/AlignAndFocusPowderFromFiles.py index 0786e4b5d2c21d8eff0972111b706d7045f02d90..2157c1ed9381b7a1801ec5a4773214000486d03a 100644 --- a/Framework/PythonInterface/plugins/algorithms/AlignAndFocusPowderFromFiles.py +++ b/Framework/PythonInterface/plugins/algorithms/AlignAndFocusPowderFromFiles.py @@ -137,14 +137,18 @@ class AlignAndFocusPowderFromFiles(DataProcessorAlgorithm): if key not in self.kwargs: self.kwargs[key] = instr + ext - def __determineCharacterizations(self, filename, wkspname): + def __determineCharacterizations(self, filename, wkspname, loadFile): useCharac = bool(self.charac is not None) # input workspace is only needed to find a row in the characterizations table - if useCharac: - tempname = '__%s_temp' % wkspname - Load(Filename=filename, OutputWorkspace=tempname, - MetaDataOnly=True) + tempname = None + if loadFile: + if useCharac: + tempname = '__%s_temp' % wkspname + Load(Filename=filename, OutputWorkspace=tempname, + MetaDataOnly=True) + else: + tempname = wkspname # assume it is already loaded # put together argument list args = dict(ReductionProperties=self.getProperty('ReductionProperties').valueAsStr) @@ -152,19 +156,19 @@ class AlignAndFocusPowderFromFiles(DataProcessorAlgorithm): prop = self.getProperty(name) if not prop.isDefault: args[name] = prop.value - if useCharac: + if tempname is not None: args['InputWorkspace']=tempname + if useCharac: args['Characterizations'] = self.charac PDDetermineCharacterizations(**args) - if useCharac: + if loadFile and useCharac: DeleteWorkspace(Workspace=tempname) def __getCacheName(self, wkspname): cachedir = self.getProperty('CacheDir').value if len(cachedir) <= 0: - self.log().warning('CacheDir is not specified - functionality disabled') return None propman_properties = ['bank', 'd_min', 'd_max', 'tof_min', 'tof_max', 'wavelength_min', 'wavelength_max'] @@ -181,7 +185,7 @@ class AlignAndFocusPowderFromFiles(DataProcessorAlgorithm): OtherProperties=alignandfocusargs, CacheDir=cachedir).OutputFilename - def __processFile(self, filename, wkspname, file_prog_start): + def __processFile(self, filename, wkspname, file_prog_start, determineCharacterizations): chunks = determineChunking(filename, self.chunkSize) self.log().information('Processing \'%s\' in %d chunks' % (filename, len(chunks))) prog_per_chunk_step = self.prog_per_file * 1./(6.*float(len(chunks))) # for better progress reporting - 6 steps per chunk @@ -193,6 +197,10 @@ class AlignAndFocusPowderFromFiles(DataProcessorAlgorithm): Load(Filename=filename, OutputWorkspace=chunkname, startProgress=prog_start, endProgress=prog_start+prog_per_chunk_step, **chunk) + if determineCharacterizations: + self.__determineCharacterizations(filename, chunkname, False) # updates instance variable + determineCharacterizations = False + prog_start += prog_per_chunk_step if self.filterBadPulses > 0.: FilterBadPulses(InputWorkspace=chunkname, OutputWorkspace=chunkname, @@ -234,6 +242,10 @@ class AlignAndFocusPowderFromFiles(DataProcessorAlgorithm): self.absorption = self.getProperty('AbsorptionWorkspace').value self.charac = self.getProperty('Characterizations').value finalname = self.getProperty('OutputWorkspace').valueAsStr + useCaching = len(self.getProperty('CacheDir').value) <= 0 + + if not useCaching: + self.log().warning('CacheDir is not specified - functionality disabled') self.prog_per_file = 1./float(len(filenames)) # for better progress reporting @@ -244,12 +256,15 @@ class AlignAndFocusPowderFromFiles(DataProcessorAlgorithm): for (i, filename) in enumerate(filenames): # default name is based off of filename wkspname = os.path.split(filename)[-1].split('.')[0] - self.__determineCharacterizations(filename, - wkspname) # updates instance variable - cachefile = self.__getCacheName(wkspname) + + if useCaching: + self.__determineCharacterizations(filename, + wkspname, True) # updates instance variable + cachefile = self.__getCacheName(wkspname) + wkspname += '_f%d' % i # add file number to be unique - if cachefile is not None and os.path.exists(cachefile): + if useCaching and os.path.exists(cachefile): LoadNexusProcessed(Filename=cachefile, OutputWorkspace=wkspname) # TODO LoadNexusProcessed has a bug. When it finds the # instrument name without xml it reads in from an IDF @@ -262,8 +277,9 @@ class AlignAndFocusPowderFromFiles(DataProcessorAlgorithm): if editinstrargs: EditInstrumentGeometry(Workspace=wkspname, **editinstrargs) else: - self.__processFile(filename, wkspname, self.prog_per_file*float(i)) - if cachefile is not None: + self.__processFile(filename, wkspname, self.prog_per_file*float(i), not useCaching) + + if useCaching: SaveNexusProcessed(InputWorkspace=wkspname, Filename=cachefile) # accumulate runs