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

Last change on this file since 472 was 472, checked in by srkline, 14 years ago

A large number of changes and fixes:

--168/169/170: panels and windows are now at least on-screen for all packages. Tested
with 1024x768 resolution.
-- closed ticket 176 which was a question about resampling data to generate error estimates
on fitted parameters. Useful for reflectometry, not needed for SANS.
--157: bug of low Q power law extrapolation in Invariant fixed by avoiding q==0
--178/180: Tr/Tw? notification in USANS. log/lin checkbox for display.
--167: saveData checkbox for USANS not behaving well. turns off/on better now.
--197: changed all (?) 1D writing routines to enforce 26 characters as the maximum length
to make sure that file loading will never exceed 31 characters

-- lots of changes to MonteCarlo? and SASCALC

  • SASCALC now enforces *exact* lens conditions, rather than a close approximation
  • improved MonteCarlo? interface panel
  • added writer for simlulated VAX binary data file
  • can save 2D as ABS or raw counts
  • can freeze w/no offset
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.