Ticket #8392: IndirectJumpFit.py

File IndirectJumpFit.py, 2.5 KB (added by Samuel Jackson, 7 years ago)

Updated version of the script

Line 
1from mantid.simpleapi import *
2from mantid import config, logger, mtd
3from IndirectCommon import *
4from IndirectImport import import_mantidplot
5import sys, os.path
6mp = import_mantidplot()
7
8# Jump programs
9def JumpRun(samWS,jumpFunc,width,qmin,qmax,Verbose=False,Plot=False,Save=False):
10        StartTime('Jump fit : '+jumpFunc+' ; ')
11
12        workdir = getDefaultWorkingDirectory()
13
14        #select the width we wish to fit
15        spectumWs = "__" + samWS
16        ExtractSingleSpectrum(InputWorkspace=samWS, OutputWorkspace=spectumWs, WorkspaceIndex=width)
17
18        #crop the workspace between the given ranges
19        if Verbose:
20                logger.notice('Cropping from Q= ' + str(qmin) +' to '+ str(qmax))
21
22        CropWorkspace(InputWorkspace=spectumWs, OutputWorkspace=spectumWs,XMin=qmin, XMax=qmax)
23
24        #give the user some extra infromation is required
25        if Verbose:
26                inGR = mtd[samWS].getRun()
27                log = inGR.getLogData('fit_program')
28               
29                if log:
30                        val = log.value
31                        logger.notice('Fit program was : '+val)
32
33                logger.notice('Parameters in ' + samWS)
34
35        x = mtd[samWS].readX(0)
36        xmax = x[len(x)-1]
37
38        #select fit function to use
39        if jumpFunc == 'CE':
40                # Chudley-Elliott: HWHM=A*(1-sin*(Q*K)/(Q*K))
41                # for Q->0 W=A*Q^2*K^2/6
42
43                aval = xmax
44                bval = 1.5
45                func = 'name=UserFunction, Formula=a*(1-(sin(x*b))/(x*b)), a='+str(aval)+', b='+str(bval)
46        elif jumpFunc == 'SS':
47                # Singwi-Sjolander: HWHM=A*(1-exp(-r*Q^2))
48                # for Q->0 W=A*Q^2*r
49
50                aval = xmax
51                bval = 0.24
52                func = 'name=UserFunction, Formula=a*(1-exp(-x*x*b)), a='+str(aval)+', b='+str(bval)
53        else:
54                sys.exit("Error in Jump Fit: Invalid fit function supplied.")
55                return
56
57        #run fit function
58        fitWS = samWS[:-10] +'_'+ jumpFunc +'fit'
59        Fit(Function=func, InputWorkspace=spectumWs, CreateOutput=True, Output=fitWS)
60
61        #Add some sample logs to the output workspace
62        CopyLogs(InputWorkspace=samWS, OutputWorkspace=fitWS+'_Workspace')
63        AddSampleLog(Workspace=fitWS+'_Workspace', LogName="jump_function", LogType="String", LogText=jumpFunc)
64        AddSampleLog(Workspace=fitWS+'_Workspace', LogName="q_min", LogType="Number", LogText=str(qmin))
65        AddSampleLog(Workspace=fitWS+'_Workspace', LogName="q_max", LogType="Number", LogText=str(qmax))
66
67        #process output options
68        if Save:
69                fit_path = os.path.join(workdir,fitWS+'_Workspace.nxs')
70                SaveNexusProcessed(InputWorkspace=fitWS+'_Workspace', Filename=fit_path)
71               
72                if Verbose:
73                        logger.notice('Fit file is ' + fit_path)
74
75        if Plot:
76                JumpPlot(fitWS+'_Workspace')
77
78        EndTime('Jump fit : '+jumpFunc+' ; ')
79
80def JumpPlot(inputWS):
81    mp.plotSpectrum(inputWS,[0,1,2],True)