Ticket #6531: SANS2d_event_to_hist_4.py

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