source: sans/Dev/trunk/NCNR_User_Procedures/Common/DataSetHandling.ipf @ 672

Last change on this file since 672 was 666, checked in by ajj, 13 years ago

Function for Data Management panel fleshed out. Mostly seems to work, suspect there are some subtle setvariable updating bugs in there.
Has to be called from command line at the moment - MakeDMPanel()

File size: 35.6 KB
Line 
1#pragma rtGlobals=1             // Use modern global access method.
2
3// Functions and interfaces to manage datasets now that they are in data folders
4// Planned interface
5// - Panel to select/load data and then select operation
6// Planned functions:
7// - Rename a data set - AJJ Done Nov 2009
8// - Duplicate a data set - AJJ Done Nov 2009
9// - Subtract one data set from another
10// - Add one data set to another
11// - Divide data sets
12// - Multiply data sets
13// - Save a data folder to file
14
15/////////////////// Data Management Panel ///////////////////////////////////////////////////////
16
17//
18Function MakeDMPanel()
19        DoWindow/F DataManagementPanel
20        if(V_flag==0)
21                fMakeDMPanel()
22        endif
23       
24        return(0)
25End
26
27Function fMakeDMPanel()
28        PauseUpdate; Silent 1           // building window...
29        NewPanel /W=(459,44,959,300)/N=DataManagementPanel/K=2 as "Data Set Management"
30        ModifyPanel fixedSize=1,cbRGB=(30000,60000,60000)
31
32        //Main bit of panel
33        GroupBox grpBox_0,pos={20,10},size={460,100}
34        GroupBox grpBox_1,pos={20,130},size={460,70}
35
36        Button DS_button,pos={300,20},size={150,20},proc=DM_LoadDataSetProc,title="Load 1D Data Set"
37        Button Save_button,title="Save 1D Data Set",pos={300,50},size={150,20}
38        Button Save_button,proc=DM_SaveProc
39        Button Unload_button,title="Unload 1D Data Set",pos={300,80},size={150,20}
40        Button Unload_button,proc=DM_UnloadProc
41        PopupMenu DS_popup,pos={30,52},size={318,20},title="Data Set ",proc=DM_PopupProc
42        PopupMenu DS_popup,mode=1,value= #"DM_DataSetPopupList()"
43
44        Button Rename_button,title="Rename",pos={75,170},size={150,20}
45        Button Rename_button,proc=DM_RenameProc
46        Button  Duplicate_button,title="Duplicate",pos={275,170},size={150,20}
47        Button Duplicate_button,proc=DM_DuplicateProc
48
49        SetVariable NewName_setvar,title="New Name (max 25 characters)",pos={50,140},size={400,20}
50        SetVariable NewName_setvar,fsize=12,value=_STR:"",proc=DMNameSetvarproc,live=1
51       
52        Button DMDone_button,title="Done",pos={360,210},size={60,20}
53        Button DMDone_button,proc=DMDoneButtonProc
54        Button DMHelp_button,title="?",pos={440,210},size={30,20}
55        Button DMHelp_button,proc=DMHelpButtonProc
56       
57       
58        ControlInfo/W=DataManagementPanel DS_popup
59        if (cmpstr(S_Value,"No data loaded") == 0)
60                SetVariable NewName_setvar,value=_STR:"dataset_copy"
61        else
62                //fake call to popup
63                STRUCT WMPopupAction pa
64                pa.win = "DataManagementPanel"
65                pa.ctrlName = "DS_popup"
66                pa.eventCode = 2
67                DM_PopupProc(pa)
68        endif
69
70End
71
72
73Function DMNameSetvarproc(sva) : SetVariableControl
74        STRUCT WMSetVariableAction &sva
75               
76        switch( sva.eventCode )
77                case 1: // mouse up
78                case 2: // Enter key
79                case 3: // Live update
80                                String sv = sva.sval
81                                if( strlen(sv) > 25 )
82                                        sv= sv[0,24]
83                                        SetVariable  $(sva.ctrlName),win=$(sva.win),value=_STR:sv
84                                        ControlUpdate /W=$(sva.win) $(sva.ctrlName)
85                                        Beep
86                                endif
87                                break
88                endswitch
89        return 0
90End
91
92Function DM_RenameProc(ba) : ButtonControl
93        STRUCT WMButtonAction &ba
94       
95        String DS,NewName
96       
97        ControlInfo/W=$(ba.win) DS_popup
98        DS = S_Value
99       
100        ControlInfo/W=$(ba.win) NewName_setvar
101        NewName = CleanupName(S_Value, 0 )              //clean up any bad characters, and put the cleaned string back
102        SetVariable NewName_setvar,value=_STR:NewName
103       
104        switch (ba.eventcode)
105                case 2: // mouse up
106                        RenameDataSet(DS,NewName)
107                        ControlUpdate /W=$(ba.win) DS_Popup
108                        break
109        endswitch
110
111
112       
113        return 0
114end
115               
116Function DM_DuplicateProc(ba) : ButtonControl
117        STRUCT WMButtonAction &ba
118       
119        String DS,NewName
120       
121        ControlInfo/W=$(ba.win) DS_popup
122        DS = S_Value
123       
124        ControlInfo/W=$(ba.win) NewName_setvar
125        NewName = CleanupName(S_Value, 0 )              //clean up any bad characters, and put the cleaned string back
126        SetVariable NewName_setvar,value=_STR:NewName
127       
128        switch (ba.eventcode)
129                case 2: // mouse up
130                        DuplicateDataSet(DS,NewName,0)
131                        ControlUpdate /W=$(ba.win) DS_Popup
132                        break
133        endswitch
134       
135        return 0
136end
137
138Function DM_SaveProc(ba) : ButtonControl
139        STRUCT WMButtonAction &ba
140       
141        switch(ba.eventCode)
142                case 2:
143                        ControlInfo/W=$(ba.win) DS_popup
144                        SaveDataSetToFile(S_Value)
145                        break
146        endswitch
147       
148        return 0
149end
150
151Function DM_UnloadProc(ba) : ButtonControl
152        STRUCT WMButtonAction &ba
153
154        switch (ba.eventcode)
155                case 2: // mouse up
156                       
157                        String savDF=GetDataFolder(1)
158                        String DF
159                        ControlInfo /W=$(ba.win) DS_Popup
160                        DF = S_Value
161                       
162                        print DF
163                        //check for horrific null output from control
164                        if (cmpstr(DF,"") != 0)
165                       
166                                SetDataFolder DF
167                                KillVariables/A
168                                SetDataFolder savDF
169                       
170                                KillDataFolder/Z $DF
171                                ControlUpdate /W=$(ba.win) DS_Popup
172                       
173                                ControlInfo/W=DataManagementPanel DS_popup
174                                if (cmpstr(S_Value,"No data loaded") == 0)
175                                        SetVariable NewName_setvar,value=_STR:"dataset_copy"
176                                else
177                                        //fake call to popup
178                                        STRUCT WMPopupAction pa
179                                        pa.win = "DataManagementPanel"
180                                        pa.ctrlName = "DS_popup"
181                                        pa.eventCode = 2
182                                        DM_PopupProc(pa)
183                                endif
184                        endif
185                        break
186        endswitch
187       
188        return 0
189end
190               
191
192Function DM_PopupProc(pa) : PopupMenuControl
193        STRUCT WMPopupAction &pa
194       
195        String resultName
196       
197        switch( pa.eventCode)
198                case 2:
199                        //print "Called by "+pa.ctrlname+" with value "+pa.popStr
200                        ControlInfo/W=$(pa.win) $(pa.ctrlName)
201                        String popStr = S_Value
202                        if (stringmatch(pa.ctrlname,"*DS*") == 1)
203                                resultName = stringfromlist(0,popStr,"_")+"_copy"
204                               
205                                SetVariable NewName_setvar win=$(pa.win), value=_STR:resultName
206                        endif
207                break
208        endswitch
209       
210
211End
212
213
214//Must follow naming scheme to match buttons to popups
215//"Name_button" goes with "Name_popup"
216Function DM_LoadDataSetProc(ba) : ButtonControl
217        STRUCT WMButtonAction &ba
218
219
220        switch( ba.eventCode )
221                case 2: // mouse up
222                        // click code here
223                        String cmd = "A_LoadOneDDataWithName(\"\","+num2str(0)+")"
224                        Execute cmd
225               
226                        SVAR gLastFileName = root:packages:NIST:gLastFileName
227
228                        String windowName = ba.win
229                        String popupName = StringFromList(0,ba.ctrlName,"_")+"_popup"
230                       
231                        ControlUpdate/W=$(windowName) $(popupName)
232                        //instead of a simple controlUpdate, better to pop the menu to make sure that the other menus follow
233                        // convoluted method to find the right item and pop the menu.
234
235                        String list,folderStr
236                        Variable num
237                        folderStr = CleanupName(gLastFileName,0)
238                        list = DM_DataSetPopupList()
239                        num=WhichListItem(folderStr,list,";",0,0)
240                        if(num != -1)
241                                PopupMenu $(popupName),mode=num+1,win=$(windowName)
242                                ControlUpdate/W=$(windowName) $(popupName)
243                               
244                                if (cmpstr(popupName,"DS_popup") ==  0)
245                                        //send fake mouse action to popup to update old name if
246                                        Struct WMPopupAction pa
247                                        pa.eventCode = 2                //fake mouse up
248                                        pa.win = windowName
249                                        pa.ctrlName = "DS_popup"
250                                        DM_PopupProc(pa)
251                                endif                   
252                        endif
253                        break
254        endswitch
255       
256        return 0
257End
258
259
260Function/S DMGetDSName(dsNum)
261        Variable dsNum
262       
263        String ctrlName
264        if (dsNum == 1)
265                ctrlName = "DS1_popup"
266        elseif (dsNum == 2)
267                ctrlName = "DS2_popup"
268        endif
269       
270        ControlInfo/W=DataManagementPanel $(ctrlName)
271
272        Return S_Value
273
274End
275
276
277Function DMDoneButtonProc(ba) : ButtonControl
278        STRUCT WMButtonAction &ba
279       
280        String win = ba.win
281
282        switch (ba.eventCode)
283                case 2:
284                        DoWindow/K DataManagementPanel
285                        break
286        endswitch
287
288        return 0
289End
290
291Function DMHelpButtonProc(ba) : ButtonControl
292        STRUCT WMButtonAction &ba
293       
294        String win = ba.win
295
296        switch (ba.eventCode)
297                case 2:
298                        // click code here
299                        DisplayHelpTopic/Z/K=1 "Data Set Management"
300                        if(V_flag !=0)
301                                DoAlert 0,"The Data Set Management Help file could not be found"
302                        endif
303                        break
304        endswitch
305
306        return 0
307End
308
309/////////////////////// Data Arithmetic Panel /////////////////////////////////////////
310
311//
312Function MakeDAPanel()
313        DoWindow/F DataArithmeticPanel
314        if(V_flag==0)
315                fMakeDAPanel()
316        else
317                DoWindow/F DAPlotPanel
318        endif
319       
320        return(0)
321End
322
323Function fMakeDAPanel()
324        PauseUpdate; Silent 1           // building window...
325        DoWindow/K DataArithmeticPanel
326        NewPanel /W=(459,44,959,404)/N=DataArithmeticPanel/K=2 as "Data Set Arithmetic"
327        ModifyPanel fixedSize=1
328
329        //Main bit of panel
330        GroupBox grpBox_0,pos={20,10},size={460,105}
331
332        Button DS1_button,pos={300,20},size={150,20},proc=DA_LoadDataSetProc,title="Load 1D Data Set 1"
333        Button DS1_button,valueColor=(65535,0,0),userdata="DS1"
334        PopupMenu DS1_popup,pos={30,21},size={318,20},title="Data Set 1"
335        PopupMenu DS1_popup,mode=1,value= #"DM_DataSetPopupList()"
336        PopupMenu DS1_popup,proc=DA_PopupProc
337        PopupMenu DS1_popup,fsize=12,fcolor=(65535,0,0),valueColor=(65535,0,0)
338
339        Button DS2_button,pos={300,50},size={150,20},proc=DA_LoadDataSetProc,title="Load 1D Data Set 2"
340        Button DS2_button,valueColor=(0,0,65535),userdata="DS2"
341        PopupMenu DS2_popup,pos={30,51},size={318,20},title="Data Set 2"
342        PopupMenu DS2_popup,mode=1,value= #"DM_DataSetPopupList()"
343        PopupMenu DS2_popup,proc=DA_PopupProc
344        PopupMenu DS2_popup,fsize=12,fcolor=(0,0,65535),valueColor=(0,0,65535)
345
346        Button DAPlot_button,title="Plot",pos={100,85},size={150,20}
347        Button DAPlot_button,proc=DAPlotButtonProc
348        Button DADone_button,title="Done",pos={360,85},size={60,20}
349        Button DADone_button,proc=DADoneButtonProc
350        Button DAHelp_button,title="?",pos={440,85},size={30,20}
351        Button DAHelp_button,proc=DAHelpButtonProc
352
353
354        //Tabs
355        TabControl DATabs,pos={20,120},size={460,220},tabLabel(0)="Subtract", proc=DATabsProc
356        TabControl DATabs,tablabel(1)="Add",tablabel(2)="Multiply",tablabel(3)="Divide"
357        TabControl DATabs,value=0
358
359        Button DACalculate_button,title="Calculate",pos={50,310},size={150,20}
360        Button DACalculate_button,proc=DACalculateProc
361        Button DASave_button,title="Save Result",pos={300,310},size={150,20}
362        Button DASave_button,proc=DASaveProc,disable=2
363        Button DACursors_button,title="Get Matching Range",pos={175,250},size={150,20}
364        Button DACursors_button,proc=DACursorButtonProc
365       
366        SetVariable DAResultName_sv,title="Result Name (max 25 characters)",pos={50,280},size={400,20}
367        SetVariable DAResultName_Sv,fsize=12,proc=DANameSetvarproc,live=1
368        //Update the result name
369        ControlInfo/W=DataArithmeticPanel DS1_popup
370        if (cmpstr(S_Value,"No data loaded") == 0)
371                SetVariable DAResultName_sv,value=_STR:"SubtractionResult"
372        else
373                //fake call to popup
374                STRUCT WMPopupAction pa
375                pa.win = "DataArithmeticPanel"
376                pa.ctrlName = "DS1_popup"
377                pa.eventCode = 2
378                DA_PopupProc(pa)
379        endif
380       
381        CheckBox DANoDS2_cb,title="Data Set 2 = 1?",pos={300,180}
382        CheckBox DANoDS2_cb,proc=DANoDS2Proc
383       
384        ValDisplay DARangeStar_vd,title="Start",pos={40,220},size={100,20},fsize=12,value=_NUM:0
385        ValDisplay DARangeEnd_vd,title="End  ",pos={160,220},size={100,20},fsize=12,value=_NUM:0
386       
387        SetVariable DAScale_sv,title="Scale Factor (f)",pos={280,220},size={180,20},fsize=12,value=_NUM:1
388
389        GroupBox grpBox_1,pos={30,210},size={440,70}
390       
391        NewPanel/HOST=DataArithmeticPanel/N=arithDisplay/W=(50,150,170,190)
392       
393        //Update the result name
394        ControlInfo/W=DataArithmeticPanel DS1_popup
395
396       
397       
398        arithDisplayProc(0)
399       
400End
401
402
403Function MakeDAPlotPanel()
404        PauseUpdate; Silent 1           // building window...
405        DoWindow/K DAPlotPanel
406        NewPanel /W=(14,44,454,484)/N=DAPlotPanel/K=1 as "Data Set Arithmetic"
407        ModifyPanel fixedSize=1
408
409        Display/HOST=DAPlotPanel/N=DAPlot/W=(0,0,440,400)
410        Legend
411        ShowInfo
412        SetActiveSubWindow DAPlotPanel
413        Checkbox DAPlot_log_cb, title="Log I(q)", pos={20,410},value=0
414        Checkbox DAPlot_log_cb, proc=DALogLinIProc
415       
416End
417
418Function AddDAPlot(dataset)
419        Variable dataset
420       
421        String win = "DataArithmeticPanel"
422        String DS1name,DS2name,ResultName
423
424        switch(dataset)
425                case 1:
426                        ControlInfo/W=$(win) DS1_popup
427                        DS1name = S_Value
428                        Wave qWave = $("root:"+DS1name+":"+DS1name+"_q")
429                        Wave iWave = $("root:"+DS1name+":"+DS1name+"_i")
430                        Wave errWave = $("root:"+DS1name+":"+DS1name+"_s")
431                        AppendToGraph/W=DAPlotPanel#DAPlot iWave vs Qwave
432                        ErrorBars/W=DAPlotPanel#DAPlot /T=0 $(DS1name+"_i"), Y wave=(errWave,errWave)
433                        ModifyGraph/W=DAPlotPanel#DAPlot rgb($(DS1name+"_i"))=(65535,0,0)
434                        ControlInfo/W=$(win) DANoDS2_cb
435//                      if (V_Value == 1)
436//                                      Cursor/W=DAPlotPanel#DAPlot A, $(DS1name+"_i"), leftx(iWave)
437//                                      Cursor/W=DAPlotPanel#DAPlot/A=0 B, $(DS1name+"_i"),  rightx(iWave)
438//                      endif
439                        break
440                case 2:
441                        ControlInfo/W=$(win) DANoDS2_cb
442                        if (V_Value == 0)
443                                ControlInfo/W=$(win) DS2_popup
444                                DS2name = S_Value
445                                if(cmpstr(DS2name,"No data loaded")==0)
446                                        break                   //in case someone loads set 1, but not set two, then plots
447                                endif
448                                Wave qWave = $("root:"+DS2name+":"+DS2name+"_q")
449                                Wave iWave = $("root:"+DS2name+":"+DS2name+"_i")
450                                Wave errWave = $("root:"+DS2name+":"+DS2name+"_s")
451                                AppendToGraph/W=DAPlotPanel#DAPlot iWave vs Qwave
452                                ErrorBars/W=DAPlotPanel#DAPlot /T=0 $(DS2name+"_i"), Y wave=(errWave,errWave)                   
453                                ModifyGraph/W=DAPlotPanel#DAPlot rgb($(DS2name+"_i"))=(0,0,65535)
454                                Cursor/W=DAPlotPanel#DAPlot A, $(DS2name+"_i"), leftx(iWave)
455                                Cursor/W=DAPlotPanel#DAPlot/A=0 B, $(DS2name+"_i"),  rightx(iWave)
456                        else
457                                ControlInfo/W=$(win) DS1_popup
458                                DS1name = S_Value
459                                DuplicateDataSet("root:"+DS1name,"NullSolvent",1)
460                                Wave qWave =root:NullSolvent:NullSolvent_q
461                                Wave iWave = root:NullSolvent:NullSolvent_i
462                                Wave errWave = root:NullSolvent:NullSolvent_s
463                                Wave iWaveDS1 = $("root:"+DS1name+":"+DS1name+"_i")
464                                iWave = 1
465                                errWave = 0
466                                AppendToGraph/W=DAPlotPanel#DAPlot iWave vs Qwave
467                                ErrorBars/W=DAPlotPanel#DAPlot /T=0 NullSolvent_i, Y wave=(errWave,errWave)                     
468                                ModifyGraph/W=DAPlotPanel#DAPlot rgb(NullSolvent_i)=(0,0,65535)
469                                //Cursor/W=DAPlotPanel#DAPlot A, NullSolvent_i, leftx(iWave)
470                                //Cursor/W=DAPlotPanel#DAPlot/A=0 B, NullSolvent_i,  rightx(iWave)
471                                if(strlen(CsrInfo(A,"DAPlotPanel#DAPlot")) == 0)                //cursors not already on the graph             
472                                        Cursor/W=DAPlotPanel#DAPlot A, $(DS1Name+"_i"), leftx(iWaveDS1)
473                                        Cursor/W=DAPlotPanel#DAPlot/A=0 B, $(DS1Name+"_i"),  rightx(iWaveDS1)                   
474                                endif
475                        endif
476                        break
477                case 3:
478                        ControlInfo/W=$(win) DAResultName_sv
479                        ResultName = S_Value
480                        Wave qWave = $("root:"+ResultName+":"+ResultName+"_q")
481                        Wave iWave = $("root:"+ResultName+":"+ResultName+"_i")
482                        Wave errWave = $("root:"+ResultName+":"+ResultName+"_s")
483                        AppendToGraph/W=DAPlotPanel#DAPlot iWave vs Qwave
484                        ErrorBars/W=DAPlotPanel#DAPlot /T=0 $(ResultName+"_i"), Y wave=(errWave,errWave)
485                        ModifyGraph/W=DAPlotPanel#DAPlot rgb($(ResultName+"_i"))=(0,65535,0)
486                        break
487        endswitch
488
489        ControlInfo/W=DAPlotPanel DAPlot_log_cb
490        ModifyGraph/W=DAPlotPanel#DAPlot mode=3, msize=2, marker=19, mirror=1, tick=2, log(bottom)=1,log(left)=V_Value,tickUnit=1
491End
492
493Function arithDisplayProc(s)
494        Variable s
495
496        SetActiveSubWindow DataArithmeticPanel#arithDisplay
497
498        switch (s)
499                case 0:
500                        //Subtract
501                        DrawAction/L=progFront delete
502                        DrawRect 0,0,120,40
503                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,65535,0)
504                        DrawText 10,32,"I"
505                        SetDrawEnv fname="Times", fsize=22, fstyle= 1,textrgb= (0,0,0)
506                        DrawText 20,30,"="
507                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (65535,0,0)
508                        DrawText 35,32,"I"
509                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,65535)
510                        DrawText 95,32,"I"
511                        SetDrawEnv fname="Symbol", fsize=22, fstyle= 1,textrgb= (0,0,0)
512                        DrawText 52,32,"-"
513                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,0)
514                        DrawText 75,30,"f"
515                        SetDrawEnv fname="Times", fsize=22, fstyle= 1,textrgb= (0,0,0)
516                        DrawText 85,32,"*"
517                        break
518                case 1:
519                        //Add
520                        DrawAction/L=progFront delete
521                        DrawRect 0,0,120,40
522                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,65535,0)
523                        DrawText 10,32,"I"
524                        SetDrawEnv fname="Times", fsize=22, fstyle= 1,textrgb= (0,0,0)
525                        DrawText 20,30,"="
526                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (65535,0,0)
527                        DrawText 35,32,"I"
528                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,65535)
529                        DrawText 95,32,"I"
530                        SetDrawEnv fname="Symbol", fsize=22, fstyle= 1,textrgb= (0,0,0)
531                        DrawText 52,32,"+"
532                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,0)
533                        DrawText 75,30,"f"
534                        SetDrawEnv fname="Times", fsize=22, fstyle= 1,textrgb= (0,0,0)
535                        DrawText 85,32,"*"
536                        break
537                case 2:
538                        //Multiply
539                        DrawAction/L=progFront delete
540                        DrawRect 0,0,120,40
541                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,65535,0)
542                        DrawText 10,32,"I"
543                        SetDrawEnv fname="Times", fsize=22, fstyle= 1,textrgb= (0,0,0)
544                        DrawText 20,30,"="
545                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (65535,0,0)
546                        DrawText 35,32,"I"
547                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,65535)
548                        DrawText 95,32,"I"
549                        SetDrawEnv fname="Symbol", fsize=22, fstyle= 1,textrgb= (0,0,0)
550                        DrawText 52,32,"*"
551                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,0)
552                        DrawText 66,30,"("
553                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,0)
554                        DrawText 75,30,"f"
555                        SetDrawEnv fname="Times", fsize=22, fstyle= 1,textrgb= (0,0,0)
556                        DrawText 85,32,"*"
557                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,0)                                 
558                        DrawText 105,30,")"
559                        break
560                case 3:
561                        //Divide
562                        DrawAction/L=progFront delete
563                        DrawRect 0,0,120,40
564                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,65535,0)
565                        DrawText 10,32,"I"
566                        SetDrawEnv fname="Times", fsize=22, fstyle= 1,textrgb= (0,0,0)
567                        DrawText 20,30,"="
568                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (65535,0,0)
569                        DrawText 35,32,"I"
570                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,65535)
571                        DrawText 95,32,"I"
572                        SetDrawEnv fname="Symbol", fsize=22, fstyle= 1,textrgb= (0,0,0)
573                        DrawText 52,32,"/"
574                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,0)
575                        DrawText 66,30,"("
576                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,0)
577                        DrawText 75,30,"f"
578                        SetDrawEnv fname="Times", fsize=22, fstyle= 1,textrgb= (0,0,0)
579                        DrawText 85,32,"*"
580                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,0)                                 
581                        DrawText 105,30,")"
582                        break           
583        endswitch
584
585        SetActiveSubWindow DataArithmeticPanel
586       
587        return 0
588End
589
590//Must follow naming scheme to match buttons to popups
591//"Name_button" goes with "Name_popup"
592Function DA_LoadDataSetProc(ba) : ButtonControl
593        STRUCT WMButtonAction &ba
594       
595        switch( ba.eventCode )
596                case 2: // mouse up
597                        // click code here
598                        String cmd = "A_LoadOneDDataWithName(\"\","+num2str(0)+")"
599                        Execute cmd
600               
601                        SVAR gLastFileName = root:packages:NIST:gLastFileName
602
603                        String windowName = ba.win
604                        String popupName = StringFromList(0,ba.ctrlName,"_")+"_popup"
605                       
606                        ControlUpdate/W=$(windowName) $(popupName)
607                        //instead of a simple controlUpdate, better to pop the menu to make sure that the other menus follow
608                        // convoluted method to find the right item and pop the menu.
609
610                        String list,folderStr
611                        Variable num
612                        folderStr = CleanupName(gLastFileName,0)
613                        list = DM_DataSetPopupList()
614                        num=WhichListItem(folderStr,list,";",0,0)
615                        if(num != -1)
616                                PopupMenu $(popupName),mode=num+1,win=$(windowName)
617                                ControlUpdate/W=$(windowName) $(popupName)
618               
619                        endif
620                        //fake call to popup
621                        STRUCT WMPopupAction pa
622                        pa.win = ba.win
623                        pa.ctrlName = "DS1_popup"
624                        pa.eventCode = 2
625                        DA_PopupProc(pa)
626                        break
627        endswitch
628       
629        return 0
630End
631
632Function DA_PopupProc(pa) : PopupMenuControl
633        STRUCT WMPopupAction &pa
634       
635        String resultName
636       
637        switch( pa.eventCode)
638                case 2:
639                        //print "Called by "+pa.ctrlname+" with value "+pa.popStr
640                        ControlInfo/W=$(pa.win) $(pa.ctrlName)
641                        String popStr = S_Value
642                        if (stringmatch(pa.ctrlname,"*DS1*") == 1)
643                                resultName = stringfromlist(0,popStr,"_")+"_mod"
644                               
645                                SetVariable DAResultName_sv win=$(pa.win), value=_STR:resultName
646                        endif
647                break
648        endswitch
649       
650
651End
652
653// function to control the drawing of buttons in the TabControl on the main panel
654// Naming scheme for the buttons MUST be strictly adhered to... else buttons will
655// appear in odd places...
656// all buttons are named MainButton_NA where N is the tab number and A is the letter denoting
657// the button's position on that particular tab.
658// in this way, buttons will always be drawn correctly..
659//
660Function DATabsProc(tca) : TabControl
661        STRUCT WMTabControlAction &tca
662               
663        switch (tca.eventCode)
664                case 2:
665                //      Print "name,number",name,tab
666                        String ctrlList = ControlNameList("",";"),item="",nameStr=""
667                        Variable num = ItemsinList(ctrlList,";"),ii,onTab
668                        for(ii=0;ii<num;ii+=1)
669                                //items all start w/"DSTabItem_"
670                                item=StringFromList(ii, ctrlList ,";")
671                                nameStr=item[0,9]
672                                if(cmpstr(nameStr,"DATabItem_")==0)
673                                        onTab = str2num(item[10])
674                                        ControlInfo $item
675                                        switch (V_flag)
676                                                case 1:
677                                                        Button $item,disable=(tca.tab!=onTab)
678                                                        break
679                                                case 2:
680                                                        CheckBox $item,disable=(tca.tab!=onTab)
681                                                        break
682                                                case 3:
683                                                        PopUpMenu       $item,disable=(tca.tab!=onTab)
684                                                        break
685                                                case 5:
686                                                        SetVariable     $item,disable=(tca.tab!=onTab)
687                                                        break
688                                        endswitch
689                                endif
690                        endfor
691                       
692                        arithDisplayProc(tca.tab)
693                        break
694        endswitch       
695End
696
697
698Function DACalculateProc(ba) : ButtonControl
699        STRUCT WMButtonAction &ba
700       
701        String DS1,DS2,Resultname
702       
703        switch(ba.eventCode)
704        case 2:
705                //Which tab?
706                ControlInfo/W=$(ba.win) DATabs
707                Variable tabNum = V_value
708                //Print "Tab number "+num2str(tabNum)
709
710                ControlInfo/W=$(ba.win) DS1_popup
711                DS1 = S_Value
712                ControlInfo/W=$(ba.win) DANoDS2_cb
713                if (V_Value == 0)
714                        ControlInfo/W=$(ba.win) DS2_popup
715                        DS2 = S_Value
716                else
717                        DS2 = "NullSolvent"
718                endif
719                ControlInfo/W=$(ba.win) DAResultName_sv
720                Resultname = CleanupName(S_Value, 0 )           //clean up any bad characters, and put the cleaned string back
721                SetVariable DAResultName_sv,value=_STR:ResultName
722               
723                ControlInfo/W=$(ba.win) DAScale_sv
724                Variable Scalefactor = V_Value
725
726                switch(tabNum)
727                        case 0:
728                                //do subtraction
729                                //print "Subtraction of "+DS2+" from "+DS1+" with sf "+num2str(scalefactor)+ " into "+Resultname
730                                SubtractDataSets(DS1,DS2,Scalefactor,Resultname)
731                                break
732                        case 1:
733                                //do addition
734                                AddDataSets(DS1,DS2,Scalefactor,Resultname)
735                                break
736                        case 2:
737                                //do multiplication
738                                MultiplyDataSets(DS1,DS2,Scalefactor,Resultname)
739                                break
740                        case 3:
741                                //do division
742                                DivideDataSets(DS1,DS2,Scalefactor,Resultname)
743                                break
744                endswitch
745               
746                //Sort out plot
747                //Fake button press to DAPlotButtonProc
748                STRUCT WMButtonAction ba2
749                ba2.win = ba.win
750                ba2.ctrlName = "DAPlot_button"
751                ba2.eventCode = 2
752               
753                // I've commented this out - the cursors get reset to the ends since this removes all sets from the graph, and
754                // then replots them. What is the real purpose of this call? To clear the old result off before adding the
755                // new one?
756//              DAPlotButtonProc(ba2)
757                ba2.userData = ResultName
758                DAPlotRemoveResult(ba2)
759               
760               
761                AddDAPlot(3)
762                DoWindow/F DataArithmeticPanel
763               
764                //Enable save button now that we have a result to save
765                Button DASave_Button win=$(ba.win),disable=0
766               
767//              SetActiveSubWindow DAPlotPanel
768        endswitch
769       
770End
771
772// remove what is not the
773//
774Function DAPlotRemoveResult(ba) : ButtonControl
775        STRUCT WMButtonAction &ba
776       
777        String win = ba.win
778        String ResultName = ba.userData
779        String item="",traceList=""
780        Variable ii=0,num
781
782        switch (ba.eventCode)
783                case 2:         //mouse up
784                        //data set 1
785                        ControlInfo/W=$(win) DS1_popup
786                        String DS1 = S_Value
787                       
788                        //Get folder for DS2
789                        ControlInfo/W=$(win) DS2_popup
790                        String DS2 = S_Value
791                       
792                        // state of the checkbox
793                        ControlInfo/W=$(win) DANoDS2_cb
794                        if(V_Value)
795                                DS2 = "NullSolvent"
796                        endif
797                       
798                        DoWindow DAPlotPanel
799                        if (V_Flag == 0)
800                                MakeDAPlotPanel()
801                        else
802                                DoWindow/HIDE=0/F DAPlotPanel
803                                traceList = TraceNameList("DAPlotPanel#DAPlot",";",1)
804                                num=ItemsInList(traceList)
805                                ii=0
806                                do
807                                        item = StringFromList(ii,traceList,";")
808                                        if (stringmatch(item,ResultName+"*")==1)                //it it's the specific trace I've asked to remove
809                                                RemoveFromGraph/W=DAPlotPanel#DAPlot $item
810                                        elseif (stringmatch(item,DS1+"*")==0 && stringmatch(item,DS2+"*")==0)           //if it's not set1 & not set2
811                                                RemoveFromGraph/W=DAPlotPanel#DAPlot $item
812                                        endif
813                                       
814                                        ii+=1
815                                while(ii<num)                           
816                        endif
817                       
818                        break
819        endswitch
820
821        return 0
822End
823
824
825Function DAPlotButtonProc(ba) : ButtonControl
826        STRUCT WMButtonAction &ba
827       
828        String win = ba.win
829
830        switch (ba.eventCode)
831                case 2:
832                        //mouse up
833                        //Get folder for DS1
834                        DoWindow DAPlotPanel
835                        if (V_Flag == 0)
836                                MakeDAPlotPanel()
837                        else
838                                DoWindow/HIDE=0/F DAPlotPanel
839                                do
840                                        String tracename = StringFromList(0,TraceNameList("DAPlotPanel#DAPlot",";",1),";")
841                                        if (cmpstr(tracename,"")==0)
842                                                break
843                                        else
844                                                RemoveFromGraph/W=DAPlotPanel#DAPlot $tracename
845                                        endif                   
846                                while(1)                               
847                        endif
848                       
849                        ControlInfo/W=$(win) DS1_popup
850                        String DS1 = S_Value
851                        if (cmpstr(DS1,"") != 0 )
852                                AddDAPlot(1)
853                        endif
854                        //Get folder for DS2
855                        ControlInfo/W=$(win) DS2_popup
856                        String DS2 = S_Value
857                        if (cmpstr(DS2,"") != 0)
858                                AddDAPlot(2)
859                        endif
860                        break
861        endswitch
862
863        return 0
864End
865
866Function DADoneButtonProc(ba) : ButtonControl
867        STRUCT WMButtonAction &ba
868       
869        String win = ba.win
870
871        switch (ba.eventCode)
872                case 2:
873                        DoWindow/K DAPlotPanel
874                        DoWindow/K DataArithmeticPanel
875                        break
876        endswitch
877
878        return 0
879End
880
881Function DAHelpButtonProc(ba) : ButtonControl
882        STRUCT WMButtonAction &ba
883       
884        String win = ba.win
885
886        switch (ba.eventCode)
887                case 2:
888                        // click code here
889                        DisplayHelpTopic/Z/K=1 "Data Set Arithmetic"
890                        if(V_flag !=0)
891                                DoAlert 0,"The Data Set Arithmetic Help file could not be found"
892                        endif
893                        break
894        endswitch
895
896        return 0
897End
898
899Function DALogLinIProc(cba) : CheckBoxControl
900        STRUCT WMCheckBoxAction &cba
901
902        switch(cba.eventcode)
903                case 2:
904                       
905                        ModifyGraph/W=DAPlotPanel#DAPlot log(left)=cba.checked
906               
907        endswitch
908
909
910End
911
912Function DACursorButtonProc(ba) : ButtonControl
913        STRUCT WMButtonAction &ba
914
915        String DS1,DS2
916       
917        switch(ba.eventCode)
918                case 2:
919               
920                        ControlInfo/W=$(ba.win) DS1_popup
921                        DS1 = S_Value
922                        ControlInfo/W=$(ba.win) DANoDS2_cb
923                        Variable NoDS2 = V_Value
924                        if (NoDS2 == 0)
925                                ControlInfo/W=$(ba.win) DS2_popup
926                                DS2 = S_Value
927                        else
928                                DS2 = "NullSolvent"
929                        endif
930               
931                        //AJJ Nov 2009 - UGLY - Will have to revisit this when we deal with hierarchical folders
932                        Wave set1_i = $("root:"+DS1+":"+DS1+"_i")
933                        Wave set1_q = $("root:"+DS1+":"+DS1+"_q")
934                        Wave set2_i = $("root:"+DS2+":"+DS2+"_i")
935                        Wave set2_q = $("root:"+DS2+":"+DS2+"_q")
936                        Duplicate/O set1_i tmp_i
937                        Duplicate/O set1_q tmp_q
938                        tmp_i = set1_i / interp(set1_q[p],set2_q,set2_i)       
939                       
940                        //Get cursors
941                        Variable q1,q2
942                       
943                        DoWindow/F DAPlotPanel
944                        SetActiveSubWindow DAPlotPanel#DAPlot
945                       
946                        q1 = CsrXWaveRef(A)[pcsr(A)]
947                        q2 = CsrXWaveRef(B)[pcsr(B)]
948
949                        //Update value display
950                        ValDisplay DARangeStar_vd,value=_NUM:q1, win=$(ba.win)
951                        ValDisplay DARangeEnd_vd,value=_NUM:q2, win=$(ba.win)
952                       
953                        //Calculate scalefactor
954                       
955                        if (NoDS2 == 1)
956                                Wave avgWave = set1_i
957                        else
958                                Wave avgWave = tmp_i
959                        endif
960
961                        Variable p1 = BinarySearch(tmp_q,q1)                   
962                        Variable p2 = BinarySearch(tmp_q,q2)                   
963
964                        //print avgWave
965
966                        WaveStats/Q/R=[p1,p2] avgWave
967                        //print V_avg
968                        //Update sv control
969                        SetVariable DAScale_sv, value=_NUM:V_avg, win=$(ba.win)
970                       
971                        KillWaves/Z tmp_i,tmp_q
972                        DoWindow/F DataArithmeticPanel
973        endswitch
974
975End
976
977
978Function DANoDS2Proc(cba) : CheckBoxControl
979        STRUCT WMCheckBoxAction &cba
980       
981       
982        switch(cba.eventCode)
983                case 2:
984                        if (cba.checked == 1)
985                                //Disable DS2 popup etc
986                                PopupMenu DS2_popup win=$(cba.win), disable=2
987                                Button DS2_button win=$(cba.win), disable=2
988                        else
989                                //Enable DS2 popup etc
990                                PopupMenu DS2_popup win=$(cba.win), disable=0
991                                Button DS2_button win=$(cba.win), disable=0
992                        endif
993                        //Sort out plot
994                        //Fake button press to DAPlotButtonProc
995                        STRUCT WMButtonAction ba2
996                        ba2.win = cba.win
997                        ba2.ctrlName = "DAPlot_button"
998                        ba2.eventCode = 2
999                        DAPlotButtonProc(ba2)
1000                        SetActiveSubWindow DAPlotPanel
1001                        DoWindow/F DataArithmeticPanel
1002        endswitch
1003
1004End
1005
1006Function DASaveProc(ba) : ButtonControl
1007        STRUCT WMButtonAction &ba
1008       
1009        switch(ba.eventCode)
1010                case 2:
1011                        ControlInfo/W=$(ba.win) DAResultName_sv
1012                        SaveDataSetToFile(S_Value)
1013                        break
1014        endswitch
1015
1016
1017End
1018
1019/////////////////////// Common Panel Functions ///////////////////////////////////////
1020
1021
1022// is there a simpler way to do this? I don't think so.
1023Function/S DM_DataSetPopupList()
1024
1025        String str=GetAList(4)
1026
1027        if(strlen(str)==0)
1028                str = "No data loaded"
1029        endif
1030        str = SortList(str)
1031       
1032        return(str)
1033End
1034
1035
1036Function DANameSetvarproc(sva) : SetVariableControl
1037        STRUCT WMSetVariableAction &sva
1038               
1039        switch( sva.eventCode )
1040                case 1: // mouse up
1041                case 2: // Enter key
1042                case 3: // Live update
1043                                String sv = sva.sval
1044                                if( strlen(sv) > 25 )
1045                                        sv= sv[0,24]
1046                                        SetVariable  $(sva.ctrlName),win=$(sva.win),value=_STR:sv
1047                                        ControlUpdate /W=$(sva.win) $(sva.ctrlName)
1048                                        Beep
1049                                endif
1050                                Button DASave_Button win=$(sva.win), disable=2
1051                                break
1052                endswitch
1053        return 0
1054End
1055
1056
1057////////////////////// Functions to do manipulations ///////////////////////////////////
1058
1059Function RenameDataSet(dataSetFolder, newName)
1060        String dataSetFolder
1061        String newName
1062       
1063        String dataSetFolderParent,basestr,objName
1064        Variable index = 0
1065       
1066        //Abuse ParseFilePath to get path without folder name
1067        dataSetFolderParent = ParseFilePath(1,dataSetFolder,":",1,0)
1068        //Abuse ParseFilePath to get basestr
1069        basestr = ParseFilePath(0,dataSetFolder,":",1,0)
1070
1071//      try
1072                RenameDataFolder $(dataSetFolder) $(newName)//; AbortOnRTE
1073       
1074
1075                SetDataFolder $(dataSetFolderParent+newName)//; AbortOnRTE
1076                do
1077                        objName = GetIndexedObjName("",1,index)
1078                        if (strlen(objName) == 0)
1079                                break
1080                        endif
1081                        Rename $(objName) $(ReplaceString(basestr,objName,newName))
1082                        index+=1
1083                while(1)
1084                SetDataFolder root:
1085//      catch
1086//              Print "Aborted: " + num2str(V_AbortCode)
1087//              SetDataFolder root:
1088//      endtry
1089End
1090
1091
1092Function DuplicateDataSet(dataSetFolder, newName, forceoverwrite)
1093        String dataSetFolder
1094        String newName
1095        Variable forceoverwrite
1096
1097        String dataSetFolderParent,basestr,objName
1098        Variable index = 0
1099
1100        //Abuse ParseFilePath to get path without folder name
1101        dataSetFolderParent = ParseFilePath(1,dataSetFolder,":",1,0)
1102        //Abuse ParseFilePath to get basestr
1103        basestr = ParseFilePath(0,dataSetFolder,":",1,0)
1104       
1105        print "Duplicating "+dataSetFolder+" as "+newName
1106       
1107        SetDataFolder $(dataSetFolderParent)
1108       
1109        if (!DataFolderExists(newName))
1110                NewDataFolder $(newName)
1111        else
1112                if (!forceoverwrite)
1113                        DoAlert 1, "A dataset with the name "+newName+" already exists. Overwrite?"
1114                        if (V_flag == 2)
1115                                return 1
1116                        endif
1117                endif
1118        endif   
1119
1120        //If we are here, the folder (now) exists and the user has agreed to overwrite
1121        //either in the function call or from the alert.
1122        do
1123                objName = GetIndexedObjName(basestr,1,index)
1124                if (strlen(objName) == 0)
1125                        break
1126                endif
1127                objname = ":"+basestr+":"+objname
1128                        Duplicate/O $(objName) $(ReplaceString(basestr,objName,newName))
1129                index+=1
1130        while(1)
1131
1132        SetDataFolder root:
1133        return 0
1134End
1135
1136
1137// Subtract Set2 From Set1
1138// Use Result_I = Set1_I - f*Set2_I
1139Function SubtractDataSets(set1Name,set2Name,set2Scale,resultName)
1140        String set1Name
1141        String set2Name
1142        Variable set2Scale
1143        String resultName
1144
1145        String set1Path = "root:"+set1Name+":"
1146        String set2Path = "root:"+set2Name+":"
1147        String resultPath = "root:"+resultName+":"
1148       
1149        SetDataFolder root:
1150        //Create folder for result
1151        //UnloadDataSet(resultName)
1152        //Make the folder
1153        if (DuplicateDataSet(set1Path,resultName,0))
1154                return 1
1155        else
1156        //Do subtraction of I waves - including interpolation if necessary.
1157        Wave result_i = $(resultPath+resultName+"_i")
1158        Wave result_s = $(resultPath+resultName+"_s")
1159        Wave set1_i = $(set1Path+set1Name+"_i")
1160        Wave set1_q = $(set1Path+set1Name+"_q")
1161        Wave set1_s = $(set1Path+set1Name+"_s")
1162        Wave set2_i = $(set2Path+set2Name+"_i")
1163        Wave set2_q = $(set2Path+set2Name+"_q")
1164        Wave set2_s = $(set2Path+set2Name+"_s")
1165       
1166        result_i = set1_i - (set2Scale*interp(set1_q[p],set2_q,set2_i))
1167        result_s = sqrt(set1_s^2 + (set2Scale*interp(set1_q[p],set2_q,set2_s))^2 )
1168        //Calculate result error wave - can we produce corrected Q error?
1169       
1170        //Generate history string to record what was done?
1171        return 0
1172        endif
1173End
1174
1175// Add Set2 to Set1
1176// Use Result_I = Set1_I + f*Set2_I
1177Function AddDataSets(set1Name,set2Name,set2Scale,resultName)
1178        String set1Name
1179        String set2Name
1180        Variable set2Scale
1181        String resultName
1182
1183        String set1Path = "root:"+set1Name+":"
1184        String set2Path = "root:"+set2Name+":"
1185        String resultPath = "root:"+resultName+":"
1186       
1187        SetDataFolder root:
1188        //Create folder for result
1189        if(DuplicateDataSet(set1Path,resultName,0))
1190                //User said no overwrite
1191                return 1
1192        else
1193        //Do addition of I waves - including interpolation if necessary.
1194        Wave result_i = $(resultPath+resultName+"_i")
1195        Wave result_s = $(resultPath+resultName+"_s")
1196        Wave set1_i = $(set1Path+set1Name+"_i")
1197        Wave set1_q = $(set1Path+set1Name+"_q")
1198        Wave set1_s = $(set1Path+set1Name+"_s")
1199        Wave set2_i = $(set2Path+set2Name+"_i")
1200        Wave set2_q = $(set2Path+set2Name+"_q")
1201        Wave set2_s = $(set2Path+set2Name+"_s")
1202       
1203        result_i =  set1_i + set2Scale*interp(set1_q[p],set2_q,set2_i) 
1204        //Calculate result error wave (note that this is identical to subtraction)
1205        result_s = sqrt(set1_s^2 + (set2Scale*interp(set1_q[p],set2_q,set2_s))^2 )
1206
1207        //  - can we produce corrected Q error?
1208        //Generate history string to record what was done?
1209        return 0
1210        endif
1211End
1212
1213// Multiply Set1 by Set2
1214// Use Result_I  = Set1_I * (f*Set2_I)
1215Function MultiplyDataSets(set1Name, set2Name, set2Scale, resultName)
1216        String set1Name
1217        String set2Name
1218        Variable set2Scale
1219        String resultName
1220
1221        String set1Path = "root:"+set1Name+":"
1222        String set2Path = "root:"+set2Name+":"
1223        String resultPath = "root:"+resultName+":"
1224       
1225        SetDataFolder root:
1226        //Create folder for result
1227        //Make the folder
1228        if(DuplicateDataSet(set1Path,resultName,0))
1229                //User said no overwrite
1230                return 1
1231        else
1232        //Do multiplcation of I waves - including interpolation if necessary.
1233        Wave result_i = $(resultPath+resultName+"_i")
1234        Wave result_s = $(resultPath+resultName+"_s")
1235        Wave set1_i = $(set1Path+set1Name+"_i")
1236        Wave set1_q = $(set1Path+set1Name+"_q")
1237        Wave set1_s = $(set1Path+set1Name+"_s")
1238        Wave set2_i = $(set2Path+set2Name+"_i")
1239        Wave set2_q = $(set2Path+set2Name+"_q")
1240        Wave set2_s = $(set2Path+set2Name+"_s")
1241       
1242        result_i =  set1_i*set2Scale*interp(set1_q[p],set2_q,set2_i)
1243        //Calculate result error wave
1244        // sum each of the relative errors, interpolating set 2 intensity and error as needed
1245        // then sqrt
1246        result_s = (set2Scale*interp(set1_q[p],set2_q,set2_i)*set1_s)^2
1247        result_s += (set2Scale*set1_i*interp(set1_q[p],set2_q,set2_s))^2
1248        result_s = sqrt(result_s)
1249
1250        // - can we produce corrected Q error?
1251
1252        //Generate history string to record what was done?
1253        return 0
1254        endif
1255End
1256
1257// Divide Set1 by Set2
1258// Use Result_I  = Set1_I / (f*Set2_I)
1259Function DivideDataSets(set1Name, set2Name, set2Scale, resultName)
1260        String set1Name
1261        String set2Name
1262        Variable set2Scale
1263        String resultName
1264
1265        String set1Path = "root:"+set1Name+":"
1266        String set2Path = "root:"+set2Name+":"
1267        String resultPath = "root:"+resultName+":"
1268       
1269        SetDataFolder root:
1270        //Create folder for result
1271        //Make the folder
1272        if(DuplicateDataSet(set1Path,resultName,0))
1273                //User said no overwrite
1274                return 1
1275        else
1276        //Do division of I waves - including interpolation if necessary.
1277        Wave result_i = $(resultPath+resultName+"_i")
1278        Wave result_s = $(resultPath+resultName+"_s")
1279        Wave set1_i = $(set1Path+set1Name+"_i")
1280        Wave set1_q = $(set1Path+set1Name+"_q")
1281        Wave set1_s = $(set1Path+set1Name+"_s")
1282        Wave set2_i = $(set2Path+set2Name+"_i")
1283        Wave set2_q = $(set2Path+set2Name+"_q")
1284        Wave set2_s = $(set2Path+set2Name+"_s")
1285       
1286        result_i =  set1_i/(set2Scale*interp(set1_q[p],set2_q,set2_i)   )
1287        //Calculate result error wave
1288        // sum each of the relative errors, interpolating set 2 intensity and error as needed
1289        // then sqrt
1290        result_s = (set1_s/set2Scale/interp(set1_q[p],set2_q,set2_i))^2
1291        result_s += (interp(set1_q[p],set2_q,set2_s)*set1_i/set2Scale/interp(set1_q[p],set2_q,set2_i)^2)^2
1292        result_s = sqrt(result_s)
1293
1294        // - can we produce corrected Q error?
1295       
1296        //Generate history string to record what was done?
1297        return 0
1298        endif
1299End
1300
1301
1302///////////////////////////Other Utility functions ////////////////////////////
1303
1304Function SaveDataSetToFile(folderName)
1305        String folderName
1306
1307        String protoStr = ""
1308        //Check for history string in folder
1309        //If it doesn't exist then
1310
1311        //Do saving of data file.
1312       
1313        NVAR gXML_Write = root:Packages:NIST:gXML_Write
1314
1315        if (gXML_Write == 1)
1316                ReWrite1DXMLData(folderName)
1317        else
1318                fReWrite1DData(folderName,"tab","CRLF")
1319        endif
1320
1321//      NISTSave1DData(folderName,protoStr)
1322
1323        //Include history string to record what was done?
1324
1325End
1326
1327
1328
1329//////////////////// Write data functions ////////////////////////////////////
1330// AJJ Nov 2009 - should move towards unified writer
1331//
1332//////////////////////////////////////////////////////////////////////////
1333
1334//Function NISTSave1DData(folderPath,protoStr)
1335//      String folderPath, protoStr
1336//     
1337//      //protoStr is string that will be written to either
1338//     
1339//
1340//End
Note: See TracBrowser for help on using the repository browser.