Ticket #9265: LeakyFit.py

File LeakyFit.py, 3.3 KB (added by Martyn Gigg, 7 years ago)
Line 
1import math
2import numpy
3from mantid.api import * # PythonAlgorithm, registerAlgorithm, WorkspaceProperty
4from mantid.kernel import *
5from mantid.simpleapi import *
6
7class LeakyFunction(IFunction1D):
8        # equivalent to ExpDecayOsc
9        def init(self):
10                self.declareParameter("A",1.0)
11                self.declareParameter("Lambda",1.0)
12                self.declareParameter("Frequency",1.0)
13                self.declareParameter("Phi",1.0)
14
15        def function1D(self,xvals):
16                a=self.getParameterValue("A")
17                lam=self.getParameterValue("Lambda")
18                frq=self.getParameterValue("Frequency")
19                phi=self.getParameterValue("Phi")
20                return a*numpy.cos(xvals*frq*2.0*math.pi+phi)*numpy.exp(-xvals*lam)
21
22FunctionFactory.subscribe(LeakyFunction)
23
24class LeakyFit(PythonAlgorithm):
25        def PyInit(self):
26                #self.declareProperty(WorkspaceProperty("InputWS","",Direction.Input),"Source run")
27                #self.declareProperty(WorkspaceProperty("InputWS","",Direction.Input),"Data to fit, from CreateALCMap")
28                self.declareProperty(WorkspaceProperty("OutputWSChi","",Direction.Output),"Chisq as a function of fixed F")
29                self.declareProperty(WorkspaceProperty("OutputWSA","",Direction.Output),"Signal ampl as a function of fixed F")
30                #self.declareProperty("StartF",0.0,doc="Lowest val of F")
31                #self.declareProperty("EndF",0.5,doc="Highest val of F")
32                #self.declareProperty("FPoints",20,doc="Number of F values to try")
33                self.declareProperty("UsePythonFunc",True,doc="Use Python function instead of built in C++ one")
34
35        def category(self):
36                return "Muon"
37               
38        def PyExec(self):
39                #sourcedat=self.getProperty("InputWS").value
40                #(flatsource,Nspec,Y0,dY,dX)=QuantumFlattenWorkspace(InputWorkspace=sourcedat)
41                sourcedat=WorkspaceFactory.create("Workspace2D",NVectors=1,XLength=5000,YLength=5000)
42                sourcedat.dataX(0)[:]=numpy.linspace(0.0,32.0,5000)
43                sourcedat.dataY(0)[:]=10.0*numpy.cos(sourcedat.dataX(0))+0.1*numpy.random.randn(5000)
44                sourcedat.dataE(0)[:]=numpy.ones(5000)*0.1
45                # Y0=field val of 1st spectrum, dY=field increment, dX=X value offset between spectra
46
47                #StartF=self.getProperty("StartF").value
48                #EndF=self.getProperty("EndF").value
49                #FPoints=self.getProperty("FPoints").value
50                StartF=0.1
51                EndF=0.5
52                FPoints=20
53                usePythonFunc=self.getProperty("UsePythonFunc").value
54                resultws=WorkspaceFactory.create("Workspace2D",NVectors=1,XLength=FPoints,YLength=FPoints)
55                amplws=WorkspaceFactory.create("Workspace2D",NVectors=1,XLength=FPoints,YLength=FPoints)
56                # progress
57                prog_reporter=Progress(self,start=0.0, end=1.0, nreports=FPoints)
58                FVals=numpy.linspace(StartF,EndF,FPoints)
59                resultws.dataX(0)[:]=FVals
60                amplws.dataX(0)[:]=FVals
61               
62                for j in range(FPoints):
63                        F=FVals[j]
64                        if(usePythonFunc):
65                                (stat,chisq,Covar,params,curves)=Fit(Function="name=LeakyFunction,A=0.2,Lambda=0.05,Frequency="+str(F)+",Phi=0.0",
66                                        ties="Frequency="+str(F),InputWorkspace=sourcedat,Output="sourcedat")
67                        else:
68                                (stat,chisq,Covar,params,curves)=Fit(Function="name=ExpDecayOsc,A=0.2,Lambda=0.05,Frequency="+str(F)+",Phi=0.0",
69                                        ties="Frequency="+str(F),InputWorkspace=sourcedat,Output="sourcedat")
70                        resultws.dataY(0)[j]=chisq
71                        amplws.dataY(0)[j]=params.column(1)[0]
72                        DeleteWorkspace(Covar)
73                        DeleteWorkspace(params)
74                        DeleteWorkspace(curves)
75
76                        prog_reporter.report("Processing")
77                self.setProperty("OutputWSChi",resultws)
78                self.setProperty("OutputWSA",amplws)
79
80AlgorithmFactory.subscribe(LeakyFit)