Skip to content
Snippets Groups Projects
Commit b2e5a799 authored by Samuel Jackson's avatar Samuel Jackson
Browse files

Refs #5422 Added UI and py routines for Indirect Foreign.

parent f8410402
No related merge requests found
# Algorithm to start Force
from MantidFramework import *
from MolDynTransfer import MolDynText
class MolDynAscii(PythonAlgorithm):
def category(self):
return "Workflow\\MIDAS;PythonAlgorithms"
def PyInit(self):
self.declareProperty('FileName', DefaultValue='', Validator = MandatoryValidator(),Description = 'File name (cdl ext)')
self.declareProperty(Name='Verbose',DefaultValue=True,Description = 'Switch Verbose Off/On')
self.declareProperty(Name='Save',DefaultValue=False,Description = 'Switch Save result to nxs file Off/On')
self.declareProperty(Name='Plot',DefaultValue='None',Validator=ListValidator(['None','Spectrum','Contour','Both']),Description = 'Plot options')
def PyExec(self):
self.log().information('MolDynLoad input')
file = self.getPropertyValue('FileName')
verbOp = self.getProperty('Verbose')
saveOp = self.getProperty('Save')
plotOp = self.getPropertyValue('Plot')
MolDynText(file,verbOp,plotOp,saveOp)
mantid.registerPyAlgorithm(MolDynAscii()) # Register algorithm with Mantid
# Algorithm to start Force
from MantidFramework import *
from MolDynTransfer import MolDynImport
class MolDynLoad(PythonAlgorithm):
def category(self):
return "Workflow\\MIDAS;PythonAlgorithms"
def PyInit(self):
self.declareProperty('FileName', DefaultValue='', Validator = MandatoryValidator(),Description = 'File name (cdl ext)')
self.declareProperty('FunctionNames', DefaultValue='', Validator = MandatoryValidator(),Description = 'Function names - comma separated(eg Fqt Sqw)')
self.declareProperty(Name='Verbose',DefaultValue=True,Description = 'Switch Verbose Off/On')
self.declareProperty(Name='Save',DefaultValue=False,Description = 'Switch Save result to nxs file Off/On')
self.declareProperty(Name='Plot',DefaultValue='None',Validator=ListValidator(['None','Spectrum','Contour','Both']),Description = 'Plot options')
def PyExec(self):
self.log().information('MolDynLoad input')
file = self.getPropertyValue('FileName')
functions = self.getPropertyValue('FunctionNames')
func = functions.split(',')
verbOp = self.getProperty('Verbose')
saveOp = self.getProperty('Save')
plotOp = self.getPropertyValue('Plot')
MolDynImport(file,func,verbOp,plotOp,saveOp)
mantid.registerPyAlgorithm(MolDynLoad()) # Register algorithm with Mantid
......@@ -118,8 +118,11 @@ set ( MOC_FILES inc/MantidQtCustomInterfaces/Background.h
set ( UI_FILES inc/MantidQtCustomInterfaces/ConvertToEnergy.ui
inc/MantidQtCustomInterfaces/CreateMDWorkspace.ui
inc/MantidQtCustomInterfaces/CreateMDWorkspaceAlgDialog.ui
inc/MantidQtCustomInterfaces/ForCE.ui
inc/MantidQtCustomInterfaces/IndirectDataAnalysis.ui
inc/MantidQtCustomInterfaces/IndirectDiffractionReduction.ui
inc/MantidQtCustomInterfaces/IndirectForeign.ui
inc/MantidQtCustomInterfaces/MolDyn.ui
inc/MantidQtCustomInterfaces/MuonAnalysis.ui
inc/MantidQtCustomInterfaces/SANSPlotSpecial.ui
inc/MantidQtCustomInterfaces/SANSRunWindow.ui
......
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>626</width>
<height>193</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="MantidQt::MantidWidgets::MWRunFiles" name="mwRun">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="label" stdset="0">
<string>Run:</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="lblInstrument">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Instrument: </string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="cbInstrument"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QLabel" name="lblAnalyser">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Analyser:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="cbAnalyser"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="lblReflection">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Reflection:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="cbReflection"/>
</item>
</layout>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item alignment="Qt::AlignHCenter">
<widget class="QCheckBox" name="chkUseMap">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Use Map</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item alignment="Qt::AlignHCenter">
<widget class="QCheckBox" name="chkRejectZero">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Reject Zero</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QGroupBox" name="gbOutput">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Output Options</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QCheckBox" name="chkVerbose">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string>Verbose</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_17">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="chkPlot">
<property name="text">
<string>Plot Result</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_18">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="chkSave">
<property name="text">
<string>Save Result</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>MantidQt::MantidWidgets::MWRunFiles</class>
<extends>QWidget</extends>
<header>MantidQtMantidWidgets/MWRunFiles.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>IndirectForeign</class>
<widget class="QWidget" name="IndirectForeign">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>530</width>
<height>282</height>
</rect>
</property>
<property name="windowTitle">
<string>Indirect Foreign</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTabWidget" name="indirectForeignTabs">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="forCE">
<attribute name="title">
<string>ForCE</string>
</attribute>
</widget>
<widget class="QWidget" name="molDyn">
<attribute name="title">
<string>MolDyn</string>
</attribute>
</widget>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="layout_bottom">
<item>
<widget class="QPushButton" name="pbHelp">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
<property name="text">
<string>?</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_14">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="pbRun">
<property name="text">
<string>Run</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_11">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="pbManageDirs">
<property name="text">
<string>Manage Directories</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>629</width>
<height>160</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="1">
<widget class="MantidQt::MantidWidgets::MWRunFiles" name="mwRunNumber">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="label" stdset="0">
<string/>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="lblRun">
<property name="text">
<string>Run:</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="lblFunctionNames">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Function Names:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="leFunctionNames"/>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QGroupBox" name="gbOutput">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="title">
<string>Output Options</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QCheckBox" name="chkVerbose">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text">
<string>Verbose</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_17">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="chkPlot">
<property name="text">
<string>Plot Result</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_18">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="chkSave">
<property name="text">
<string>Save Result</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>MantidQt::MantidWidgets::MWRunFiles</class>
<extends>QWidget</extends>
<header>MantidQtMantidWidgets/MWRunFiles.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
#Force for ILL backscattering raw
#
from IndirectImport import *
from mantid.simpleapi import *
from mantid import config, logger, mtd
from mantid.kernel import V3D
import sys, math, os.path, numpy as np
from IndirectCommon import StartTime, EndTime, ExtractFloat, ExtractInt
from IndirectForce import ChangeAngles, InstrParas, RunParas
mp = import_mantidplot()
# Routines for Ascii file of MolDyn data
def SplitLine(a):
elements = a.split() #split line on character
extracted = []
for n in elements:
extracted.append(float(n))
return extracted #values as list
def FindDimensions(a,Verbose):
ldim = FindStarts(a,'dimensions',0)
lQ = FindTabStarts(a,'NQVALUES',0)
lT = FindTabStarts(a,'NTIMES',0)
lF = FindTabStarts(a,'NFREQUENCIES',0)
Qel = a[lQ].split()
nQ = int(Qel[2])
Tel = a[lT].split()
nT = int(Tel[2])
Fel = a[lF].split()
nF = int(Tel[2])
if Verbose:
logger.notice(a[2][1:-1])
logger.notice(a[3][1:-1])
logger.notice(a[6][1:-1])
return nQ,nT,nF
def FindStarts(asc,c,l1):
for l in range(l1,len(asc)):
char = asc[l]
if char.startswith(c):
line = l
break
return line
def FindTabStarts(asc,c,l1):
for l in range(l1,len(asc)):
char = asc[l][1:]
if char.startswith(c):
line = l
break
return line
def FindEnds(asc,c,l1):
for l in range(l1,len(asc)):
char = asc[l]
if char.endswith(c):
line = l
break
return line
def FindChar(asc,c,l1):
for l in range(l1,len(asc)):
char = asc[l]
if char.find(c):
line = l
break
return line
def MakeList(a,l1,l2):
asc = ''
for m in range(l1,l2+1):
asc += a[m]
alist = asc.split(',')
return alist
def MolDynImport(file,functions,Verbose,Plot,Save): #Ascii start routine
StartTime('MolDynImport')
workdir = config['defaultsave.directory']
filext = file + '.cdl'
path = os.path.join(workdir, filext)
if Verbose:
logger.notice('Functions : '+str(functions))
logger.notice('Reading file : ' + path)
handle = open(path, 'r')
asc = []
for line in handle:
line = line.rstrip()
asc.append(line)
handle.close()
lasc = len(asc)
# raw head
nQ,nT,nF = FindDimensions(asc,Verbose)
ldata = FindStarts(asc,'data:',0)
lq1 = FindStarts(asc,' q =',ldata) #start Q values
lq2 = FindStarts(asc,' q =',lq1-1)
Qlist = MakeList(asc,lq1,lq2)
if nQ != len(Qlist):
error = 'ERROR *** reading Q values'
logger.notice(error)
sys.exit(error)
Qf = Qlist[0].split()
Q = [float(Qf[2])/10.0]
for m in range(1,nQ-1):
Q.append(float(Qlist[m])/10.0)
Q.append(float(Qlist[nQ-1][:-1])/10.0)
if Verbose:
logger.notice('Q values = '+str(Q))
lt1 = FindStarts(asc,' time =',lq2) #start T values
lt2 = FindEnds(asc,';',lt1)
Tlist = MakeList(asc,lt1,lt2)
if nT != len(Tlist):
error = 'ERROR *** reading Time values'
logger.notice(error)
sys.exit(error)
Tf = Tlist[0].split()
T = [float(Tf[2])]
for m in range(1,nT-1):
T.append(float(Tlist[m]))
T.append(float(Tlist[nT-1][:-1]))
T.append(2*T[nT-1]-T[nT-2])
if Verbose:
logger.notice('T values = '+str(T[:2])+' to '+str(T[-3:]))
lf1 = FindStarts(asc,' frequency =',lq2) #start F values
lf2 = FindEnds(asc,';',lf1)
Flist = MakeList(asc,lf1,lf2)
if nF != len(Flist):
error = 'ERROR *** reading Freq values'
logger.notice(error)
sys.exit(error)
Ff = Flist[0].split()
F = [float(Ff[2])]
for m in range(1,nF-1):
F.append(float(Flist[m]))
F.append(float(Flist[nF-1][:-1]))
F.append(2*F[nF-1]-T[nF-2])
if Verbose:
logger.notice('F values = '+str(F[:2])+' to '+str(F[-3:]))
# Function
for func in functions:
start = []
lstart = lt2
if func[:3] == 'Fqt':
nP = nT
xEn = np.array(T)
eZero = np.zeros(nT)
xUnit = 'TOF'
if func[:3] == 'Sqw':
nP = nF
xEn = np.array(F)
eZero = np.zeros(nF)
xUnit = 'Energy'
for n in range(0,nQ):
for m in range(lstart,lasc):
char = asc[m]
if char.startswith(' // '+func):
start.append(m)
lstart = m+1
lend = FindEnds(asc,';',lstart)
start.append(lend+1)
# logger.notice('Start lines : '+str(start))
Qaxis = ''
for n in range(0,nQ):
if Verbose:
logger.notice('Reading : '+asc[start[n]])
Slist = MakeList(asc,start[n]+1,start[n+1]-1)
if n == nQ-1:
Slist[nP-1] = Slist[nP-1][:-1]
S = []
for m in range(0,nP):
S.append(float(Slist[m]))
if nP != len(S):
error = 'ERROR *** reading S values'
logger.notice(error)
sys.exit(error)
else:
if Verbose:
logger.notice('S values = '+str(S[:2])+' to '+str(S[-2:]))
if n == 0:
Qaxis += str(Q[n])
xDat = xEn
yDat = np.array(S)
eDat = eZero
else:
Qaxis += ','+str(Q[n])
xDat = np.append(xDat,xEn)
yDat = np.append(yDat,np.array(S))
eDat = np.append(eDat,eZero)
outWS = file+'_'+func
CreateWorkspace(OutputWorkspace=outWS, DataX=xDat, DataY=yDat, DataE=eDat,
Nspec=nQ, UnitX=xUnit, VerticalAxisUnit='MomentumTransfer', VerticalAxisValues=Qaxis)
if Save:
opath = os.path.join(workdir,outWS+'.nxs')
SaveNexusProcessed(InputWorkspace=outWS, Filename=opath)
if Verbose:
logger.notice('Output file : ' + opath)
if (Plot != 'None'):
plotMolDyn(outWS,Plot)
EndTime('MolDynImport')
def plotMolDyn(inWS,Plot):
if (Plot == 'Spectrum' or Plot == 'Both'):
nHist = mtd[inWS].getNumberHistograms()
if nHist > 10 :
nHist = 10
plot_list = []
for i in range(0, nHist):
plot_list.append(i)
res_plot=mp.plotSpectrum(inWS,plot_list)
if (Plot == 'Contour' or Plot == 'Both'):
cont_plot=mp.importMatrixWorkspace(inWS).plotGraph2D()
def MolDynText(file,Verbose,Plot,Save): #Ascii start routine
StartTime('MolDynAscii')
workdir = config['defaultsave.directory']
filext = file + '.dat'
path = os.path.join(workdir, filext)
if Verbose:
logger.notice('Reading file : ' + path)
handle = open(path, 'r')
asc = []
for line in handle:
line = line.rstrip()
asc.append(line)
handle.close()
lasc = len(asc)
val = SplitLine(asc[3])
Q = []
for n in range(1,len(val)):
Q.append(val[n])
nQ = len(Q)
x = []
y = []
for n in range(4,lasc):
val = SplitLine(asc[n])
x.append(val[0])
yval = val[1:]
y.append(yval)
nX = len(x)
if Verbose:
logger.notice('nQ = '+str(nQ))
logger.notice('nT = '+str(nX))
xT = np.array(x)
eZero = np.zeros(nX)
Qaxis = ''
for m in range(0,nQ):
if Verbose:
logger.notice('Q['+str(m+1)+'] : '+str(Q[m]))
S = []
for n in range(0,nX):
S.append(y[n][m])
if m == 0:
Qaxis += str(Q[m])
xDat = xT
yDat = np.array(S)
eDat = eZero
else:
Qaxis += ','+str(Q[m])
xDat = np.append(xDat,xT)
yDat = np.append(yDat,np.array(S))
eDat = np.append(eDat,eZero)
outWS = file + '_iqt'
CreateWorkspace(OutputWorkspace=outWS, DataX=xDat, DataY=yDat, DataE=eDat,
Nspec=nQ, UnitX='TOF')
# Nspec=nQ, UnitX='TOF', VerticalAxisUnit='MomentumTransfer', VerticalAxisValues=Qaxis)
Qmax = Q[nQ-1]
instr = 'MolDyn'
ana = 'qmax'
if Qmax <= 2.0:
refl = '2'
else:
refl = '4'
InstrParas(outWS,instr,ana,refl)
efixed = RunParas(outWS,instr,file,file,Verbose)
if Verbose:
logger.notice('Qmax = '+str(Qmax)+' ; efixed = '+str(efixed))
pi4 = 4.0*math.pi
wave=1.8*math.sqrt(25.2429/efixed)
theta = []
for n in range(0,nQ):
qw = wave*Q[n]/pi4
ang = 2.0*math.degrees(math.asin(qw))
theta.append(ang)
ChangeAngles(outWS,instr,theta,Verbose)
if Save:
opath = os.path.join(workdir,outWS+'.nxs')
SaveNexusProcessed(InputWorkspace=outWS, Filename=opath)
if Verbose:
logger.notice('Output file : ' + opath)
if (Plot != 'None'):
plotMolDyn(outWS,Plot)
EndTime('MolDynAscii')
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment