Skip to content
Snippets Groups Projects
RunDescriptor.py 54.9 KiB
Newer Older
""" File contains Descriptors used describe run for direct inelastic reduction """ 

from mantid.simpleapi import *
from 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,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 clone 
       """
       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):
       """ """ 
       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 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 isinstance(fext,list):
            self._fext = fext
         else:
            self._fext = [fext]

       if not (self._fext):
          self._fext = [''] * 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_file_guess(self,inst_name,run_num,default_fext=None):
      """ return the name of run file for run number provided 
          
          note, that internally set file extension overwrites 
          default_fext if not empty
      """ 
      index = self._run_numbers.index(run_num)
      guess = self._get_file_guess(inst_name,run_num,index,default_fext)
      return (guess,index)
   #
   def _get_file_guess(self,inst_name,run_num,index,def_fext=None):
      """ get file guess given index of the run in the list of runs """ 
      path_guess = self._file_path[index]
      fext = self._fext[index]
      if def_fext and len(fext) == 0:
         fext = def_fext
      guess = os.path.join(path_guess,'{0}{1}{2}'.\
                      format(inst_name,run_num,fext))
   def add_or_replace_run(self,run_number,fpath='',fext=None,default_fext=False):
      """ 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)
          if not fext:
             fext = self._fext[-1]
          self._fext.append(fext)

          self._last_ind2sum=len(self._run_numbers)-1
          return self._last_ind2sum
          ext_ind = self._run_numbers.index(run_number)
          if len(fpath)>0:
             self._file_path[ext_ind]=fpath
          if fext:
             if not(default_fext and len(self._fext[ext_ind])>0): #not keep existing
                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)
   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))) 
          ind = self.get_last_ind2sum(sum_runs)
       return self._run_numbers[ind],self._file_path[ind],self._fext[ind],ind
   def set_last_ind2sum(self,run_number):
        """Check and set last number, contributing to summation 
           if this number is out of summation range, clear the summation
        """
        run_number = int(run_number)
        if run_number in self._run_numbers:
            self._last_ind2sum = self._run_numbers.index(run_number) 
            self._last_ind2sum = -1
   def get_run_list2sum(self,num_to_sum=None):
        """Get run numbers of the files to be summed together 
           from the list of defined run numbers
Loading
Loading full blame...