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

Last change on this file since 728 was 728, checked in by srkline, 12 years ago

Fixed typo in the parameter description in CoreShellCylinder?

W_Sigma is now appended to the table in the wrapper panel when a fit is done.
It is cleared whenever functions or data are changed.

The naming of reports is changed to help make the names more descriptive and unique.

DataSetHandling? - -simple checkbox on the graph to change to a linear display
that highlights the high Q - to be sure that data oscillates around zero
after background subtraction (this doesn't have to stay)

Added a crude batch file converter to take the 5-column grasp data (read in as
if it was old-school desmeared USANS data) and write it back out in our 6-column
ASCII format. Did this for Andrea.

File size: 45.7 KB
Line 
1#pragma rtGlobals=1             // Use modern global access method.
2
3
4///////// SRK - VERY SIMPLE batch converter has been added: see
5//
6//      Function batchXML26ColConvert()
7//
8// Function batchGrasp26ColConvert()
9//
10// these both need a real interface, and a way to better define the name of the
11// converted output file. And some retention of the header would be nice too...
12//
13
14
15// Functions and interfaces to manage datasets now that they are in data folders
16// Planned interface
17// - Panel to select/load data and then select operation
18// Planned functions:
19// - Rename a data set - AJJ Done Nov 2009
20// - Duplicate a data set - AJJ Done Nov 2009
21// - Subtract one data set from another
22// - Add one data set to another
23// - Divide data sets
24// - Multiply data sets
25// - Save a data folder to file
26
27/////////////////// Data Management Panel ///////////////////////////////////////////////////////
28
29//
30Proc MakeDMPanel()
31        DoWindow/F DataManagementPanel
32        if(V_flag==0)
33                fMakeDMPanel()
34        endif
35End
36
37Proc fMakeDMPanel()
38        PauseUpdate; Silent 1           // building window...
39        NewPanel /W=(459,44,959,410)/N=DataManagementPanel/K=2 as "Data Set Management"
40        ModifyPanel fixedSize=1,cbRGB=(30000,60000,60000)
41
42        //Main bit of panel
43        GroupBox grpBox_0,pos={20,10},size={460,100}
44        GroupBox grpBox_1,pos={20,130},size={460,70}
45        GroupBox grpBox_2,pos={20,220},size={460,40}
46
47        GroupBox grpBox_3,pos={20,280},size={460,40}
48
49        Button DS_button,title="Load 1D Data Set",pos={300,20},size={150,20}
50        Button DS_button,proc=DM_LoadDataSetProc
51        Button Unload_button,title="Unload 1D Data Set",pos={300,50},size={150,20}
52        Button Unload_button,proc=DM_UnloadProc
53        Button Save_button,title="Save 1D Data Set",pos={300,80},size={150,20}
54        Button Save_button,proc=DM_SaveProc
55        PopupMenu DS_popup,pos={30,40},size={318,20},title="Data Set ",proc=DM_PopupProc
56        PopupMenu DS_popup,mode=1,value= #"DM_DataSetPopupList()"
57
58        CheckBox XMLStateCtrl,pos={30,82},size={124,14},title="XML Output Enabled (change in Preferences)"
59        CheckBox XMLStateCtrl,help={"Default output format is canSAS XML rather than NIST 6 column"}
60        CheckBox XMLStateCtrl,value= root:Packages:NIST:gXML_Write,disable=2
61
62        Button Rename_button,title="Rename",pos={75,170},size={150,20}
63        Button Rename_button,proc=DM_RenameProc
64        Button  Duplicate_button,title="Duplicate",pos={275,170},size={150,20}
65        Button Duplicate_button,proc=DM_DuplicateProc
66
67        SetVariable NewName_setvar,title="New Name (max 25 characters)",pos={50,140},size={400,20}
68        SetVariable NewName_setvar,fsize=12,value=_STR:"",proc=DMNameSetvarproc,live=1
69               
70        Button SaveAsXML_button,title="Save as canSAS XML",pos={75,230},size={150,20}
71        Button SaveAsXML_button,proc=DMSaveAsXMLproc   
72
73        Button SaveAs6col_button,title="Save as NIST 6 column",pos={275,230},size={150,20}
74        Button SaveAs6col_button,proc=DMSaveAs6colproc 
75       
76        Button BatchConvertData_button,title="Convert Format of 1D Data Files",pos={75,290},size={350,20}
77        Button BatchConvertData_button,proc=DMBatchConvertProc
78                       
79        Button DMDone_button,title="Done",pos={360,330},size={60,20}
80        Button DMDone_button,proc=DMDoneButtonProc
81        Button DMHelp_button,title="?",pos={440,330},size={30,20}
82        Button DMHelp_button,proc=DMHelpButtonProc
83       
84       
85        ControlInfo/W=DataManagementPanel DS_popup
86        if (cmpstr(S_Value,"No data loaded") == 0)
87                SetVariable NewName_setvar,value=_STR:"dataset_copy"
88        else
89                //fake call to popup
90                STRUCT WMPopupAction pa
91                pa.win = "DataManagementPanel"
92                pa.ctrlName = "DS_popup"
93                pa.eventCode = 2
94                DM_PopupProc(pa)
95        endif
96
97End
98
99Function DMBatchConvertProc(ba) : ButtonControl
100        STRUCT WMButtonAction &ba
101       
102        switch( ba.eventCode)
103                case 2:
104                        Execute "MakeBatchConvertPanel()"
105                        break
106        endswitch
107       
108        return 0
109End
110
111
112Function DMNameSetvarproc(sva) : SetVariableControl
113        STRUCT WMSetVariableAction &sva
114               
115        switch( sva.eventCode )
116                case 1: // mouse up
117                case 2: // Enter key
118                case 3: // Live update
119                                String sv = sva.sval
120                                if( strlen(sv) > 25 )
121                                        sv= sv[0,24]
122                                        SetVariable  $(sva.ctrlName),win=$(sva.win),value=_STR:sv
123                                        ControlUpdate /W=$(sva.win) $(sva.ctrlName)
124                                        Beep
125                                endif
126                                break
127                endswitch
128        return 0
129End
130
131Function DM_RenameProc(ba) : ButtonControl
132        STRUCT WMButtonAction &ba
133       
134        String DS,NewName
135       
136        ControlInfo/W=$(ba.win) DS_popup
137        DS = S_Value
138       
139        ControlInfo/W=$(ba.win) NewName_setvar
140        NewName = CleanupName(S_Value, 0 )              //clean up any bad characters, and put the cleaned string back
141        SetVariable NewName_setvar,value=_STR:NewName
142       
143        switch (ba.eventcode)
144                case 2: // mouse up
145                        RenameDataSet(DS,NewName)
146                        ControlUpdate /W=$(ba.win) DS_Popup
147                        break
148        endswitch
149
150
151       
152        return 0
153end
154               
155Function DM_DuplicateProc(ba) : ButtonControl
156        STRUCT WMButtonAction &ba
157       
158        String DS,NewName
159       
160        ControlInfo/W=$(ba.win) DS_popup
161        DS = S_Value
162       
163        ControlInfo/W=$(ba.win) NewName_setvar
164        NewName = CleanupName(S_Value, 0 )              //clean up any bad characters, and put the cleaned string back
165        SetVariable NewName_setvar,value=_STR:NewName
166       
167        switch (ba.eventcode)
168                case 2: // mouse up
169                        DuplicateDataSet(DS,NewName,0)
170                        ControlUpdate /W=$(ba.win) DS_Popup
171                        break
172        endswitch
173       
174        return 0
175end
176
177Function DM_SaveProc(ba) : ButtonControl
178        STRUCT WMButtonAction &ba
179       
180        switch(ba.eventCode)
181                case 2:
182                        ControlInfo/W=$(ba.win) DS_popup
183                        SaveDataSetToFile(S_Value)
184                        break
185        endswitch
186       
187        return 0
188end
189
190Function DM_UnloadProc(ba) : ButtonControl
191        STRUCT WMButtonAction &ba
192
193        switch (ba.eventcode)
194                case 2: // mouse up
195                       
196                        String savDF=GetDataFolder(1)
197                        String DF
198                        ControlInfo /W=$(ba.win) DS_Popup
199                        DF = S_Value
200                       
201                        print DF
202                        //check for horrific null output from control
203                        if (cmpstr(DF,"") != 0)
204                       
205                                SetDataFolder DF
206                                KillVariables/A
207                                SetDataFolder savDF
208                       
209                                KillDataFolder/Z $DF
210                                ControlUpdate /W=$(ba.win) DS_Popup
211                       
212                                ControlInfo/W=DataManagementPanel DS_popup
213                                if (cmpstr(S_Value,"No data loaded") == 0)
214                                        SetVariable NewName_setvar,value=_STR:"dataset_copy"
215                                else
216                                        //fake call to popup
217                                        STRUCT WMPopupAction pa
218                                        pa.win = "DataManagementPanel"
219                                        pa.ctrlName = "DS_popup"
220                                        pa.eventCode = 2
221                                        DM_PopupProc(pa)
222                                endif
223                        endif
224                        break
225        endswitch
226       
227        return 0
228end
229               
230
231Function DM_PopupProc(pa) : PopupMenuControl
232        STRUCT WMPopupAction &pa
233       
234        String resultName
235       
236        switch( pa.eventCode)
237                case 2:
238                        //print "Called by "+pa.ctrlname+" with value "+pa.popStr
239                        ControlInfo/W=$(pa.win) $(pa.ctrlName)
240                        String popStr = S_Value
241                        if (stringmatch(pa.ctrlname,"*DS*") == 1)
242                                resultName = stringfromlist(0,popStr,"_")+"_copy"
243                               
244                                SetVariable NewName_setvar win=$(pa.win), value=_STR:resultName
245                        endif
246                break
247        endswitch
248       
249
250End
251
252
253//Must follow naming scheme to match buttons to popups
254//"Name_button" goes with "Name_popup"
255Function DM_LoadDataSetProc(ba) : ButtonControl
256        STRUCT WMButtonAction &ba
257
258
259        switch( ba.eventCode )
260                case 2: // mouse up
261                        // click code here
262                        String cmd = "A_LoadOneDDataWithName(\"\","+num2str(0)+")"
263                        Execute cmd
264               
265                        SVAR gLastFileName = root:packages:NIST:gLastFileName
266
267                        String windowName = ba.win
268                        String popupName = StringFromList(0,ba.ctrlName,"_")+"_popup"
269                       
270                        ControlUpdate/W=$(windowName) $(popupName)
271                        //instead of a simple controlUpdate, better to pop the menu to make sure that the other menus follow
272                        // convoluted method to find the right item and pop the menu.
273
274                        String list,folderStr
275                        Variable num
276                        folderStr = CleanupName(gLastFileName,0)
277                        list = DM_DataSetPopupList()
278                        num=WhichListItem(folderStr,list,";",0,0)
279                        if(num != -1)
280                                PopupMenu $(popupName),mode=num+1,win=$(windowName)
281                                ControlUpdate/W=$(windowName) $(popupName)
282                               
283                                if (cmpstr(popupName,"DS_popup") ==  0)
284                                        //send fake mouse action to popup to update old name if
285                                        Struct WMPopupAction pa
286                                        pa.eventCode = 2                //fake mouse up
287                                        pa.win = windowName
288                                        pa.ctrlName = "DS_popup"
289                                        DM_PopupProc(pa)
290                                endif                   
291                        endif
292                        break
293        endswitch
294       
295        return 0
296End
297
298
299Function/S DMGetDSName(dsNum)
300        Variable dsNum
301       
302        String ctrlName
303        if (dsNum == 1)
304                ctrlName = "DS1_popup"
305        elseif (dsNum == 2)
306                ctrlName = "DS2_popup"
307        endif
308       
309        ControlInfo/W=DataManagementPanel $(ctrlName)
310
311        Return S_Value
312
313End
314
315
316Function DMDoneButtonProc(ba) : ButtonControl
317        STRUCT WMButtonAction &ba
318       
319        String win = ba.win
320
321        switch (ba.eventCode)
322                case 2:
323                        DoWindow/K DataManagementPanel
324                        break
325        endswitch
326
327        return 0
328End
329
330Function DMHelpButtonProc(ba) : ButtonControl
331        STRUCT WMButtonAction &ba
332       
333        String win = ba.win
334
335        switch (ba.eventCode)
336                case 2:
337                        // click code here
338                        DisplayHelpTopic/Z/K=1 "Data Set Management"
339                        if(V_flag !=0)
340                                DoAlert 0,"The Data Set Management Help file could not be found"
341                        endif
342                        break
343        endswitch
344
345        return 0
346End
347
348/////////////////////// Batch Data Conversion Panel ////////////////////////////////////
349//
350//
351
352Proc MakeNCNRBatchConvertPanel()
353        NCNRInitBatchConvert()
354        DoWindow/F NCNRBatchConvertPanel
355        if(V_flag==0)
356                fMakeNCNRBatchConvertPanel()
357        endif
358End
359
360
361Function NCNRInitBatchConvert()
362        NewDataFolder/O/S root:Packages:NIST:BatchConvert
363        Make/O/T/N=1 filewave=""
364        Make/O/N=1 selWave=0
365        Variable/G ind=0
366        SetDataFolder root:
367End
368
369Proc fMakeNCNRBatchConvertPanel()
370        PauseUpdate; Silent 1           // building window...
371        NewPanel /W=(658,347,1018,737)/N=NCNRBatchConvertPanel/K=2 as "Batch Convert 1D Data"
372        ModifyPanel cbRGB=(40000,50000,32896)
373        ModifyPanel fixedSize=1
374       
375        ListBox fileList,pos={13,11},size={206,179}
376        ListBox fileList,listWave=root:Packages:NIST:BatchConvert:fileWave
377        ListBox fileList,selWave=root:Packages:NIST:BatchConvert:selWave,mode= 4
378
379        Button button7,pos={238,20},size={100,20},proc=NCNRBatchConvertNewFolder,title="New Folder"
380        Button button7,help={"Select a new data folder"}
381        TitleBox msg0,pos={238,140},size={100,30},title="\JCShift-click to\rselect multiple files"
382        TitleBox msg0,frame=0,fixedSize=1
383       
384        GroupBox filterGroup,pos={13,200},size={206,60},title="Filter list by input file type"
385       
386        Button button8,pos={238,76},size={100,20},proc=NCNRBatchConvertHelpProc,title="Help"
387        Button button9,pos={238,48},size={100,20},proc=NCNRBatchConvertRefresh,title="Refresh List"
388        Button button0,pos={238,106},size={100,20},proc=NCNRBatchConvertDone,title="Done"
389
390        GroupBox outputGroup,pos={13,270},size={206,60},title="Output File Type"
391
392       
393        Button button6,pos={13,350},size={206,20},proc=NCNRBatchConvertFiles,title="Convert File(s)"
394        Button button6,help={"Converts the files to the format selected"}
395       
396
397       
398End
399
400
401Function NCNRBatchConvertFiles(ba) : ButtonControl
402                STRUCT WMButtonAction &ba
403               
404                switch (ba.eventCode)
405                        case 2:
406                                Wave/T fileWave=$"root:Packages:NIST:BatchConvert:fileWave"
407                                Wave sel=$"root:BatchConvert:NIST:BatchConvert:selWave"
408                               
409                                break
410                endswitch
411
412        return 0
413End
414
415
416Function NCNRBatchConvertNewFolder(ba) : ButtonControl
417        STRUCT WMButtonAction &ba
418       
419        switch (ba.eventcode)
420                case 2:
421                        A_PickPath()
422                        NCNRBatchConvertGetList()
423                        break
424        endswitch
425
426End
427
428Function NCNRBatchConvertGetList()
429
430        //make sure that path exists
431        PathInfo catPathName
432        if (V_flag == 0)
433                Abort "Folder path does not exist - use \"New Folder\" button"
434        Endif
435       
436        String newList = A_ReducedDataFileList("")
437        Variable num
438       
439        num=ItemsInList(newlist,";")
440        WAVE/T fileWave=$"root:Packages:NIST:BatchConvert:fileWave"
441        WAVE selWave=$"root:Packages:NIST:BatchConvert:selWave"
442        Redimension/N=(num) fileWave
443        Redimension/N=(num) selWave
444        fileWave = StringFromList(p,newlist,";")
445        Sort filewave,filewave
446End
447
448Function NCNRBatchConvertRefresh(ba) : ButtonControl
449                STRUCT WMButtonAction &ba
450               
451                switch (ba.eventCode)
452                        case 2:
453                                NCNRBatchConvertGetList()
454                                break
455                endswitch
456               
457                return 0
458End
459       
460
461Function NCNRBatchConvertDone(ba) : ButtonControl
462                STRUCT WMButtonAction &ba
463
464                switch (ba.eventCode)
465                        case 2:
466                                DoWindow/K NCNRBatchConvertPanel
467                                break
468                endswitch
469               
470                return 0
471End
472
473Function NCNRBatchConvertHelpProc(ba) : ButtonControl
474        STRUCT WMButtonAction &ba
475       
476        String win = ba.win
477
478        switch (ba.eventCode)
479                case 2:
480                        // click code here
481                        DisplayHelpTopic/Z/K=1 "Batch Data Conversion"
482                        if(V_flag !=0)
483                                DoAlert 0,"The Batch Data Conversion Help file could not be found"
484                        endif
485                        break
486        endswitch
487
488        return 0
489End
490
491/////////////////////// Data Arithmetic Panel /////////////////////////////////////////
492
493//
494Function MakeDAPanel()
495        DoWindow/F DataArithmeticPanel
496        if(V_flag==0)
497                fMakeDAPanel()
498        else
499                DoWindow/F DAPlotPanel
500        endif
501       
502        return(0)
503End
504
505Function fMakeDAPanel()
506        PauseUpdate; Silent 1           // building window...
507        DoWindow/K DataArithmeticPanel
508        NewPanel /W=(459,44,959,404)/N=DataArithmeticPanel/K=2 as "Data Set Arithmetic"
509        ModifyPanel fixedSize=1
510
511        //Main bit of panel
512        GroupBox grpBox_0,pos={20,10},size={460,105}
513
514        Button DS1_button,pos={300,20},size={150,20},proc=DA_LoadDataSetProc,title="Load 1D Data Set 1"
515        Button DS1_button,valueColor=(65535,0,0),userdata="DS1"
516        PopupMenu DS1_popup,pos={30,21},size={318,20},title="Data Set 1"
517        PopupMenu DS1_popup,mode=1,value= #"DM_DataSetPopupList()"
518        PopupMenu DS1_popup,proc=DA_PopupProc
519        PopupMenu DS1_popup,fsize=12,fcolor=(65535,0,0),valueColor=(65535,0,0)
520
521        Button DS2_button,pos={300,50},size={150,20},proc=DA_LoadDataSetProc,title="Load 1D Data Set 2"
522        Button DS2_button,valueColor=(0,0,65535),userdata="DS2"
523        PopupMenu DS2_popup,pos={30,51},size={318,20},title="Data Set 2"
524        PopupMenu DS2_popup,mode=1,value= #"DM_DataSetPopupList()"
525        PopupMenu DS2_popup,proc=DA_PopupProc
526        PopupMenu DS2_popup,fsize=12,fcolor=(0,0,65535),valueColor=(0,0,65535)
527
528        Button DAPlot_button,title="Plot",pos={100,85},size={150,20}
529        Button DAPlot_button,proc=DAPlotButtonProc
530        Button DADone_button,title="Done",pos={360,85},size={60,20}
531        Button DADone_button,proc=DADoneButtonProc
532        Button DAHelp_button,title="?",pos={440,85},size={30,20}
533        Button DAHelp_button,proc=DAHelpButtonProc
534
535
536        //Tabs
537        TabControl DATabs,pos={20,120},size={460,220},tabLabel(0)="Subtract", proc=DATabsProc
538        TabControl DATabs,tablabel(1)="Add",tablabel(2)="Multiply",tablabel(3)="Divide"
539        TabControl DATabs,value=0
540
541        Button DACalculate_button,title="Calculate",pos={50,310},size={150,20}
542        Button DACalculate_button,proc=DACalculateProc
543        Button DASave_button,title="Save Result",pos={300,310},size={150,20}
544        Button DASave_button,proc=DASaveProc,disable=2
545        Button DACursors_button,title="Get Matching Range",pos={175,250},size={150,20}
546        Button DACursors_button,proc=DACursorButtonProc
547       
548        SetVariable DAResultName_sv,title="Result Name (max 25 characters)",pos={50,280},size={400,20}
549        SetVariable DAResultName_Sv,fsize=12,proc=DANameSetvarproc,live=1
550        //Update the result name
551        ControlInfo/W=DataArithmeticPanel DS1_popup
552        if (cmpstr(S_Value,"No data loaded") == 0)
553                SetVariable DAResultName_sv,value=_STR:"SubtractionResult"
554        else
555                //fake call to popup
556                STRUCT WMPopupAction pa
557                pa.win = "DataArithmeticPanel"
558                pa.ctrlName = "DS1_popup"
559                pa.eventCode = 2
560                DA_PopupProc(pa)
561        endif
562       
563        CheckBox DANoDS2_cb,title="Data Set 2 = 1?",pos={300,180}
564        CheckBox DANoDS2_cb,proc=DANoDS2Proc
565       
566        ValDisplay DARangeStar_vd,title="Start",pos={40,220},size={100,20},fsize=12,value=_NUM:0
567        ValDisplay DARangeEnd_vd,title="End  ",pos={160,220},size={100,20},fsize=12,value=_NUM:0
568       
569        SetVariable DAScale_sv,title="Scale Factor (f)",pos={280,220},size={180,20},fsize=12,value=_NUM:1
570
571        GroupBox grpBox_1,pos={30,210},size={440,70}
572       
573        NewPanel/HOST=DataArithmeticPanel/N=arithDisplay/W=(50,150,170,190)
574       
575        //Update the result name
576        ControlInfo/W=DataArithmeticPanel DS1_popup
577
578       
579       
580        arithDisplayProc(0)
581       
582End
583
584
585Function MakeDAPlotPanel()
586        PauseUpdate; Silent 1           // building window...
587        DoWindow/K DAPlotPanel
588        NewPanel /W=(14,44,454,484)/N=DAPlotPanel/K=1 as "Data Set Arithmetic"
589        ModifyPanel fixedSize=1
590
591        Display/HOST=DAPlotPanel/N=DAPlot/W=(0,0,440,400)
592        Legend
593        ShowInfo
594        SetActiveSubWindow DAPlotPanel
595        Checkbox DAPlot_log_cb, title="Log I(q)", pos={20,410},value=0
596        Checkbox DAPlot_log_cb, proc=DALogLinIProc
597        Checkbox DAPlot_lin_cb, title="High Q Linear", pos={100,410},value=0
598        Checkbox DAPlot_lin_cb, proc=DAHighQLinProc
599       
600End
601
602Function AddDAPlot(dataset)
603        Variable dataset
604       
605        String win = "DataArithmeticPanel"
606        String DS1name,DS2name,ResultName
607
608        switch(dataset)
609                case 1:
610                        ControlInfo/W=$(win) DS1_popup
611                        DS1name = S_Value
612                        Wave qWave = $("root:"+DS1name+":"+DS1name+"_q")
613                        Wave iWave = $("root:"+DS1name+":"+DS1name+"_i")
614                        Wave errWave = $("root:"+DS1name+":"+DS1name+"_s")
615                        AppendToGraph/W=DAPlotPanel#DAPlot iWave vs Qwave
616                        ErrorBars/W=DAPlotPanel#DAPlot /T=0 $(DS1name+"_i"), Y wave=(errWave,errWave)
617                        ModifyGraph/W=DAPlotPanel#DAPlot rgb($(DS1name+"_i"))=(65535,0,0)
618                        ControlInfo/W=$(win) DANoDS2_cb
619//                      if (V_Value == 1)
620//                                      Cursor/W=DAPlotPanel#DAPlot A, $(DS1name+"_i"), leftx(iWave)
621//                                      Cursor/W=DAPlotPanel#DAPlot/A=0 B, $(DS1name+"_i"),  rightx(iWave)
622//                      endif
623                        break
624                case 2:
625                        ControlInfo/W=$(win) DANoDS2_cb
626                        if (V_Value == 0)
627                                ControlInfo/W=$(win) DS2_popup
628                                DS2name = S_Value
629                                if(cmpstr(DS2name,"No data loaded")==0)
630                                        break                   //in case someone loads set 1, but not set two, then plots
631                                endif
632                                Wave qWave = $("root:"+DS2name+":"+DS2name+"_q")
633                                Wave iWave = $("root:"+DS2name+":"+DS2name+"_i")
634                                Wave errWave = $("root:"+DS2name+":"+DS2name+"_s")
635                                AppendToGraph/W=DAPlotPanel#DAPlot iWave vs Qwave
636                                ErrorBars/W=DAPlotPanel#DAPlot /T=0 $(DS2name+"_i"), Y wave=(errWave,errWave)                   
637                                ModifyGraph/W=DAPlotPanel#DAPlot rgb($(DS2name+"_i"))=(0,0,65535)
638                                Cursor/W=DAPlotPanel#DAPlot A, $(DS2name+"_i"), leftx(iWave)
639                                Cursor/W=DAPlotPanel#DAPlot/A=0 B, $(DS2name+"_i"),  rightx(iWave)
640                        else
641                                ControlInfo/W=$(win) DS1_popup
642                                DS1name = S_Value
643                                DuplicateDataSet("root:"+DS1name,"NullSolvent",1)
644                                Wave qWave =root:NullSolvent:NullSolvent_q
645                                Wave iWave = root:NullSolvent:NullSolvent_i
646                                Wave errWave = root:NullSolvent:NullSolvent_s
647                                Wave iWaveDS1 = $("root:"+DS1name+":"+DS1name+"_i")
648                                iWave = 1
649                                errWave = 0
650                                AppendToGraph/W=DAPlotPanel#DAPlot iWave vs Qwave
651                                ErrorBars/W=DAPlotPanel#DAPlot /T=0 NullSolvent_i, Y wave=(errWave,errWave)                     
652                                ModifyGraph/W=DAPlotPanel#DAPlot rgb(NullSolvent_i)=(0,0,65535)
653                                //Cursor/W=DAPlotPanel#DAPlot A, NullSolvent_i, leftx(iWave)
654                                //Cursor/W=DAPlotPanel#DAPlot/A=0 B, NullSolvent_i,  rightx(iWave)
655                                if(strlen(CsrInfo(A,"DAPlotPanel#DAPlot")) == 0)                //cursors not already on the graph             
656                                        Cursor/W=DAPlotPanel#DAPlot A, $(DS1Name+"_i"), leftx(iWaveDS1)
657                                        Cursor/W=DAPlotPanel#DAPlot/A=0 B, $(DS1Name+"_i"),  rightx(iWaveDS1)                   
658                                endif
659                        endif
660                        break
661                case 3:
662                        ControlInfo/W=$(win) DAResultName_sv
663                        ResultName = S_Value
664                        Wave qWave = $("root:"+ResultName+":"+ResultName+"_q")
665                        Wave iWave = $("root:"+ResultName+":"+ResultName+"_i")
666                        Wave errWave = $("root:"+ResultName+":"+ResultName+"_s")
667                        AppendToGraph/W=DAPlotPanel#DAPlot iWave vs Qwave
668                        ErrorBars/W=DAPlotPanel#DAPlot /T=0 $(ResultName+"_i"), Y wave=(errWave,errWave)
669                        ModifyGraph/W=DAPlotPanel#DAPlot rgb($(ResultName+"_i"))=(0,65535,0)
670                        break
671        endswitch
672
673        ControlInfo/W=DAPlotPanel DAPlot_log_cb
674        ModifyGraph/W=DAPlotPanel#DAPlot mode=3, msize=2, marker=19, mirror=1, tick=2, log(bottom)=1,log(left)=V_Value,tickUnit=1
675End
676
677Function arithDisplayProc(s)
678        Variable s
679
680        SetActiveSubWindow DataArithmeticPanel#arithDisplay
681
682        switch (s)
683                case 0:
684                        //Subtract
685                        DrawAction/L=progFront delete
686                        DrawRect 0,0,120,40
687                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,65535,0)
688                        DrawText 10,32,"I"
689                        SetDrawEnv fname="Times", fsize=22, fstyle= 1,textrgb= (0,0,0)
690                        DrawText 20,30,"="
691                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (65535,0,0)
692                        DrawText 35,32,"I"
693                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,65535)
694                        DrawText 95,32,"I"
695                        SetDrawEnv fname="Symbol", fsize=22, fstyle= 1,textrgb= (0,0,0)
696                        DrawText 52,32,"-"
697                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,0)
698                        DrawText 75,30,"f"
699                        SetDrawEnv fname="Times", fsize=22, fstyle= 1,textrgb= (0,0,0)
700                        DrawText 85,32,"*"
701                        break
702                case 1:
703                        //Add
704                        DrawAction/L=progFront delete
705                        DrawRect 0,0,120,40
706                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,65535,0)
707                        DrawText 10,32,"I"
708                        SetDrawEnv fname="Times", fsize=22, fstyle= 1,textrgb= (0,0,0)
709                        DrawText 20,30,"="
710                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (65535,0,0)
711                        DrawText 35,32,"I"
712                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,65535)
713                        DrawText 95,32,"I"
714                        SetDrawEnv fname="Symbol", fsize=22, fstyle= 1,textrgb= (0,0,0)
715                        DrawText 52,32,"+"
716                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,0)
717                        DrawText 75,30,"f"
718                        SetDrawEnv fname="Times", fsize=22, fstyle= 1,textrgb= (0,0,0)
719                        DrawText 85,32,"*"
720                        break
721                case 2:
722                        //Multiply
723                        DrawAction/L=progFront delete
724                        DrawRect 0,0,120,40
725                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,65535,0)
726                        DrawText 10,32,"I"
727                        SetDrawEnv fname="Times", fsize=22, fstyle= 1,textrgb= (0,0,0)
728                        DrawText 20,30,"="
729                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (65535,0,0)
730                        DrawText 35,32,"I"
731                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,65535)
732                        DrawText 95,32,"I"
733                        SetDrawEnv fname="Symbol", fsize=22, fstyle= 1,textrgb= (0,0,0)
734                        DrawText 52,32,"*"
735                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,0)
736                        DrawText 66,30,"("
737                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,0)
738                        DrawText 75,30,"f"
739                        SetDrawEnv fname="Times", fsize=22, fstyle= 1,textrgb= (0,0,0)
740                        DrawText 85,32,"*"
741                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,0)                                 
742                        DrawText 105,30,")"
743                        break
744                case 3:
745                        //Divide
746                        DrawAction/L=progFront delete
747                        DrawRect 0,0,120,40
748                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,65535,0)
749                        DrawText 10,32,"I"
750                        SetDrawEnv fname="Times", fsize=22, fstyle= 1,textrgb= (0,0,0)
751                        DrawText 20,30,"="
752                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (65535,0,0)
753                        DrawText 35,32,"I"
754                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,65535)
755                        DrawText 95,32,"I"
756                        SetDrawEnv fname="Symbol", fsize=22, fstyle= 1,textrgb= (0,0,0)
757                        DrawText 52,32,"/"
758                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,0)
759                        DrawText 66,30,"("
760                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,0)
761                        DrawText 75,30,"f"
762                        SetDrawEnv fname="Times", fsize=22, fstyle= 1,textrgb= (0,0,0)
763                        DrawText 85,32,"*"
764                        SetDrawEnv fname="Times", fsize=22, fstyle= 2,textrgb= (0,0,0)                                 
765                        DrawText 105,30,")"
766                        break           
767        endswitch
768
769        SetActiveSubWindow DataArithmeticPanel
770       
771        return 0
772End
773
774//Must follow naming scheme to match buttons to popups
775//"Name_button" goes with "Name_popup"
776Function DA_LoadDataSetProc(ba) : ButtonControl
777        STRUCT WMButtonAction &ba
778       
779        switch( ba.eventCode )
780                case 2: // mouse up
781                        // click code here
782                        String cmd = "A_LoadOneDDataWithName(\"\","+num2str(0)+")"
783                        Execute cmd
784               
785                        SVAR gLastFileName = root:packages:NIST:gLastFileName
786
787                        String windowName = ba.win
788                        String popupName = StringFromList(0,ba.ctrlName,"_")+"_popup"
789                       
790                        ControlUpdate/W=$(windowName) $(popupName)
791                        //instead of a simple controlUpdate, better to pop the menu to make sure that the other menus follow
792                        // convoluted method to find the right item and pop the menu.
793
794                        String list,folderStr
795                        Variable num
796                        folderStr = CleanupName(gLastFileName,0)
797                        list = DM_DataSetPopupList()
798                        num=WhichListItem(folderStr,list,";",0,0)
799                        if(num != -1)
800                                PopupMenu $(popupName),mode=num+1,win=$(windowName)
801                                ControlUpdate/W=$(windowName) $(popupName)
802               
803                        endif
804                        //fake call to popup
805                        STRUCT WMPopupAction pa
806                        pa.win = ba.win
807                        pa.ctrlName = "DS1_popup"
808                        pa.eventCode = 2
809                        DA_PopupProc(pa)
810                        break
811        endswitch
812       
813        return 0
814End
815
816Function DA_PopupProc(pa) : PopupMenuControl
817        STRUCT WMPopupAction &pa
818       
819        String resultName
820       
821        switch( pa.eventCode)
822                case 2:
823                        //print "Called by "+pa.ctrlname+" with value "+pa.popStr
824                        ControlInfo/W=$(pa.win) $(pa.ctrlName)
825                        String popStr = S_Value
826                        if (stringmatch(pa.ctrlname,"*DS1*") == 1)
827                                resultName = stringfromlist(0,popStr,"_")+"_mod"
828                               
829                                SetVariable DAResultName_sv win=$(pa.win), value=_STR:resultName
830                        endif
831                break
832        endswitch
833       
834
835End
836
837// function to control the drawing of buttons in the TabControl on the main panel
838// Naming scheme for the buttons MUST be strictly adhered to... else buttons will
839// appear in odd places...
840// all buttons are named MainButton_NA where N is the tab number and A is the letter denoting
841// the button's position on that particular tab.
842// in this way, buttons will always be drawn correctly..
843//
844Function DATabsProc(tca) : TabControl
845        STRUCT WMTabControlAction &tca
846               
847        switch (tca.eventCode)
848                case 2:
849                //      Print "name,number",name,tab
850                        String ctrlList = ControlNameList("",";"),item="",nameStr=""
851                        Variable num = ItemsinList(ctrlList,";"),ii,onTab
852                        for(ii=0;ii<num;ii+=1)
853                                //items all start w/"DSTabItem_"
854                                item=StringFromList(ii, ctrlList ,";")
855                                nameStr=item[0,9]
856                                if(cmpstr(nameStr,"DATabItem_")==0)
857                                        onTab = str2num(item[10])
858                                        ControlInfo $item
859                                        switch (V_flag)
860                                                case 1:
861                                                        Button $item,disable=(tca.tab!=onTab)
862                                                        break
863                                                case 2:
864                                                        CheckBox $item,disable=(tca.tab!=onTab)
865                                                        break
866                                                case 3:
867                                                        PopUpMenu       $item,disable=(tca.tab!=onTab)
868                                                        break
869                                                case 5:
870                                                        SetVariable     $item,disable=(tca.tab!=onTab)
871                                                        break
872                                        endswitch
873                                endif
874                        endfor
875                       
876                        arithDisplayProc(tca.tab)
877                        break
878        endswitch       
879End
880
881
882Function DACalculateProc(ba) : ButtonControl
883        STRUCT WMButtonAction &ba
884       
885        String DS1,DS2,Resultname
886       
887        switch(ba.eventCode)
888        case 2:
889                //Which tab?
890                ControlInfo/W=$(ba.win) DATabs
891                Variable tabNum = V_value
892                //Print "Tab number "+num2str(tabNum)
893
894                ControlInfo/W=$(ba.win) DS1_popup
895                DS1 = S_Value
896                ControlInfo/W=$(ba.win) DANoDS2_cb
897                if (V_Value == 0)
898                        ControlInfo/W=$(ba.win) DS2_popup
899                        DS2 = S_Value
900                else
901                        DS2 = "NullSolvent"
902                endif
903                ControlInfo/W=$(ba.win) DAResultName_sv
904                Resultname = CleanupName(S_Value, 0 )           //clean up any bad characters, and put the cleaned string back
905                SetVariable DAResultName_sv,value=_STR:ResultName
906               
907                ControlInfo/W=$(ba.win) DAScale_sv
908                Variable Scalefactor = V_Value
909
910                switch(tabNum)
911                        case 0:
912                                //do subtraction
913                                //print "Subtraction of "+DS2+" from "+DS1+" with sf "+num2str(scalefactor)+ " into "+Resultname
914                                SubtractDataSets(DS1,DS2,Scalefactor,Resultname)
915                                break
916                        case 1:
917                                //do addition
918                                AddDataSets(DS1,DS2,Scalefactor,Resultname)
919                                break
920                        case 2:
921                                //do multiplication
922                                MultiplyDataSets(DS1,DS2,Scalefactor,Resultname)
923                                break
924                        case 3:
925                                //do division
926                                DivideDataSets(DS1,DS2,Scalefactor,Resultname)
927                                break
928                endswitch
929               
930                //Sort out plot
931                //Fake button press to DAPlotButtonProc
932                STRUCT WMButtonAction ba2
933                ba2.win = ba.win
934                ba2.ctrlName = "DAPlot_button"
935                ba2.eventCode = 2
936               
937                // I've commented this out - the cursors get reset to the ends since this removes all sets from the graph, and
938                // then replots them. What is the real purpose of this call? To clear the old result off before adding the
939                // new one?
940//              DAPlotButtonProc(ba2)
941                ba2.userData = ResultName
942                DAPlotRemoveResult(ba2)
943               
944               
945                AddDAPlot(3)
946                DoWindow/F DataArithmeticPanel
947               
948                //Enable save button now that we have a result to save
949                Button DASave_Button win=$(ba.win),disable=0
950               
951//              SetActiveSubWindow DAPlotPanel
952        endswitch
953       
954End
955
956// remove what is not the
957//
958Function DAPlotRemoveResult(ba) : ButtonControl
959        STRUCT WMButtonAction &ba
960       
961        String win = ba.win
962        String ResultName = ba.userData
963        String item="",traceList=""
964        Variable ii=0,num
965
966        switch (ba.eventCode)
967                case 2:         //mouse up
968                        //data set 1
969                        ControlInfo/W=$(win) DS1_popup
970                        String DS1 = S_Value
971                       
972                        //Get folder for DS2
973                        ControlInfo/W=$(win) DS2_popup
974                        String DS2 = S_Value
975                       
976                        // state of the checkbox
977                        ControlInfo/W=$(win) DANoDS2_cb
978                        if(V_Value)
979                                DS2 = "NullSolvent"
980                        endif
981                       
982                        DoWindow DAPlotPanel
983                        if (V_Flag == 0)
984                                MakeDAPlotPanel()
985                        else
986                                DoWindow/HIDE=0/F DAPlotPanel
987                                traceList = TraceNameList("DAPlotPanel#DAPlot",";",1)
988                                num=ItemsInList(traceList)
989                                ii=0
990                                do
991                                        item = StringFromList(ii,traceList,";")
992                                        if (stringmatch(item,ResultName+"*")==1)                //it it's the specific trace I've asked to remove
993                                                RemoveFromGraph/W=DAPlotPanel#DAPlot $item
994                                        elseif (stringmatch(item,DS1+"*")==0 && stringmatch(item,DS2+"*")==0)           //if it's not set1 & not set2
995                                                RemoveFromGraph/W=DAPlotPanel#DAPlot $item
996                                        endif
997                                       
998                                        ii+=1
999                                while(ii<num)                           
1000                        endif
1001                       
1002                        break
1003        endswitch
1004
1005        return 0
1006End
1007
1008
1009Function DAPlotButtonProc(ba) : ButtonControl
1010        STRUCT WMButtonAction &ba
1011       
1012        String win = ba.win
1013
1014        switch (ba.eventCode)
1015                case 2:
1016                        //mouse up
1017                        //Get folder for DS1
1018                        DoWindow DAPlotPanel
1019                        if (V_Flag == 0)
1020                                MakeDAPlotPanel()
1021                        else
1022                                DoWindow/HIDE=0/F DAPlotPanel
1023                                do
1024                                        String tracename = StringFromList(0,TraceNameList("DAPlotPanel#DAPlot",";",1),";")
1025                                        if (cmpstr(tracename,"")==0)
1026                                                break
1027                                        else
1028                                                RemoveFromGraph/W=DAPlotPanel#DAPlot $tracename
1029                                        endif                   
1030                                while(1)                               
1031                        endif
1032                       
1033                        ControlInfo/W=$(win) DS1_popup
1034                        String DS1 = S_Value
1035                        if (cmpstr(DS1,"") != 0 )
1036                                AddDAPlot(1)
1037                        endif
1038                        //Get folder for DS2
1039                        ControlInfo/W=$(win) DS2_popup
1040                        String DS2 = S_Value
1041                        if (cmpstr(DS2,"") != 0)
1042                                AddDAPlot(2)
1043                        endif
1044                        break
1045        endswitch
1046
1047        return 0
1048End
1049
1050Function DADoneButtonProc(ba) : ButtonControl
1051        STRUCT WMButtonAction &ba
1052       
1053        String win = ba.win
1054
1055        switch (ba.eventCode)
1056                case 2:
1057                        DoWindow/K DAPlotPanel
1058                        DoWindow/K DataArithmeticPanel
1059                        break
1060        endswitch
1061
1062        return 0
1063End
1064
1065Function DAHelpButtonProc(ba) : ButtonControl
1066        STRUCT WMButtonAction &ba
1067       
1068        String win = ba.win
1069
1070        switch (ba.eventCode)
1071                case 2:
1072                        // click code here
1073                        DisplayHelpTopic/Z/K=1 "Data Set Arithmetic"
1074                        if(V_flag !=0)
1075                                DoAlert 0,"The Data Set Arithmetic Help file could not be found"
1076                        endif
1077                        break
1078        endswitch
1079
1080        return 0
1081End
1082
1083Function DALogLinIProc(cba) : CheckBoxControl
1084        STRUCT WMCheckBoxAction &cba
1085
1086        switch(cba.eventcode)
1087                case 2:
1088                       
1089                        ModifyGraph/W=DAPlotPanel#DAPlot log(left)=cba.checked
1090                        ModifyGraph/W=DAPlotPanel#DAPlot log(bottom)=cba.checked
1091                        ModifyGraph/W=DAPlotPanel#DAPlot zero(left)=0
1092                        SetAxis/A/W=DAPlotPanel#DAPlot
1093                       
1094                        if(cba.checked)
1095                                Checkbox DAPlot_lin_cb,value=0          //uncheck lin
1096                        endif
1097        endswitch
1098
1099
1100End
1101
1102Function DAHighQLinProc(cba) : CheckBoxControl
1103        STRUCT WMCheckBoxAction &cba
1104
1105        switch(cba.eventcode)
1106                case 2:
1107                        if(cba.checked)
1108                                ModifyGraph/W=DAPlotPanel#DAPlot log=0,zero(left)=1
1109                                SetAxis/W=DAPlotPanel#DAPlot left -0.1,0.1
1110                                SetAxis/W=DAPlotPanel#DAPlot bottom 0.1,*
1111                                SetAxis/W=DAPlotPanel#DAPlot left -0.02,0.02
1112                               
1113                                Checkbox DAPlot_log_cb,value=0          //uncheck the log
1114                        endif
1115        endswitch
1116
1117
1118End
1119
1120
1121Function DACursorButtonProc(ba) : ButtonControl
1122        STRUCT WMButtonAction &ba
1123
1124        String DS1,DS2
1125       
1126        switch(ba.eventCode)
1127                case 2:
1128               
1129                        ControlInfo/W=$(ba.win) DS1_popup
1130                        DS1 = S_Value
1131                        ControlInfo/W=$(ba.win) DANoDS2_cb
1132                        Variable NoDS2 = V_Value
1133                        if (NoDS2 == 0)
1134                                ControlInfo/W=$(ba.win) DS2_popup
1135                                DS2 = S_Value
1136                        else
1137                                DS2 = "NullSolvent"
1138                        endif
1139               
1140                        //AJJ Nov 2009 - UGLY - Will have to revisit this when we deal with hierarchical folders
1141                        Wave set1_i = $("root:"+DS1+":"+DS1+"_i")
1142                        Wave set1_q = $("root:"+DS1+":"+DS1+"_q")
1143                        Wave set2_i = $("root:"+DS2+":"+DS2+"_i")
1144                        Wave set2_q = $("root:"+DS2+":"+DS2+"_q")
1145                        Duplicate/O set1_i tmp_i
1146                        Duplicate/O set1_q tmp_q
1147                        tmp_i = set1_i / interp(set1_q[p],set2_q,set2_i)       
1148                       
1149                        //Get cursors
1150                        Variable q1,q2
1151                       
1152                        DoWindow/F DAPlotPanel
1153                        SetActiveSubWindow DAPlotPanel#DAPlot
1154                       
1155                        q1 = CsrXWaveRef(A)[pcsr(A)]
1156                        q2 = CsrXWaveRef(B)[pcsr(B)]
1157
1158                        //Update value display
1159                        ValDisplay DARangeStar_vd,value=_NUM:q1, win=$(ba.win)
1160                        ValDisplay DARangeEnd_vd,value=_NUM:q2, win=$(ba.win)
1161                       
1162                        //Calculate scalefactor
1163                       
1164                        if (NoDS2 == 1)
1165                                Wave avgWave = set1_i
1166                        else
1167                                Wave avgWave = tmp_i
1168                        endif
1169
1170                        Variable p1 = BinarySearch(tmp_q,q1)                   
1171                        Variable p2 = BinarySearch(tmp_q,q2)                   
1172
1173                        //print avgWave
1174
1175                        WaveStats/Q/R=[p1,p2] avgWave
1176                        //print V_avg
1177                        //Update sv control
1178                        SetVariable DAScale_sv, value=_NUM:V_avg, win=$(ba.win)
1179                       
1180                        KillWaves/Z tmp_i,tmp_q
1181                        DoWindow/F DataArithmeticPanel
1182        endswitch
1183
1184End
1185
1186
1187Function DANoDS2Proc(cba) : CheckBoxControl
1188        STRUCT WMCheckBoxAction &cba
1189       
1190       
1191        switch(cba.eventCode)
1192                case 2:
1193                        if (cba.checked == 1)
1194                                //Disable DS2 popup etc
1195                                PopupMenu DS2_popup win=$(cba.win), disable=2
1196                                Button DS2_button win=$(cba.win), disable=2
1197                        else
1198                                //Enable DS2 popup etc
1199                                PopupMenu DS2_popup win=$(cba.win), disable=0
1200                                Button DS2_button win=$(cba.win), disable=0
1201                        endif
1202                        //Sort out plot
1203                        //Fake button press to DAPlotButtonProc
1204                        STRUCT WMButtonAction ba2
1205                        ba2.win = cba.win
1206                        ba2.ctrlName = "DAPlot_button"
1207                        ba2.eventCode = 2
1208                        DAPlotButtonProc(ba2)
1209                        SetActiveSubWindow DAPlotPanel
1210                        DoWindow/F DataArithmeticPanel
1211        endswitch
1212
1213End
1214
1215Function DASaveProc(ba) : ButtonControl
1216        STRUCT WMButtonAction &ba
1217       
1218        switch(ba.eventCode)
1219                case 2:
1220                        ControlInfo/W=$(ba.win) DAResultName_sv
1221                        SaveDataSetToFile(S_Value)
1222                        break
1223        endswitch
1224
1225
1226End
1227
1228/////////////////////// Common Panel Functions ///////////////////////////////////////
1229
1230
1231// is there a simpler way to do this? I don't think so.
1232Function/S DM_DataSetPopupList()
1233
1234        String str=GetAList(4)
1235
1236        if(strlen(str)==0)
1237                str = "No data loaded"
1238        endif
1239        str = SortList(str)
1240       
1241        return(str)
1242End
1243
1244
1245Function DANameSetvarproc(sva) : SetVariableControl
1246        STRUCT WMSetVariableAction &sva
1247               
1248        switch( sva.eventCode )
1249                case 1: // mouse up
1250                case 2: // Enter key
1251                case 3: // Live update
1252                                String sv = sva.sval
1253                                if( strlen(sv) > 25 )
1254                                        sv= sv[0,24]
1255                                        SetVariable  $(sva.ctrlName),win=$(sva.win),value=_STR:sv
1256                                        ControlUpdate /W=$(sva.win) $(sva.ctrlName)
1257                                        Beep
1258                                endif
1259                                Button DASave_Button win=$(sva.win), disable=2
1260                                break
1261                endswitch
1262        return 0
1263End
1264
1265
1266////////////////////// Functions to do manipulations ///////////////////////////////////
1267
1268Function RenameDataSet(dataSetFolder, newName)
1269        String dataSetFolder
1270        String newName
1271       
1272        String dataSetFolderParent,basestr,objName
1273        Variable index = 0
1274       
1275        //Abuse ParseFilePath to get path without folder name
1276        dataSetFolderParent = ParseFilePath(1,dataSetFolder,":",1,0)
1277        //Abuse ParseFilePath to get basestr
1278        basestr = ParseFilePath(0,dataSetFolder,":",1,0)
1279
1280//      try
1281                RenameDataFolder $(dataSetFolder) $(newName)//; AbortOnRTE
1282       
1283
1284                SetDataFolder $(dataSetFolderParent+newName)//; AbortOnRTE
1285                do
1286                        objName = GetIndexedObjName("",1,index)
1287                        if (strlen(objName) == 0)
1288                                break
1289                        endif
1290                        Rename $(objName) $(ReplaceString(basestr,objName,newName))
1291                        index+=1
1292                while(1)
1293                SetDataFolder root:
1294//      catch
1295//              Print "Aborted: " + num2str(V_AbortCode)
1296//              SetDataFolder root:
1297//      endtry
1298End
1299
1300
1301Function DuplicateDataSet(dataSetFolder, newName, forceoverwrite)
1302        String dataSetFolder
1303        String newName
1304        Variable forceoverwrite
1305
1306        String dataSetFolderParent,basestr,objName
1307        Variable index = 0
1308
1309        //Abuse ParseFilePath to get path without folder name
1310        dataSetFolderParent = ParseFilePath(1,dataSetFolder,":",1,0)
1311        //Abuse ParseFilePath to get basestr
1312        basestr = ParseFilePath(0,dataSetFolder,":",1,0)
1313       
1314        print "Duplicating "+dataSetFolder+" as "+newName
1315       
1316        SetDataFolder $(dataSetFolderParent)
1317       
1318        if (!DataFolderExists(newName))
1319                NewDataFolder $(newName)
1320        else
1321                if (!forceoverwrite)
1322                        DoAlert 1, "A dataset with the name "+newName+" already exists. Overwrite?"
1323                        if (V_flag == 2)
1324                                return 1
1325                        endif
1326                endif
1327        endif   
1328
1329        //If we are here, the folder (now) exists and the user has agreed to overwrite
1330        //either in the function call or from the alert.
1331        do
1332                objName = GetIndexedObjName(basestr,1,index)
1333                if (strlen(objName) == 0)
1334                        break
1335                endif
1336                objname = ":"+basestr+":"+objname
1337                        Duplicate/O $(objName) $(ReplaceString(basestr,objName,newName))
1338                index+=1
1339        while(1)
1340
1341        SetDataFolder root:
1342        return 0
1343End
1344
1345
1346// Subtract Set2 From Set1
1347// Use Result_I = Set1_I - f*Set2_I
1348Function SubtractDataSets(set1Name,set2Name,set2Scale,resultName)
1349        String set1Name
1350        String set2Name
1351        Variable set2Scale
1352        String resultName
1353
1354        String set1Path = "root:"+set1Name+":"
1355        String set2Path = "root:"+set2Name+":"
1356        String resultPath = "root:"+resultName+":"
1357       
1358        SetDataFolder root:
1359        //Create folder for result
1360        //UnloadDataSet(resultName)
1361        //Make the folder
1362        if (DuplicateDataSet(set1Path,resultName,0))
1363                return 1
1364        else
1365        //Do subtraction of I waves - including interpolation if necessary.
1366        Wave result_i = $(resultPath+resultName+"_i")
1367        Wave result_s = $(resultPath+resultName+"_s")
1368        Wave set1_i = $(set1Path+set1Name+"_i")
1369        Wave set1_q = $(set1Path+set1Name+"_q")
1370        Wave set1_s = $(set1Path+set1Name+"_s")
1371        Wave set2_i = $(set2Path+set2Name+"_i")
1372        Wave set2_q = $(set2Path+set2Name+"_q")
1373        Wave set2_s = $(set2Path+set2Name+"_s")
1374       
1375        result_i = set1_i - (set2Scale*interp(set1_q[p],set2_q,set2_i))
1376        result_s = sqrt(set1_s^2 + (set2Scale*interp(set1_q[p],set2_q,set2_s))^2 )
1377        //Calculate result error wave - can we produce corrected Q error?
1378       
1379        //Generate history string to record what was done?
1380        return 0
1381        endif
1382End
1383
1384// Add Set2 to Set1
1385// Use Result_I = Set1_I + f*Set2_I
1386Function AddDataSets(set1Name,set2Name,set2Scale,resultName)
1387        String set1Name
1388        String set2Name
1389        Variable set2Scale
1390        String resultName
1391
1392        String set1Path = "root:"+set1Name+":"
1393        String set2Path = "root:"+set2Name+":"
1394        String resultPath = "root:"+resultName+":"
1395       
1396        SetDataFolder root:
1397        //Create folder for result
1398        if(DuplicateDataSet(set1Path,resultName,0))
1399                //User said no overwrite
1400                return 1
1401        else
1402        //Do addition of I waves - including interpolation if necessary.
1403        Wave result_i = $(resultPath+resultName+"_i")
1404        Wave result_s = $(resultPath+resultName+"_s")
1405        Wave set1_i = $(set1Path+set1Name+"_i")
1406        Wave set1_q = $(set1Path+set1Name+"_q")
1407        Wave set1_s = $(set1Path+set1Name+"_s")
1408        Wave set2_i = $(set2Path+set2Name+"_i")
1409        Wave set2_q = $(set2Path+set2Name+"_q")
1410        Wave set2_s = $(set2Path+set2Name+"_s")
1411       
1412        result_i =  set1_i + set2Scale*interp(set1_q[p],set2_q,set2_i) 
1413        //Calculate result error wave (note that this is identical to subtraction)
1414        result_s = sqrt(set1_s^2 + (set2Scale*interp(set1_q[p],set2_q,set2_s))^2 )
1415
1416        //  - can we produce corrected Q error?
1417        //Generate history string to record what was done?
1418        return 0
1419        endif
1420End
1421
1422// Multiply Set1 by Set2
1423// Use Result_I  = Set1_I * (f*Set2_I)
1424Function MultiplyDataSets(set1Name, set2Name, set2Scale, resultName)
1425        String set1Name
1426        String set2Name
1427        Variable set2Scale
1428        String resultName
1429
1430        String set1Path = "root:"+set1Name+":"
1431        String set2Path = "root:"+set2Name+":"
1432        String resultPath = "root:"+resultName+":"
1433       
1434        SetDataFolder root:
1435        //Create folder for result
1436        //Make the folder
1437        if(DuplicateDataSet(set1Path,resultName,0))
1438                //User said no overwrite
1439                return 1
1440        else
1441        //Do multiplcation of I waves - including interpolation if necessary.
1442        Wave result_i = $(resultPath+resultName+"_i")
1443        Wave result_s = $(resultPath+resultName+"_s")
1444        Wave set1_i = $(set1Path+set1Name+"_i")
1445        Wave set1_q = $(set1Path+set1Name+"_q")
1446        Wave set1_s = $(set1Path+set1Name+"_s")
1447        Wave set2_i = $(set2Path+set2Name+"_i")
1448        Wave set2_q = $(set2Path+set2Name+"_q")
1449        Wave set2_s = $(set2Path+set2Name+"_s")
1450       
1451        result_i =  set1_i*set2Scale*interp(set1_q[p],set2_q,set2_i)
1452        //Calculate result error wave
1453        // sum each of the relative errors, interpolating set 2 intensity and error as needed
1454        // then sqrt
1455        result_s = (set2Scale*interp(set1_q[p],set2_q,set2_i)*set1_s)^2
1456        result_s += (set2Scale*set1_i*interp(set1_q[p],set2_q,set2_s))^2
1457        result_s = sqrt(result_s)
1458
1459        // - can we produce corrected Q error?
1460
1461        //Generate history string to record what was done?
1462        return 0
1463        endif
1464End
1465
1466// Divide Set1 by Set2
1467// Use Result_I  = Set1_I / (f*Set2_I)
1468Function DivideDataSets(set1Name, set2Name, set2Scale, resultName)
1469        String set1Name
1470        String set2Name
1471        Variable set2Scale
1472        String resultName
1473
1474        String set1Path = "root:"+set1Name+":"
1475        String set2Path = "root:"+set2Name+":"
1476        String resultPath = "root:"+resultName+":"
1477       
1478        SetDataFolder root:
1479        //Create folder for result
1480        //Make the folder
1481        if(DuplicateDataSet(set1Path,resultName,0))
1482                //User said no overwrite
1483                return 1
1484        else
1485        //Do division of I waves - including interpolation if necessary.
1486        Wave result_i = $(resultPath+resultName+"_i")
1487        Wave result_s = $(resultPath+resultName+"_s")
1488        Wave set1_i = $(set1Path+set1Name+"_i")
1489        Wave set1_q = $(set1Path+set1Name+"_q")
1490        Wave set1_s = $(set1Path+set1Name+"_s")
1491        Wave set2_i = $(set2Path+set2Name+"_i")
1492        Wave set2_q = $(set2Path+set2Name+"_q")
1493        Wave set2_s = $(set2Path+set2Name+"_s")
1494       
1495        result_i =  set1_i/(set2Scale*interp(set1_q[p],set2_q,set2_i)   )
1496        //Calculate result error wave
1497        // sum each of the relative errors, interpolating set 2 intensity and error as needed
1498        // then sqrt
1499        result_s = (set1_s/set2Scale/interp(set1_q[p],set2_q,set2_i))^2
1500        result_s += (interp(set1_q[p],set2_q,set2_s)*set1_i/set2Scale/interp(set1_q[p],set2_q,set2_i)^2)^2
1501        result_s = sqrt(result_s)
1502
1503        // - can we produce corrected Q error?
1504       
1505        //Generate history string to record what was done?
1506        return 0
1507        endif
1508End
1509
1510
1511///////////////////////////Other Utility functions ////////////////////////////
1512
1513Function SaveDataSetToFile(folderName)
1514        String folderName
1515
1516        String protoStr = ""
1517        //Check for history string in folder
1518        //If it doesn't exist then
1519
1520        //Do saving of data file.
1521       
1522        NVAR gXML_Write = root:Packages:NIST:gXML_Write
1523
1524        if (gXML_Write == 1)
1525                ReWrite1DXMLData(folderName)
1526        else
1527                fReWrite1DData(folderName,"tab","CRLF")
1528        endif
1529
1530//      NISTSave1DData(folderName,protoStr)
1531
1532        //Include history string to record what was done?
1533
1534End
1535
1536
1537
1538//////////////////// Write data functions ////////////////////////////////////
1539// AJJ Nov 2009 - should move towards unified writer
1540//
1541//////////////////////////////////////////////////////////////////////////
1542
1543//Function NISTSave1DData(folderPath,protoStr)
1544//      String folderPath, protoStr
1545//     
1546//      //protoStr is string that will be written to either
1547//     
1548//
1549//End
1550
1551
1552
1553///////// SRK - VERY SIMPLE batch converter
1554// no header information is preserved
1555// file names are partially preserved
1556//
1557
1558/// to use this:
1559// -open the Plot Manager and set the path
1560// -run this function
1561//
1562// it doesn't matter if the XML ouput flag is set - this overrides.
1563Function batchXML26ColConvert()
1564
1565        String list, item,path,fname
1566        Variable num,ii
1567       
1568        PathInfo CatPathName
1569        path = S_Path
1570
1571        list = A_ReducedDataFileList("")
1572        num = itemsInList(list)
1573        Print num
1574        for(ii=0;ii<num;ii+=1)
1575                item = StringFromList(ii, list ,";")
1576                fname=path + item
1577                Execute "A_LoadOneDDataWithName(\""+fname+"\",0)"               //won't plot
1578//              easier to load all, then write out, since the name will be changed
1579        endfor
1580       
1581       
1582        list = DM_DataSetPopupList()
1583
1584        num = itemsInList(list)
1585        Print num
1586        for(ii=0;ii<num;ii+=1)
1587                item = StringFromList(ii, list ,";")
1588                fReWrite1DData_noPrompt(item,"tab","CR")
1589        endfor
1590       
1591End
1592
1593///////// SRK - VERY SIMPLE batch converter
1594// NO header information is preserved
1595// file names are partially preserved
1596//
1597
1598/// to use this:
1599// -open the Plot Manager and set the path
1600// -run this function
1601//
1602// it doesn't matter if the XML ouput flag is set - this overrides.
1603//
1604// The GRASP output data is 5-column Q-I-errI-sigQ-nCells
1605// which gets read in as q-i-s-ism-fit_ism (as if it was some wierd USANS data format)
1606// -- so fake the output...
1607//
1608Function batchGrasp26ColConvert()
1609
1610        String list, item,path,fname
1611        Variable num,ii,npt
1612       
1613        PathInfo CatPathName
1614        path = S_Path
1615
1616        list = A_ReducedDataFileList("")
1617        num = itemsInList(list)
1618        Print num
1619        for(ii=0;ii<num;ii+=1)
1620                item = StringFromList(ii, list ,";")
1621                fname=path + item
1622                Execute "A_LoadOneDDataWithName(\""+fname+"\",0)"               //won't plot
1623//              easier to load all, then write out, since the name will be changed
1624        endfor
1625       
1626       
1627        list = DM_DataSetPopupList()
1628
1629        num = itemsInList(list)
1630       
1631        Print num
1632        for(ii=0;ii<num;ii+=1)
1633                item = StringFromList(ii, list ,";")
1634               
1635                // fake the 6-column NIST data structure
1636                WAVE qw = $("root:"+item+":"+item+"_q")
1637                npt = numpnts(qw)
1638                Make/O/D/N=(npt,4) $("root:"+item+":"+item+"_res")
1639                WAVE res = $("root:"+item+":"+item+"_res")
1640                WAVE sigQ = $("root:"+item+":"+item+"_ism")
1641                res[][0] = sigQ[p]      // sigQ
1642                res[][1] = qw[p]                // qBar ~ q
1643                res[][2] = 1            //shadow
1644                res[][3] = qw[p]                // q
1645               
1646               
1647                fReWrite1DData_noPrompt(item,"tab","CR")
1648        endfor
1649       
1650End
1651
1652// quick version (copied from fReWrite1DData() that NEVER asks for a new fileName
1653// - and right now, always expect 6-column data, either SANS or USANS (re-writes -dQv)
1654// - AJJ Nov 2009 : better make sure we always fake 6 columns on reading then....
1655Function fReWrite1DData_noPrompt(folderStr,delim,term)
1656        String folderStr,delim,term
1657       
1658        String formatStr="",fullpath=""
1659        Variable refnum,dialog=1
1660       
1661        String dataSetFolderParent,basestr
1662       
1663        //setup delimeter and terminator choices
1664        If(cmpstr(delim,"tab")==0)
1665                //tab-delimeted
1666                formatStr="%15.8g\t%15.8g\t%15.8g\t%15.8g\t%15.8g\t%15.8g"
1667        else
1668                //use 3 spaces
1669                formatStr="%15.8g   %15.8g   %15.8g   %15.8g   %15.8g   %15.8g"
1670        Endif
1671        If(cmpstr(term,"CR")==0)
1672                formatStr += "\r"
1673        Endif
1674        If(cmpstr(term,"LF")==0)
1675                formatStr += "\n"
1676        Endif
1677        If(cmpstr(term,"CRLF")==0)
1678                formatStr += "\r\n"
1679        Endif
1680       
1681        //Abuse ParseFilePath to get path without folder name
1682        dataSetFolderParent = ParseFilePath(1,folderStr,":",1,0)
1683        //Abuse ParseFilePath to get basestr
1684        basestr = ParseFilePath(0,folderStr,":",1,0)
1685       
1686        //make sure the waves exist
1687        SetDataFolder $(dataSetFolderParent+basestr)
1688        WAVE/Z qw = $(baseStr+"_q")
1689        WAVE/Z iw = $(baseStr+"_i")
1690        WAVE/Z sw = $(baseStr+"_s")
1691        WAVE/Z resw = $(baseStr+"_res")
1692       
1693        if(WaveExists(qw) == 0)
1694                Abort "q is missing"
1695        endif
1696        if(WaveExists(iw) == 0)
1697                Abort "i is missing"
1698        endif
1699        if(WaveExists(sw) == 0)
1700                Abort "s is missing"
1701        endif
1702        if(WaveExists(resw) == 0)
1703                Abort "Resolution information is missing."
1704        endif
1705       
1706        Duplicate/O qw qbar,sigQ,fs
1707        if(dimsize(resW,1) > 4)
1708                //it's USANS put -dQv back in the last 3 columns
1709                NVAR/Z dQv = USANS_dQv
1710                if(NVAR_Exists(dQv) == 0)
1711                        Abort "It's USANS data, and I don't know what the slit height is."
1712                endif
1713                sigQ = -dQv
1714                qbar = -dQv
1715                fs = -dQv
1716        else
1717                //it's SANS
1718                sigQ = resw[p][0]
1719                qbar = resw[p][1]
1720                fs = resw[p][2]
1721        endif
1722       
1723        dialog=0
1724        if(dialog)
1725                PathInfo/S catPathName
1726//              fullPath = DoSaveFileDialog("Save data as",fname=baseStr+".txt")
1727                fullPath = DoSaveFileDialog("Save data as",fname=baseStr[0,strlen(BaseStr)-1])
1728                Print fullPath
1729                If(cmpstr(fullPath,"")==0)
1730                        //user cancel, don't write out a file
1731                        Close/A
1732                        Abort "no data file was written"
1733                Endif
1734                //Print "dialog fullpath = ",fullpath
1735        Endif
1736        PathInfo catPathName
1737        fullPath = S_Path + baseStr[0,strlen(BaseStr)-1]
1738
1739        Open refnum as fullpath
1740       
1741        fprintf refnum,"Modified data written from folder %s on %s\r\n",baseStr,(date()+" "+time())
1742        wfprintf refnum,formatStr,qw,iw,sw,sigQ,qbar,fs
1743        Close refnum
1744       
1745        KillWaves/Z sigQ,qbar,fs
1746       
1747        SetDataFolder root:
1748        return(0)
1749End
1750
1751///////////end SRK
Note: See TracBrowser for help on using the repository browser.