Newer
Older
""" File contains Descriptors used describe run for direct inelastic reduction """
from mantid.simpleapi import *
from 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,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)
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#--------------------------------------------------------------------------------------------------
#
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]
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)
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...