source: sans/Dev/trunk/NCNR_User_Procedures/Analysis/Packages/ModelPicker/SANSModelPicker_v40.ipf @ 499

Last change on this file since 499 was 499, checked in by ajj, 14 years ago

Couple of small bug fixes that were raising compile errors on load.

File size: 29.3 KB
Line 
1#pragma rtGlobals=1             // Use modern global access method.
2#pragma IgorVersion=6.0
3#pragma version=4.00
4
5//************************
6//
7// Utility procedure to allow the user to select exactly which fitting
8// functions they wish to include in their experiment. Smearing and plotting
9// procedures are automatically included
10//
11// Functions are now in "SANS Models" Menu, with submenus for
12// smeared/unsmeared functions
13//
14// this change was prompted due to the 31 item limitation of Windows submenus
15// resulting in functions being unavailable in the curve fitting dialog
16//
17// A built-in list of procedure files is included, and should match the current
18// distribution package -- see the procedure asdf() for instructions on how
19// to update the built-in list of procedures
20//
21// SRK 091801
22//
23// Updated for easier use 02 JUL 04 SRK
24//
25// SRK 16DEC05 added utility function to get the list of all functions
26// first - select and include all of the models
27//    -- Proc GetAllModelFunctions()
28//
29// SEE TypeNewModelList() for instructions on how to permanently add new model
30// functions to the list... (APR 06 SRK)
31//
32// added Freeze Model - to duplicate a model function/strip the dependency
33// and plot it on the top graph - so that parameters can be changed...
34// SRK 09 JUN 2006
35//
36//***************************
37
38// main procedure for invoking the Procedure list panel
39// initializes each time to make sure
40Proc ModelPicker_Panel()
41       
42        DoWindow/F Procedure_List
43        if(V_Flag==0)
44                Init_FileList()
45                Procedure_List()
46                AutoPositionWindow/M=1/R=WrapperPanel Procedure_List            //keep it on-screen
47        endif
48End
49
50// initialization procedure to create the necessary data folder and the waves for
51// the list box in the panel
52Proc Init_FileList()
53        //create the data folders  and globals
54        NewDataFolder/O root:Packages
55        NewDataFolder/O root:Packages:NIST
56       
57        if(!DataFolderExists("root:Packages:NIST:FileList"))
58                NewDataFolder/O/S root:Packages:NIST:FileList
59                //create the waves
60                Make/O/T/N=0 fileWave,includedFileWave
61                Make/O/N=0 selWave,selToDelWave
62        //      String/G allFiles=""
63                String/G MenuItemStr1=""
64                String/G MenuItemStr2=""
65                //DON'T create MenuItemStr_def
66               
67                // a switch for me to turn off file checking
68                Variable/G checkForFiles=1              //set to true initially
69               
70                // always turn off file checking for me
71                checkForFiles = !(stringmatch(ParseFilePath(0,SpecialDirPath("Desktop",0,0,0),":",1,1),"s*ine"))                //zero for me
72               
73                // turn off file checking if the proper alias to the NCNR procedures is there
74                PathInfo igor
75                NewPath/O/Q tmpUPPath S_Path + "User Procedures" 
76                String fileList = IndexedFile(tmpUPPath,-1,"????")
77                if(strsearch(fileList, "NCNR_User_Procedures", 0  , 2) != -1)   //ignore case
78                        checkforfiles = 0
79                        Print "found the proper procedures"
80                endif
81               
82                //fill the list of procedures
83                //
84                // first time, create wave from built-in list
85                FileList_BuiltInList()          //makes sure that the wave exists
86                FileList_GetListButtonProc()    //converts it into a list for the panel
87               
88                // "include" nothing to force a load of the utility procedures
89                FileList_InsertButtonProc("")
90               
91
92               
93                SetDataFolder root:
94        Endif
95End
96
97
98// for my own testing to read in a new list of procedures
99// FileList_GetListButtonProc("") will only read in a new list
100// if the wave SANS_Model_List does not exist
101Proc ReadNewProcList()
102        KillWaves/Z root:Packages:NIST:FileList:SANS_Model_List         //kill the old list
103        FileList_GetListButtonProc("")
104End
105
106// To create a new "Built-in" list of procedures, edit the
107// wave SANS_Model_List (a text wave), adding your new procedure names
108// (sort alphabetically if desired)
109// then use TypeNewModelList() to spit out the text format.
110// then paste this list into FileList_BuiltInList
111//
112// note that you won't have help for these new procedures until
113// you update the function documentation, making the name of the procedure
114// file a Subtopic
115//
116Proc TypeNewModelList()
117        variable ii=0,num=numpnts(root:Packages:NIST:FileList:SANS_Model_List)
118        printf "Make/O/T/N=%d  SANS_Model_List\r\r",num
119        do
120                printf "SANS_Model_List[%d] = \"%s\"\r",ii,root:Packages:NIST:FileList:SANS_Model_List[ii]
121                ii+=1
122        while(ii<num)
123End
124
125Proc FileList_BuiltInList()
126        SetDataFolder root:Packages:NIST:FileList
127
128////paste here... after deleting the old make statement and list
129       
130  Make/O/T/N=85  SANS_Model_List
131
132  SANS_Model_List[0] = "BE_Polyelectrolyte.ipf"
133  SANS_Model_List[1] = "CoreShellCylinder.ipf"
134  SANS_Model_List[2] = "CoreShell_Sq.ipf"
135  SANS_Model_List[3] = "CoreShell.ipf"
136  SANS_Model_List[4] = "Cylinder_Sq.ipf"
137  SANS_Model_List[5] = "Cylinder.ipf"
138  SANS_Model_List[6] = "DAB_model.ipf"
139  SANS_Model_List[7] = "HPMSA.ipf"
140  SANS_Model_List[8] = "HardSphereStruct.ipf"
141  SANS_Model_List[9] = "HollowCylinders.ipf"
142  SANS_Model_List[10] = "Lorentz_model.ipf"
143  SANS_Model_List[11] = "OblateCoreShell_Sq.ipf"
144  SANS_Model_List[12] = "OblateCoreShell.ipf"
145  SANS_Model_List[13] = "Peak_Gauss_model.ipf"
146  SANS_Model_List[14] = "Peak_Lorentz_model.ipf"
147  SANS_Model_List[15] = "PolyCoreShellRatio_Sq.ipf"
148  SANS_Model_List[16] = "PolyCoreShellRatio.ipf"
149  SANS_Model_List[17] = "PolyCore_Sq.ipf"
150  SANS_Model_List[18] = "PolyCore.ipf"
151  SANS_Model_List[19] = "PolyHardSphereInten.ipf"
152  SANS_Model_List[20] = "PolyRectSphere_Sq.ipf"
153  SANS_Model_List[21] = "PolyRectSphere.ipf"
154  SANS_Model_List[22] = "Power_Law_model.ipf"
155  SANS_Model_List[23] = "ProlateCoreShell_Sq.ipf"
156  SANS_Model_List[24] = "ProlateCoreShell.ipf"
157  SANS_Model_List[25] = "SmearedRPA.ipf"
158  SANS_Model_List[26] = "Sphere_Sq.ipf"
159  SANS_Model_List[27] = "Sphere.ipf"
160  SANS_Model_List[28] = "SquareWellStruct.ipf"
161  SANS_Model_List[29] = "StackedDiscs.ipf"
162  SANS_Model_List[30] = "Teubner.ipf"
163  SANS_Model_List[31] = "UniformEllipsoid_Sq.ipf"
164  SANS_Model_List[32] = "UniformEllipsoid.ipf"
165  SANS_Model_List[33] = "CoreShellCyl2D.ipf"
166  SANS_Model_List[34] = "Cylinder_2D.ipf"
167  SANS_Model_List[35] = "Ellipsoid2D.ipf"
168  SANS_Model_List[36] = "EllipticalCylinder2D.ipf"
169  SANS_Model_List[37] = "Beaucage.ipf"
170  SANS_Model_List[38] = "BimodalSchulzSpheres.ipf"
171  SANS_Model_List[39] = "BinaryHardSpheres.ipf"
172  SANS_Model_List[40] = "Cylinder_PolyLength.ipf"
173  SANS_Model_List[41] = "Cylinder_PolyRadius.ipf"
174  SANS_Model_List[42] = "Debye.ipf"
175  SANS_Model_List[43] = "EllipticalCylinder.ipf"
176  SANS_Model_List[44] = "FlexCyl_EllipCross.ipf"
177  SANS_Model_List[45] = "FlexCyl_PolyLen.ipf"
178  SANS_Model_List[46] = "FlexCyl_PolyRadius.ipf"
179  SANS_Model_List[47] = "FlexibleCylinder.ipf"
180  SANS_Model_List[48] = "Fractal.ipf"
181  SANS_Model_List[49] = "GaussSpheres_Sq.ipf"
182  SANS_Model_List[50] = "GaussSpheres.ipf"
183  SANS_Model_List[51] = "LamellarFF_HG.ipf"
184  SANS_Model_List[52] = "LamellarFF.ipf"
185  SANS_Model_List[53] = "LamellarPS_HG.ipf"
186  SANS_Model_List[54] = "LamellarPS.ipf"
187  SANS_Model_List[55] = "LogNormalSphere_Sq.ipf"
188  SANS_Model_List[56] = "LogNormalSphere.ipf"
189  SANS_Model_List[57] = "MultiShell.ipf"
190  SANS_Model_List[58] = "Parallelepiped.ipf"
191  SANS_Model_List[59] = "PolyCoreShellCylinder.ipf"
192  SANS_Model_List[60] = "SchulzSpheres_Sq.ipf"
193  SANS_Model_List[61] = "SchulzSpheres.ipf"
194  SANS_Model_List[62] = "StickyHardSphereStruct.ipf"
195  SANS_Model_List[63] = "TriaxialEllipsoid.ipf"
196  SANS_Model_List[64] = "Vesicle_UL_and_Struct.ipf"
197  SANS_Model_List[65] = "Vesicle_UL.ipf"
198  //2008 Models
199  SANS_Model_List[66] = "Core_and_NShells.ipf"
200  SANS_Model_List[67] = "PolyCore_and_NShells.ipf"
201  SANS_Model_List[68] = "Fractal_Polysphere.ipf"
202  SANS_Model_List[69] = "GaussLorentzGel.ipf"
203  SANS_Model_List[70] = "PolyGaussCoil.ipf"
204  SANS_Model_List[71] = "Two_Power_Law.ipf"
205  SANS_Model_List[72] = "BroadPeak.ipf"
206  SANS_Model_List[73] = "CorrelationLengthModel.ipf"
207  SANS_Model_List[74] = "TwoLorentzian.ipf"
208  SANS_Model_List[75] = "PolyGaussShell.ipf"
209  SANS_Model_List[76] = "LamellarParacrystal.ipf"
210  SANS_Model_List[77] = "SC_ParaCrystal.ipf"
211  SANS_Model_List[78] = "BCC_ParaCrystal.ipf"
212  SANS_Model_List[79] = "FCC_ParaCrystal.ipf"
213  SANS_Model_List[80] = "Spherocylinder.ipf"
214  SANS_Model_List[81] = "Dumbbell.ipf"
215  SANS_Model_List[82] = "ConvexLens.ipf"
216  SANS_Model_List[83] = "CappedCylinder.ipf"
217  SANS_Model_List[84] = "Barbell.ipf"
218
219
220  ///end paste here
221End
222
223//another way to add a single procedure name to the list
224// (only in the current experiment!)
225// not a permanent add to the template, unless you re-save the
226// template
227Proc AddProcedureToList(ProcedureName)
228        String ProcedureName
229       
230        SetDataFolder root:Packages:NIST:FileList
231        Variable num
232        num=numpnts(fileWave)
233        Redimension/N=(num+1) fileWave
234        fileWave[num] = ProcedureName
235        num=numpnts(selWave)
236        Redimension/N=(num+1) selWave
237        selWave[num] = 0
238       
239        SetDataFolder root:
240End
241/////////////////////////////////////////////////////////////
242
243
244Proc doCheck(val)
245        Variable val
246        // a switch for me to turn off file checking
247        root:Packages:NIST:FileList:checkForFiles=val   //0==no check, 1=check 
248End
249
250
251//Function MakeMenu_ButtonProc(ctrlName) : ButtonControl
252//      String ctrlName
253
254//      RefreshMenu()
255//End
256
257//procedure for drawing the simple panel to pick and compile selected models
258//
259Proc Procedure_List()
260        PauseUpdate; Silent 1           // building window...
261        NewPanel /W=(1115,44,1453,363) /K=2
262        DoWindow/C Procedure_List
263        ModifyPanel fixedSize=1
264       
265        ListBox fileList,pos={4,3},size={200,203},listWave=root:Packages:NIST:FileList:fileWave
266        ListBox fileList,selWave=root:Packages:NIST:FileList:selWave,mode= 4
267        ListBox inclList,pos={4,212},size={200,100}
268        ListBox inclList,listWave=root:Packages:NIST:FileList:includedFileWave
269        ListBox inclList,selWave=root:Packages:NIST:FileList:selToDelWave,mode= 4
270        Button button0,pos={212,173},size={110,20},proc=FileList_InsertButtonProc,title="Include File(s)"
271        Button button0,help={"Includes the selected procedures, functions appear under the SANS Models menu"}
272        Button button5,pos={212,283},size={110,20},proc=FileList_RemoveButtonProc,title="Remove File(s)"
273        Button button5,help={"Removes selected procedures from the experiment"}
274        Button PickerButton,pos={212,14},size={90,20},proc=FileList_HelpButtonProc,title="Help"
275        Button PickerButton,help={"If you need help understanding what a help button does, you really need help"}
276        Button button1,pos={212,37},size={100,20},proc=FileList_HelpButtonProc,title="Function Help"
277        Button button1,help={"If you need help understanding what a help button does, you really need help"}
278        GroupBox group0,pos={203,128},size={46,11},title="Select model functions"
279        GroupBox group0_1,pos={203,145},size={46,11},title="to include"
280EndMacro
281
282
283//button function to prompt user to select path where procedures are located
284Function FL_PickButtonProc(ctrlName) : ButtonControl
285        String ctrlName
286
287        PickProcPath()
288End
289
290//bring the help notebook to the front
291Function FileList_HelpButtonProc(ctrlName) : ButtonControl
292        String ctrlName
293
294        if(cmpstr(ctrlName,"PickerButton")==0)          //PickerButton is the picker help
295                DisplayHelpTopic/Z/K=1 "SANS Model Picker"
296                if(V_flag !=0)
297                        DoAlert 0,"The SANS Model Picker Help file could not be found"
298                endif
299                return(0)
300        endif
301       
302        //otherwise, show the help for the selected function   
303        //loop through the selected files in the list...
304        //
305        Wave/T fileWave=$"root:Packages:NIST:FileList:fileWave"
306        Wave sel=$"root:Packages:NIST:FileList:selWave"
307       
308        Variable num=numpnts(sel),ii
309        String fname=""
310       
311//      NVAR doCheck=root:Packages:NIST:FileList:checkForFiles
312        ii=num-1                //work bottom-up to not lose the index
313        do
314                if(sel[ii] == 1)               
315                                fname = fileWave[ii] //RemoveExten(fileWave[ii])
316                endif
317                ii-=1
318        while(ii>=0)
319       
320        // nothing selected in the list to include,
321        //try the list of already-included files
322        if(cmpstr(fname,"")==0)
323                Wave/T inclFileWave=$"root:Packages:NIST:FileList:includedFileWave"
324                Wave seltoDel=$"root:Packages:NIST:FileList:selToDelWave"
325                num=numpnts(seltoDel)
326                ii=num-1                //work bottom-up to not lose the index
327                do
328                        if(seltoDel[ii] == 1)           
329                                        fname = inclFileWave[ii] //RemoveExten(fileWave[ii])
330                        endif
331                        ii-=1
332                while(ii>=0)
333        endif
334       
335        if(cmpstr(fname,"")!=0)
336//              Print "show help for ",RemoveExten(fname)
337//              Print fname[strlen(fname)-11,strlen(fname)-1]
338                if(cmpstr(fname[strlen(fname)-7,strlen(fname)-1],"_Sq.ipf") ==0 )
339                        DisplayHelpTopic/Z/K=1 "How Form Factors and Structure Factors are Combined"
340                        if(V_flag !=0)
341                                DoAlert 0,"The Help file could not be found"
342                        endif
343                else
344                        DisplayHelpTopic/Z/K=1 fname
345                        if(V_flag !=0)
346                                DoAlert 0,"The Help file could not be found for " + fname
347                        endif
348                endif
349        else
350                DoAlert 0,"Please select a function from the list to display its help file"
351        endif
352       
353        return(0)
354End
355
356//closes the panel when done
357Function FileListDoneButtonProc(ctrlName) : ButtonControl
358        String ctrlName
359
360        //kill the panel
361        DoWindow/K Procedure_List
362        return(0)
363End
364
365//reads in the list of procedures
366// (in practice, the list will be part of the experiment)
367// but this can be used to easily update the list if
368// new models are added, or if a custom list is desired
369// - these lists could also be stored in the template
370//
371Function FileList_GetListButtonProc(ctrlName) : ButtonControl
372        String ctrlName
373       
374        String list=""
375
376        if(Exists("root:Packages:NIST:FileList:SANS_Model_List") != 1)
377                SetDataFolder root:Packages:NIST:FileList
378                LoadWave/A/T
379                WAVE/T w=$(StringFromList(0,S_WaveNames,";"))
380                SetDataFolder root:
381        else
382                WAVE/T w=$("root:Packages:NIST:FileList:SANS_Model_List")
383        endif
384       
385//      // convert the input wave to a semi-list
386//      SVAR allFiles=root:Packages:NIST:FileList:allFiles
387//      allFiles=MP_TextWave2SemiList(w)
388        list=MP_TextWave2SemiList(w)
389       
390        //get the list of available files from the specified path
391        String newList="",item=""
392        Variable num=ItemsInList(list,";"),ii
393
394        // remove the items that have already been included
395        Wave/T includedFileWave=$"root:Packages:NIST:FileList:includedFileWave"
396        Variable numInc=numpnts(includedFileWave)
397        for(ii=0;ii<numInc;ii+=1)
398                list = RemoveFromList(includedFileWave[ii],list,";")
399        endfor
400        list = SortList(list,";",0)
401        num=ItemsInList(list,";")
402        WAVE/T fileWave=$"root:Packages:NIST:FileList:fileWave"
403        WAVE selWave=$"root:Packages:NIST:FileList:selWave"
404        Redimension/N=(num) fileWave            //make the waves the proper length
405        Redimension/N=(num) selWave
406        fileWave = StringFromList(p,list,";")           //converts the list to a wave
407        Sort filewave,filewave
408       
409        return(0)
410End
411
412//*******OLD WAY*******
413//*******NOT USED*******
414//gets the list of files in the folder specified by procPathName
415//filters the list to remove some of the procedures that the user does not need to see
416// list is assigned to textbox wave
417Function OLD_FileList_GetListButtonProc(ctrlName) : ButtonControl
418        String ctrlName
419       
420        //make sure that path exists
421        PathInfo procPathName
422        if (V_flag == 0)
423                //Abort "Folder path does not exist - use Pick Path button to set path"
424                //build the path to the User Procedures folder
425                PathInfo Igor
426        //      Print S_Path
427                String UserProcStr=S_path+"User Procedures:"
428                NewPath/O/Q procPathName  UserProcStr
429        Endif
430       
431        String list=""
432//      list=IndexedFile(procPathName,-1,"????")
433
434// new way, to catch all files in all subfolders
435        SVAR allFiles=root:Packages:NIST:FileList:allFiles
436        allFiles=""             //clear the list
437
438        ListAllFilesAndFolders("procPathName",1,1,0)    //this sets allFiles
439        list = allFiles
440       
441        //get the list of available files from the specified path
442       
443        String newList="",item=""
444        Variable num=ItemsInList(list,";"),ii
445        //remove procedures from the list the are unrelated, or may be loaded by default (Utils)
446        list = RemoveFromList(".DS_Store",list,";")             //occurs on OSX, not "hidden" to Igor
447        list = RemoveFromList("GaussUtils.ipf",list,";" )
448        list = RemoveFromList("PlotUtils.ipf",list,";" )
449        list = RemoveFromList("PlotUtilsMacro.ipf",list,";" )
450        list = RemoveFromList("WriteModelData.ipf",list,";" )
451        list = RemoveFromList("WMMenus.ipf",list,";" )
452        list = RemoveFromList("DemoLoader.ipf",list,";" )
453        // remove the items that have already been included
454        Wave/T includedFileWave=$"root:Packages:NIST:FileList:includedFileWave"
455        Variable numInc=numpnts(includedFileWave)
456        for(ii=0;ii<numInc;ii+=1)
457                list = RemoveFromList(includedFileWave[ii],list,";")
458        endfor
459        list = SortList(list,";",0)
460        num=ItemsInList(list,";")
461        WAVE/T fileWave=$"root:Packages:NIST:FileList:fileWave"
462        WAVE selWave=$"root:Packages:NIST:FileList:selWave"
463        Redimension/N=(num) fileWave            //make the waves the proper length
464        Redimension/N=(num) selWave
465        fileWave = StringFromList(p,list,";")           //converts the list to a wave
466        Sort filewave,filewave
467End
468
469// returns 1 if the file exists, 0 if the file is not there
470// fails miserably if there are aliases in the UP folder, although
471// the #include doesn't mind
472Function CheckFileInUPFolder(fileStr)
473        String fileStr
474
475        Variable err=0
476        String/G root:Packages:NIST:FileList:allFiles=""
477        SVAR allFiles = root:Packages:NIST:FileList:allFiles
478
479        SVAR fileVerExt = root:Packages:NIST:SANS_ANA_EXTENSION
480
481        fileStr = RemoveExten(fileStr)+fileVerExt
482       
483        PathInfo Igor
484        String UPStr=S_path+"User Procedures:"
485        NewPath /O/Q/Z UPPath ,UPStr
486        ListAllFilesAndFolders("UPPath",1,1,0)  //this sets allFiles
487        String list = allFiles
488//      err = FindListItem(fileStr, list ,";" ,0)
489        err = strsearch(list, fileStr, 0,2)             //this is not case-sensitive, but Igor 5!
490//      err = strsearch(list, fileStr, 0)               //this is Igor 4+ compatible
491//      Print err
492        if(err == -1)
493                return(0)
494        else
495                return(1)               //name was found somewhere
496        endif
497End
498
499
500Function FileList_InsertButtonProc(ctrlName) : ButtonControl
501        String ctrlName
502       
503        //loop through the selected files in the list...
504        Wave/T fileWave=$"root:Packages:NIST:FileList:fileWave"
505        Wave sel=$"root:Packages:NIST:FileList:selWave"
506        //and adjust the included file lists
507        Wave/T includedFileWave=$"root:Packages:NIST:FileList:includedFileWave"
508        Wave selToDel=$"root:Packages:NIST:FileList:selToDelWave"
509
510        SVAR fileVerExt=root:Packages:NIST:SANS_ANA_EXTENSION
511       
512        Variable numIncl=numpnts(includedFileWave)
513        Variable num=numpnts(sel),ii,ok
514        String fname=""
515
516        //Necessary for every analysis experiment
517        Execute/P "INSERTINCLUDE \"PlotUtilsMacro_v40\""
518        Execute/P "INSERTINCLUDE \"GaussUtils_v40\""
519        Execute/P "INSERTINCLUDE \"WriteModelData_v40\""
520       
521        NVAR doCheck=root:Packages:NIST:FileList:checkForFiles
522       
523        ii=num-1                //work bottom-up to not lose the index
524        do
525                if(sel[ii] == 1)
526                        //can I make sure the file exists before trying to include it?
527                        if(doCheck)
528                                ok = CheckFileInUPFolder(fileWave[ii])
529                        endif
530                        if(ok || !doCheck)
531                                fname = RemoveExten(fileWave[ii])       
532                                Execute/P "INSERTINCLUDE \""+fname+fileVerExt+"\""
533                                // add to the already included list, and remove from the to-include list (and selWaves also)
534                                InsertPoints numpnts(includedFileWave), 1, includedFileWave,selToDel
535                                includedFileWave[numpnts(includedFileWave)-1]=fileWave[ii]
536                               
537                                DeletePoints ii, 1, fileWave,sel
538                        else
539                                DoAlert 0,"File "+fileWave[ii]+" was not found in the User Procedures folder, so it was not included"
540                        endif
541                endif
542                ii-=1
543        while(ii>=0)
544//      Execute/P "COMPILEPROCEDURES ";Execute/P/Q/Z "RefreshMenu()"
545        Execute/P "COMPILEPROCEDURES "
546       
547        sel=0           //clear the selections
548        selToDel=0
549       
550        return(0)
551End
552
553Function FileList_RemoveButtonProc(ctrlName) : ButtonControl
554        String ctrlName
555       
556        //loop through the selected files in the list...
557        Wave/T includedFileWave=$"root:Packages:NIST:FileList:includedFileWave"
558        Wave selToDel=$"root:Packages:NIST:FileList:selToDelWave"
559        // and put the unwanted procedures back in the to-add list
560        Wave/T fileWave=$"root:Packages:NIST:FileList:fileWave"
561        Wave sel=$"root:Packages:NIST:FileList:selWave"
562       
563        SVAR fileVerExt=root:Packages:NIST:SANS_ANA_EXTENSION
564       
565        Variable num=numpnts(selToDel),ii
566        String fname="",funcToDelStr=""
567       
568        ii=num-1                //work backwards
569        do
570                if(selToDel[ii] == 1)
571                        fname = RemoveExten(includedFileWave[ii])
572                        Execute/P "DELETEINCLUDE \""+fname+fileVerExt+"\""
573                        //add to the to-include list
574                        InsertPoints numpnts(fileWave), 1, fileWave,sel
575                        fileWave[numpnts(fileWave)-1]=includedFileWave[ii]
576                        //delete the point
577                        DeletePoints ii, 1, includedFileWave,selToDel
578                        //
579                        // could kill dependencies connected to the procedure file, but really not necessary
580                        //funcToDelStr = FunctionList("*",";","WIN:"+fname+fileVerExt+".ipf")
581                        //KillAllDependentObjects("root:",funcToDelStr, 1, 1, 0)
582                         
583                endif
584                ii-=1
585        while(ii>=0)
586        Execute/P "COMPILEPROCEDURES "
587       
588        sel=0
589        selToDel=0
590       
591        Sort filewave,filewave
592        return(0)
593End
594
595Function KillDependentVariables(folderStr,funcToDelStr)
596        String folderStr,funcToDelStr
597       
598        String objName,formStr,funcStr,matchStr
599        Variable index = 0,loc
600       
601        do
602                objName = GetIndexedObjName(folderStr, 2, index)
603                if (strlen(objName) == 0)
604                        break
605                endif
606                formStr = GetFormula($(folderStr+objName))
607                if(strlen(formStr) != 0)
608                        loc = strsearch(formStr,"(",0)
609                        funcStr = formStr[0,loc-1]
610//                      Print objName,funcStr
611                        matchStr = ListMatch(funcToDelStr, funcStr ,";")
612                        if(strlen(matchStr) != 0)
613                                SetFormula $(folderStr+objName),""              //kill the dependency
614                                Printf "killed the dependency of %s on the function %s\r",folderStr+objName,matchStr
615                        endif
616                               
617                endif
618                               
619                index += 1
620        while(1)
621End
622
623
624
625// doesn't really kill all objects...
626// kills the dependency formula for any variable that has a formula that contains a function name
627// that matches anything in the funcToDelStr, which are functions that are about to be removed
628// from the experiment by DELETEINCLUDE
629//
630// recursively looks through all data folders
631//
632// on the first call:
633// pass "root:" as the pathName
634// full = 1
635// recurse = 1
636// level = 0
637//
638Function KillAllDependentObjects(pathName,funcToDelStr, full, recurse, level)
639        String pathName         // Name of symbolic path in which to look for folders.
640        String funcToDelStr             //list of functions to look for
641        Variable full                   // True to print full paths instead of just folder name.
642        Variable recurse                // True to recurse (do it for subfolders too).
643        Variable level          // Recursion level. Pass 0 for the top level.
644       
645        Variable ii
646        String prefix
647       
648//      SVAR allFiles=root:Packages:NIST:FileList:allFiles
649        // Build a prefix (a number of tabs to indicate the folder level by indentation)
650        prefix = ""
651        ii = 0
652        do
653                if (ii >= level)
654                        break
655                endif
656                prefix += "\t"                                  // Indent one more tab
657                ii += 1
658        while(1)
659       
660//      Printf "%s%s\r", prefix, pathName
661//      Print IndexedFile($pathName,-1,"????")
662        //allFiles += IndexedFile($pathName,-1,"????")
663       
664        KillDependentVariables(pathName,funcToDelStr)
665       
666        String path
667        ii = 0
668        do
669                path = GetIndexedObjName(pathName, 4, ii)
670                if (strlen(path) == 0)
671                        break                                                   // No more folders
672                endif
673                path = pathName+path+":"                        //the full path
674//              Print "ii, path = ",ii,path
675
676                if (recurse)                                            // Do we want to go into subfolder?
677                        KillAllDependentObjects(path, funcToDelStr, full, recurse, level+1)
678                endif
679               
680                ii += 1
681        while(1)
682End
683
684
685//removes ANY ".ext" extension from the name
686// - wipes out all after the "dot"
687// - procedure files to be included (using quotes) must be in User Procedures folder
688// and end in .ipf?
689Function/S RemoveExten(str)
690        String str
691       
692        Variable loc=0
693        String tempStr=""
694       
695        loc=strsearch(str,".",0)
696        tempStr=str[0,loc-1]
697        return(tempStr)
698End
699
700// function to have user select the path where the procedure files are
701//      - the selected path is set as procPathName
702//
703// setting the path to "igor" does not seem to have the desired effect of
704// bringing up the Igor Pro folder in the NewPath Dialog
705//
706//may also be able to use folder lists on HD - for more sophisticated listings
707Function PickProcPath()
708       
709        //set the global string to the selected pathname
710        PathInfo/S Igor
711       
712        NewPath/O/M="pick the SANS Procedure folder" procPathName
713        return(0)               //no error
714End
715
716
717//my menu, seemingly one item, but really a long string for each submenu
718// if root:MenuItemStr exists
719//Menu "SANS Models"
720//      StrVarOrDefault("root:Packages:NIST:FileList:MenuItemStr_def","ModelPicker_Panel")//, RefreshMenu()
721//      SubMenu "Unsmeared Models"
722//              StrVarOrDefault("root:Packages:NIST:FileList:MenuItemStr1","ModelPicker_Panel")
723//      End
724//      SubMenu "Smeared Models"
725//              StrVarOrDefault("root:Packages:NIST:FileList:MenuItemStr2","ModelPicker_Panel")
726//      End
727//      SubMenu "Models 3"
728//              StrVarOrDefault("root:MenuItemStr3","ModelPicker_Panel")
729//      End
730//End
731
732//wrapper to use the A_ prepended file loader from the dynamically defined menu
733//Proc LoadSANSorUSANSData()
734//      A_LoadOneDData()
735//End
736
737//// tweaked to find RPA model which has an extra parameter in the declaration
738//Function RefreshMenu()
739//
740//      String list="",sep=";"
741//     
742//      //list = "Refresh Menu"+sep+"ModelPicker_Panel"+sep+"-"+sep
743//      list = "ModelPicker_Panel"+sep+"-"+sep
744////    list += MacroList("LoadO*",sep,"KIND:1,NPARAMS:0")              //data loader
745//      list += "Load SANS or USANS Data;"              //use the wrapper above to get the right loader
746////    list += "Reset Resolution Waves;"               // resets the resolution waves used for the calculations
747////    list += "Freeze Model;"                                         // freeze a model to compare plots on the same graph
748//      list += MacroList("WriteM*",sep,"KIND:1,NPARAMS:4")             //data writer
749//      list += "-"+sep
750//      String/G root:Packages:NIST:FileList:MenuItemStr_def = TrimListTo255(list)
751//     
752//      list = ""
753//      list += MacroList("*",sep,"KIND:1,NPARAMS:3")                           //unsmeared plot procedures
754//      list += MacroList("Plot*",sep,"KIND:1,NPARAMS:4")                               //RPA has 4 parameters
755//      list = RemoveFromList("FreezeModel", list ,";")                 // remove FreezeModel, it's not a model
756//      //      list += "-"+sep
757//      String/G root:Packages:NIST:FileList:MenuItemStr1 = TrimListTo255(list)
758//
759//      list=""
760//      list += MacroList("PlotSmea*",sep,"KIND:1,NPARAMS:1")                   //smeared plot procedures
761//      list += MacroList("PlotSmea*",sep,"KIND:1,NPARAMS:2")                   //smeared RPA has 2 parameters
762//      String/G root:Packages:NIST:FileList:MenuItemStr2 = TrimListTo255(list)
763//
764//      BuildMenu "SANS Models"
765//     
766//      return(0)
767//End
768
769//if the length of any of the strings is more than 255, the menu will disappear
770Function/S TrimListTo255(list)
771        String list
772       
773        Variable len,num
774        num = itemsinlist(list,";")
775        len = strlen(list)
776        if(len>255)
777                DoAlert 0, "Not all menu items are shown - remove some of the models"
778                do
779                        list = RemoveListItem(num-1, list  ,";" )
780                        len=strlen(list)
781                        num=itemsinlist(list,";")
782                while(len>255)
783        endif
784        return(list)
785End
786
787Function/S MP_TextWave2SemiList(textW)
788        Wave/T textW
789       
790        String list=""
791        Variable num=numpnts(textW),ii=0
792        do
793                list += textw[ii] + ";"
794                ii+=1
795        while(ii<num)
796        return(list)
797End
798
799Function MP_SemiList2TextWave(list,outWStr)
800        String list,outWStr
801       
802        Variable num=itemsinList(list)
803        Make/T/O/N=(num) $outWStr
804        WAVE/T w=$outWStr
805        w = StringFromList(p,list,";")
806        return(0)
807End
808
809//modified to get a list of all files in folder and subfolders
810// passed back through a global variable
811Function ListAllFilesAndFolders(pathName, full, recurse, level)
812        String pathName         // Name of symbolic path in which to look for folders.
813        Variable full                   // True to print full paths instead of just folder name.
814        Variable recurse                // True to recurse (do it for subfolders too).
815        Variable level          // Recursion level. Pass 0 for the top level.
816       
817        Variable ii
818        String prefix
819       
820        SVAR allFiles=root:Packages:NIST:FileList:allFiles
821        // Build a prefix (a number of tabs to indicate the folder level by indentation)
822        prefix = ""
823        ii = 0
824        do
825                if (ii >= level)
826                        break
827                endif
828                prefix += "\t"                                  // Indent one more tab
829                ii += 1
830        while(1)
831       
832//      Printf "%s%s\r", prefix, pathName
833//      Print IndexedFile($pathName,-1,"????")
834        allFiles += IndexedFile($pathName,-1,"????")
835       
836        String path
837        ii = 0
838        do
839                path = IndexedDir($pathName, ii, full)
840                if (strlen(path) == 0)
841                        break                                                   // No more folders
842                endif
843//              Printf "%s%s\r", prefix, path
844               
845                if (recurse)                                            // Do we want to go into subfolder?
846                        String subFolderPathName = "tempPrintFoldersPath_" + num2istr(level+1)
847                       
848                        // Now we get the path to the new parent folder
849                        String subFolderPath
850                        if (full)
851                                subFolderPath = path    // We already have the full path.
852                        else
853                                PathInfo $pathName              // We have only the folder name. Need to get full path.
854                                subFolderPath = S_path + path
855                        endif
856                       
857                        NewPath/Q/O $subFolderPathName, subFolderPath
858                        ListAllFilesAndFolders(subFolderPathName, full, recurse, level+1)
859                        KillPath/Z $subFolderPathName
860                endif
861               
862                ii += 1
863        while(1)
864End
865
866
867// utility function to get the list of all functions
868// first - select and include all of the models
869//
870Proc GetAllModelFunctions()
871        String str =  FunctionList("*",";","KIND:10,NINDVARS:1")
872        Print itemsinList(str)
873
874        MP_SemiList2TextWave(str,"UserFunctionList")
875        edit UserFunctionList
876end
877
878// allows an easy way to "freeze" a model calculation
879// - duplicates X and Y waves (tags them _q and _i)
880// - kill the dependecy
881// - append it to the top graph
882// - it can later be exported with WriteModelData
883//
884// in Igor 5, you can restrict the WaveList to be just the top graph...
885// SRK  09 JUN 2006
886//
887// made data folder-aware in a somewhat messy way, but wavelist works only on the
888// current data folder, and WaveSelectorWidget is waaaaaay too complex
889//
890Function FreezeModel()
891        String modelType
892        Prompt modelType,"What type of model to freeze? (smeared models use the current data set)",popup,"Unsmeared Model;Smeared Model;"
893        DoPrompt "Type of Data",modelType
894       
895        if(V_Flag==1)           //user canceled
896                return(1)
897        endif
898       
899        String xWave,yWave,newNameStr
900
901        SetDataFolder root:
902        if(cmpstr(modelType,"Smeared Model")==0)
903                ControlInfo/W=WrapperPanel popup_0
904                String folderStr=S_Value
905                SetDataFolder $("root:"+folderStr)
906       
907                Prompt xwave,"X data",popup,WaveList("s*",";","")
908                Prompt ywave,"Y data",popup,WaveList("s*",";","")
909                Prompt newNameStr,"new name for the waves, _q and _i will be appended"
910        else
911                Prompt xwave,"X data",popup,WaveList("x*",";","")
912                Prompt ywave,"Y data",popup,WaveList("y*",";","")
913                Prompt newNameStr,"new name for the waves, _q and _i will be appended"
914        endif
915
916        DoPrompt "Select the Waves to Freeze",xwave,ywave,newNameStr
917        if(V_Flag==1)           //user canceled
918                SetDataFolder root:
919                return(1)
920        endif
921
922        Duplicate/O $xwave,$(newNameStr+"_q")
923        Duplicate/O $ywave,$(newNameStr+"_i")
924        SetFormula $(newNameStr+"_i"), ""
925       
926        AppendToGraph $(newNameStr+"_i") vs $(newNameStr+"_q")
927       
928        SetDataFolder root:
929end
Note: See TracBrowser for help on using the repository browser.