Ticket #6530: SANS2d_event_to_hist_4.py

File SANS2d_event_to_hist_4.py, 6.3 KB (added by Gesner Passos, 7 years ago)

Richard offered his scripts being used to slice and rebin event data.

Line 
1#
2#  25/10/11 takes slices out of SANS2d event mode file and turn to histogram
3#  11/12/12 SER corrected spectrum range, was adrfit by 4 spectra (oops)
4#  26/7/13 RKH, conjoin failing on mis-matched spectra, checked carefully, need index=8 to 36871
5#   26/7/13 RKH rewritten some calls to work with new api - results sem OK compared to previous version.
6import time as tim
7import calendar as cal
8#from datetime import timedelta
9#from ISISCommandInterface import *
10from mantid.simpleapi import *
11# example time handling from Rob Dalgleish (thanks !)   1319280436.54
12#t1="2011-Oct-22 10:47:16.539999961"
13#t3=t1.split('.')
14#print t3
15#t4=cal.timegm(tim.strptime(t3[0],"%Y-%b-%d %H:%M:%S"))
16#print t4+float('0.'+t3[1])
17#
18#  ================================================ INPUT DATA HERE =================================     
19#DataPath=("y:/cycle_13_3/")
20#DataPath=("z:/processed/SANS2d/")
21samplefilename='SANS2D00017523'
22# list of times to slice between,
23slicelist=[0,30,5000,10000]
24#  extensions .n001, .n002, .n003 etc, give first extension number here
25savext=1
26# ichan is the index for "time zero" in the per pulse proton log.  NOTE presume the proton log is for previous 0.1 sec
27# so if you want 0.1 sec resolution you may need to adjust the slicelist numbers very carefully !
28ichan=0
29# ===================================================================================================
30sampleext='.nxs'
31# note LoadEventNexus can also do the additional filtering.  It does not by default load the monitors!
32# (with LoadMonitors=True a separate workspace appears called SampleEvent_monitors with their 8 histogram spectra)
33SampleEvents=LoadEventNexus(samplefilename+sampleext,LoadMonitors=False)
34# We noted that LoadEventNexus does not load all the neccessary matadata, hence use LoadNexus to get the metadata and monitors.
35SampleMonHist=LoadNexus(samplefilename,SpectrumMin=1,SpectrumMax=8)
36#CropWorkspace('SampleMonHist','SampleMonHist',StartWorkspaceIndex=0,EndWorkspaceIndex=7)
37#
38ws=mtd["SampleEvents"]
39r= ws.getRun()
40time_array = r.getLogData("proton_charge").times
41value_array = r.getLogData("proton_charge").value
42#
43unit_array = r.getLogData("proton_charge").units
44#print dir(r.getLogData("proton_charge"))
45#print dir(time_array)
46#
47tarr=[]
48# converting individual elements of the time_arry with str(time_array[i]) results in format change and loss of the fractions of sec
49# however Rob discovered (by accident) that str( ) of the whole array at once does work, then need to split it up again ...
50tarr2str=str(time_array)
51tarr2str=tarr2str[1:len(tarr2str)-1].split(',')
52print " some debugging info ..."
53print time_array[0],tarr2str[0]
54print time_array[1],tarr2str[1]
55print time_array[2],tarr2str[2]
56print time_array[3],tarr2str[3]
57print time_array[4],tarr2str[4]
58#
59# choose start time index
60ichan=0
61t1=tarr2str[ichan]
62t2=t1.split('.')
63t3=cal.timegm(tim.strptime(t2[0],"%Y-%b-%d %H:%M:%S"))
64print t1,t2,t3
65tstart=float(t3)+float('0.'+t2[1])
66npts=len(tarr2str)
67print "start index=",ichan,"  ",t1,"   mintime=",tstart,"  npts=",npts
68#
69print " more debugging info ..."
70for i in range(npts):
71        t1=tarr2str[i]
72        t2=t1.split('.')
73        # aagh is falling over when there are no fractions of a second, so no '.' and no t2[1]
74        t2.append("0")
75        t3=cal.timegm(tim.strptime(t2[0],"%Y-%b-%d %H:%M:%S"))
76       
77        tarr.append(float(t3)+float('0.'+t2[1])-tstart)
78        if i<20:
79                print t1,t3,tarr[i],value_array[i]
80tmax=tarr[npts-1]
81print "first 20 times =",tarr[0:20]
82print "last 20 times =",tarr[npts-21:npts-1]
83#
84def findCharge(tarr,varr,tmin,tmax):
85        imin=len(tarr)
86        imax=0
87        for i in range(len(tarr)):
88                imin=i
89                if tarr[i]>=tmin:
90                        break
91        for i in range(len(tarr)):
92                imax=i
93                if tarr[i]>=tmax:
94                        break
95        tCharge=0.0
96        for i in range(imin,imax):
97                tCharge=tCharge+varr[i]
98        return tCharge
99
100totaluamphr=findCharge(tarr,value_array,0.0,tmax)
101print "total proton charge=",totaluamphr
102#
103nslices=len(slicelist)-1
104for i in range(nslices):
105        nzeros=3-len(str(savext))
106        #fpad=".n"
107        #for ii in range(nzeros):
108        #       fpad+="0"
109        #newfilename=samplefilename+fpad+str(savext)
110        fpad="_"
111        for ii in range(nzeros):
112                fpad+="0"
113        newfilename=samplefilename+fpad+str(savext)+".nxs"
114        savext=savext+1
115        # cut out a range of data collection times
116        SampleEventsCut=FilterByTime('SampleEvents',StartTime=slicelist[i],Stoptime=slicelist[i+1])
117        #FilterByTime('SampleEvents','SampleEventsCut',AbsoluteStartTime='2011-10-09T22:27:00',AbsoluteStoptime='2011-10-09T22:43:00')
118        # impose time channels, identical to ones used in histogram part of file (blame Kelvin for the odd choices here)
119        params='5.5,44.5,50,50,1000,500,1500,750,99750,255,100005'
120        SampleHist=Rebin('SampleEventsCut',params,PreserveEvents=False)
121        #Rebin('SampleEvents','SampleHist',params,PreserveEvents=False)
122        # use call to crop to make a copy of the monitor workspace to put at front of new file
123        # will later rescale the new monitors to the correct run time fraction
124        # was CropWorkspace('SampleEvents_monitors','SampleHistNew',StartWorkspaceIndex=0,EndWorkspaceIndex=7)
125        uamphr=findCharge(tarr,value_array,slicelist[i],slicelist[i+1])
126        print "slice ",i+1,"  from",slicelist[i],"  to ",slicelist[i+1],"  uamphr=",uamphr,"  of total=",totaluamphr
127        rescale=uamphr/totaluamphr
128        SampleHistNew=Scale('SampleMonHist',rescale)   
129        # 8 + 192^2 -1 =36871  use only the spectra we need,
130        # BEWARE due to Kelvin's wring tables Spectrum 9 is in ID=4
131        #Note SER changed StartWorkspaceIndex to zero and not 4 and changed EndWorkspaceIndex to 36863 and not 36867 to correct mapping!
132        #  26/7/13 RKH is confused, "show detectors" on SampleHist shows as we expect rear det, spectra 9 to 192^2+9=36872 are in workspaceindex 8 to 36871
133        # SampleHistNew has spectra 1 to 8 in index 0 to 7 as expect also.
134        SampleHistCropped=CropWorkspace('SampleHist',StartWorkspaceIndex=8,EndWorkspaceIndex=36871)
135        # conjoin expands the first workspace by tagging the second to the end of it, time channels I think have to
136        # be identical and spectrum number ranges must not overlap.
137        ConjoinWorkspaces('SampleHistNew','SampleHistCropped')
138        #
139        # SampleHist seems to have main detector counts OK, but the monitor spectra which were in hist mode to start with are ZERO
140        SaveNexusProcessed('SampleHistNew',newfilename,PreserveEvents=False)
141        print "saved file: ",newfilename
142print 'DELETE all the temp workspaces else you may run out of memory!!'
143print 'BEWARE Mantid reduction does not delete _n001 etc workspaces, and you need to rename the output ones before reducing another file!'