Ticket #7670: _procedures.py

File _procedures.py, 59.8 KB (added by Gesner Passos, 7 years ago)

The file for the new api.

Line 
1from math import *
2from mantid.simpleapi import *
3from mantid.api import WorkspaceGroup
4try:
5  from mantidplot import *
6except ImportError:
7  pass
8
9import numpy as n
10
11def addRuns(runlist,wname):
12  #DeleteWorkspace(str(wname))
13  output=str(wname)
14  if runlist[0] != "0":
15    #nzeros=8-len(str(runlist[0]))
16    #fpad=""
17    #for i in range(nzeros):
18    #  fpad+="0"
19    #filename="offspec"+fpad+str(runlist[0])+".nxs"
20    #fname=str(FileFinder.findRuns(filename))
21    #fname=str.replace(fname,'\\','/')
22    #fname=str.replace(fname,'[','')
23    #fname=str.replace(fname,']','')
24    #fname=str.replace(fname,'\'','')
25    #fname=fname.lower()
26    ##fname=str.replace(fname,'.nxs','.raw')
27    #Load(fname,output)
28        Load(str(runlist[0]),OutputWorkspace=output)
29  else:
30    #dae="ndx"+config['default.instrument'].lower()
31    dae="ndxoffspec"
32    LoadDAE(DAEname=dae,OutputWorkspace=output,SpectrumMin="1")
33    #LoadLiveData(Instrument="OFFSPEC",AccumulationMethod="Replace",OutputWorkspace="output")
34    if isinstance(mtd[output], WorkspaceGroup):
35        for k in mtd[output].getNames():
36                mtd[k].setYUnit('Counts')
37    else:
38        mtd[output].setYUnit('Counts')
39
40  if len(runlist) > 1:
41    for i in range(1,len(runlist)):
42      if runlist[i] != "0":
43        #nzeros=8-len(str(runlist[i]))
44        #fpad=""
45        #for j in range(nzeros):
46        #  fpad+="0"
47        #filename="offspec"+fpad+str(runlist[i])+".nxs"
48        #fname=str(FileFinder.findRuns(filename))
49        #fname=str.replace(fname,'\\','/')
50        #fname=str.replace(fname,'[','')
51        #fname=str.replace(fname,']','')
52        #fname=str.replace(fname,'\'','')
53        #fname=fname.lower()
54        ##fname=str.replace(fname,'.nxs','.raw')
55        #Load(fname,"wtemp")
56                Load(str(runlist[i]),OutputWorkspace="wtemp")
57      else:
58                #dae="ndx"+config['default.instrument'].lower()
59                dae="ndxoffspec"
60                LoadDAE(DAEname=dae,OutputWorkspace="wtemp",SpectrumMin="1")
61                #LoadLiveData(Instrument="OFFSPEC",AccumulationMethod="Replace",OutputWorkspace="output")
62                if isinstance(mtd['wtemp'], WorkspaceGroup):
63                        for k in mtd['wtemp'].getNames():
64                                mtd[k].setYUnit('Counts')
65                else:
66                        mtd[output].setYUnit('Counts')
67      Plus(output,"wtemp",OutputWorkspace=output)
68      DeleteWorkspace("wtemp")
69
70  #logger.notice("addRuns Completed")
71#
72#===================================================================================================================
73#
74'''
75parse a text string of the format "1-6:2+8+9,10+11+12+13-19:3,20-24"
76to return a structure containing the separated lists [1, 3, 5, 8, 9],
77[10, 11, 12, 13, 16, 19] and [20, 21, 22, 23, 24]
78as integer lists that addRuns can handle.
79'''
80def parseRunList(istring):
81        if len(istring) >0: 
82                s1=istring.split(',')
83                rlist1=[]
84                for i in range(len(s1)):
85                        tstr=s1[i].strip()
86                        if len(tstr) > 0:
87                                rlist1.append(tstr)
88                rlist=[]
89                for i in range(len(rlist1)):
90                        rlist2=[]
91                        if rlist1[i].find('+') >= 0:
92                                tstr=rlist1[i].split('+')
93                                for j in range(len(tstr)):
94                                        if tstr[j].find(':') >=0 and tstr[j].find('-') >=0:
95                                                tstr[j].strip()
96                                                tstr2=tstr[j].split('-')
97                                                tstr3=tstr2[1].split(':')
98                                                r1=range(int(tstr2[0]),int(tstr3[0])+1,int(tstr3[1]))
99                                                for k in r1:
100                                                        rlist2.append(str(k))
101                                        elif tstr[j].find('-') >=0:
102                                                tstr[j].strip()
103                                                tstr2=tstr[j].split('-')
104                                                r1=range(int(tstr2[0]),int(tstr2[1])+1)
105                                                for k in r1:
106                                                        rlist2.append(str(k))
107                                        else:
108                                                rlist2.append(tstr[j])
109                        else:
110                                if rlist1[i].find(':') >=0 and rlist1[i].find('-')>=0:
111                                        rlist1[i].strip()
112                                        tstr2=rlist1[i].split('-')
113                                        tstr3=tstr2[1].split(':')
114                                        r1=range(int(tstr2[0]),int(tstr3[0])+1,int(tstr3[1]))
115                                        for k in r1:
116                                                rlist2.append(str(k))
117                                elif rlist1[i].find('-')>=0:
118                                        rlist1[i].strip()
119                                        tstr2=rlist1[i].split('-')
120                                        r1=range(int(tstr2[0]),int(tstr2[1])+1)
121                                        for k in r1:
122                                                rlist2.append(str(k))
123                                else:
124                                        rlist2.append(rlist1[i])
125                        rlist.append(rlist2)
126        return rlist
127#
128#===================================================================================================================
129#
130def parseNameList(istring):
131        s1=istring.split(',')
132        namelist=[]
133        for i in range(len(s1)):
134                tstr=s1[i].strip()
135                namelist.append(tstr)   
136        return namelist
137
138#
139#===================================================================================================================
140#
141def floodnorm(wkspName,floodfile):
142   #
143   # pixel by pixel efficiency correction for the linear detector
144   #
145   flood_wksp = "ld240flood"
146   if  flood_wksp not in mtd:
147           LoadNexusProcessed(Filename=floodfile,OutputWorkspace=flood_wksp)
148
149   Divide(LHSWorkspace=wkspName, RHSWorkspace=flood_wksp, OutputWorkspace=wkspName)
150#
151#===================================================================================================================
152#
153# Plot a bunch of workspaces as 2D maps
154# using the supplied limits and log scale settings
155#
156def plot2D(wkspNames,limits,logScales):
157        nplot=0
158        workspace_mtx=[]
159        wNames=parseNameList(wkspNames)
160        for i in range(len(wNames)):
161                w1=mtd[wNames[i]]
162                if isinstance(w1, WorkspaceGroup):
163                        w1names=w1.getNames()
164                        for j in range(len(w1names)):
165                                #workspace_mtx.append(mantidplot.importMatrixWorkspace(w1names[j]))
166                                workspace_mtx.append(mantidplot.importMatrixWorkspace(w1names[j]))
167                                gr2d=workspace_mtx[nplot].plotGraph2D()
168                                nplot=nplot+1
169                                l=gr2d.activeLayer()
170                                if logScales[0]=="0":
171                                        l.setAxisScale(mantidplot.Layer.Bottom,float(limits[0]),float(limits[1]))
172                                elif logScales[0]=="2":
173                                        l.setAxisScale(mantidplot.Layer.Bottom,float(limits[0]),float(limits[1]),1)
174                                if logScales[1]=="0":
175                                        l.setAxisScale(mantidplot.Layer.Left,float(limits[2]),float(limits[3]))
176                                elif logScales[1]=="2":
177                                        l.setAxisScale(mantidplot.Layer.Left,float(limits[2]),float(limits[3]),1)
178                                if logScales[2]=="0":
179                                        l.setAxisScale(mantidplot.Layer.Right,float(limits[4]),float(limits[5]))
180                                elif logScales[2]=="2":
181                                        l.setAxisScale(mantidplot.Layer.Right,float(limits[4]),float(limits[5]),1)
182                else:
183                        workspace_mtx.append(mantidplot.importMatrixWorkspace(wNames[i]))
184                        gr2d=workspace_mtx[nplot].plotGraph2D()
185                        nplot=nplot+1
186                        l=gr2d.activeLayer()
187                        if logScales[0]=="0":
188                                l.setAxisScale(mantidplot.Layer.Bottom,float(limits[0]),float(limits[1]))
189                        elif logScales[0]=="2":
190                                l.setAxisScale(mantidplot.Layer.Bottom,float(limits[0]),float(limits[1]),1)
191                        if logScales[1]=="0":
192                                l.setAxisScale(mantidplot.Layer.Left,float(limits[2]),float(limits[3]))
193                        elif logScales[1]=="2":
194                                l.setAxisScale(mantidplot.Layer.Left,float(limits[2]),float(limits[3]),1)
195                        if logScales[2]=="0":
196                                l.setAxisScale(mantidplot.Layer.Right,float(limits[4]),float(limits[5]))
197                        elif logScales[2]=="2":
198                                l.setAxisScale(mantidplot.Layer.Right,float(limits[4]),float(limits[5]),1)
199               
200        logger.notice("plot2D finished")
201#
202#===================================================================================================================
203#
204# Plot a bunch of workspaces as 2D maps
205# using the supplied limits and log scale settings
206#
207def XYPlot(wkspNames,spectra,limits,logScales,errors,singleFigure):
208        wNames=parseNameList(wkspNames)
209        spec=parseNameList(spectra)
210        ploterr=0
211        xLog=0
212        yLog=0
213        if errors == "2":
214                ploterr=1
215        if logScales[0] == "2":
216                xLog=1
217        if logScales[1] == "2":
218                yLog=1
219               
220        if singleFigure == "2":
221                p1=plotSpectrum(wNames,spec,ploterr)
222                l=p1.activeLayer()
223                l.setAxisScale(mantidplot.Layer.Bottom,float(limits[0]),float(limits[1]),xLog)
224                l.setAxisScale(mantidplot.Layer.Left,float(limits[2]),float(limits[3]),yLog)
225        else:   
226                for i in range(len(wNames)):
227                        p1=plotSpectrum(wNames[i],spec,ploterr)
228                        l=p1.activeLayer()
229                        l.setAxisScale(mantidplot.Layer.Bottom,float(limits[0]),float(limits[1]),xLog)
230                        l.setAxisScale(mantidplot.Layer.Left,float(limits[2]),float(limits[3]),yLog)
231               
232        logger.notice("XYPlot finished")
233#
234#===================================================================================================================
235#
236def nrtestfn(runlist,wnames):
237       
238        rlist=parseRunList(runlist)
239        logger.notice("This is the runlist:"+str(rlist))
240        namelist=parseNameList(wnames)
241        logger.notice("This is the nameslist:"+str(namelist))
242        for i in range(len(rlist)):
243                addRuns(rlist[i],namelist[i])
244                #Load(Filename="L:/RawData/cycle_10_1/OFFSPEC0000"+str(rlist[i][j])+".nxs",OutputWorkspace="w"+str(rlist[i][j]),LoaderName="LoadISISNexus")
245
246        logger.notice("nrtestfn completed")
247'''
248        output="w7503"
249        plotper=[1,2]
250        rebpars="0.5,0.025,14.5"
251        spmin=0
252        spmax=239
253        Load(Filename="L:/RawData/cycle_10_1/OFFSPEC00007503.nxs",OutputWorkspace=output,LoaderName="LoadISISNexus")
254        workspace_mtx=[]
255        nplot=0
256        for i in plotper:
257                ConvertUnits(InputWorkspace=output+"_"+str(i),OutputWorkspace=output+"_"+str(i),Target="Wavelength",AlignBins="1")
258                Rebin(InputWorkspace=output+"_"+str(i),OutputWorkspace=output+"_"+str(i),Params=rebpars)
259                CropWorkspace(InputWorkspace=output+"_"+str(i),OutputWorkspace=output+"_"+str(i)+"m",StartWorkspaceIndex="1",EndWorkspaceIndex="1")
260                CropWorkspace(InputWorkspace=output+"_"+str(i),OutputWorkspace=output+"_"+str(i)+"d",StartWorkspaceIndex=str(spmin+4),EndWorkspaceIndex=str(spmax+4))
261                Divide(output+"_"+str(i)+"d",output+"_"+str(i)+"m",OutputWorkspace=output+"_"+str(i)+"n")
262                workspace_mtx.append(mantidplot.importMatrixWorkspace(output+"_"+str(i)+"n"))
263                gr2d=workspace_mtx[nplot].plotGraph2D()
264                nplot=nplot+1
265                l=gr2d.activeLayer()
266       
267        logger.notice("quickPlot Finished")
268'''
269def removeoutlayer(wksp):
270        # remove counts from bins where there are so few counts it makes a mess of the polarisation
271        # calculation
272        a1=mtd[wksp]
273        nspec=a1.getNumberHistograms()
274        x=a1.readX(0)
275        for i in range(nspec):
276                for j in range(len(x)-1):
277                        y=a1.readY(i)[j]
278                        if (y<2):
279                                a1.dataY(i)[j]=0.0;
280                                a1.dataE(i)[j]=0.0;
281
282def nrSESANSFn(runList,nameList,P0runList,P0nameList,minSpec,maxSpec,upPeriod,downPeriod,existingP0,SEConstants,gparams,convertToSEL,lnPOverLam,diagnostics="0",removeoutlayer="0",floodfile="none",):
283        nlist=parseNameList(nameList)
284        logger.notice("This is the sample nameslist:"+str(nlist))
285        rlist=parseRunList(runList)
286        logger.notice("This is the sample runlist:"+str(rlist))
287        for i in range(len(rlist)):
288                addRuns(rlist[i],nlist[i])
289
290        P0nlist=parseNameList(P0nameList)
291        logger.notice("This is the P0nameslist:"+str(P0nlist))
292        if existingP0 != "2":
293                P0rlist=parseRunList(P0runList)
294                logger.notice("This is the P0runlist:"+str(P0rlist))
295                for i in range(len(P0rlist)):
296                        addRuns(P0rlist[i],P0nlist[i])
297
298        mon_spec=int(gparams[3])-1
299        minSp=int(minSpec)-1
300        maxSp=int(maxSpec)-1
301        reb=gparams[0]+","+gparams[1]+","+gparams[2]
302        if len(gparams) == 5:
303                mapfile=gparams[4]
304       
305        for i in nlist:
306                a1=mtd[i+"_1"]
307                nspec=a1.getNumberHistograms()
308                if nspec == 1030 and minSp != 3:
309                        GroupDetectors(InputWorkspace=i,OutputWorkspace=i,MapFile=mapfile)
310                ConvertUnits(InputWorkspace=i,OutputWorkspace=i,Target="Wavelength",AlignBins=1)
311                Rebin(i,reb,OutputWorkspace=i)
312                if (removeoutlayer != "0"):
313                        removeoutlayer(i+"_1")
314                        removeoutlayer(i+"_2")
315                CropWorkspace(InputWorkspace=i,OutputWorkspace=i+"mon",StartWorkspaceIndex=mon_spec,EndWorkspaceIndex=mon_spec)
316                if nspec == 245:
317                        CropWorkspace(InputWorkspace=i,OutputWorkspace=i+"2ddet",StartWorkspaceIndex=4,EndWorkspaceIndex=243)
318                        if (floodfile != "none"):
319                                floodnorm(i+"2ddet",floodfile)
320                if nspec == 1030:
321                        CropWorkspace(InputWorkspace=i,OutputWorkspace=i+"2ddet",StartWorkspaceIndex=3,EndWorkspaceIndex=124)
322                if int(maxSpec) > int(minSpec):
323                        SumSpectra(InputWorkspace=i,OutputWorkspace=i+"det",StartWorkspaceIndex=minSp,EndWorkspaceIndex=maxSp)
324                else:
325                        CropWorkspace(InputWorkspace=i,OutputWorkspace=i+"det",StartWorkspaceIndex=minSp,EndWorkspaceIndex=maxSp)
326
327                Divide(LHSWorkspace=i+"det",RHSWorkspace=i+"mon",OutputWorkspace=i+"norm")
328                if nspec > 4 and minSp != 3:
329                        Divide(LHSWorkspace=i+"2ddet",RHSWorkspace=i+"mon",OutputWorkspace=i+"2dnorm")
330                DeleteWorkspace(i+"mon")
331                if (diagnostics == "0"):
332                        DeleteWorkspace(i+"det")
333                DeleteWorkspace(i)
334                Minus(LHSWorkspace=i+"norm_"+upPeriod,RHSWorkspace=i+"norm_"+downPeriod,OutputWorkspace="num")
335                Plus(LHSWorkspace=i+"norm_2",RHSWorkspace=i+"norm_1",OutputWorkspace="den")
336                Divide(LHSWorkspace="num",RHSWorkspace="den",OutputWorkspace=i+"pol")
337                ReplaceSpecialValues(InputWorkspace=i+"pol",OutputWorkspace=i+"pol",NanValue=0.0,NaNError=0.0,InfinityValue=0.0,InfinityError=0.0)
338                if nspec >4 and minSp != 3:
339                        #print i+"2dnorm_"+upPeriod
340                        #print i+"2dnorm_"+downPeriod
341                        Minus(LHSWorkspace=i+"2dnorm_"+upPeriod,RHSWorkspace=i+"2dnorm_"+downPeriod,OutputWorkspace="num")
342                        Plus(LHSWorkspace=i+"2dnorm_2",RHSWorkspace=i+"2dnorm_1",OutputWorkspace="den")
343                        Divide(LHSWorkspace="num",RHSWorkspace="den",OutputWorkspace=i+"2dpol")
344                        ReplaceSpecialValues(InputWorkspace=i+"2dpol",OutputWorkspace=i+"2dpol",NanValue=0.0,NaNError=0.0,InfinityValue=0.0,InfinityError=0.0)
345                #DeleteWorkspace(i+"norm_2")
346                #DeleteWorkspace(i+"norm_1")
347                DeleteWorkspace("num")
348                DeleteWorkspace("den")
349               
350        if existingP0 != "2":
351                for i in P0nlist:
352                        ConvertUnits(InputWorkspace=i,OutputWorkspace=i,Target="Wavelength",AlignBins=1)
353                        Rebin(InputWorkspace=i,OutputWorkspace=i,Params=reb)
354                        removeoutlayer(i+"_1")
355                        removeoutlayer(i+"_2")
356                        CropWorkspace(InputWorkspace=i,OutputWorkspace=i+"mon",StartWorkspaceIndex=mon_spec,EndWorkspaceIndex=mon_spec)
357                        if int(maxSpec) > int(minSpec):
358                                SumSpectra(InputWorkspace=i,OutputWorkspace=i+"det",StartWorkspaceIndex=minSp,EndWorkspaceIndex=maxSp)
359                        else:
360                                CropWorkspace(InputWorkspace=i,OutputWorkspace=i+"det",StartWorkspaceIndex=minSp,EndWorkspaceIndex=maxSp)
361                        Divide(LHSWorkspace=i+"det",RHSWorkspace=i+"mon",OutputWorkspace=i+"norm")
362                        DeleteWorkspace(i+"mon")
363                        DeleteWorkspace(i+"det")
364                        DeleteWorkspace(i)
365                        Minus(LHSWorkspace=i+"norm_"+upPeriod,RHSWorkspace=i+"norm_"+downPeriod,OutputWorkspace="num")
366                        Plus(LHSWorkspace=i+"norm_2",RHSWorkspace=i+"norm_1",OutputWorkspace="den")
367                        Divide(LHSWorkspace="num",RHSWorkspace="den",OutputWorkspace=i+"pol")
368                        ReplaceSpecialValues(InputWorkspace=i+"pol",OutputWorkspace=i+"pol",NanValue=0.0,NaNError=0.0,InfinityValue=0.0,InfinityError=0.0)
369                        DeleteWorkspace(i+"norm_2")
370                        DeleteWorkspace(i+"norm_1")
371                        DeleteWorkspace("num")
372                        DeleteWorkspace("den")
373               
374        for i in range(len(nlist)):
375                if existingP0 != "2":
376                        Divide(LHSWorkspace=nlist[i]+"pol",RHSWorkspace=P0nlist[i]+"pol",OutputWorkspace=nlist[i]+"SESANS")
377                        if nspec > 4 and minSp != 3:
378                                Divide(LHSWorkspace=nlist[i]+"2dpol",RHSWorkspace=P0nlist[i]+"pol",OutputWorkspace=nlist[i]+"2dSESANS")
379                else:
380                        Divide(LHSWorkspace=nlist[i]+"pol",RHSWorkspace=P0nlist[i],OutputWorkspace=nlist[i]+"SESANS")
381                        if nspec > 4 and minSp != 3:
382                                Divide(LHSWorkspace=nlist[i]+"2dpol",RHSWorkspace=P0nlist[i],OutputWorkspace=nlist[i]+"2dSESANS")
383                ReplaceSpecialValues(InputWorkspace=nlist[i]+"SESANS",OutputWorkspace=nlist[i]+"SESANS",NanValue=0.0,NaNError=0.0,InfinityValue=0.0,InfinityError=0.0)
384       
385        SEConstList=parseNameList(SEConstants)
386        k=0
387        for i in nlist:
388                if lnPOverLam == "2":
389                        CloneWorkspace(InputWorkspace=i+"SESANS",OutputWorkspace=i+"SESANS_P")
390                a1=mtd[i+"SESANS"]
391                x=numpy.array(a1.readX(0))
392                new_y = numpy.array(a1.dataY(0))
393                new_e = numpy.array(a1.dataE(0))
394
395                for j in range(len(x)-1):
396                        lam=((a1.readX(0)[j]+a1.readX(0)[j+1])/2.0)/10.0
397                        p=a1.readY(0)[j]
398                        e=a1.readE(0)[j]
399                        if lnPOverLam == "2":
400                                if p > 0.0:
401                                        new_y[j]=log(p)/((lam)**2)
402                                        new_e(0)[j]=(e/p)/((lam)**2)
403                                else:
404                                        new_y(0)[j]=0.0
405                                        new_e(0)[j]=0.0
406                for j in range(len(x)):
407                        if convertToSEL == "2":
408                                lam=a1.readX(0)[j]
409                                x[j]=1.0e-2*float(SEConstList[k])*lam*lam
410                                #print str(lam)+" "+str(1.0e-2*float(SEConstList[k])*lam*lam)
411                a1.setY(0, new_y)
412                a1.setE(0, new_e)
413                a1.setX(0, x)
414                k=k+1
415
416       
417        if nspec > 4 and minSp != 3:
418                k=0
419                for i in nlist:
420                        if lnPOverLam == "2":
421                                CloneWorkspace(InputWorkspace=i+"2dSESANS",OutputWorkspace=i+"2dSESANS_P")
422                        a1=mtd[i+"2dSESANS"]
423                        nspec=a1.getNumberHistograms()
424                        for l in range(nspec):
425                                x = numpy.array(a1.readX(l))
426                                new_y = numpy.array(a1.readY(l))
427                                new_e = numpy.array(a1.readE(l))
428                                for j in range(len(x)-1):
429                                        lam=((a1.readX(l)[j]+a1.readX(l)[j+1])/2.0)/10.0
430                                        p=a1.readY(l)[j]
431                                        e=a1.readE(l)[j]
432                                        if lnPOverLam == "2":
433                                                if p > 0.0:
434                                                        new_y[j]=log(p)/((lam*1.0e-9)**2)
435                                                        new_e[j]=(e/p)/((lam*1.0e-9)**2)
436                                                else:
437                                                        new_y[j]=0.0
438                                                        new_e[j]=0.0
439                                for j in range(len(x)):
440                                        if convertToSEL == "2":
441                                                lam=a1.readX(l)[j]                                               
442                                                x[j]=1.0e-2*float(SEConstList[k])*lam*lam
443                                                #print str(lam)+" "+str(1.0e-2*float(SEConstList[k])*lam*lam)
444                        a1.setY(l, new_y)
445                        a1.setE(l, new_e)
446                        a1.setX(l, x)
447                        k=k+1
448
449#
450#===========================================================
451#
452def nrCalcSEConst(RFFrequency,poleShoeAngle):
453        if (RFFrequency=="0.5"):
454                B=0.53*34.288
455        elif (RFFrequency=="1.0"):
456                B=34.288
457        else:
458                B=2.0*34.288
459       
460        h=6.62607e-34
461        m=1.67493e-27
462        L=1.0
463        Gl=1.83247e8
464        #
465        # correct the angle
466        # calibration of th0 using gold grating Dec 2010
467        #
468        th0=float(poleShoeAngle)
469        th0=-0.0000000467796*(th0**5)+0.0000195413*(th0**4)-0.00326229*(th0**3)+0.271767*(th0**2)-10.4269*th0+198.108
470        c1=Gl*m*2.0*B*L/(2.0*pi*h*tan(th0*pi/180.0)*1.0e20)
471        print c1*1e8
472        return c1*1e8
473#
474#===========================================================
475#
476def nrSESANSP0Fn(P0runList,P0nameList,minSpec,maxSpec,upPeriod,downPeriod,gparams,diagnostics="0"):
477
478        P0nlist=parseNameList(P0nameList)
479        logger.notice("This is the P0nameslist:"+str(P0nlist))
480        P0rlist=parseRunList(P0runList)
481        logger.notice("This is the P0runlist:"+str(P0rlist))
482        for i in range(len(P0rlist)):
483                addRuns(P0rlist[i],P0nlist[i])
484
485        mon_spec=int(gparams[3])-1
486        minSp=int(minSpec)-1
487        maxSp=int(maxSpec)-1
488        reb=gparams[0]+","+gparams[1]+","+gparams[2]
489        if len(gparams) == 5:
490                mapfile=gparams[4]
491
492        for i in P0nlist:
493                a1=mtd[i+"_1"]
494                nspec=a1.getNumberHistograms()
495                if nspec == 1030 and minSp != 3:
496                        GroupDetectors(InputWorkspace=i,OutputWorkspace=i,MapFile=mapfile)
497                ConvertUnits(InputWorkspace=i,OutputWorkspace=i,Target="Wavelength",AlignBins=1)
498                Rebin(InputWorkspace=i,OutputWorkspace=i,Params=reb)
499                CropWorkspace(InputWorkspace=i,OutputWorkspace=i+"mon",StartWorkspaceIndex=mon_spec,EndWorkspaceIndex=mon_spec)
500                if int(maxSpec) > int(minSpec):
501                        SumSpectra(InputWorkspace=i,OutputWorkspace=i+"det",StartWorkspaceIndex=minSp,EndWorkspaceIndex=maxSp)
502                else:
503                        CropWorkspace(InputWorkspace=i,OutputWorkspace=i+"det",StartWorkspaceIndex=minSp,EndWorkspaceIndex=maxSp)
504                Divide(LHSWorkspace=i+"det",RHSWorkspace=i+"mon",OutputWorkspace=i+"norm")
505                if (diagnostics=="0"):
506                        DeleteWorkspace(i+"mon")
507                        DeleteWorkspace(i+"det")
508                        DeleteWorkspace(i)
509                Minus(LHSWorkspace=i+"norm_"+upPeriod,RHSWorkspace=i+"norm_"+downPeriod,OutputWorkspace="num")
510                Plus(LHSWorkspace=i+"norm_2",RHSWorkspace=i+"norm_1",OutputWorkspace="den")
511                Divide(LHSWorkspace="num",RHSWorkspace="den",OutputWorkspace=i+"pol")
512                ReplaceSpecialValues(InputWorkspace=i+"pol",OutputWorkspace=i+"pol",NanValue=0.0,NaNError=0.0,InfinityValue=0.0,InfinityError=0.0)
513                if (diagnostics=="0"):
514                        DeleteWorkspace(i+"norm_2")
515                        DeleteWorkspace(i+"norm_1")
516                        DeleteWorkspace("num")
517                        DeleteWorkspace("den")
518#
519#===========================================================
520#
521def nrSERGISFn(runList,nameList,P0runList,P0nameList,incidentAngles,SEConstants,specChan,minSpec,maxSpec,upPeriod,downPeriod,existingP0,gparams,lnPOverLam):
522        nlist=parseNameList(nameList)
523        logger.notice("This is the sample nameslist:"+str(nlist))
524        rlist=parseRunList(runList)
525        logger.notice("This is the sample runlist:"+str(rlist))
526        incAngles=parseNameList(incidentAngles)
527        logger.notice("This incident Angles are:"+str(incAngles))
528
529        for i in range(len(rlist)):
530                addRuns(rlist[i],nlist[i])
531
532        P0nlist=parseNameList(P0nameList)
533        logger.notice("This is the P0nameslist:"+str(P0nlist))
534        if existingP0 != "2":
535                P0rlist=parseRunList(P0runList)
536                logger.notice("This is the P0runlist:"+str(P0rlist))
537                for i in range(len(P0rlist)):
538                        addRuns(P0rlist[i],P0nlist[i])
539
540        mon_spec=int(gparams[3])-1
541        minSp=int(minSpec)-1
542        maxSp=int(maxSpec)-1
543        reb=gparams[0]+","+gparams[1]+","+gparams[2]
544       
545        k=0
546        for i in nlist:
547                for j in range(2):
548                        wksp=i+"_"+pnums[j]
549                        ConvertUnits(InputWorkspace=wksp,OutputWorkspace=wksp,Target="Wavelength",AlignBins=1)
550                        Rebin(InputWorkspace=wksp,OutputWorkspace=wksp,Params=reb)
551                        CropWorkspace(InputWorkspace=wksp,OutputWorkspace=wksp+"mon",StartWorkspaceIndex=mon_spec,EndWorkspaceIndex=mon_spec)
552                        a1=mtd[wksp]
553                        nspec=a1.getNumberHistograms()
554                        if nspec == 4:
555                                CropWorkspace(InputWorkspace=wksp,OutputWorkspace=wksp+"det",StartWorkspaceIndex=3,EndWorkspaceIndex=3)
556                                RotateInstrumentComponent(wksp+"det","DetectorBench",X="-1.0",Angle=str(2.0*float(incAngles[k])))
557                                Divide(LHSWorkspace=wksp+"det",RHSWorkspace=wksp+"mon",OutputWorkspace=wksp+"norm")
558                        else:
559                                CropWorkspace(InputWorkspace=wksp,OutputWorkspace=wksp+"det",StartWorkspaceIndex=4,EndWorkspaceIndex=243)
560                                # move the first spectrum in the list onto the beam centre so that when the bench is rotated it's in the right place
561                                MoveInstrumentComponent(wksp+"det","DetectorBench",Y=str((125.0-float(minSpec))*1.2e-3))
562                                # add a bit to the angle to put the first spectrum of the group in the right place
563                                a1=2.0*float(incAngles[k])+atan((float(minSpec)-float(specChan))*1.2e-3/3.53)*180.0/pi
564                                #print str(2.0*float(incAngles[k]))+" "+str(atan((float(minSpec)-float(specChan))*1.2e-3/3.63)*180.0/pi)+" "+str(a1)
565                                RotateInstrumentComponent(wksp+"det","DetectorBench",X="-1.0",Angle=str(a1))
566                                GroupDetectors(InputWorkspace=wksp+"det",OutputWorkspace=wksp+"sum",WorkspaceIndexList=range(int(minSpec)-5,int(maxSpec)-5+1),KeepUngroupedSpectra="0")
567                                Divide(LHSWorkspace=wksp+"sum",RHSWorkspace=wksp+"mon",OutputWorkspace=wksp+"norm")
568                                Divide(LHSWorkspace=wksp+"det",RHSWorkspace=wksp+"mon",OutputWorkspace=wksp+"detnorm")
569                                floodnorm(wksp+"detnorm",floodfile)
570                                DeleteWorkspace(wksp+"sum")
571
572                        DeleteWorkspace(wksp+"mon")
573                        DeleteWorkspace(wksp+"det")
574                        DeleteWorkspace(wksp)
575                       
576                Minus(LHSWorkspace=i+"_"+upPeriod+"norm",RHSWorkspace=i+"_"+downPeriod+"norm",OutputWorkspace="num")
577                Plus(LHSWorkspace=i+"_1norm",RHSWorkspace=i+"_2norm",OutputWorkspace="den")
578                Divide(LHSWorkspace="num",RHSWorkspace="den",OutputWorkspace=i+"pol")
579                ReplaceSpecialValues(InputWorkspace=i+"pol",OutputWorkspace=i+"pol",NanValue=0.0,NaNError=0.0,InfinityValue=0.0,InfinityError=0.0)
580                DeleteWorkspace(i+"_1norm")
581                DeleteWorkspace(i+"_2norm")
582                DeleteWorkspace("num")
583                DeleteWorkspace("den")
584
585                if nspec != 4:
586                        Minus(LHSWorkspace=i+"_"+upPeriod+"detnorm",RHSWorkspace=i+"_"+downPeriod+"detnorm",OutputWorkspace="num")
587                        Plus(LHSWorkspace=i+"_1detnorm",RHSWorkspace=i+"_2detnorm",OutputWorkspace="den")
588                        Divide(LHSWorkspace="num",RHSWorkspace="den",OutputWorkspace=i+"2dpol")
589                        ReplaceSpecialValues(InputWorkspace=i+"2dpol",OutputWorkspace=i+"2dpol",NanValue=0.0,NaNError=0.0,InfinityValue=0.0,InfinityError=0.0)
590                        DeleteWorkspace(i+"_1detnorm")
591                        DeleteWorkspace(i+"_2detnorm")
592                        DeleteWorkspace("num")
593                        DeleteWorkspace("den")
594               
595        if existingP0 != "2":
596                for i in P0nlist:
597                        ConvertUnits(InputWorkspace=i,OutputWorkspace=i,Target="Wavelength",AlignBins=1)
598                        Rebin(InputWorkspace=i,OutputWorkspace=i,Params=reb)
599                        CropWorkspace(InputWorkspace=i,OutputWorkspace=i+"mon",StartWorkspaceIndex=mon_spec,EndWorkspaceIndex=mon_spec)
600                        if int(maxSpec) > int(minSpec):
601                                SumSpectra(InputWorkspace=i,OutputWorkspace=i+"det",StartWorkspaceIndex=minSp,EndWorkspaceIndex=maxSp)
602                        else:
603                                CropWorkspace(InputWorkspace=i,OutputWorkspace=i+"det",StartWorkspaceIndex=minSp,EndWorkspaceIndex=maxSp)
604                        Divide(LHSWorkspace=i+"det",RHSWorkspace=i+"mon",OutputWorkspace=i+"norm")
605                        DeleteWorkspace(i+"mon")
606                        DeleteWorkspace(i+"det")
607                        DeleteWorkspace(i)
608                        Minus(LHSWorkspace=i+"norm_"+upPeriod,RHSWorkspace=i+"norm_"+downPeriod,OutputWorkspace="num")
609                        Plus(LHSWorkspace=i+"norm_2",RHSWorkspace=i+"norm_1",OutputWorkspace="den")
610                        Divide(LHSWorkspace="num",RHSWorkspace="den",OutputWorkspace=i+"pol")
611                        ReplaceSpecialValues(InputWorkspace=i+"pol",OutputWorkspace=i+"pol",NanValue=0.0,NaNError=0.0,InfinityValue=0.0,InfinityError=0.0)
612                        DeleteWorkspace(i+"norm_2")
613                        DeleteWorkspace(i+"norm_1")
614                        DeleteWorkspace("num")
615                        DeleteWorkspace("den")
616               
617        for i in range(len(nlist)):
618                if existingP0 != "2":
619                        Divide(LHSWorkspace=nlist[i]+"pol",RHSWorkspace=P0nlist[i]+"pol",OutputWorkspace=nlist[i]+"SESANS")
620                else:
621                        Divide(LHSWorkspace=nlist[i]+"pol",RHSWorkspace=P0nlist[i]+"pol",OutputWorkspace=nlist[i]+"SESANS")
622                ReplaceSpecialValues(InputWorkspace=nlist[i]+"SESANS",OutputWorkspace=nlist[i]+"SESANS",NanValue=0.0,NaNError=0.0,InfinityValue=0.0,InfinityError=0.0)
623       
624        SEConstList=parseNameList(SEConstants)
625        k=0
626        for i in nlist:
627                a1=mtd[i+"SESANS"]
628                lam = ((a1.readX(0)[1:] + a1.readX(0)[:-1])/2.0)/10.0
629                p = a1.readY(0)
630                a1.setY(0, numpy.log(p)/((lam*1.0e-8)**2) )
631                a1.setX(0, 1.0e-2*float(SEConstList[k])*lam*lam)
632                k=k+1
633#
634#===========================================================
635#
636def nrNRFn(runList,nameList,incidentAngles,DBList,specChan,minSpec,maxSpec,gparams,floodfile,subbgd=0,qgroup=0,dofloodnorm=1,diagnostics=0):
637        nlist=parseNameList(nameList)
638        #logger.notice("This is the sample nameslist:"+str(nlist))
639        rlist=parseRunList(runList)
640        #logger.notice("This is the sample runlist:"+str(rlist))
641        dlist=parseNameList(DBList)
642        #logger.notice("This is the Direct Beam nameslist:"+str(dlist))
643        incAngles=parseNameList(incidentAngles)
644        #logger.notice("This incident Angles are:"+str(incAngles))
645
646        for i in range(len(rlist)):
647                addRuns(rlist[i],nlist[i])
648       
649        mon_spec=int(gparams[3])-1
650        reb=gparams[0]+","+gparams[1]+","+gparams[2]
651       
652        k=0
653        for i in nlist:
654                if isinstance(mtd[i], WorkspaceGroup):
655                        #RenameWorkspace(i+"_1",i)
656                        snames=mtd[i].getNames()
657                        Plus(LHSWorkspace=i+"_1",RHSWorkspace=i+"_2",OutputWorkspace="wtemp")
658                        if len(snames) > 2:
659                                for j in range(2,len(snames)-1):
660                                        Plus(LHSWorkspace="wtemp",RHSWorkspace=snames[j],OutputWorkspace="wtemp")
661                        for j in snames:
662                                DeleteWorkspace(j)
663                        RenameWorkspace(InputWorkspace="wtemp",OutputWorkspace=i)
664                ConvertUnits(InputWorkspace=i,OutputWorkspace=i,Target="Wavelength",AlignBins="1")
665                a1=mtd[i]
666                nspec=a1.getNumberHistograms()
667                if nspec == 4:
668                        Rebin(InputWorkspace=i,OutputWorkspace=i,Params=reb)
669                        CropWorkspace(InputWorkspace=i,OutputWorkspace=i+"mon",StartWorkspaceIndex=mon_spec,EndWorkspaceIndex=mon_spec)
670                        CropWorkspace(InputWorkspace=i,OutputWorkspace=i+"det",StartWorkspaceIndex=3,EndWorkspaceIndex=3)
671                        RotateInstrumentComponent(i+"det","DetectorBench",X="-1.0",Angle=str(2.0*float(incAngles[k])))
672                        Divide(LHSWorkspace=i+"det",RHSWorkspace=i+"mon",OutputWorkspace=i+"norm")
673                        if dlist[k] != "none":
674                                Divide(LHSWorkspace=i+"norm",RHSWorkspace=dlist[k],OutputWorkspace=i+"norm")
675                                ReplaceSpecialValues(InputWorkspace=i+"norm",OutputWorkspace=i+"norm",NanValue=0.0,NaNError=0.0,InfinityValue=0.0,InfinityError=0.0)
676                        ConvertUnits(InputWorkspace=i+"norm",OutputWorkspace=i+"RvQ",Target="MomentumTransfer")
677                else:
678                        # Rebin using internal parameters to avoid problems with summing in Q
679                        #internalreb=gparams[0]+",0.01,"+gparams[2]
680                        #Rebin(InputWorkspace=i,OutputWorkspace=i,Params=internalreb)
681                        minSp=int(minSpec)
682                        maxSp=int(maxSpec)
683                        CropWorkspace(InputWorkspace=i,OutputWorkspace=i+"det",StartWorkspaceIndex=4,EndWorkspaceIndex=243)
684                        if(dofloodnorm==1):
685                                floodnorm(i+"det",floodfile)
686                        # move the first spectrum in the list onto the beam centre so that when the bench is rotated it's in the right place
687                        MoveInstrumentComponent(i+"det","DetectorBench",Y=str((125.0-float(minSpec))*1.2e-3))
688                        # add a bit to the angle to put the first spectrum of the group in the right place
689                        a1=2.0*float(incAngles[k])+atan((float(minSpec)-float(specChan))*1.2e-3/3.53)*180.0/pi
690                        #print str(2.0*float(incAngles[k]))+" "+str(atan((float(minSpec)-float(specChan))*1.2e-3/3.63)*180.0/pi)+" "+str(a1)
691                        RotateInstrumentComponent(i+"det","DetectorBench",X="-1.0",Angle=str(a1))
692                        if (subbgd==1):
693                                # Calculate a background correction
694                                GroupDetectors(i+"det",OutputWorkspace=i+"bgd2",WorkspaceIndexList=range(0,50),KeepUngroupedSpectra="0")
695                                GroupDetectors(i+"det",OutputWorkspace=i+"bgd1",WorkspaceIndexList=range(160,240),KeepUngroupedSpectra="0")
696                                Plus(i+"bgd1",i+"bgd2",OutputWorkspace=i+"bgd")
697                                wbgdtemp=mtd[i+"bgd"]/130.0
698                                DeleteWorkspace(i+"bgd1")
699                                DeleteWorkspace(i+"bgd2")
700                                DeleteWorkspace(i+"bgd")
701                                # Subract a per spectrum background
702                                Minus(i+"det",wbgdtemp,OutputWorkspace=i+"det")
703                                if(diagnostics==0):
704                                        DeleteWorkspace("wbgdtemp")
705# Experimental convert to Q before summing
706                        if (qgroup==1):
707                                Rebin(InputWorkspace=i+"det",OutputWorkspace=i+"det",Params=reb)
708                                CropWorkspace(InputWorkspace=i+"det",OutputWorkspace=i+"detQ",StartWorkspaceIndex=int(minSpec)-5,EndWorkspaceIndex=int(maxSpec)-5+1)
709                                ConvertUnits(InputWorkspace=i+"detQ",OutputWorkspace=i+"detQ",Target="MomentumTransfer",AlignBins="1")
710                                GroupDetectors(i+"detQ",OutputWorkspace=i+"sum",WorkspaceIndexList=range(0,int(maxSpec)-int(minSpec)),KeepUngroupedSpectra="0")
711                                ConvertUnits(InputWorkspace=i+"sum",OutputWorkspace=i+"sum",Target="Wavelength",AlignBins="1")
712                                Rebin(InputWorkspace=i+"sum",OutputWorkspace=i+"sum",Params=reb)
713                                CropWorkspace(InputWorkspace=i,OutputWorkspace=i+"mon",StartWorkspaceIndex=mon_spec,EndWorkspaceIndex=mon_spec)
714                                Rebin(InputWorkspace=i+"mon",OutputWorkspace=i+"mon",Params=reb)
715                                Rebin(InputWorkspace=i+"det",OutputWorkspace=i+"det",Params=reb)
716                                DeleteWorkspace(i+"detQ")
717                        else:
718                                CropWorkspace(InputWorkspace=i,OutputWorkspace=i+"mon",StartWorkspaceIndex=mon_spec,EndWorkspaceIndex=mon_spec)
719                                Rebin(InputWorkspace=i+"mon",OutputWorkspace=i+"mon",Params=reb)
720                                Rebin(InputWorkspace=i+"det",OutputWorkspace=i+"det",Params=reb)
721                                GroupDetectors(InputWorkspace=i+"det",OutputWorkspace=i+"sum",WorkspaceIndexList=range(int(minSpec)-5,int(maxSpec)-5+1),KeepUngroupedSpectra="0")
722                        Divide(LHSWorkspace=i+"sum",RHSWorkspace=i+"mon",OutputWorkspace=i+"norm")
723                        Divide(LHSWorkspace=i+"det",RHSWorkspace=i+"mon",OutputWorkspace=i+"detnorm")
724                        if dlist[k]  == "none":
725                                a1=0
726                        elif dlist[k] == "function":
727                                # polynomial + power law corrections based on Run numbers 8291 and 8292
728                                Divide(LHSWorkspace=i+'norm',RHSWorkspace=i+'norm',OutputWorkspace=i+'normt1')
729                                PolynomialCorrection(InputWorkspace=i+'normt1',OutputWorkspace=i+'normPC',Coefficients='-0.0177398,0.00101695,0.0',Operation='Multiply')
730                                PowerLawCorrection(InputWorkspace=i+'normt1',OutputWorkspace=i+'normPLC',C0='2.01332',C1='-1.8188')
731                                Plus(LHSWorkspace=i+'normPC',RHSWorkspace=i+'normPLC',OutputWorkspace=i+'normt1')
732                                Divide(LHSWorkspace=i+'norm',RHSWorkspace=i+'normt1',OutputWorkspace=i+'norm')
733                                ReplaceSpecialValues(InputWorkspace=i+'norm',OutputWorkspace=i+'norm',NanValue=0.0,NaNError=0.0,InfinityValue=0.0,InfinityError=0.0)
734                                DeleteWorkspace(i+'normPC')
735                                DeleteWorkspace(i+'normPLC')
736                                DeleteWorkspace(i+'normt1')
737                        else:
738                                Divide(LHSWorkspace=i+"norm",RHSWorkspace=dlist[k],OutputWorkspace=i+"norm")
739                                ReplaceSpecialValues(InputWorkspace=i+"norm",OutputWorkspace=i+"norm",NanValue=0.0,NaNError=0.0,InfinityValue=0.0,InfinityError=0.0)
740                                Divide(LHSWorkspace=i+"detnorm",RHSWorkspace=dlist[k],OutputWorkspace=i+"detnorm")
741                                ReplaceSpecialValues(InputWorkspace=i+"detnorm",OutputWorkspace=i+"detnorm",NanValue=0.0,NaNError=0.0,InfinityValue=0.0,InfinityError=0.0)
742                        ConvertUnits(InputWorkspace=i+"norm",OutputWorkspace=i+"RvQ",Target="MomentumTransfer")
743                        #floodnorm(i+"detnorm",floodfile)
744                        DeleteWorkspace(i+"sum")
745                       
746                k=k+1
747                DeleteWorkspace(i)
748                if(diagnostics==0):
749                        DeleteWorkspace(i+"mon")
750                        DeleteWorkspace(i+"det")
751
752#
753#===========================================================
754#
755def findbin(wksp,val):
756        a1=mtd[wksp]
757        x1=a1.readX(0)
758        bnum=-1
759        for i in range(len(x1)-1):
760                if x1[i] > val:
761                        break
762        return i-1
763#
764#===========================================================
765#
766def nrDBFn(runListShort,nameListShort,runListLong,nameListLong,nameListComb,minSpec,maxSpec,minWavelength,gparams,floodfile="",diagnostics="0"):
767        nlistS=parseNameList(nameListShort)
768        rlistS=parseRunList(runListShort)
769        nlistL=parseNameList(nameListLong)
770        rlistL=parseRunList(runListLong)
771        nlistComb=parseNameList(nameListComb)
772
773        for i in range(len(rlistS)):
774                addRuns(rlistS[i],nlistS[i])
775        for i in range(len(rlistL)):
776                addRuns(rlistL[i],nlistL[i])
777       
778        mon_spec=int(gparams[3])-1
779        minSp=int(minSpec)-1
780        maxSp=int(maxSpec)-1
781        reb=gparams[0]+","+gparams[1]+","+gparams[2]
782       
783        for i in nlistS:
784                ConvertUnits(InputWorkspace=i,OutputWorkspace=i,Target="Wavelength",AlignBins="1")
785                Rebin(InputWorkspace=i,OutputWorkspace=i,Params=reb)
786                CropWorkspace(InputWorkspace=i,OutputWorkspace=i+"mon",StartWorkspaceIndex=mon_spec,EndWorkspaceIndex=mon_spec)
787                if isinstance(mtd[i], GroupWorkspace):
788                        snames=mtd[i].getNames()
789                        a1=mtd[snames[0]]
790                else:
791                        a1=mtd[i]
792               
793                nspec=a1.getNumberHistograms()
794               
795                if nspec == 4:
796                        CropWorkspace(InputWorkspace=i,OutputWorkspace=i+"det",StartWorkspaceIndex=3,EndWorkspaceIndex=3)
797                        Divide(i+"det",i+"mon",OutputWorkspace=i+"norm")
798                        ReplaceSpecialValues(i+"norm","0.0","0.0","0.0","0.0",OutputWorkspace=i+"norm")
799                else:
800                        CropWorkspace(InputWorkspace=i,OutputWorkspace=i+"det",StartWorkspaceIndex=4,EndWorkspaceIndex=243)
801                        floodnorm(i+"det",floodfile)
802                        GroupDetectors(i+"det",OutputWorkspace=i+"sum",WorkspaceIndexList=range(int(minSpec)-5,int(maxSpec)-5+1),KeepUngroupedSpectra="0")
803                        Divide(i+"sum",i+"mon",OutputWorkspace=i+"norm")
804                        ReplaceSpecialValues(i+"norm","0.0","0.0","0.0","0.0", OutputWorkspace=i+"norm")
805                       
806        for i in nlistL:
807                ConvertUnits(InputWorkspace=i,OutputWorkspace=i,Target="Wavelength",AlignBins="1")
808                Rebin(InputWorkspace=i,OutputWorkspace=i,Params=reb)
809                CropWorkspace(InputWorkspace=i,OutputWorkspace=i+"mon",StartWorkspaceIndex=mon_spec,EndWorkspaceIndex=mon_spec)
810                if isinstance(mtd[i], GroupWorkspace):
811                        lnames=mtd[i].getNames()
812                        a1=mtd[lnames[0]]
813                else:
814                        a1=mtd[i]
815
816                nspec=a1.getNumberHistograms()
817
818                if nspec == 4:
819                        CropWorkspace(InputWorkspace=i,OutputWorkspace=i+"det",StartWorkspaceIndex=3,EndWorkspaceIndex=3)
820                        Divide(i+"det",i+"mon",OutputWorkspace=i+"norm")
821                        ReplaceSpecialValues(i+"norm","0.0","0.0","0.0","0.0",OutputWorkspace=i+"norm")
822                else:
823                        CropWorkspace(InputWorkspace=i,OutputWorkspace=i+"det",StartWorkspaceIndex=4,EndWorkspaceIndex=243)
824                        floodnorm(i+"det",floodfile)
825                        GroupDetectors(i+"det",OutputWorkspace=i+"sum",WorkspaceIndexList=range(int(minSpec)-5,int(maxSpec)-5+1),KeepUngroupedSpectra="0")
826                        Divide(i+"sum",i+"mon",OutputWorkspace=i+"norm")
827                        ReplaceSpecialValues(i+"norm","0.0","0.0","0.0","0.0",OutputWorkspace=i+"norm")
828               
829        for i in range(len(nlistS)):
830                if isinstance(mtd[nlistS[i]+"norm"], GroupWorkspace):
831                        snames=mtd[nlistS[i]+"norm"].getNames()
832                        lnames=mtd[nlistL[i]+"norm"].getNames()
833                        for k in range(len(snames)):
834                                Integration(snames[k],minWavelength,gparams[2], OutputWorkspace=snames[k]+"int")
835                                Integration(lnames[k],minWavelength,gparams[2], OutputWorkspace=lnames[k]+"int")
836                                Multiply(snames[k],lnames[k]+"int",OutputWorkspace=snames[k])
837                                Divide(snames[k],snames[k]+"int",OutputWorkspace=snames[k])
838                                a1=findbin(lnames[k],float(minWavelength))
839                                MultiplyRange(lnames[k],"0",str(a1),"0.0",OutputWorkspace=lnames[k])
840                                WeightedMean(snames[k],nlistComb[i]+"_"+str(k+1),OutputWorkspace=lnames[k])
841                                if (diagnostics=="0"):
842                                        DeleteWorkspace(snames[k]+"int")
843                                        DeleteWorkspace(lnames[k]+"int")
844                else:
845                        Integration(nlistS[i]+"norm",minWavelength,gparams[2],OutputWorkspace=nlistS[i]+"int")
846                        Integration(nlistL[i]+"norm",minWavelength,gparams[2],OutputWorkspace=nlistL[i]+"int")
847                        Multiply(nlistS[i]+"norm",nlistL[i]+"int",OutputWorkspace=nlistS[i]+"norm")
848                        Divide(nlistS[i]+"norm",nlistS[i]+"int",OutputWorkspace=nlistS[i]+"norm")
849                        a1=findbin(nlistL[i]+"norm",float(minWavelength))
850                        MultiplyRange(nlistL[i]+"norm","0",str(a1),"0.0", OutputWorkspace=nlistL[i]+"norm")
851                        WeightedMean(nlistS[i]+"norm",nlistL[i]+"norm", OutputWorkspace=nlistComb[i])
852                        if (diagnostics=="0"):
853                                DeleteWorkspace(nlistS[i]+"int")
854                                DeleteWorkspace(nlistL[i]+"int")
855
856                        if (diagnostics=="0"):
857                                DeleteWorkspace(nlistS[i]+"mon")
858                                DeleteWorkspace(nlistS[i]+"det")
859                                if nspec != 4:
860                                        DeleteWorkspace(nlistS[i]+"sum")
861                                DeleteWorkspace(nlistS[i]+"norm")
862                                DeleteWorkspace(nlistS[i])
863                                DeleteWorkspace(nlistL[i]+"mon")
864                                DeleteWorkspace(nlistL[i]+"det")
865                                if nspec != 4:
866                                        DeleteWorkspace(nlistL[i]+"sum")
867                                DeleteWorkspace(nlistL[i]+"norm")
868                                DeleteWorkspace(nlistL[i])
869               
870#
871#===========================================================
872#
873def numberofbins(wksp):
874        a1=mtd[wksp]
875        y1=a1.readY(0)
876        return len(y1)-1
877#
878#===========================================================
879#
880def maskbin(wksp,val):
881        a1=mtd[wksp]
882        x1=a1.readX(0)
883        for i in range(len(x1)-1):
884                if x1[i] > val:
885                        break
886        a1.dataY(0)[i-1]=0.0
887        a1.dataE(0)[i-1]=0.0
888#
889#===========================================================
890#
891def arr2list(iarray):
892        # convert array of strings to a single string with commas
893        res=""
894        for i in range(len(iarray)-1):
895                res=res+iarray[i]+","
896        res=res+iarray[len(iarray)-1]
897        return res
898#
899#===========================================================
900#
901def NRCombineDatafn(RunsNameList,CombNameList,applySFs,SFList,SFError,scaleOption,bparams,globalSF,applyGlobalSF,diagnostics=0):
902        qmin=bparams[0]
903        bin=bparams[1]
904        qmax=bparams[2]
905        rlist=parseNameList(RunsNameList)
906        listsfs=parseNameList(SFList)
907        listsfserr=parseNameList(SFError)
908        sfs=[]
909        sferrs=[]
910        for i in rlist:
911                Rebin(i,qmin+","+bin+","+qmax,OutputWorkspace=i+"reb")
912        # find the overlap ranges
913        bol=[] #beginning of overlaps
914        eol=[] #end of overlaps
915        for i in range(len(rlist)-1):
916                a1=mtd[rlist[i+1]]
917                x=a1.readX(0)
918                bol.append(x[0])
919                a1=mtd[rlist[i]]
920                x=a1.readX(0)
921                eol.append(x[len(x)-1])
922        # set the edges of the rebinned data to 0.0 to avoid partial bin problems
923        maskbin(rlist[0]+"reb",eol[0])
924        if len(rlist) > 2:
925                for i in range(1,len(rlist)-1):
926                        maskbin(rlist[i]+"reb",bol[i-1])
927                        maskbin(rlist[i]+"reb",eol[i])
928        maskbin(rlist[len(rlist)-1]+"reb",bol[len(rlist)-2])
929        # Now find the various scale factors and store in temp workspaces
930        for i in range(len(rlist)-1):
931                Integration(rlist[i]+"reb",str(bol[i]),str(eol[i]), OutputWorkspace="i"+str(i)+"1temp")
932                Integration(rlist[i+1]+"reb",str(bol[i]),str(eol[i]), OutputWorkspace="i"+str(i)+"2temp")
933                if scaleOption != "2":
934                        Divide("i"+str(i)+"1temp","i"+str(i)+"2temp",OutputWorkspace="sf"+str(i))
935                        a1=mtd["sf"+str(i)]
936                        print "sf"+str(i)+"="+str(a1.readY(0))+" +/- "+str(a1.readE(0))
937                        sfs.append(str(a1.readY(0)[0]))
938                        sferrs.append(str(a1.readE(0)[0]))
939                else:
940                        Divide("i"+str(i)+"2temp","i"+str(i)+"1temp",OutputWorkspace="sf"+str(i))
941                        print "sf"+str(i)+"="+str(a1.readY(0))+" +/- "+str(a1.readE(0))
942                        sfs.append(str(a1.readY(0)[0]))
943                        sferrs.append(str(a1.readE(0)[0]))
944                DeleteWorkspace("i"+str(i)+"1temp")
945                DeleteWorkspace("i"+str(i)+"2temp")
946        # if applying pre-defined scale factors substitute the given values now
947        # Note the errors are now set to 0
948        if applySFs == "2":
949                for i in range(len(rlist)-1):
950                        a1=mtd["sf"+str(i)]
951                        a1.setY(0, float(listsfs[i]))
952                        a1.setE(0, float(listsfserr[i]))
953        # Now scale the various data sets in the correct order
954        if scaleOption != "2":
955                for i in range(len(rlist)-1):
956                        for j in range(i+1,len(rlist)):
957                                Multiply(rlist[j]+"reb","sf"+str(i),OutputWorkspace=rlist[j]+"reb")
958        else:
959                for i in range(len(rlist)-1,0,-1):
960                        for j in range(i,0,-1):
961                                Multiply(rlist[j]+"reb","sf"+str(i-1),OutputWorkspace=rlist[j]+"reb")
962
963        WeightedMean(rlist[0]+"reb",rlist[1]+"reb",OutputWorkspace="currentSum")
964        if len(rlist) > 2:
965                for i in range(2,len(rlist)):
966                        WeightedMean("currentSum",rlist[i]+"reb",OutputWorkspace="currentSum")
967       
968        # if applying a global scale factor do it here
969        if applyGlobalSF == "2":
970                scaledData=mtd['currentSum']/float(globalSF)
971                RenameWorkspace('scaledData',OutputWorkspace=CombNameList)
972                DeleteWorkspace('currentSum')
973        else:
974                RenameWorkspace('currentSum',OutputWorkspace=CombNameList)
975        for i in range(len(rlist)-1):
976                DeleteWorkspace("sf"+str(i))
977        if (diagnostics==0):
978                for i in range(len(rlist)):
979                        DeleteWorkspace(rlist[i]+"reb")
980        return [arr2list(sfs),arr2list(sferrs)] 
981       
982#
983#===========================================================
984#
985def nrWriteXYE(wksp,fname):
986        a1=mtd[wksp]
987        x1=a1.readX(0)
988        X1=n.zeros((len(x1)-1))
989        for i in range(0,len(x1)-1):
990                X1[i]=(x1[i]+x1[i+1])/2.0
991        y1=a1.readY(0)
992        e1=a1.readE(0)
993        f=open(fname,'w')
994        for i in range(len(X1)):
995                s=""
996                s+="%f," % X1[i]
997                s+="%f," % y1[i]
998                s+="%f\n" % e1[i] 
999                f.write(s)
1000        f.close()
1001#
1002#===========================================================
1003#
1004def nrPNRCorrection(UpWksp,DownWksp,calibration=0):
1005#       crho=[0.941893,0.0234006,-0.00210536,0.0]
1006#       calpha=[0.945088,0.0242861,-0.00213624,0.0]
1007#       cAp=[1.00079,-0.0186778,0.00131546,0.0]
1008#       cPp=[1.01649,-0.0228172,0.00214626,0.0]
1009        # Constants Based on Runs 18350+18355 and 18351+18356 analyser theta at -0.1deg
1010        # 2 RF Flippers as the polarising system
1011        if (calibration == 0):
1012                crho=[1.006831,-0.011467,0.002244,-0.000095]
1013                calpha=[1.017526,-0.017183,0.003136,-0.000140]
1014                cAp=[0.917940,0.038265,-0.006645,0.000282]
1015                cPp=[0.972762,0.001828,-0.000261,0.0]
1016        elif (calibration == 1):
1017        # Constants Based on Runs 19438-19458 and 19439+19459
1018        # Drabkin on incident side RF Flipper on analyser side, Dec 2012
1019                crho=[0.970257,0.016127,-0.002318,0.000090]
1020                calpha=[0.975722,0.012464,-0.002408,0.000105]
1021                cAp=[1.030894,-0.040847,0.006069,-0.000247]
1022                cPp=[0.961900,-0.003722,0.001094,-0.000057]
1023        elif (calibration == 2):
1024        # Constants Based on Runs 19628-19656 and 19660-19670 analyser -0.2deg
1025        # RF Flippers on polariser and analyser side Feb 2013
1026                crho=[0.945927,0.025421,-0.003647,0.000156]
1027                calpha=[0.940769,0.027250,-0.003848,0.000164]
1028                cAp=[0.974374,-0.005334,0.001313,-0.000115]
1029                cPp=[1.023141,-0.024548,0.003398,-0.000134]
1030        elif (calibration == 3):
1031        # Constants Based on Runs 19628-19656 and 19660-19670 analyser -0.1deg
1032        # RF Flippers on polariser and analyser side Feb 2013
1033                crho=[0.955384,0.021501,-0.002962,0.000112]
1034                calpha=[0.957789,0.019995,-0.002697,0.000099]
1035                cAp=[0.986906,-0.013945,0.002480,-0.000161]
1036                cPp=[0.999517,-0.013878,0.001680,-0.000043]
1037
1038        Ip = mtd[UpWksp]
1039        Ia = mtd[DownWksp]
1040        CloneWorkspace(Ip,OutputWorkspace="PCalpha")
1041        CropWorkspace(InputWorkspace="PCalpha",OutputWorkspace="PCalpha",StartWorkspaceIndex="0",EndWorkspaceIndex="0")
1042        PCalpha=(mtd['PCalpha']*0.0)+1.0
1043        alpha=mtd['PCalpha']
1044        # a1=alpha.readY(0)
1045        # for i in range(0,len(a1)):
1046                # alpha.dataY(0)[i]=0.0
1047                # alpha.dataE(0)[i]=0.0
1048        CloneWorkspace("PCalpha",OutputWorkspace="PCrho")
1049        CloneWorkspace("PCalpha",OutputWorkspace="PCAp")
1050        CloneWorkspace("PCalpha",OutputWorkspace="PCPp")
1051        rho=mtd['PCrho']
1052        Ap=mtd['PCAp']
1053        Pp=mtd['PCPp']
1054        # for i in range(0,len(a1)):
1055                # x=(alpha.dataX(0)[i]+alpha.dataX(0)[i])/2.0
1056                # for j in range(0,4):
1057                        # alpha.dataY(0)[i]=alpha.dataY(0)[i]+calpha[j]*x**j
1058                        # rho.dataY(0)[i]=rho.dataY(0)[i]+crho[j]*x**j
1059                        # Ap.dataY(0)[i]=Ap.dataY(0)[i]+cAp[j]*x**j
1060                        # Pp.dataY(0)[i]=Pp.dataY(0)[i]+cPp[j]*x**j
1061        PolynomialCorrection(InputWorkspace="PCalpha",OutputWorkspace="PCalpha",Coefficients=calpha,Operation="Multiply")
1062        PolynomialCorrection(InputWorkspace="PCrho",OutputWorkspace="PCrho",Coefficients=crho,Operation="Multiply")
1063        PolynomialCorrection(InputWorkspace="PCAp",OutputWorkspace="PCAp",Coefficients=cAp,Operation="Multiply")
1064        PolynomialCorrection(InputWorkspace="PCPp",OutputWorkspace="PCPp",Coefficients=cPp,Operation="Multiply")
1065        D=Pp*(1.0+rho)
1066        nIp=(Ip*(rho*Pp+1.0)+Ia*(Pp-1.0))/D
1067        nIa=(Ip*(rho*Pp-1.0)+Ia*(Pp+1.0))/D
1068        RenameWorkspace(nIp,OutputWorkspace=str(Ip)+"corr")
1069        RenameWorkspace(nIa,OutputWorkspace=str(Ia)+"corr")
1070        iwksp=mtd.getObjectNames()
1071        list_n=[str(Ip),str(Ia),"PCalpha","PCrho","PCAp","PCPp","1_p"]
1072        for i in range(len(iwksp)):
1073                for j in list_n:
1074                        lname=len(j)
1075                        if iwksp[i] [0:lname+1] == j+"_":
1076                                DeleteWorkspace(iwksp[i])
1077        DeleteWorkspace("PCalpha")
1078        DeleteWorkspace("PCrho")
1079        DeleteWorkspace("PCAp")
1080        DeleteWorkspace("PCPp")
1081        DeleteWorkspace("D")
1082#
1083#===========================================================
1084#
1085def nrPACorrection(UpUpWksp,UpDownWksp,DownUpWksp,DownDownWksp,calibration=0):
1086#       crho=[0.941893,0.0234006,-0.00210536,0.0]
1087#       calpha=[0.945088,0.0242861,-0.00213624,0.0]
1088#       cAp=[1.00079,-0.0186778,0.00131546,0.0]
1089#       cPp=[1.01649,-0.0228172,0.00214626,0.0]
1090        # Constants Based on Runs 18350+18355 and 18351+18356 analyser theta at -0.1deg
1091        # 2 RF Flippers as the polarising system
1092        if (calibration == 0):
1093                crho=[1.006831,-0.011467,0.002244,-0.000095]
1094                calpha=[1.017526,-0.017183,0.003136,-0.000140]
1095                cAp=[0.917940,0.038265,-0.006645,0.000282]
1096                cPp=[0.972762,0.001828,-0.000261,0.0]
1097        elif (calibration == 1):
1098        # Constants Based on Runs 19438-19458 and 19439+19459
1099        # Drabkin on incident side RF Flipper on analyser side Dec 2012
1100                crho=[0.970257,0.016127,-0.002318,0.000090]
1101                calpha=[0.975722,0.012464,-0.002408,0.000105]
1102                cAp=[1.030894,-0.040847,0.006069,-0.000247]
1103                cPp=[0.961900,-0.003722,0.001094,-0.000057]
1104        elif (calibration == 2):
1105        # Constants Based on Runs 19628-19656 and 19660-19670 analyser -0.2deg
1106        # RF Flippers on polariser and analyser side Feb 2013
1107                crho=[0.945927,0.025421,-0.003647,0.000156]
1108                calpha=[0.940769,0.027250,-0.003848,0.000164]
1109                cAp=[0.974374,-0.005334,0.001313,-0.000115]
1110                cPp=[1.023141,-0.024548,0.003398,-0.000134]
1111        elif (calibration == 3):
1112        # Constants Based on Runs 19628-19656 and 19660-19670 analyser -0.1deg
1113        # RF Flippers on polariser and analyser side Feb 2013
1114                crho=[0.955384,0.021501,-0.002962,0.000112]
1115                calpha=[0.957789,0.019995,-0.002697,0.000099]
1116                cAp=[0.986906,-0.013945,0.002480,-0.000161]
1117                cPp=[0.999517,-0.013878,0.001680,-0.000043]
1118       
1119        Ipp = mtd[UpUpWksp]
1120        Ipa = mtd[UpDownWksp]
1121        Iap = mtd[DownUpWksp]
1122        Iaa = mtd[DownDownWksp]
1123        CloneWorkspace(Ipp,OutputWorkspace="PCalpha")
1124        CropWorkspace(InputWorkspace="PCalpha",OutputWorkspace="PCalpha",StartWorkspaceIndex="0",EndWorkspaceIndex="0")
1125        PCalpha=(mtd['PCalpha']*0.0)+1.0
1126        alpha=mtd['PCalpha']
1127        # a1=alpha.readY(0)
1128        # for i in range(0,len(a1)):
1129                # alpha.dataY(0)[i]=0.0
1130                # alpha.dataE(0)[i]=0.0
1131        CloneWorkspace("PCalpha",OutputWorkspace="PCrho")
1132        CloneWorkspace("PCalpha",OutputWorkspace="PCAp")
1133        CloneWorkspace("PCalpha",OutputWorkspace="PCPp")
1134        rho=mtd['PCrho']
1135        Ap=mtd['PCAp']
1136        Pp=mtd['PCPp']
1137        # for i in range(0,len(a1)):
1138                # x=(alpha.dataX(0)[i]+alpha.dataX(0)[i])/2.0
1139                # for j in range(0,4):
1140                        # alpha.dataY(0)[i]=alpha.dataY(0)[i]+calpha[j]*x**j
1141                        # rho.dataY(0)[i]=rho.dataY(0)[i]+crho[j]*x**j
1142                        # Ap.dataY(0)[i]=Ap.dataY(0)[i]+cAp[j]*x**j
1143                        # Pp.dataY(0)[i]=Pp.dataY(0)[i]+cPp[j]*x**j
1144        # Use the polynomial corretion fn instead
1145        PolynomialCorrection(InputWorkspace="PCalpha",OutputWorkspace="PCalpha",Coefficients=calpha,Operation="Multiply")
1146        PolynomialCorrection(InputWorkspace="PCrho",OutputWorkspace="PCrho",Coefficients=crho,Operation="Multiply")
1147        PolynomialCorrection(InputWorkspace="PCAp",OutputWorkspace="PCAp",Coefficients=cAp,Operation="Multiply")
1148        PolynomialCorrection(InputWorkspace="PCPp",OutputWorkspace="PCPp",Coefficients=cPp,Operation="Multiply")
1149       
1150        A0 = (Iaa * Pp * Ap) + (Ap * Ipa * rho * Pp) + (Ap * Iap * Pp * alpha) + (Ipp * Ap * alpha * rho * Pp)
1151        A1 = Pp * Iaa
1152        A2 = Pp * Iap
1153        A3 = Ap * Iaa
1154        A4 = Ap * Ipa
1155        A5 = Ap * alpha * Ipp
1156        A6 = Ap * alpha * Iap
1157        A7 = Pp * rho  * Ipp
1158        A8 = Pp * rho  * Ipa
1159        D = Pp * Ap *( 1.0 + rho + alpha + (rho * alpha) ) 
1160        nIpp = (A0 - A1 + A2 - A3 + A4 + A5 - A6 + A7 - A8 + Ipp + Iaa - Ipa - Iap) / D
1161        nIaa = (A0 + A1 - A2 + A3 - A4 - A5 + A6 - A7 + A8 + Ipp + Iaa - Ipa - Iap) / D
1162        nIpa = (A0 - A1 + A2 + A3 - A4 - A5 + A6 + A7 - A8 - Ipp - Iaa + Ipa + Iap) / D
1163        nIap = (A0 + A1 - A2 - A3 + A4 + A5 - A6 - A7 + A8 - Ipp - Iaa + Ipa + Iap) / D
1164        RenameWorkspace(nIpp,OutputWorkspace=str(Ipp)+"corr")
1165        RenameWorkspace(nIpa,OutputWorkspace=str(Ipa)+"corr")
1166        RenameWorkspace(nIap,OutputWorkspace=str(Iap)+"corr")
1167        RenameWorkspace(nIaa,OutputWorkspace=str(Iaa)+"corr")
1168        ReplaceSpecialValues(str(Ipp)+"corr",OutputWorkspace=str(Ipp)+"corr",NaNValue="0.0",NaNError="0.0",InfinityValue="0.0",InfinityError="0.0")
1169        ReplaceSpecialValues(str(Ipp)+"corr",OutputWorkspace=str(Ipp)+"corr",NaNValue="0.0",NaNError="0.0",InfinityValue="0.0",InfinityError="0.0")
1170        ReplaceSpecialValues(str(Ipp)+"corr",OutputWorkspace=str(Ipp)+"corr",NaNValue="0.0",NaNError="0.0",InfinityValue="0.0",InfinityError="0.0")
1171        ReplaceSpecialValues(str(Ipp)+"corr",OutputWorkspace=str(Ipp)+"corr",NaNValue="0.0",NaNError="0.0",InfinityValue="0.0",InfinityError="0.0")
1172        iwksp=mtd.getObjectNames()
1173        list_n=[str(Ipp),str(Ipa),str(Iap),str(Iaa),"PCalpha","PCrho","PCAp","PCPp","1_p"]
1174        for i in range(len(iwksp)):
1175                for j in list_n:
1176                        lname=len(j)
1177                        if iwksp[i] [0:lname+1] == j+"_":
1178                                DeleteWorkspace(iwksp[i])
1179        DeleteWorkspace("PCalpha")
1180        DeleteWorkspace("PCrho")
1181        DeleteWorkspace("PCAp")
1182        DeleteWorkspace("PCPp")
1183        DeleteWorkspace('A0')
1184        DeleteWorkspace('A1')
1185        DeleteWorkspace('A2')
1186        DeleteWorkspace('A3')
1187        DeleteWorkspace('A4')
1188        DeleteWorkspace('A5')
1189        DeleteWorkspace('A6')
1190        DeleteWorkspace('A7')
1191        DeleteWorkspace('A8')
1192        DeleteWorkspace('D')
1193#
1194#===========================================================
1195#
1196def nrPNRFn(runList,nameList,incidentAngles,DBList,specChan,minSpec,maxSpec,gparams,floodfile,PNRwithPA,pnums,doCorrs,doLDCorrs="0",subbgd=0,calibration=0,diagnostics=0):
1197        nlist=parseNameList(nameList)
1198        logger.notice("This is the sample nameslist:"+str(nlist))
1199        rlist=parseRunList(runList)
1200        logger.notice("This is the sample runlist:"+str(rlist))
1201        dlist=parseNameList(DBList)
1202        logger.notice("This is the Direct Beam nameslist:"+str(dlist))
1203        incAngles=parseNameList(incidentAngles)
1204        logger.notice("This incident Angles are:"+str(incAngles))
1205       
1206        if PNRwithPA == "2":
1207                nper=4
1208                logger.notice("PNRwithPA="+str(PNRwithPA))
1209                logger.notice(str(pnums))
1210        else:
1211                nper=2
1212       
1213        for i in range(len(rlist)):
1214                addRuns(rlist[i],nlist[i])
1215       
1216        mon_spec=int(gparams[3])-1
1217        minSp=int(minSpec)
1218        maxSp=int(maxSpec)
1219        reb=gparams[0]+","+gparams[1]+","+gparams[2]
1220       
1221        k=0
1222        for i in nlist:
1223                a1=mtd[i+"_1"]
1224                nspec=a1.getNumberHistograms()
1225                if (subbgd==1 and nspec!=4):
1226                        # If a background subtraction is required sum the bgd outside the
1227                        # area of the detector that is visible through the analyser over all periods and average
1228                        CloneWorkspace(i, OutputWorkspace="bgdtemp")
1229                        ConvertUnits(InputWorkspace="bgdtemp",OutputWorkspace="bgdtemp",Target="Wavelength",AlignBins="1")
1230                        Rebin(InputWorkspace="bgdtemp",OutputWorkspace="bgdtemp",Params=reb)
1231                        CropWorkspace(InputWorkspace="bgdtemp",OutputWorkspace="bgdtemp",StartWorkspaceIndex=4,EndWorkspaceIndex=243)
1232                        Plus("bgdtemp"+"_"+pnums[0],"bgdtemp"+"_"+pnums[1],OutputWorkspace="wbgdsum")
1233                        if (nper>2):
1234                                for j in range(2,nper):
1235                                        Plus("wbgdsum","bgdtemp"+"_"+pnums[j],OutputWorkspace="wbgdsum")
1236                        GroupDetectors("wbgdsum",OutputWorkspace="bgd2",WorkspaceIndexList=range(0,50),KeepUngroupedSpectra="0")
1237                        GroupDetectors("wbgdsum",OutputWorkspace="bgd1",WorkspaceIndexList=range(160,240),KeepUngroupedSpectra="0")
1238                        Plus("bgd1","bgd2",OutputWorkspace="bgd")
1239                        wbgdtemp=mtd["bgd"]/(130.0*nper)
1240                        DeleteWorkspace("bgdtemp")
1241                        DeleteWorkspace("wbgdsum")
1242                        DeleteWorkspace("bgd1")
1243                        DeleteWorkspace("bgd2")
1244                        DeleteWorkspace("bgd")
1245                       
1246                wksp=i
1247                ConvertUnits(InputWorkspace=wksp,OutputWorkspace=wksp,Target="Wavelength",AlignBins="1")
1248                Rebin(InputWorkspace=wksp,OutputWorkspace=wksp,Params=reb)
1249                CropWorkspace(InputWorkspace=wksp,OutputWorkspace=wksp+"mon",StartWorkspaceIndex=mon_spec,EndWorkspaceIndex=mon_spec)
1250                if nspec == 4:
1251                        CropWorkspace(InputWorkspace=wksp,OutputWorkspace=wksp+"det",StartWorkspaceIndex=3,EndWorkspaceIndex=3)
1252                        RotateInstrumentComponent(wksp+"det","DetectorBench",X="-1.0",Angle=str(2.0*float(incAngles[k])))
1253                        Divide(LHSWorkspace=wksp+"det",RHSWorkspace=wksp+"mon",OutputWorkspace=wksp+"norm")
1254                        if dlist[k] != "none":
1255                                Divide(LHSWorkspace=wksp+"norm",RHSWorkspace=dlist[k],OutputWorkspace=wksp+"norm")
1256                                ReplaceSpecialValues(wksp+"norm","0.0","0.0","0.0","0.0",OutputWorkspace=wksp+"norm")
1257                                ConvertUnits(wksp+"norm",Target="MomentumTransfer",OutputWorkspace=wksp+"RvQ")
1258                        if(diagnostics==0):
1259                                DeleteWorkspace(wksp+"mon")
1260                                DeleteWorkspace(wksp+"det")
1261                else:
1262                        CropWorkspace(InputWorkspace=wksp,OutputWorkspace=wksp+"det",StartWorkspaceIndex=4,EndWorkspaceIndex=243)
1263                        # move the first spectrum in the list onto the beam centre so that when the bench is rotated it's in the right place
1264                        MoveInstrumentComponent(wksp+"det","DetectorBench",Y=str((125.0-float(minSpec))*1.2e-3))
1265                        # add a bit to the angle to put the first spectrum of the group in the right place
1266                        a1=2.0*float(incAngles[k])+atan((float(minSpec)-float(specChan))*1.2e-3/3.53)*180.0/pi
1267                        #print str(2.0*float(incAngles[k]))+" "+str(atan((float(minSpec)-float(specChan))*1.2e-3/3.63)*180.0/pi)+" "+str(a1)
1268                        RotateInstrumentComponent(wksp+"det","DetectorBench",X="-1.0",Angle=str(a1))
1269                        floodnorm(wksp+"det",floodfile)
1270                        if (subbgd==1):
1271                                # Subract a per spectrum background
1272                                Minus(wksp+"det",wbgdtemp,OutputWorkspace=wksp+"det")
1273                                ResetNegatives(InputWorkspace=wksp+"det",OutputWorkspace=wksp+"det",AddMinimum='0',ResetValue="0.0")
1274                                GroupDetectors(wksp+"det",OutputWorkspace=wksp+"sum",WorkspaceIndexList=range(int(minSpec)-5,int(maxSpec)-5+1),KeepUngroupedSpectra="0")
1275                        else:
1276                                GroupDetectors(wksp+"det",OutputWorkspace=wksp+"sum",WorkspaceIndexList=range(int(minSpec)-5,int(maxSpec)-5+1),KeepUngroupedSpectra="0")
1277                        RebinToWorkspace(WorkspaceToRebin=wksp+"sum",WorkspaceToMatch=wksp+"mon",OutputWorkspace=wksp+"sum")
1278                        Divide(LHSWorkspace=wksp+"sum",RHSWorkspace=wksp+"mon",OutputWorkspace=wksp+"norm")
1279                        RebinToWorkspace(WorkspaceToRebin=wksp+"det",WorkspaceToMatch=wksp+"mon",OutputWorkspace=wksp+"det")
1280                        Divide(LHSWorkspace=wksp+"det",RHSWorkspace=wksp+"mon",OutputWorkspace=wksp+"detnorm")
1281                        if dlist[k]  != "none":
1282                                Divide(LHSWorkspace=wksp+"norm",RHSWorkspace=dlist[k],OutputWorkspace=wksp+"norm")
1283                                ReplaceSpecialValues(wksp+"norm","0.0","0.0","0.0","0.0",OutputWorkspace=wksp+"norm")
1284                                Divide(LHSWorkspace=wksp+"detnorm",RHSWorkspace=dlist[k],OutputWorkspace=wksp+"detnorm")
1285                                ReplaceSpecialValues(wksp+"detnorm","0.0","0.0","0.0","0.0",OutputWorkspace=wksp+"detnorm")
1286                        ConvertUnits(wksp+"norm",OutputWorkspace=wksp+"RvQ",Target="MomentumTransfer")
1287                        if(diagnostics == 0):
1288                                DeleteWorkspace(wksp+"sum")
1289                                DeleteWorkspace(wksp+"mon")
1290                                DeleteWorkspace(wksp+"det")
1291                if doCorrs != "0":
1292                        if nper == 2:
1293                                nrPNRCorrection(i+"norm_"+pnums[0],i+"norm_"+pnums[1],calibration=calibration)
1294                                for j in range(2):
1295                                        RenameWorkspace(InputWorkspace=i+"norm"+"_"+pnums[j]+"corr",OutputWorkspace=i+"normcorr"+"_"+pnums[j])
1296                                GroupWorkspaces(InputWorkspaces=i+"normcorr_"+pnums[0]+","+i+"normcorr_"+pnums[1],OutputWorkspace=i+"normcorr")
1297                                ConvertUnits(InputWorkspace=i+"normcorr",OutputWorkspace=i+"normcorrRvQ",Target="MomentumTransfer")
1298                                if (nspec > 4 and doLDCorrs != "0"):
1299                                        nrPNRCorrection(i+"detnorm_"+pnums[0],i+"detnorm_"+pnums[1],calibration=calibration)
1300                                        for j in range(4):
1301                                                RenameWorkspace(InputWorkspace=i+"detnorm"+"_"+pnums[j]+"corr",OutputWorkspace=i+"detnormcorr"+"_"+pnums[j])
1302                                        GroupWorkspaces(InputWorkspaces=i+"detnormcorr_"+pnums[0]+","+i+"detnormcorr_"+pnums[1],OutputWorkspace=i+"detnormcorr")
1303                        else:
1304                                nrPACorrection(i+"norm"+"_"+pnums[0],i+"norm"+"_"+pnums[1],i+"norm"+"_"+pnums[2],i+"norm"+"_"+pnums[3],calibration=calibration)
1305                                for j in range(4):
1306                                        RenameWorkspace(InputWorkspace=i+"norm"+"_"+pnums[j]+"corr",OutputWorkspace=i+"normcorr"+"_"+pnums[j])
1307                                GroupWorkspaces(InputWorkspaces=i+"normcorr_"+pnums[0]+","+i+"normcorr_"+pnums[1]+","+i+"normcorr_"+pnums[2]+","+i+"normcorr_"+pnums[3]+"",OutputWorkspace=i+"normcorr")
1308                                ConvertUnits(InputWorkspace=i+"normcorr",OutputWorkspace=i+"normcorrRvQ",Target="MomentumTransfer")
1309                                if (nspec > 4 and doLDCorrs != "0"):
1310                                        nrPACorrection(i+"detnorm_"+pnums[0],i+"detnorm_"+pnums[1],i+"detnorm_"+pnums[2],i+"detnorm_"+pnums[3],calibration=calibration)
1311                                        for j in range(4):
1312                                                RenameWorkspace(InputWorkspace=i+"detnorm"+"_"+pnums[j]+"corr",OutputWorkspace=i+"detnormcorr"+"_"+pnums[j])
1313                                        GroupWorkspaces(InputWorkspaces=i+"detnormcorr_"+pnums[0]+","+i+"detnormcorr_"+pnums[1]+","+i+"detnormcorr_"+pnums[2]+","+i+"detnormcorr_"+pnums[3]+"",OutputWorkspace=i+"detnormcorr")
1314                        if (diagnostics == 0 and doCorrs != "0"):
1315                                DeleteWorkspace(i+"norm")
1316                                #DeleteWorkspace(i+"RvQ")
1317                        if (diagnostics == 0 and doLDCorrs != "0"):
1318                                DeleteWorkspace(i+"detnorm")
1319                k=k+1
1320                DeleteWorkspace(i)
1321                if (subbgd==1):
1322                        DeleteWorkspace("wbgdtemp")
1323#
1324#===========================================================
1325#
1326def tl(wksp,th0,schan):
1327        pixel=1.2
1328        dist=3630
1329        ThetaInc=th0*pi/180.0
1330        a1=mtd[wksp]
1331        y=a1.readY(0)
1332        ntc=len(y)
1333        nspec=a1.getNumberHistograms()
1334        x1=n.zeros((nspec+1,ntc+1))
1335        theta=n.zeros((nspec+1,ntc+1))
1336        y1=n.zeros((nspec,ntc))
1337        e1=n.zeros((nspec,ntc))
1338        for i in range(0,nspec):
1339                x=a1.readX(i)
1340                y=a1.readY(i)
1341                e=a1.readE(i)
1342                x1[i,0:ntc+1]=x[0:ntc+1]
1343                theta[i,:]=atan2( (i - schan-0.5) * pixel + dist * tan(ThetaInc) , dist)*180/pi
1344                y1[i,0:ntc]=y[0:ntc]
1345                e1[i,0:ntc]=e[0:ntc]
1346        x1[nspec,:]=x1[nspec-1,:]
1347        theta[nspec,:]=atan2( (nspec - schan-0.5) * pixel + dist * tan(ThetaInc) , dist)*180/pi
1348        d1=[x1,theta,y1,e1]
1349        return d1
1350#
1351#===========================================================
1352#
1353def writemap_tab(dat,th0,spchan,fname):
1354        a1=tl(dat,th0,spchan)
1355        f=open(fname,'w')
1356        x=a1[0]
1357        y=a1[1]
1358        z=a1[2]
1359        e=a1[3]
1360        s="\t"
1361        for i in range(0,n.shape(z)[1]-1):
1362                s+="%g\t" % ((x[0][i]+x[0][i+1])/2.0)
1363                s+="%g\t" % ((x[0][i]+x[0][i+1])/2.0)
1364        s+="\n"
1365        f.write(s)
1366        for i in range(0,n.shape(y)[0]-1):
1367                s=""
1368                s+="%g\t" % ((y[i][0]+y[i+1][0])/2.0)
1369                for j in range(0,n.shape(z)[1]-1):
1370                        s+="%g\t" % z[i][j]
1371                        s+="%g\t" % e[i][j]
1372                s+="\n"
1373                f.write(s)
1374        f.close()
1375#
1376#===========================================================
1377#
1378def xye(wksp):
1379        a1=mtd[wksp]
1380        x1=a1.readX(0)
1381        X1=n.zeros((len(x1)-1))
1382        for i in range(0,len(x1)-1):
1383                X1[i]=(x1[i]+x1[i+1])/2.0
1384        y1=a1.readY(0)
1385        e1=a1.readE(0)
1386        d1=[X1,y1,e1]
1387        return d1
1388#
1389#======================================================================================
1390#
1391def writeXYE_tab(dat,fname):
1392        a1=xye(dat)
1393        f=open(fname,'w')
1394        x=a1[0]
1395        y=a1[1]
1396        e=a1[2]         
1397        s=""
1398        s+="x\ty\te\n"
1399        f.write(s)
1400        for i in range(len(x)):
1401                s=""
1402                s+="%f\t" % x[i]
1403                s+="%f\t" % y[i]
1404                s+="%f\n" % e[i] 
1405                f.write(s)
1406        f.close()
1407
1408
1409'''
1410def quickPlot(runlist,dataDir,lmin,reb,lmax,spmin,spmax,output,plotper,polper,zmin,zmax,zlog):
1411
1412        isisDataDir=dataDir
1413        logger.notice("setting dataDir="+dataDir+" "+isisDataDir)
1414        deleteFromRootName(output)
1415        addruns(runlist,output)
1416        nper=nperFromList(output)
1417        rebpars=str(lmin)+","+str(reb)+","+str(lmax)
1418               
1419        if nper == 1:
1420                ConvertUnits(InputWorkspace=output,OutputWorkspace=output,Target="Wavelength",AlignBins="1")
1421                Rebin(InputWorkspace=output,OutputWorkspace=output,Params=rebpars)
1422                CropWorkspace(InputWorkspace=output,OutputWorkspace=output+"m",StartWorkspaceIndex="1",EndWorkspaceIndex="1")
1423                CropWorkspace(InputWorkspace=output,OutputWorkspace=output+"d",StartWorkspaceIndex=str(spmin+4),EndWorkspaceIndex=str(spmax+4))
1424                Divide(output+"d",output+"m",OutputWorkspace=output+"n")
1425                workspace_mtx=mantidplot.importMatrixWorkspace(output+"n")
1426                gr2d=workspace_mtx.plotGraph2D()
1427                l=gr2d.activeLayer()
1428                if zlog == 0:
1429                        l.setAxisScale(1,zmin,zmax,0)
1430                else:
1431                        l.setAxisScale(1,zmin,zmax,1)
1432        else:
1433                workspace_mtx=[]
1434                nplot=0
1435                for i in plotper:
1436                        ConvertUnits(InputWorkspace=output+"_"+str(i),OutputWorkspace=output+"_"+str(i),Target="Wavelength",AlignBins="1")
1437                        Rebin(InputWorkspace=output+"_"+str(i),OutputWorkspace=output+"_"+str(i),Params=rebpars)
1438                        CropWorkspace(InputWorkspace=output+"_"+str(i),OutputWorkspace=output+"_"+str(i)+"m",StartWorkspaceIndex="1",EndWorkspaceIndex="1")
1439                        CropWorkspace(InputWorkspace=output+"_"+str(i),OutputWorkspace=output+"_"+str(i)+"d",StartWorkspaceIndex=str(spmin+4),EndWorkspaceIndex=str(spmax+4))
1440                        Divide(output+"_"+str(i)+"d",output+"_"+str(i)+"m",OutputWorkspace=output+"_"+str(i)+"n")
1441                        workspace_mtx.append(mantidplot.importMatrixWorkspace(output+"_"+str(i)+"n"))
1442                        gr2d=workspace_mtx[nplot].plotGraph2D()
1443                        nplot=nplot+1
1444                        l=gr2d.activeLayer()
1445                        if zlog == 0:
1446                                l.setAxisScale(1,zmin,zmax,0)
1447                        else:
1448                                l.setAxisScale(1,zmin,zmax,1)
1449               
1450                up=mtd[output+"_2d"]
1451                down=mtd[output+"_1d"]
1452                asym=(up-down)/(down+up)
1453                RenameWorkspace(asym,OutputWorkspace=output+"_asym")
1454                ReplaceSpecialValues(output+"_asym",OutputWorkspace=output+"_asym","0.0","0.0","0.0","0.0")
1455                workspace_mtx.append(mantidplot.importMatrixWorkspace(output+"_asym"))
1456                gr2d=workspace_mtx[nplot].plotGraph2D()
1457                l=gr2d.activeLayer()
1458                l.setAxisScale(1,-1.0,1.0,0)
1459
1460
1461        logger.notice("quickPlot Finished)
1462'''
1463