Newer
Older
Michael Whitty
committed
from mantidsimple import *
from mantidplot import *
from IndirectEnergyConversion import *
Michael Whitty
committed
Michael Whitty
committed
import math
Michael Whitty
committed
import re
Michael Whitty
committed
def abscyl(inWS_n, outWS_n, efixed, sample, can):
Michael Whitty
committed
ConvertUnits(inWS_n, 'wavelength', 'Wavelength', 'Indirect', efixed)
CylinderAbsorption('wavelength', outWS_n, sample[0], sample[1], sample[2],
can[0],can[1], EMode='Indirect', EFixed=efixed, NumberOfSlices=can[2],
NumberOfAnnuli=can[3])
mantid.deleteWorkspace('wavelength')
Michael Whitty
committed
def absflat(inWS_n, outWS_n, efixed, sample, can):
Michael Whitty
committed
ConvertUnits(inWS_n, 'wlength', 'Wavelength', 'Indirect', efixed)
FlatPlateAbsorption('wlength', outWS_n, sample[0], sample[1], sample[2],
can[0], can[1], can[2], EMode='Indirect', EFixed=efixed,
ElementSize=can[3])
mantid.deleteWorkspace('wlength')
Michael Whitty
committed
Michael Whitty
committed
def absorption(input, mode, sample, can, Save=False, Verbose=False,
Michael Whitty
committed
Plot=False):
(direct, filename) = os.path.split(input)
(root, ext) = os.path.splitext(filename)
LoadNexusProcessed(input, root)
Michael Whitty
committed
ws = mtd[root]
det = ws.getDetector(0)
efixed = 0.0
try:
efixed = det.getNumberParameter('Efixed')[0]
except AttributeError: # detector group
ids = det.getDetectorIDs()
det = ws.getInstrument().getDetector(ids[0])
efixed = det.getNumberParameter('Efixed')[0]
Michael Whitty
committed
outWS_n = root[:-3] + 'abs'
if mode == 'Flat Plate':
absflat(root, outWS_n, efixed, sample, can)
if mode == 'Cylinder':
abscyl(root, outWS_n, efixed, sample, can)
if Save:
SaveNexus(outWS_n, outWS_n+'.nxs')
mantid.deleteWorkspace(root)
if Plot:
graph = plotSpectrum(outWS_n,0)
Michael Whitty
committed
def concatWSs(workspaces, unit, name):
dataX = []
dataY = []
dataE = []
for ws in workspaces:
readX = mtd[ws].readX(0)
readY = mtd[ws].readY(0)
readE = mtd[ws].readE(0)
for i in range(0, len(readX)):
dataX.append(readX[i])
for i in range(0, len(readY)):
dataY.append(readY[i])
for i in range(0, len(readE)):
dataE.append(readE[i])
CreateWorkspace(name, dataX, dataY, dataE, NSpec = len(workspaces),
UnitX=unit)
Michael Whitty
committed
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
def confitParsToWS(Table, Data):
dataX = []
outNm = Table + '_matrix'
ConvertSpectrumAxis(Data, 'inq', 'MomentumTransfer', 'Indirect')
Transpose('inq', 'inq')
readX = mtd['inq'].readX(0)
nBins = len(readX)
for i in range(0,nBins):
dataX.append(readX[i])
mtd.deleteWorkspace('inq')
xAxisVals = []
dataY = []
dataE = []
names = ''
ws = mtd[Table]
cName = ws.getColumnNames()
nSpec = ( ws.getColumnCount() - 1 ) / 2
for spec in range(0,nSpec):
yAxis = cName[(spec*2)+1]
if re.search('HWHM$', yAxis) or re.search('Height$', yAxis):
xAxisVals += dataX
if (len(names) > 0):
names += ","
names += yAxis
eAxis = cName[(spec*2)+2]
for row in range(0, ws.getRowCount()):
dataY.append(ws.getDouble(yAxis,row))
dataE.append(ws.getDouble(eAxis,row))
else:
nSpec -= 1
CreateWorkspace(outNm, xAxisVals, dataY, dataE, nSpec,
UnitX='MomentumTransfer', UnitY='Text', YAxisValues=names)
return outNm
def confitPlotSeq(inputWS, plot):
nhist = mtd[inputWS].getNumberHistograms()
if ( plot == 'All' ):
plotSpectrum(inputWS, range(0, nhist))
return
plotSpecs = []
if ( plot == 'Intensity' ):
res = 'Height$'
elif ( plot == 'HWHM' ):
res = 'HWHM$'
for i in range(0,nhist):
title = mtd[inputWS].getAxis(1).label(i)
if re.search(res, title):
plotSpecs.append(i)
plotSpectrum(inputWS, plotSpecs)
def confitSeq(inputWS, func, startX, endX, save, plot):
input = inputWS+',i0'
nHist = mtd[inputWS].getNumberHistograms()
for i in range(1, nHist):
input += ';'+inputWS+',i'+str(i)
outNm = inputWS + '_convfit_seq_Parameters'
PlotPeakByLogValue(input, outNm, func, StartX=startX, EndX=endX)
wsname = confitParsToWS(outNm, inputWS)
if save:
SaveNexusProcessed(wsname, wsname+'.nxs')
if plot != 'None':
confitPlotSeq(wsname, plot)
Michael Whitty
committed
def demon(rawFiles, first, last, Smooth=False, SumFiles=False, CleanUp=True,
Michael Whitty
committed
Verbose=False, Plot='None', Save=True):
Michael Whitty
committed
ws_list, ws_names = loadData(rawFiles, Sum=SumFiles)
runNos = []
workspaces = []
(direct, filename) = os.path.split(rawFiles[0])
(root, ext) = os.path.splitext(filename)
try:
inst = mtd[ws_names[0]].getInstrument()
area = inst.getNumberParameter('mon-area')[0]
thickness = inst.getNumberParameter('mon-thickness')[0]
except IndexError:
sys.exit('Monitor area and thickness (unt and zz) are not defined \
in the Instrument Parameter File.')
for i in range(0, len(ws_names)):
# Get Monitor WS
MonitorWS = timeRegime(inWS=ws_names[i], Smooth=Smooth)
monitorEfficiency(MonitorWS, area, thickness)
# Get Run no, crop file
Gigg, Martyn Anthony
committed
runNo = ws_list[i].getRun().getLogData("run_number").value
Michael Whitty
committed
runNos.append(runNo)
Michael Whitty
committed
savefile = root[:3].lower() + runNo + '_diff'
Michael Whitty
committed
CropWorkspace(ws_names[i], ws_names[i], StartWorkspaceIndex=(first-1),
EndWorkspaceIndex = (last-1) )
# Normalise to Monitor
normalised = normToMon(inWS_n=ws_names[i], outWS_n=ws_names[i],
monWS_n=MonitorWS)
# Convert to dSpacing
ConvertUnits(ws_names[i], savefile, 'dSpacing')
workspaces.append(savefile)
if CleanUp:
mantid.deleteWorkspace(ws_names[i])
if Save:
SaveNexusProcessed(savefile, savefile+'.nxs')
Michael Whitty
committed
if ( Plot != 'None' ):
Michael Whitty
committed
for demon in workspaces:
Michael Whitty
committed
if ( Plot == 'Contour' ):
importMatrixWorkspace(demon).plotGraph2D()
else:
nspec = mtd[demon].getNumberHistograms()
plotSpectrum(demon, range(0, nspec))
Michael Whitty
committed
return workspaces, runNos
Michael Whitty
committed
def elwin(inputFiles, eRange, Save=False, Verbose=False, Plot=False):
eq1 = [] # output workspaces with units in Q
eq2 = [] # output workspaces with units in Q^2
Michael Whitty
committed
for file in inputFiles:
(direct, filename) = os.path.split(file)
(root, ext) = os.path.splitext(filename)
LoadNexus(file, root)
Gigg, Martyn Anthony
committed
run = mtd[root].getRun().getLogData("run_number").value
Michael Whitty
committed
savefile = root[:3] + run + root[8:-3]
if ( len(eRange) == 4 ):
ElasticWindow(root, savefile+'eq1', savefile+'eq2',eRange[0],
eRange[1], eRange[2], eRange[3])
Michael Whitty
committed
elif ( len(eRange) == 2 ):
ElasticWindow(root, savefile+'eq1', savefile+'eq2',
eRange[0], eRange[1])
Michael Whitty
committed
if Save:
SaveNexusProcessed(savefile+'eq1', savefile+'eq1.nxs')
SaveNexusProcessed(savefile+'eq2', savefile+'eq2.nxs')
eq1.append(savefile+'eq1')
eq2.append(savefile+'eq2')
Michael Whitty
committed
mantid.deleteWorkspace(root)
if Plot:
Michael Whitty
committed
nBins = mtd[eq1[0]].getNumberBins()
lastXeq1 = mtd[eq1[0]].readX(0)[nBins-1]
graph1 = plotSpectrum(eq1, 0)
Michael Whitty
committed
layer = graph1.activeLayer()
layer.setScale(Layer.Bottom, 0.0, lastXeq1)
nBins = mtd[eq2[0]].getNumberBins()
lastXeq2 = mtd[eq2[0]].readX(0)[nBins-1]
graph2 = plotSpectrum(eq2, 0)
Michael Whitty
committed
layer = graph2.activeLayer()
layer.setScale(Layer.Bottom, 0.0, lastXeq2)
return eq1, eq2
Michael Whitty
committed
Michael Whitty
committed
def fury(sam_files, res_file, rebinParam, RES=True, Save=False, Verbose=False,
Plot=False):
outWSlist = []
# Process RES Data Only Once
LoadNexus(res_file, 'res_data') # RES
Rebin('res_data', 'res_data', rebinParam)
ExtractFFTSpectrum('res_data', 'res_fft', 2)
Integration('res_data', 'res_int')
Divide('res_fft', 'res_int', 'res')
for sam_file in sam_files:
(direct, filename) = os.path.split(sam_file)
(root, ext) = os.path.splitext(filename)
if (ext == '.nxs'):
LoadNexus(sam_file, 'sam_data') # SAMPLE
Rebin('sam_data', 'sam_data', rebinParam)
else: #input is workspace
Rebin(sam_file, 'sam_data', rebinParam)
Michael Whitty
committed
ExtractFFTSpectrum('sam_data', 'sam_fft', 2)
Integration('sam_data', 'sam_int')
Divide('sam_fft', 'sam_int', 'sam')
# Create save file name.
Gigg, Martyn Anthony
committed
runNo = mtd['sam_data'].getRun().getLogData("run_number").value
savefile = root[:3] + runNo + root[8:-3] + 'iqt'
Michael Whitty
committed
outWSlist.append(savefile)
Divide('sam', 'res', savefile)
#Cleanup Sample Files
mantid.deleteWorkspace('sam_data')
mantid.deleteWorkspace('sam_int')
mantid.deleteWorkspace('sam_fft')
mantid.deleteWorkspace('sam')
# Crop nonsense values off workspace
bin = int(math.ceil(mtd[savefile].getNumberBins()/ 2.0))
binV = mtd[savefile].dataX(0)[bin]
CropWorkspace(savefile, savefile, XMax=binV)
if Save:
SaveNexusProcessed(savefile, savefile + '.nxs')
# Clean Up RES files
mantid.deleteWorkspace('res_data')
mantid.deleteWorkspace('res_int')
mantid.deleteWorkspace('res_fft')
mantid.deleteWorkspace('res')
if Plot:
specrange = range(0,mtd[outWSlist[0]].getNumberHistograms())
plotFury(outWSlist, specrange)
return outWSlist
Michael Whitty
committed
Michael Whitty
committed
def furyfitCreateXAxis(inputWS):
Michael Whitty
committed
result = []
ws = mtd[inputWS]
nHist = ws.getNumberHistograms()
inst = ws.getInstrument()
samplePos = inst.getSample().getPos()
beamPos = samplePos - inst.getSource().getPos()
for i in range(0,nHist):
detector = ws.getDetector(i)
Michael Whitty
committed
try:
efixed = detector.getNumberParameter("Efixed")[0]
except AttributeError: # Detector Group
ids = det.getDetectorIDs()
det = inst.getDetector(ids[0])
efixed = det.getNumberParameter("Efixed")[0]
Michael Whitty
committed
theta = detector.getTwoTheta(samplePos, beamPos) / 2
lamda = math.sqrt(81.787/efixed)
q = 4 * math.pi * math.sin(theta) / lamda
result.append(q)
return result
def furyfitParsToWS(Table, Data):
Michael Whitty
committed
wsname = Table + '_matrix'
dataX = furyfitCreateXAxis(Data)
dataY = []
dataE = []
names = ""
Michael Whitty
committed
xAxisVals = []
ws = mtd[Table]
cCount = ws.getColumnCount()
rCount = ws.getRowCount()
cName = ws.getColumnNames()
nSpec = ( cCount - 1 ) / 2
xAxis = cName[0]
for spec in range(0,nSpec):
yAxis = cName[(spec*2)+1]
if re.search('Tau$', yAxis) or re.search('Beta$', yAxis):
xAxisVals += dataX
if (len(names) > 0):
names += ","
names += yAxis
eAxis = cName[(spec*2)+2]
for row in range(0, rCount):
dataY.append(ws.getDouble(yAxis,row))
dataE.append(ws.getDouble(eAxis,row))
else:
nSpec -= 1
Michael Whitty
committed
CreateWorkspace(wsname, xAxisVals, dataY, dataE, nSpec,
Michael Whitty
committed
UnitX='MomentumTransfer', UnitY='Text', YAxisValues=names)
Michael Whitty
committed
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
return wsname
def furyfitPlotSeq(inputWS, plot):
nHist = mtd[inputWS].getNumberHistograms()
if ( plot == 'All' ):
plotSpectrum(inputWS, range(0, nHist))
return
plotSpecs = []
if ( plot == 'Tau' ):
res = 'Tau$'
elif ( plot == 'Beta' ):
res = 'Beta$'
for i in range(0, nHist):
title = mtd[inputWS].getAxis(1).label(i)
if ( re.search(res, title) ):
plotSpecs.append(i)
plotSpectrum(inputWS, plotSpecs)
def furyfitSeq(inputWS, func, startx, endx, save, plot):
input = inputWS+',i0'
nHist = mtd[inputWS].getNumberHistograms()
for i in range(1,nHist):
input += ';'+inputWS+',i'+str(i)
outNm = inputWS + '_furyfit_seq_Parameters'
PlotPeakByLogValue(input, outNm, func, StartX=startx, EndX=endx)
wsname = furyfitParsToWS(outNm, inputWS)
if save:
SaveNexusProcessed(wsname, wsname+'.nxs')
if ( plot != 'None' ):
furyfitPlotSeq(wsname, plot)
Michael Whitty
committed
Michael Whitty
committed
def msdfit(inputs, startX, endX, Save=False, Verbose=False, Plot=False):
output = []
Michael Whitty
committed
for file in inputs:
(direct, filename) = os.path.split(file)
(root, ext) = os.path.splitext(filename)
LoadNexusProcessed(file, root)
outWS_n = root[:-3] + 'msd'
fit_alg = Linear(root, outWS_n, WorkspaceIndex=0, StartX=startX,
EndX=endX)
output.append(outWS_n)
Michael Whitty
committed
A0 = fit_alg.getPropertyValue("FitIntercept")
A1 = fit_alg.getPropertyValue("FitSlope")
title = 'Intercept: '+A0+' ; Slope: '+A1
if Plot:
graph=plotSpectrum([root,outWS_n],0, 1)
graph.activeLayer().setTitle(title)
if Save:
SaveNexusProcessed(outWS_n, outWS_n+'.nxs', Title=title)
return output
Michael Whitty
committed
def mut(inWS_n, deltaW, filename, efixed):
Michael Whitty
committed
file_handle = open(filename, 'w') # Open File
sigs = 5.0 # sigs ?
siga = 1.0 # siga ?
we = math.sqrt(81.787/efixed) # 81.787 ?
tempWS = '_tmp_indirect_mut_file_'
ConvertUnits(inWS_n, tempWS, 'Wavelength', 'Indirect', efixed)
xValues = mtd[tempWS].readX(0)
nbins = len(xValues)
xMin = xValues[0]
xMax = xValues[nbins-1]
nw = int(xMax/deltaW) - int(xMin/deltaW) + 1
file_handle.write(str(nw)+' '+str(we)+' '+str(siga)+' '+str(sigs)+'\n')
for i in range(0, nw):
wavelength = (int(xMin/deltaW) + i) * deltaW
sigt = sigs + siga*wavelength/1.8
file_handle.write(str(wavelength) + ' ' + str(sigt) + '\n')
file_handle.close()
mantid.deleteWorkspace(tempWS)
Michael Whitty
committed
def plotFury(inWS_n, spec):
Michael Whitty
committed
nbins = inWS.getNumberBins()
graph = plotSpectrum(inWS_n, spec)
layer = graph.activeLayer()
Michael Whitty
committed
layer.setScale(Layer.Left, 0, 1.0)
Michael Whitty
committed
Michael Whitty
committed
def plotInput(inputfiles,spectra=[]):
OneSpectra = False
Michael Whitty
committed
if len(spectra) != 2:
Michael Whitty
committed
spectra = [spectra[0], spectra[0]]
OneSpectra = True
Michael Whitty
committed
workspaces = []
for file in inputfiles:
(direct, filename) = os.path.split(file)
(root, ext) = os.path.splitext(filename)
Michael Whitty
committed
LoadNexusProcessed(file, root)
if not OneSpectra:
GroupDetectors(root, root,
DetectorList=range(spectra[0],spectra[1]+1) )
Michael Whitty
committed
workspaces.append(root)
if len(workspaces) > 0:
graph = plotSpectrum(workspaces,0)
layer = graph.activeLayer().setTitle(", ".join(workspaces))
Michael Whitty
committed
def plotRaw(inputfiles,spectra=[]):
Michael Whitty
committed
if len(spectra) != 2:
sys.exit(1)
workspaces = []
for file in inputfiles:
(direct, filename) = os.path.split(file)
(root, ext) = os.path.splitext(filename)
Michael Whitty
committed
LoadRaw(file, root, SpectrumMin=spectra[0], SpectrumMax = spectra[1])
Michael Whitty
committed
GroupDetectors(root,root,DetectorList=range(spectra[0],spectra[1]+1))
workspaces.append(root)
if len(workspaces) > 0:
graph = plotSpectrum(workspaces,0)
Michael Whitty
committed
layer = graph.activeLayer().setTitle(", ".join(workspaces))