Newer
Older
""" File contains Descriptors used describe run for direct inelastic reduction """
from Direct.PropertiesDescriptors import *
class RunList(object):
"""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._theRun = theRumDescr
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 mtd[self._partial_sum_ws_name]
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
"""
if fnames:
if isinstance(fnames,list):
self._file_path = fnames
else:
self._file_path = [fnames]
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]
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
#
def get_file_guess(self,inst_name,run_num,index=None):
"""Return the name of run file for run number provided
default_fext if internal is not empty
"""
if index is None:
index = self._run_numbers.index(run_num)
path_guess = self._file_path[index]
fext = self.get_fext(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):
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
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.
sets new file_path and fext list if such are provided
"""
if len(run_list) != len(self._run_numbers):
return False
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)))
else:
ind = self.get_last_ind2sum(sum_runs)
Loading
Loading full blame...