1 | """*WIKI* |
---|
2 | |
---|
3 | Calculates the scattering & transmission for Indirect Geometry spectrometers. The sample chemical formula is input for the SetSampleMaterial algorithm to calculate the cross-sections. |
---|
4 | The instrument analyser reflection is selected to obtain the wavelength to calculate the absorption cross-section. The sample number density & thickness is input to then calculate the percentage scattering & transmission. |
---|
5 | |
---|
6 | *WIKI*""" |
---|
7 | |
---|
8 | from mantid.simpleapi import * |
---|
9 | from mantid.api import PythonAlgorithm, AlgorithmFactory |
---|
10 | from mantid.kernel import StringListValidator, StringMandatoryValidator |
---|
11 | from mantid import config |
---|
12 | from IndirectCommon import StartTime, EndTime |
---|
13 | import os.path, math |
---|
14 | |
---|
15 | class IndirectTransmission(PythonAlgorithm): |
---|
16 | |
---|
17 | def category(self): |
---|
18 | return "Workflow\\MIDAS;PythonAlgorithms" |
---|
19 | |
---|
20 | def PyInit(self): |
---|
21 | self.declareProperty(name='Instrument',defaultValue='IRIS',validator=StringListValidator(['IRIS','OSIRIS']), doc='Instrument') |
---|
22 | self.declareProperty(name='Analyser',defaultValue='graphite',validator=StringListValidator(['graphite','fmica']), doc='Analyser') |
---|
23 | self.declareProperty(name='Reflection',defaultValue='002',validator=StringListValidator(['002','004']), doc='Reflection') |
---|
24 | self.declareProperty(name='Chemical Formula',defaultValue='',validator=StringMandatoryValidator(), doc='Sample chemical formula') |
---|
25 | self.declareProperty(name='Number Density', defaultValue=0.1, doc='Number denisty. Default=0.1') |
---|
26 | self.declareProperty(name='Thickness', defaultValue=0.1, doc='Sample thickness. Default=0.1') |
---|
27 | |
---|
28 | def PyExec(self): |
---|
29 | |
---|
30 | StartTime('IndirectTransmission') |
---|
31 | |
---|
32 | instrumentName = self.getPropertyValue('Instrument') |
---|
33 | analyser = self.getPropertyValue('Analyser') |
---|
34 | reflection = self.getPropertyValue('Reflection') |
---|
35 | formula = self.getPropertyValue('Chemical Formula') |
---|
36 | density = self.getPropertyValue('Number Density') |
---|
37 | thickness = self.getPropertyValue('Thickness') |
---|
38 | |
---|
39 | #Load instrument defintion file |
---|
40 | idfDir = config['instrumentDefinition.directory'] |
---|
41 | idf = idfDir + instrumentName + '_Definition.xml' |
---|
42 | workspace = '__empty_'+instrumentName |
---|
43 | LoadEmptyInstrument(OutputWorkspace=workspace, Filename=idf) |
---|
44 | |
---|
45 | #Load instrument parameter file |
---|
46 | nameStem = instrumentName + '_' + analyser + '_' + reflection |
---|
47 | ipf = idfDir + nameStem + '_Parameters.xml' |
---|
48 | LoadParameterFile(Workspace=workspace, Filename=ipf) |
---|
49 | |
---|
50 | #Get efixed value |
---|
51 | instrument = mtd[workspace].getInstrument() |
---|
52 | efixed = instrument.getNumberParameter('efixed-val')[0] |
---|
53 | |
---|
54 | logger.notice('Analyser : ' +analyser+reflection +' with energy = ' + str(efixed)) |
---|
55 | |
---|
56 | result = SetSampleMaterial(InputWorkspace=workspace,ChemicalFormula=formula) |
---|
57 | |
---|
58 | #elastic wavelength |
---|
59 | wave=1.8*math.sqrt(25.2429/efixed) |
---|
60 | |
---|
61 | absorptionXSection = result[5]*wave/1.7982 |
---|
62 | coherentXSection = result[4] |
---|
63 | incoherentXSection = result[3] |
---|
64 | scatteringXSection = result[3] |
---|
65 | |
---|
66 | thickness = float(thickness) |
---|
67 | density = float(density) |
---|
68 | |
---|
69 | totalXSection = absorptionXSection + scatteringXSection |
---|
70 | |
---|
71 | transmission = math.exp(-density*totalXSection*thickness) |
---|
72 | scattering = 1.0 - math.exp(-density*scatteringXSection*thickness) |
---|
73 | |
---|
74 | #Create table workspace to store calculations |
---|
75 | tableWs = nameStem + '_Transmission' |
---|
76 | tableWs = CreateEmptyTableWorkspace(OutputWorkspace=tableWs) |
---|
77 | tableWs.addColumn("str", "Name") |
---|
78 | tableWs.addColumn("str", "Value") |
---|
79 | |
---|
80 | #Add values to table workspace |
---|
81 | tableWs.addRow(['Absorption Xsection at wavelength ', str(wave) + |
---|
82 | ' A = '+str(absorptionXSection)]) |
---|
83 | tableWs.addRow(['Coherent Xsection', str(coherentXSection)]) |
---|
84 | tableWs.addRow(['Incoherent Xsection', str(incoherentXSection)]) |
---|
85 | tableWs.addRow(['Total scattering Xsection', str(scatteringXSection)]) |
---|
86 | tableWs.addRow(['Number density', str(density)]) |
---|
87 | tableWs.addRow(['Thickness', str(thickness)]) |
---|
88 | tableWs.addRow(['Transmission (abs+scatt)', str(transmission)]) |
---|
89 | tableWs.addRow(['Total scattering', str(scattering)]) |
---|
90 | |
---|
91 | #Output values to the results log |
---|
92 | logger.notice('Absorption Xsection at wavelength ' + str(wave) + |
---|
93 | ' A = '+str(absorptionXSection)) |
---|
94 | logger.notice('Coherent Xsection = '+ str(coherentXSection)) |
---|
95 | logger.notice('Incoherent Xsection = ' + str(incoherentXSection)) |
---|
96 | logger.notice('Total scattering Xsection = ' + str(scatteringXSection)) |
---|
97 | logger.notice('Number density = ' + str(density)) |
---|
98 | logger.notice('Thickness = ' + str(thickness)) |
---|
99 | logger.notice('Transmission (abs+scatt) = ' +str(transmission)) |
---|
100 | logger.notice('Total scattering = ' +str(scattering)) |
---|
101 | |
---|
102 | #remove idf/ipf workspace |
---|
103 | DeleteWorkspace(workspace) |
---|
104 | |
---|
105 | EndTime('IndirectTransmission') |
---|
106 | |
---|
107 | # Register algorithm with Mantid |
---|
108 | AlgorithmFactory.subscribe(IndirectTransmission) |
---|