Skip to content
Snippets Groups Projects
RunDescriptor.py 59.5 KiB
Newer Older
#pylint: disable=invalid-name
""" File contains Descriptors used describe run for direct inelastic reduction """

from mantid.simpleapi import *
from Direct.PropertiesDescriptors import *
    """Helper class to maintain list of runs used in RunDescriptor for summing
       or subsequent processing range of files.

       Supports basic operations with this list
    """
    def __init__(self,theRumDescr,run_list,file_names=None,fext=None):
        self._last_ind2sum = -1
        self._file_path = None
        self._fext = None
        self.set_list2add(run_list,file_names,fext)
        self._partial_sum_ws_name = None
    def set_list2add(self,runs_to_add,fnames=None,fext=None):
        """Set run numbers to add together with possible file guess-es """
        if not isinstance(runs_to_add,list):
            raise KeyError('Can only set list of run numbers to add')
        runs = []
        for item in runs_to_add:
            runs.append(int(item))
        self._run_numbers = runs
        self._set_fnames(fnames,fext)
#--------------------------------------------------------------------------------------------------
    def set_cashed_sum_ws(self,ws,new_ws_name=None):
        """Store the name of a workspace in the class
           as reference
        """
        if new_ws_name:
            old_name = ws.name()
            if old_name != new_ws_name:
                old_mon_name = old_name + '_monitors'
                RenameWorkspace(ws,OutputWorkspace=new_ws_name)
            if old_mon_name in mtd:
                RenameWorkspace(old_mon_name,OutputWorkspace=new_ws_name + '_monitors')
        else:
            new_ws_name = ws.name()
        self._partial_sum_ws_name = new_ws_name
    #
    def get_cashed_sum_ws(self):
        """Return python pointer to cached sum workspace
        """
        if not self._partial_sum_ws_name:
            return None
        if self._partial_sum_ws_name in mtd:
            return mtd[self._partial_sum_ws_name]
        else:
            return None
    def get_cashed_sum_clone(self):
        """ """
        origin = self.get_cashed_sum_ws()
        if not origin:
            return None
        origin_name = origin.name()
        mon_name = origin_name + '_monitors'
        if mon_name in mtd:
            CloneWorkspace(InputWorkspace=mon_name,OutputWorkspace=origin_name + '_clone_monitors')
        ws = CloneWorkspace(InputWorkspace=origin_name,OutputWorkspace=origin_name + '_clone')
        return ws
    #
    def del_cashed_sum(self):
        """ """
        if not self._partial_sum_ws_name:
            return
        if self._partial_sum_ws_name in mtd:
            DeleteWorkspace(self._partial_sum_ws_name)
        mon_ws = self._partial_sum_ws_name + '_monitors'
        if mon_ws in mtd:
            DeleteWorkspace(mon_ws)
#--------------------------------------------------------------------------------------------------
    #
    def _set_fnames(self,fnames,fext):
        """Sets filenames lists and file extension lists
            of length correspondent to run number length
           if length of the list provided differs from the length
           of the run list, expands fnames list and fext list
           to the whole runnumber list using last for fext and
           first for fnames members of the
        """
        if fnames:
            if isinstance(fnames,list):
                self._file_path = fnames
            else:
                self._file_path = [fnames]
        if not self._file_path:
            self._file_path = [''] * len(self._run_numbers)
        else:
            if len(self._file_path) != len(self._run_numbers):
                self._file_path = [self._file_path[0]] * len(self._run_numbers)
        if fext:
            if isinstance(fext,list):
                self._fext = fext
            else:
                self._fext = [fext]

        if not self._fext:
            self._fext = [None] * len(self._run_numbers)
        else:
            if len(self._fext) != len(self._run_numbers):
                base_fext = self._fext[-1]
                self._fext = [base_fext] * len(self._run_numbers)
    #
    def get_fext(self,index=0):
        """Get file extension for file with run number
           Should be used on defined Run_list only(which should be always true)
        """
        fext_given =self._fext[index]
        if fext_given is None:
            return self._theRun._holder.data_file_ext
        else:
            return fext_given
    #
    def get_file_guess(self,inst_name,run_num,index=None):
        """Return the name of run file for run number provided

          Note: internal file extension overwrites
          default_fext if internal is not empty
        """
        if index is None:
            index = self._run_numbers.index(run_num)
        path_guess = self._file_path[index]
        guess = build_run_file_name(run_num,inst_name,path_guess,fext)
        return (guess,index)
    #
    def get_run_file_list(self,inst_name):
        """Return list of files, used corresponding to runs"""
        run_files = []
        for ind,run in enumerate(self._run_numbers):
            fname,index = self.get_file_guess(inst_name,run,ind)
            run_files.append(fname)
        return run_files
    #
    def get_all_run_list(self):
        return self._run_numbers
    #
    def add_or_replace_run(self,run_number,fpath='',fext=None):
        """Add run number to list of existing runs
         Let's prohibit adding the same run numbers using this method.
         Equivalent run numbers can still be added using list assignment

         file path and file extension are added/modified if present
         regardless of run being added or replaced
        if not run_number in self._run_numbers:
            self._run_numbers.append(run_number)
            if not fpath:
                fpath = self._file_path[-1]
            self._file_path.append(fpath)
            self._fext.append(fext)

            self._last_ind2sum = len(self._run_numbers) - 1
            return self._last_ind2sum
        else:
            ext_ind = self._run_numbers.index(run_number)
            if len(fpath) > 0:
                self._file_path[ext_ind] = fpath
            if fext: #not to keep existing extension if new one is provided
                self._fext[ext_ind] = fext
            self._last_ind2sum = ext_ind
            return ext_ind
    #
    def check_runs_equal(self,run_list,fpath=None,fext=None):
        """Returns true if all run numbers in existing list are
           in the comparison list and vice versa.

           if lists numbers coincide,
           sets new file_path and fext list if such are provided
        """
        if len(run_list) != len(self._run_numbers):
            return False
        for run in run_list:
            if not run in self._run_numbers:
                return False
        self._set_fnames(fpath,fext)
        return True
    #
    def get_current_run_info(self,sum_runs,ind=None):
        """Return last run info for file to sum"""
        if ind:
            if not(ind > -1 and ind < len(self._run_numbers)):
                raise RuntimeError("Index {0} is outside of the run list of {1} runs".format(ind,len(self._run_numbers)))
        else:
            ind = self.get_last_ind2sum(sum_runs)
Loading
Loading full blame...