From 4d272f6da9eadf0f5756ada5ea698b1da80577ff Mon Sep 17 00:00:00 2001
From: Elliot Oram <Elliot.Oram@stfc.ac.uk>
Date: Wed, 28 Oct 2015 10:14:57 +0000
Subject: [PATCH] Added Progress tracking to BayesQuasi

Refs #13944
---
 .../WorkflowAlgorithms/BayesQuasi.py          | 33 +++++++++++++++++--
 1 file changed, 30 insertions(+), 3 deletions(-)

diff --git a/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/BayesQuasi.py b/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/BayesQuasi.py
index 98cf247457b..652299627b2 100644
--- a/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/BayesQuasi.py
+++ b/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/BayesQuasi.py
@@ -1,7 +1,8 @@
 #pylint: disable=invalid-name,too-many-instance-attributes,too-many-branches,no-init
 from IndirectImport import *
 
-from mantid.api import PythonAlgorithm, AlgorithmFactory, MatrixWorkspaceProperty, PropertyMode, WorkspaceGroupProperty
+from mantid.api import (PythonAlgorithm, AlgorithmFactory, MatrixWorkspaceProperty, PropertyMode,
+                        WorkspaceGroupProperty, Progress)
 from mantid.kernel import StringListValidator, Direction
 from mantid.simpleapi import *
 from mantid import config, logger
@@ -142,18 +143,19 @@ class BayesQuasi(PythonAlgorithm):
                                    C2Se, QuasiPlot)
         from IndirectCommon import (CheckXrange, CheckAnalysers, getEfixed, GetThetaQ,
                                     CheckHistZero, CheckHistSame)
-
+        setup_prog = Progress(self, start=0.0, end=0.3, nreports = 5)
         self.log().information('BayesQuasi input')
 
         erange = [self._e_min, self._e_max]
         nbins = [self._sam_bins, self._res_bins]
-
+        setup_prog.report('Converting to binary for Fortran')
         #convert true/false to 1/0 for fortran
         o_el = 1 if self._elastic else 0
         o_w1 = 1 if self._width else 0
         o_res = 1 if self._res_norm else 0
 
         #fortran code uses background choices defined using the following numbers
+        setup_prog.report('Encoding input options')
         if self._background == 'Sloping':
             o_bgd = 2
         elif self._background == 'Flat':
@@ -163,12 +165,14 @@ class BayesQuasi(PythonAlgorithm):
 
         fitOp = [o_el, o_bgd, o_w1, o_res]
 
+        setup_prog.report('Establishing save path')
         workdir = config['defaultsave.directory']
         if not os.path.isdir(workdir):
             workdir = os.getcwd()
             logger.information('Default Save directory is not set. Defaulting to current working Directory: ' + workdir)
 
         array_len = 4096                           # length of array in Fortran
+        setup_prog.report('Checking X Range')
         CheckXrange(erange,'Energy')
 
         nbin,nrbin = nbins[0], nbins[1]
@@ -176,7 +180,9 @@ class BayesQuasi(PythonAlgorithm):
         logger.information('Sample is ' + self._samWS)
         logger.information('Resolution is ' + self._resWS)
 
+        setup_prog.report('Checking Analysers')
         CheckAnalysers(self._samWS,self._resWS)
+        setup_prog.report('Obtaining EFixed, theta and Q')
         efix = getEfixed(self._samWS)
         theta, Q = GetThetaQ(self._samWS)
 
@@ -190,6 +196,7 @@ class BayesQuasi(PythonAlgorithm):
 
         nres = CheckHistZero(self._resWS)[0]
 
+        setup_prog.report('Checking Histograms')
         if self._program == 'QL':
             if nres == 1:
                 prog = 'QLr'                        # res file
@@ -206,9 +213,11 @@ class BayesQuasi(PythonAlgorithm):
         logger.information(' Number of spectra = '+str(nsam))
         logger.information(' Erange : '+str(erange[0])+' to '+str(erange[1]))
 
+        setup_prog.report('Reading files')
         Wy,We = ReadWidthFile(self._width,self._wfile,totalNoSam)
         dtn,xsc = ReadNormFile(self._res_norm,self._resnormWS,totalNoSam)
 
+        setup_prog.report('Establishing output workspace name')
         fname = self._samWS[:-4] + '_'+ prog
         probWS = fname + '_Prob'
         fitWS = fname + '_Fit'
@@ -219,6 +228,7 @@ class BayesQuasi(PythonAlgorithm):
         wrkr=self._resWS
         wrkr.ljust(140,' ')
 
+        setup_prog.report('Initialising probability list')
         # initialise probability list
         if self._program == 'QL':
             prob0 = []
@@ -233,6 +243,7 @@ class BayesQuasi(PythonAlgorithm):
         eProb = np.zeros(3*nsam)
 
         group = ''
+        workflow_prog = Progress(self, start=0.3, end=0.7, nreports=nsam*3)
         for m in range(0,nsam):
             logger.information('Group ' +str(m)+ ' at angle '+ str(theta[m]))
             nsp = m+1
@@ -250,18 +261,21 @@ class BayesQuasi(PythonAlgorithm):
             reals = [efix, theta[m], rscl, bnorm]
 
             if prog == 'QLr':
+                workflow_prog.report('Running QLr for input %i' % nsam)
                 nd,xout,yout,eout,yfit,yprob=QLr.qlres(numb,Xv,Yv,Ev,reals,fitOp,
                                                        Xdat,Xb,Yb,Wy,We,dtn,xsc,
                                                        wrks,wrkr,lwrk)
                 message = ' Log(prob) : '+str(yprob[0])+' '+str(yprob[1])+' '+str(yprob[2])+' '+str(yprob[3])
                 logger.information(message)
             if prog == 'QLd':
+                workflow_prog.report('Running QLd for input %i' % nsam)
                 nd,xout,yout,eout,yfit,yprob=QLd.qldata(numb,Xv,Yv,Ev,reals,fitOp,
                                                         Xdat,Xb,Yb,Eb,Wy,We,
                                                         wrks,wrkr,lwrk)
                 message = ' Log(prob) : '+str(yprob[0])+' '+str(yprob[1])+' '+str(yprob[2])+' '+str(yprob[3])
                 logger.information(message)
             if prog == 'QSe':
+                workflow_prog.report('Running QSe for input %i' % nsam)
                 nd,xout,yout,eout,yfit,yprob=Qse.qlstexp(numb,Xv,Yv,Ev,reals,fitOp,\
                                                         Xdat,Xb,Yb,Wy,We,dtn,xsc,\
                                                         wrks,wrkr,lwrk)
@@ -271,6 +285,7 @@ class BayesQuasi(PythonAlgorithm):
             dataF1 = yfit_list[1]
             if self._program == 'QL':
                 dataF2 = yfit_list[2]
+            workflow_prog.report('Processing data')
             dataG = np.zeros(nd)
             datX = dataX
             datY = yout[:nd]
@@ -286,6 +301,7 @@ class BayesQuasi(PythonAlgorithm):
             names = 'data,fit.1,diff.1'
             res_plot = [0, 1, 2]
             if self._program == 'QL':
+                workflow_prog.report('Processing QL data')
                 datX = np.append(datX,dataX)
                 datY = np.append(datY,dataF2[:nd])
                 datE = np.append(datE,dataG)
@@ -304,15 +320,19 @@ class BayesQuasi(PythonAlgorithm):
             fitWS = fname+'_Workspaces'
             fout = fname+'_Workspace_'+ str(m)
 
+            workflow_prog.report('Creating OutputWorkspace')
             CreateWorkspace(OutputWorkspace=fout, DataX=datX, DataY=datY, DataE=datE,\
                 Nspec=nsp, UnitX='DeltaE', VerticalAxisUnit='Text', VerticalAxisValues=names)
 
             # append workspace to list of results
             group += fout + ','
 
+        comp_prog = Progress(self, start=0.7, end=0.8, nreports=2)
+        comp_prog.report('Creating Group Workspace')
         GroupWorkspaces(InputWorkspaces=group,OutputWorkspace=fitWS)
 
         if self._program == 'QL':
+            comp_prog.report('Processing QLr probability data')
             yPr0 = np.array([prob0[0]])
             yPr1 = np.array([prob1[0]])
             yPr2 = np.array([prob2[0]])
@@ -329,19 +349,26 @@ class BayesQuasi(PythonAlgorithm):
             if self._plot != 'None':
                 QuasiPlot(fname,self._plot,res_plot,self._loop)
         if self._program == 'QSe':
+            comp_prog.report('Runnning C2Se')
             outWS = C2Se(fname)
             if self._plot != 'None':
                 QuasiPlot(fname,self._plot,res_plot,self._loop)
 
+        log_prog = Progress(self, start=0.8, end =1.0, nreports=4)
         #Add some sample logs to the output workspaces
+        log_prog.report('Copying Logs to outputWorkspace')
         CopyLogs(InputWorkspace=self._samWS, OutputWorkspace=outWS)
+        log_prog.report('Adding Sample logs to QL output workspace')
         QLAddSampleLogs(outWS, self._resWS, prog, self._background, self._elastic, erange,
                         (nbin, nrbin), self._resnormWS, self._wfile)
+        log_prog.report('Copying logs to fit Workspace')
         CopyLogs(InputWorkspace=self._samWS, OutputWorkspace=fitWS)
+        log_prog.report('Adding sample logs to QL fit workspace')
         QLAddSampleLogs(fitWS, self._resWS, prog, self._background, self._elastic, erange,
                         (nbin, nrbin), self._resnormWS, self._wfile)
 
         if self._save:
+            log_prog.report('Saving workspaces')
             fit_path = os.path.join(workdir,fitWS+'.nxs')
             SaveNexusProcessed(InputWorkspace=fitWS, Filename=fit_path)
             out_path = os.path.join(workdir, outWS+'.nxs')                    # path name for nxs file
-- 
GitLab