source: sans/Dev/trunk/NCNR_User_Procedures/Reduction/SANS/TISANE.ipf @ 575

Last change on this file since 575 was 572, checked in by srkline, 13 years ago

Merging changes:

NCNR_Utils -> merging these into FACILITY, HFIR, and ILL_Utils

HFIR files merged by hand to reflect JaeHie?'s 29JUL09 version

Changed MainPanel? to look for TISANE or RealTime? functions to prevent button procedures from being called when the procedures aren't there. Seemed easier than separate versions without the buttons. #define at the begining of TISANE.ipf -> #ifdef in MainPanel? didn't work for some reason?

File size: 8.1 KB
Line 
1#pragma rtGlobals=1             // Use modern global access method.
2#pragma IgorVersion=6.1
3
4
5
6//Functions to deal with TISANE data
7
8Constant ATXY = 0
9Constant ATXYM = 2
10Constant ATMIR = 1
11Constant ATMAR = 3
12
13Constant USECSPERTICK=0.1 // microseconds
14Constant TICKSPERUSEC=10
15Constant XBINS=128
16Constant YBINS=128
17
18Proc Show_TISANE_Panel()
19        DoWindow/F TISANE
20        if(V_flag ==0)
21                Init_TISANE()
22                TISANE()
23        EndIf
24End
25
26
27Function Init_TISANE()
28        String/G root:MyGlobals:gTISANE_logfile
29        Variable/G      root:MyGlobals:AIMTYPE_XY=0 // XY Event
30        Variable/G      root:MyGlobals:AIMTYPE_XYM=2 // XY Minor event
31        Variable/G      root:MyGlobals:AIMTYPE_MIR=1 // Minor rollover event
32        Variable/G      root:MyGlobals:AIMTYPE_MAR=3 // Major rollover event
33
34        Variable/G root:MyGlobals:gTISANE_time_msw = 0
35        Variable/G root:MyGlobals:gTISANE_time_lsw = 0
36        Variable/G root:MyGlobals:gTISANE_t_longest = 0
37
38        Variable/G root:MyGlobals:gTISANE_tsdisp //Displayed slice
39        Variable/G root:MyGlobals:gTISANE_nslices = 10  //Number of time slices
40        Variable/G root:MyGlobals:gTISANE_slicewidth  = 1000 //Slicewidth in us
41       
42        Variable/G root:MyGlobals:gTISANE_prescan // Do we prescan the file?
43        Variable/G root:MyGlobals:gTISANE_logint = 1
44
45        SetDataFolder root:
46        NewDataFolder/O/S root:TISANE
47       
48        SetDataFolder root:
49End
50
51Window TISANE() : Panel
52        PauseUpdate; Silent 1           // building window...
53        NewPanel/K=1 /W=(100,50,600,680)/N=TISANE
54        ModifyPanel fixedSize=1,noEdit =1
55        //ShowTools/A
56        SetDrawLayer UserBack
57        Button button0,pos = {10,10}, size={150,20},title="Load TISANE Log File",fSize=12
58        Button button0,proc=LoadTISANELog_Proc
59        SetVariable setvar3,pos= {20,590},size={460,20},title=" ",fSize=12
60        SetVariable setvar3,disable=2,variable=root:myGlobals:gTISANE_logfile
61        CheckBox chkbox1,pos={170,15},title="Prescan file? (increases load time)"
62        CheckBox chkbox1,variable = root:myGlobals:gTISANE_prescan
63       
64        //DrawLine 10,35,490,35
65        Button button1,pos = {10,50}, size={150,20},title="Process Data",fSize=12
66        Button button1,proc=ProcessLog_Proc
67        SetVariable setvar1,pos={170,50},size={160,20},title="Number of slices",fSize=12
68        SetVariable setvar1,value=root:myGlobals:gTISANE_nslices
69        SetVariable setvar2,pos={330,50},size={160,20},title="Slice Width (us)",fSize=12
70        SetVariable setvar2,value=root:myGlobals:gTISANE_slicewidth
71        //DrawLine 10,65,490,65
72       
73        CheckBox chkbox2,pos={20,95},title="Log Intensity",value=1
74        CheckBox chkbox2,variable=root:myGlobals:gTISANE_logint,proc=LogInt_Proc
75        SetVariable setvar0,pos={320,90},size={160,20},title="Display Time Slice",fSize=12
76        SetVariable setvar0,value= root:myGlobals:gTISANE_tsdisp
77        SetVariable setvar0,proc=sliceSelect_Proc
78        Display/W=(20,120,480,580)/HOST=TISANE/N=TISANE_slicegraph
79        AppendImage/W=TISANE#TISANE_slicegraph/T :TISANE:dispsliceData
80        ModifyImage/W=TISANE#TISANE_slicegraph  ''#0 ctab= {*,*,Rainbow,0}
81        ModifyImage/W=TISANE#TISANE_slicegraph ''#0 ctabAutoscale=3
82        ModifyGraph margin(left)=14,margin(bottom)=14,margin(top)=14,margin(right)=14
83        ModifyGraph mirror=2
84        ModifyGraph nticks=4
85        ModifyGraph minor=1
86        ModifyGraph fSize=9
87        ModifyGraph standoff=0
88        ModifyGraph tkLblRot(left)=90
89        ModifyGraph btLen=3
90        ModifyGraph tlOffset=-2
91        SetAxis/A/R left
92        SetActiveSubwindow ##
93EndMacro
94
95Function LoadTISANELog_Proc(ctrlName) : ButtonControl
96        String ctrlName
97       
98        Variable fileref
99        SVAR filename = root:MyGlobals:gTISANE_logfile
100        NVAR prescan = root:MyGlobals:gTISANE_prescan
101        NVAR slicewidth = root:MyGlobals:gTISANE_slicewidth
102        NVAR nslices = root:MyGlobals:gTISANE_nslices
103        NVAR t_longest = root:MyGlobals:gTISANE_t_longest
104       
105        Open/R/D fileref
106        filename = S_filename
107       
108        if(prescan )
109                PreProcessLog()
110                slicewidth = trunc(t_longest/nslices)
111                DoUpdate
112        endif
113
114End
115
116Function ProcessLog_Proc(ctrlName) : ButtonControl
117        String ctrlName
118
119        NVAR slicewidth = root:MyGlobals:gTISANE_slicewidth
120        NVAR nslices = root:MyGlobals:gTISANE_nslices
121       
122        ProcessLog(nslices,slicewidth)
123       
124End
125
126Function LogInt_Proc(ctrlName,checked) : CheckBoxControl
127        String ctrlName
128        Variable checked
129               
130        SetDataFolder root:TISANE
131        if(checked)
132                Duplicate/O logslicedData dispsliceData
133        else
134                Duplicate/O slicedData dispsliceData
135        endif
136
137        SetDataFolder root:
138End
139
140Function sliceSelect_Proc(ctrlName, varNum, varStr, varName) : SetVariableControl
141        String ctrlName
142        Variable varNum
143        String varStr
144        String varName
145       
146        NVAR nslices = root:MyGlobals:gTISANE_nslices
147        NVAR selectedslice = root:MyGlobals:gTISANE_tsdisp
148       
149        if(varNum < 0)
150                selectedslice = 0
151                DoUpdate
152        elseif (varNum > nslices-1)
153                selectedslice = nslices-1
154                DoUpdate
155        else
156                ModifyImage/W=TISANE#TISANE_slicegraph ''#0 plane = varNum
157        endif
158
159End
160
161Function ProcessLog(nslices,slicewidth)
162        Variable nslices,slicewidth
163       
164        NVAR time_msw = root:MyGlobals:gTISANE_time_msw
165        NVAR time_lsw = root:MyGlobals:gTISANE_time_lsw
166        NVAR t_longest = root:MyGlobals:gTISANE_t_longest
167       
168        NVAR logint = root:MyGlobals:gTISANE_logint
169       
170        SVAR filepathstr = root:MyGlobals:gTISANE_logfile
171        SetDataFolder root:TISANE
172
173        //Create bin lookup
174        Variable tickwidth, i ,boundary
175        Variable fileref
176       
177        Make/O/N = (nslices) t_lookup
178        tickwidth = floor(slicewidth/USECSPERTICK)
179        boundary = 0
180        for (i = 0 ; i < nslices; i += 1)
181                t_lookup[i] = boundary
182                boundary += tickwidth
183        endfor
184       
185        Make/O/N=(XBINS,YBINS,nslices)  slicedData
186        Open/R fileref as filepathstr
187
188        String buffer
189        Variable dataval,b,tmp
190       
191        Variable xval,tyval,yval,timeval,ppto,type
192
193        do
194                FReadLine fileref, buffer
195                if (strlen(buffer) == 0)
196                        break
197                endif
198                sscanf buffer,"%x",dataval
199               
200                //print (dataval)
201               
202                //This is hideous, but that is what you get for IGOR not doing structs like C
203                type = (dataval & ~(2^32 - 2^30 -1))/2^30
204
205                switch(type)
206                        case ATXY:             
207                                //printf "XY : "               
208                                xval = ~(dataval & ~(2^32 - 2^8)) & 127
209                                yval = ((dataval & ~(2^32 - 2^16 ))/2^8) & 127
210                                time_lsw = (dataval & ~(2^32 - 2^29))/2^16
211                                timeval = (time_msw * (2^13)) + time_lsw
212                                if (timeval > t_longest)
213                                        t_longest = timeval
214                                endif
215                                //printf "%u : %u : %u : %u\r",dataval,time_lsw,time_msw,timeval
216                                b = FindBin(timeval,nslices)
217                                slicedData[xval][yval][b] += 1
218                                break
219                        case ATXYM:
220                                //printf "XYM : "
221                                xval = ~(dataval & ~(2^32 - 2^8)) & 127
222                                yval = ((dataval & ~(2^32 - 2^16 ))/2^8) & 127
223                                time_lsw =  (dataval & ~(2^32 - 2^29 ))/2^16
224                                break
225                        case ATMIR:
226                                //printf "MIR : "
227                                time_msw =  (dataval & ~(2^32 - 2^29 ))/2^16
228                                timeval = (time_msw * (2^13)) + time_lsw
229                                if (timeval > t_longest)
230                                        t_longest = timeval
231                                endif
232                                //printf "%u : %u : %u : %u\r",dataval,time_lsw,time_msw,timeval
233                                b = FindBin(timeval,nslices)
234                                slicedData[xval][yval][b] += 1
235                                break
236                        case ATMAR:
237                                //printf "MAR : \r"
238                                break
239                endswitch
240        while(1)       
241
242        Close fileref
243
244        Duplicate/O slicedData logslicedData
245        logslicedData[][][] = log(slicedData[p][q][r])
246        if(logint)
247                Duplicate/O logslicedData dispsliceData
248        else
249                Duplicate/O slicedData dispsliceData
250        endif
251       
252        SetDataFolder root:
253End
254
255
256Function FindBin(nticks,nslices)
257        Variable nticks,nslices
258       
259        WAVE t_lookup = root:TISANE:t_lookup
260       
261        Variable i
262        Variable whichbin = nslices -1
263        for (i= 0; i < nslices; i+=1)
264                if (nticks > t_lookup[i])
265                        whichbin = i
266                else
267                        break
268                endif
269        endfor
270        return whichbin
271End
272
273
274Function PreProcessLog()
275       
276        NVAR time_msw = root:MyGlobals:gTISANE_time_msw
277        NVAR time_lsw = root:MyGlobals:gTISANE_time_lsw
278        NVAR t_longest = root:MyGlobals:gTISANE_t_longest
279       
280        SVAR filepathstr = root:MyGlobals:gTISANE_logfile
281        SetDataFolder root:TISANE
282
283        Variable fileref
284       
285        Open/R fileref as filepathstr
286
287        String buffer
288        Variable dataval,timeval,type
289
290        do
291                FReadLine fileref, buffer
292                if (strlen(buffer) == 0)
293                        break
294                endif
295                sscanf buffer,"%x",dataval
296               
297                //This is hideous, but that is what you get for IGOR not doing structs like C
298                type = (dataval & ~(2^32 - 2^30 -1))/2^30
299
300                switch(type)
301                        case ATXY:             
302                                time_lsw = (dataval & ~(2^32 - 2^29))/2^16
303                                timeval = (time_msw * (2^13)) + time_lsw
304                                if (timeval > t_longest)
305                                        t_longest = timeval
306                                endif
307                                break
308                        case ATXYM:
309                                time_lsw =  (dataval & ~(2^32 - 2^29 ))/2^16
310                                break
311                        case ATMIR:
312                                time_msw =  (dataval & ~(2^32 - 2^29 ))/2^16
313                                timeval = (time_msw * (2^13)) + time_lsw
314                                if (timeval > t_longest)
315                                        t_longest = timeval
316                                endif
317                                break
318                        case ATMAR:
319                                break
320                endswitch
321        while(1)       
322
323        Close fileref
324       
325        SetDataFolder root:
326End
Note: See TracBrowser for help on using the repository browser.