Skip to content
Snippets Groups Projects
ISISIndirectInelastic.py 50.3 KiB
Newer Older
                                    self.ftype,
                                    self.startx,
                                    self.endx,
                                    Save=False,
                                    Plot='None')

        self.result_names = [fury_ws.getName(),
                             furyfitSeq_ws]

        #remove workspaces from mantid
        for sample in self.samples:
            DeleteWorkspace(sample)
        DeleteWorkspace(self.resolution)

    def _validate_properties(self):
        """Check the object properties are in an expected state to continue"""

        if type(self.samples) != list:
            raise RuntimeError("Samples should be a list of strings.")
        if type(self.resolution) != str:
            raise RuntimeError("Resolution should be a string.")
        if type(self.e_min) != float:
            raise RuntimeError("e_min should be a float")
        if type(self.e_max) != float:
            raise RuntimeError("e_max should be a float")
        if type(self.num_bins) != int:
            raise RuntimeError("num_bins should be an int")
        if type(self.func) != str:
            raise RuntimeError("Function should be a string.")
        if type(self.ftype) != str:
            raise RuntimeError("Function type should be a string.")
        if type(self.startx) != float:
            raise RuntimeError("startx should be a float")
        if type(self.endx) != float:
            raise RuntimeError("endx should be a float")

#------------------------- OSIRIS tests ---------------------------------------


class OSIRISFuryAndFuryFitMulti(ISISIndirectInelasticFuryAndFuryFitMulti):

    def skipTests(self):
        return platform.system() == "Darwin"

    def __init__(self):
        ISISIndirectInelasticFuryAndFuryFitMulti.__init__(self)

        # TransformToIqt
        self.samples = ['osi97935_graphite002_red.nxs']
        self.resolution = 'osi97935_graphite002_res.nxs'
        self.e_min = -0.4
        self.e_max = 0.4
        self.num_bins = 4

        # Fury Seq Fit
        self.func = r'name=LinearBackground,A0=0.510595,A1=0,ties=(A1=0);name=UserFunction,Formula=Intensity*exp( -(x/Tau)^Beta),Intensity=0.489405,Tau=0.105559,Beta=1.61112e-14;ties=(f1.Intensity=1-f0.A0)'
        self.ftype = '1E_s'
        self.startx = 0.0
        self.endx = 0.119681

    def get_reference_files(self):
        return ['II.OSIRISFury.nxs',
                'II.OSIRISFuryFitMulti.nxs']

#------------------------- IRIS tests -----------------------------------------


class IRISFuryAndFuryFitMulti(ISISIndirectInelasticFuryAndFuryFitMulti):

    def __init__(self):
        ISISIndirectInelasticFuryAndFuryFitMulti.__init__(self)

        # TransformToIqt
        self.samples = ['irs53664_graphite002_red.nxs']
        self.resolution = 'irs53664_graphite002_res.nxs'
        self.e_min = -0.4
        self.e_max = 0.4
        self.num_bins = 4

        # Fury Seq Fit
        self.func = r'name=LinearBackground,A0=0.584488,A1=0,ties=(A1=0);name=UserFunction,Formula=Intensity*exp( -(x/Tau)^Beta),Intensity=0.415512,Tau=4.848013e-14,Beta=0.022653;ties=(f1.Intensity=1-f0.A0)'
        self.ftype = '1S_s'
        self.startx = 0.0
        self.endx = 0.156250

    def get_reference_files(self):
        return ['II.IRISFury.nxs',
                'II.IRISFuryFitMulti.nxs']

#==============================================================================


class ISISIndirectInelasticConvFit(ISISIndirectInelasticBase):
    '''A base class for the ISIS indirect inelastic ConvFit tests

    The workflow is defined in the _run() method, simply
    define an __init__ method and set the following properties
    on the object
    '''
    # Mark as an abstract class
    __metaclass__ = ABCMeta

    def _run(self):
        '''Defines the workflow for the test'''
        self.tolerance = 1e-4
        LoadNexus(self.sample, OutputWorkspace=self.sample)

        confitSeq(
            self.sample,
            self.func,
            self.startx,
            self.endx,
            self.ftype,
            self.bg,
            specMin=self.spectra_min,
            specMax=self.spectra_max,
            Plot='None',
            Save=False)

    def _validate_properties(self):
        '''Check the object properties are in an expected state to continue'''

        if type(self.sample) != str:
            raise RuntimeError("Sample should be a string.")
        if type(self.resolution) != str:
            raise RuntimeError("Resolution should be a string.")
        if not os.path.isfile(self.resolution):
            raise RuntimeError("Resolution must be a file that exists.")
        if type(self.func) != str:
            raise RuntimeError("Function should be a string.")
        if type(self.bg) != str:
            raise RuntimeError("Background type should be a string.")
        if type(self.ftype) != str:
            raise RuntimeError("Function type should be a string.")
        if type(self.startx) != float:
            raise RuntimeError("startx should be a float")
        if type(self.endx) != float:
            raise RuntimeError("endx should be a float")
        if type(self.spectra_min) != int:
            raise RuntimeError("Min spectrum should be a int")
        if type(self.spectra_max) != int:
            raise RuntimeError("Max spectrum should be a int")
        if type(self.ties) != bool:
            raise RuntimeError("ties should be a boolean.")

#------------------------- OSIRIS tests ---------------------------------------


class OSIRISConvFit(ISISIndirectInelasticConvFit):

    def __init__(self):
        ISISIndirectInelasticConvFit.__init__(self)
        self.sample = 'osi97935_graphite002_red.nxs'
        self.resolution = FileFinder.getFullPath('osi97935_graphite002_res.nxs')
        #ConvFit fit function
        self.func = 'name=LinearBackground,A0=0,A1=0;(composite=Convolution,FixResolution=true,NumDeriv=true;name=Resolution,FileName=\"%s\";name=Lorentzian,Amplitude=2,PeakCentre=0,FWHM=0.05)' % self.resolution
        self.ftype = '1L'
        self.startx = -0.2
        self.endx = 0.2
        self.bg = 'FitL_s'
        self.spectra_min = 0
        self.spectra_max = 41
        self.ties = False

        self.result_names = ['osi97935_graphite002_conv_1LFitL_s0_to_41_Result']

    def get_reference_files(self):
        return ['II.OSIRISConvFitSeq.nxs']


#------------------------- IRIS tests -----------------------------------------
class IRISConvFit(ISISIndirectInelasticConvFit):

    def __init__(self):
        ISISIndirectInelasticConvFit.__init__(self)
        self.sample = 'irs53664_graphite002_red.nxs'
        self.resolution = FileFinder.getFullPath('irs53664_graphite002_res.nxs')
        #ConvFit fit function
        self.func = 'name=LinearBackground,A0=0.060623,A1=0.001343;(composite=Convolution,FixResolution=true,NumDeriv=true;name=Resolution,FileName=\"%s\";name=Lorentzian,Amplitude=1.033150,PeakCentre=-0.000841,FWHM=0.001576)' % self.resolution
        self.ftype = '1L'
        self.startx = -0.2
        self.endx = 0.2
        self.bg = 'FitL_s'
        self.spectra_min = 0
        self.spectra_max = 50
        self.ties = False

        self.result_names = ['irs53664_graphite002_conv_1LFitL_s0_to_50_Result']

    def get_reference_files(self):
        return ['II.IRISConvFitSeq.nxs']

#==============================================================================


class ISISIndirectInelasticApplyCorrections(ISISIndirectInelasticBase):
    '''A base class for the ISIS indirect inelastic Apply Corrections tests

    The workflow is defined in the _run() method, simply
    define an __init__ method and set the following properties
    on the object
    '''
    # Mark as an abstract class
    __metaclass__ = ABCMeta

    def _run(self):
        '''Defines the workflow for the test'''
        self.tolerance = 1e-4

        LoadNexus(self._sample_workspace + '.nxs', OutputWorkspace=self._sample_workspace)
        if self._corrections_workspace != '':
            LoadNexus(self._corrections_workspace + '.nxs', OutputWorkspace=self._corrections_workspace)
        if self._can_workspace != '':
            LoadNexus(self._can_workspace + '.nxs', OutputWorkspace=self._can_workspace)

        output_workspaces = self._run_apply_corrections()
        self.result_names = [output_workspaces['reduced_workspace']]

    def _run_apply_corrections(self):
        abscorFeeder(self._sample_workspace, self._can_workspace, self._can_geometry,
                     self._using_corrections, self._corrections_workspace, **self._kwargs)
        return self._get_output_workspace_names()

    def _get_output_workspace_names(self):
        """
        abscorFeeder doesn't return anything, these names should exist in the ADS
        apply corrections uses the following naming convention:
        <instrument><sample number>_<analyser><reflection>_<mode>_<can number>
        """

        if self._can_workspace != '':
            can_run = mtd[self._can_workspace].getRun()
            can_run_number = can_run.getProperty('run_number').value

        mode = ''
        if self._corrections_workspace != '' and self._can_workspace != '':
            mode = 'Correct_%s' % can_run_number
        elif self._corrections_workspace != '':
            mode = 'Corrected'
        else:
            mode = 'Subtract_%s' % can_run_number

        workspace_name_stem = self._sample_workspace[:-3] + mode

        output_workspaces = {
            'reduced_workspace': workspace_name_stem + '_red',
            'rqw_workspace': workspace_name_stem + '_rqw',
        }

        if self._can_workspace != '':
            output_workspaces['result_workspace'] = workspace_name_stem + '_Result'

        return output_workspaces

    def _validate_properties(self):
        '''Check the object properties are in an expected state to continue'''

#------------------------- IRIS tests -----------------------------------------

class IRISApplyCorrectionsWithCan(ISISIndirectInelasticApplyCorrections):
    """ Test applying corrections with just a can workspace """

    def __init__(self):
        ISISIndirectInelasticApplyCorrections.__init__(self)

        self._sample_workspace = 'irs26176_graphite002_red'
        self._can_workspace = 'irs26173_graphite002_red'
        self._corrections_workspace = ''
        self._can_geometry = 'cyl'
        self._using_corrections = False

        self._kwargs = {'RebinCan':False, 'ScaleOrNotToScale':False,
                        'factor':1, 'Save':False, 'PlotResult':'None', 'PlotContrib':False}

    def get_reference_files(self):
        return ['II.IRISApplyCorrectionsWithCan.nxs']


class IRISApplyCorrectionsWithCorrectionsWS(ISISIndirectInelasticApplyCorrections):
    """ Test applying corrections with a corrections workspace """

    def __init__(self):
        ISISIndirectInelasticApplyCorrections.__init__(self)

        self._sample_workspace = 'irs26176_graphite002_red'
        self._can_workspace = ''
        self._corrections_workspace = 'irs26176_graphite002_cyl_Abs'
        self._can_geometry = 'cyl'
        self._using_corrections = True

        self._kwargs = {'RebinCan':False, 'ScaleOrNotToScale':False,
                        'factor':1, 'Save':False, 'PlotResult':'None', 'PlotContrib':False}

    def get_reference_files(self):
        return ['II.IRISApplyCorrectionsWithCorrectionsWS.nxs']

class IRISApplyCorrectionsWithBoth(ISISIndirectInelasticApplyCorrections):
    """ Test applying corrections with both a can and a corrections workspace """

    def __init__(self):
        ISISIndirectInelasticApplyCorrections.__init__(self)

        self._sample_workspace = 'irs26176_graphite002_red'
        self._can_workspace = 'irs26173_graphite002_red'
        self._corrections_workspace = 'irs26176_graphite002_cyl_Abs'
        self._can_geometry = 'cyl'
        self._using_corrections = True

        self._kwargs = {'RebinCan':False, 'ScaleOrNotToScale':False,
                        'factor':1, 'Save':False, 'PlotResult':'None', 'PlotContrib':False}

    def get_reference_files(self):
        return ['II.IRISApplyCorrections.nxs']

#==============================================================================
# Transmission Monitor Test

class ISISIndirectInelasticTransmissionMonitor(ISISIndirectInelasticBase):
    '''
    '''

    # Mark as an abstract class
    __metaclass__ = ABCMeta

    def _run(self):
        '''Defines the workflow for the test'''

        self.tolerance = 1e-4
        Load(self.sample, OutputWorkspace=self.sample)
        Load(self.can, OutputWorkspace=self.can)

        IndirectTransmissionMonitor(SampleWorkspace=self.sample, CanWorkspace=self.can,
                                    OutputWorkspace='IRISTransmissionMonitorTest')

    def _validate_properties(self):
        '''Check the object properties are in an expected state to continue'''

        if type(self.sample) != str:
            raise RuntimeError("Sample should be a string.")
        if type(self.can) != str:
            raise RuntimeError("Can should be a string.")


#------------------------- IRIS tests -----------------------------------------
class IRISTransmissionMonitor(ISISIndirectInelasticTransmissionMonitor):

    def __init__(self):
        ISISIndirectInelasticTransmissionMonitor.__init__(self)
        self.sample = 'IRS26176.RAW'
        self.can = 'IRS26173.RAW'

        self.result_names = ['IRISTransmissionMonitorTest']

    def get_reference_files(self):
        return ['II.IRISTransmissionMonitor.nxs']