source: sans/Analysis/branches/ajj_23APR07/IGOR_Package_Files/Put in User Procedures/SANS_Models_v3.00/Packages/Wrapper.ipf @ 161

Last change on this file since 161 was 161, checked in by srkline, 15 years ago

Added fit reporting (just the basics) to write the results to the panel. Simply changes the title of GroupBox? elements.

File size: 21.9 KB
Line 
1#pragma rtGlobals=1             // Use modern global access method.
2
3
4//
5// need a way of importing more functions into the experiment
6// ? call the picker panel from the panel?
7//
8//
9////////
10//
11// if model is Smeared, search the DF for coefficients
12// if new DF chosen, need to reset
13// if new model function, need to reset table
14//
15// create hold_mod (0/1), constr_low_mod, constr_hi_mod
16// in either DF (smeared) or in root: (normal)
17// and put these in the table as needed
18//
19Window WrapperPanel() : Panel
20        PauseUpdate; Silent 1           // building window...
21        NewPanel /W=(459,44,1113,499)/N=wrapperPanel as "Curve Fit Setup"
22       
23        GroupBox grpBox_0,pos={18,11},size={350,113}
24        GroupBox grpBox_1,pos={386,10},size={247,113}
25        GroupBox grpBox_2 title="No Fit",pos={10,130},size={620,1},frame=0,fSize=10,fstyle=1,fColor=(39321,1,1)
26        GroupBox grpBox_3 title="",pos={10,150},size={620,1},frame=0,fSize=10,fstyle=1,fColor=(39321,1,1)
27        Button button_0,pos={523,93},size={100,20},proc=DoTheFitButton,title="Do The Fit"
28        Button button_1,pos={270,57},size={80,20},proc=PlotModelFunction,title="Plot"
29        Button button_2,pos={270,93},size={80,20},proc=AppendModelToTarget,title="Append"
30        PopupMenu popup_0,pos={30,21},size={218,20},title="Data Set"
31        PopupMenu popup_0,mode=1,value= #"W_DataSetPopupList()"
32        PopupMenu popup_1,pos={30,57},size={136,20},title="Function"
33        PopupMenu popup_1,mode=1,value= #"W_FunctionPopupList()"
34        PopupMenu popup_2,pos={30,93},size={123,20},title="Coefficients"
35        PopupMenu popup_2,mode=1,value= #"W_CoefPopupList()",proc=Coef_PopMenuProc
36        CheckBox check_0,pos={400,19},size={79,14},title="Use Cursors?",value= 0
37        CheckBox check_1,pos={400,42},size={74,14},title="Use Epsilon?",value= 0
38        CheckBox check_2,pos={400,65},size={95,14},title="Use Constraints?",value= 0
39        CheckBox check_3,pos={280,24},size={72,14},title="From target",value= 0
40        CheckBox check_4,pos={400,85},size={72,14},title="Report?",value= 0
41        CheckBox check_5,pos={414,100},size={72,14},title="Save it?",value= 0
42        Edit/W=(20,174,634,435)/HOST=# 
43        ModifyTable width(Point)=0
44        RenameWindow #,T0
45        SetActiveSubwindow ##
46EndMacro
47
48
49// is there a simpler way to do this?
50Function/S W_DataSetPopupList()
51
52        String str=GetAList(4),tmp="",onTargetStr=""
53        Variable ii
54        ControlInfo check_3
55        if(V_Value==1)          //if "from target" checked
56                //ther must be a better way to do this
57                onTargetStr = TraceNameList("",";",1)
58                onTargetStr = ReplaceString("_i",onTargetStr,"")                //get rid of the "_i"
59                for(ii=0;ii<ItemsInList(onTargetStr);ii+=1)
60                        if(WhichListItem(StringFromList(ii,onTargetStr,";"), str  , ";") != -1)
61                                tmp = Addlistitem(StringFromList(ii,onTargetStr,";"),tmp)               //only keep the matches w/data folder listing
62                        endif
63                endfor
64                return(tmp)
65        endif
66
67        if(strlen(str)==0)
68                str = "No data loaded"
69        endif
70        str = SortList(str)
71       
72        return(str)
73End
74
75
76// show the available models
77// not the f*(cw,xw) point calculations
78// not the *X(cw,xw) XOPS
79//
80// KIND:10 should show only user-defined curve fitting functions
81// - not XOPs
82// - not other user-defined functions
83Function/S W_FunctionPopupList()
84        String list,tmp
85        list = FunctionList("*",";","KIND:10")          //get every user defined curve fit function
86//      list = RemoveFromList("Sum_Model", list  ,";")
87       
88        tmp = FunctionList("*_proto",";","KIND:10")             //prototypes
89        list = RemoveFromList(tmp, list  ,";")
90        //prototypes that show up if GF is loaded
91        list = RemoveFromList("GFFitFuncTemplate", list)
92        list = RemoveFromList("GFFitAllAtOnceTemplate", list)
93        list = RemoveFromList("NewGlblFitFunc", list)
94        list = RemoveFromList("NewGlblFitFuncAllAtOnce", list)
95        list = RemoveFromList("GlobalFitFunc", list)
96        list = RemoveFromList("GlobalFitAllAtOnce", list)
97        list = RemoveFromList("GFFitAAOStructTemplate", list)
98        list = RemoveFromList("NewGF_SetXWaveInList", list)
99        list = RemoveFromList("NewGlblFitFuncAAOStruct", list)
100
101        tmp = FunctionList("f*",";","NPARAMS:2")                //point calculations
102        list = RemoveFromList(tmp, list  ,";")
103       
104        tmp = FunctionList("fSmear*",";","NPARAMS:3")           //smeared dependency calculations
105        list = RemoveFromList(tmp, list  ,";")
106       
107//      tmp = FunctionList("*X",";","KIND:4")           //XOPs, but these shouldn't show up if KIND:10 is used initially
108//      Print "X* = ",tmp
109//      print " "
110//      list = RemoveFromList(tmp, list  ,";")
111       
112        //non-fit functions that I can't seem to filter out
113        list = RemoveFromList("BinaryHS_PSF11;BinaryHS_PSF12;BinaryHS_PSF22;EllipCyl_Integrand;PP_Inner;PP_Outer;Phi_EC;TaE_Inner;TaE_Outer;",list,";")
114
115        if(strlen(list)==0)
116                list = "No functions plotted"
117        endif
118       
119        list = SortList(list)
120        return(list)
121End
122
123// show all the appropriate coefficient waves
124//
125// also need to search the folder listed in "data set" popup
126// for smeared coefs
127//
128// - or - restrict the coefficient list based on the model function
129//
130Function/S W_CoefPopupList()
131        String list
132        setDataFolder root:
133        list = WaveList("coef*",";","")
134       
135        ControlInfo/W=wrapperpanel popup_0
136        if(V_Value != 0)                //0== no items in menu
137                if(DataFolderExists("root:"+S_Value))
138                        SetDataFolder $("root:"+S_Value)
139                        list += WaveList("*coef*",";","")
140                endif
141        endif
142       
143        // tmp coefficients that aren't being cleaned up from somewhere...
144        list = RemoveFromList("temp_coef_1;temp_coef_2;", list  ,";")
145
146        if(strlen(list)==0)
147                list = "No functions plotted"
148        endif
149        list = SortList(list)
150       
151//      Print itemsinlist(list,";")
152       
153        setDataFolder root:
154        return(list)
155End
156
157// if the coefficients are changed, then update the table
158//
159//update the table
160// may be easier to just kill the subwindow (table) and create a new one
161// need to set/reset all of the waves in the table
162//
163// !! only respond to mouse up
164//
165Function Coef_PopMenuProc(pa) : PopupMenuControl
166        STRUCT WMPopupAction &pa
167
168        switch( pa.eventCode )
169                case 2: // mouse up
170                        Variable popNum = pa.popNum
171                        String popStr = pa.popStr
172                        String suffix = getModelSuffix(popStr)
173                        ControlInfo popup_0
174                        String folderStr=S_Value
175                       
176                        if(DataFolderExists("root:"+folderStr))
177                                SetDataFolder $("root:"+folderStr)
178                                if(!exists(popStr))
179                                        // must be unsmeared model, work in the root folder
180                                        SetDataFolder root:                             
181                                        if(!exists(popStr))             //this should be fine if the coef filter is working, but check anyhow
182                                                DoAlert 0,"the coefficient and data sets do not match"
183                                                return 0
184                                        endif
185                                endif
186                        else
187                                // must be unsmeared model, work in the root folder
188                                SetDataFolder root:     
189                                if(!exists(popStr))             //this should be fine if the coef filter is working, but check anyhow
190                                        DoAlert 0,"the coefficient and data sets do not match"
191                                        return 0
192                                endif
193                        endif
194                       
195                        // farm the work out to another function?
196                        Variable num=numpnts($popStr)
197                        // make the necessary waves
198                        Make/O/D/N=(num) $("epsilon"+suffix),$("Hold"+suffix)
199                        Make/O/T/N=(num) $("LoLim"+suffix),$("HiLim"+suffix)
200                       
201                        // default epsilon values, sometimes needed for the fit
202                        Wave eps = $("epsilon"+suffix)
203                        Wave coef=$popStr
204                        eps = abs(coef*1e-4) + 1e-10                    //default eps is proportional to the coefficients
205                        WAVE/T LoLim = $("LoLim"+suffix)
206                        WAVE/T HiLim = $("HiLim"+suffix)
207                        LoLim = ""              //should have nicer way of keeping the previous values
208                        HiLim = ""
209                       
210                        // clear the table (a subwindow)
211                        KillWindow wrapperPanel#T0
212                        Edit/W=(20,174,634,435)/HOST=#
213                        RenameWindow #,T0
214                        // get them onto the table
215                        // how do I get the parameter name?
216                        String param = WaveList("*param*"+suffix, "", "TEXT:1," )               //this is *hopefully* one wave
217                        AppendtoTable/W=wrapperPanel#T0 $param,$(popStr)
218                        AppendToTable/W=wrapperPanel#T0 $("Hold"+suffix),$("LoLim"+suffix),$("HiLim"+suffix),$("epsilon"+suffix)
219                        ModifyTable width(Point)=0
220                       
221                        SetDataFolder root:
222                        break
223        endswitch
224
225        return 0
226End
227
228// always pass this the coefficient string
229//
230// either "coef_"
231// or "smear_coef_"
232//
233Function/S getModelSuffix(coefStr)
234        String coefStr
235
236        Variable pos,start=0
237//      Variable pos=Strsearch(modelStr,"_",Inf,1)              //look backwards to find "_" - this fails for form+struct models
238
239        if(stringmatch(coefStr,"smear_*") == 1)
240                start=7 //look forwards to find "_", skipping "smear_coe" if necessary
241        endif
242        pos=Strsearch(coefStr,"_",start,0)
243        //Print start, pos
244        return(coefStr[pos,strlen(coefStr)-1])
245End
246
247// How to bypass the step of plot and append?
248//
249// - does not yet work
250// -- may need more serious changes in the way the "Plot" macros work
251// - may need to have a separate "append" button that looks at what is available in the specified
252//   data folder, or as a PauseForUser, after the plot is done
253//
254// - different Cmd if smeared or unsmeared
255// - stringent "PlotNNN" naming requirements
256// - how to kill the generated table and graph, that are not needed now
257//
258// - how to plot when there are no files loaded, no data folders, no resolution information
259//
260Function PlotModelFunction(ba) : ButtonControl
261        STRUCT WMButtonAction &ba
262
263        String folderStr,funcStr,coefStr,cmdStr=""
264        Variable useCursors,useEps,useConstr
265       
266        switch( ba.eventCode )
267                case 2: // mouse up
268                        ControlInfo popup_0
269                        folderStr=S_Value
270                       
271                        ControlInfo popup_1
272                        funcStr=S_Value
273                       
274                        // check for smeared or smeared function
275                        if(stringmatch(funcStr, "Smear*" )==1)
276                                //it's a smeared model
277                                sprintf cmdStr, "Plot%s(\"%s\")",funcStr,folderStr
278                        else
279                                // it's not,                   
280                                sprintf cmdStr, "Plot%s()",funcStr
281                        endif
282                       
283                        //Print cmdStr
284                        Execute cmdStr
285                        break
286        endswitch
287       
288        return 0
289End
290
291// How to bypass the step of plot and append?
292//
293// do it in two separate events
294//
295Function AppendModelToTarget(ba) : ButtonControl
296        STRUCT WMButtonAction &ba
297
298        String coefStr,suffix,yWStr,xWStr,folderStr
299       
300        switch( ba.eventCode )
301                case 2: // mouse up                     
302                        ControlInfo popup_2
303                        coefStr=S_Value
304                        suffix = getModelSuffix(coefStr)
305                       
306                        // check for smeared or smeared function
307                        if(stringmatch(coefStr, "smear*" )==1)
308                                //it's a smeared model
309                                ControlInfo popup_0
310                                folderStr=S_Value
311                                xWStr = "root:"+folderStr+":smeared_qvals"
312                                ywStr = "root:"+folderStr+":smeared"+suffix
313                        else
314                                // it's not, so it's in the root folder
315                                xWStr = "xwave"+suffix
316                                yWStr = "ywave"+suffix
317                        endif
318                       
319                        Wave yw = $yWStr
320                        Wave xw = $xWStr
321                        AppendtoGraph yw vs xw
322                        break
323        endswitch
324       
325        return 0
326End
327
328
329// this should parse the panel and call the FitWrapper() function
330Function DoTheFitButton(ba) : ButtonControl
331        STRUCT WMButtonAction &ba
332
333        String folderStr,funcStr,coefStr
334        Variable useCursors,useEps,useConstr
335       
336        switch( ba.eventCode )
337                case 2: // mouse up
338                        ControlInfo popup_0
339                        folderStr=S_Value
340                       
341                        ControlInfo popup_1
342                        funcStr=S_Value
343                       
344                        ControlInfo popup_2
345                        coefStr=S_Value
346                       
347                        Controlinfo check_0
348                        useCursors=V_Value
349                        Controlinfo check_1
350                        useEps=V_Value
351                        Controlinfo check_2
352                        useConstr=V_Value
353                       
354                        FitWrapper(folderStr,funcStr,coefStr,useCursors,useEps,useConstr)
355                       
356                        //      DoUpdate (does not work!)
357                        //?? why do I need to force an update ??
358                        if(!exists("root:"+folderStr+":"+coefStr))
359                                Wave w=$coefStr
360                        else
361                                Wave w=$("root:"+folderStr+":"+coefStr) //smeared coefs in data folder
362                        endif
363                        w[0] += 1e-6
364                        w[0] -= 1e-6
365       
366                        break
367        endswitch
368       
369        return 0
370End
371
372
373/////////////////////////////////
374
375// wrapper to do the desired fit
376//
377// folderStr is the data folder for the desired data set
378//
379// -- this looks like something that can be made rather generic rather easily
380//
381Function FitWrapper(folderStr,funcStr,coefStr,useCursors,useEps,useConstr)
382        String folderStr,funcStr,coefStr
383        Variable useCursors,useEps,useConstr
384
385        String suffix=getModelSuffix(coefStr)
386       
387        SetDataFolder $("root:"+folderStr)
388        if(!exists(coefStr))
389                // must be unsmeared model, work in the root folder
390                SetDataFolder root:                             
391                if(!exists(coefStr))            //this should be fine if the coef filter is working, but check anyhow
392                        DoAlert 0,"the coefficient and data sets do not match"
393                        return 0
394                endif
395        endif
396               
397        WAVE cw=$(coefStr)     
398        Wave hold=$("Hold"+suffix)
399        Wave/T lolim=$("LoLim"+suffix)
400        Wave/T hilim=$("HiLim"+suffix)
401        Wave eps=$("epsilon"+suffix)
402       
403// fill a struct instance whether I need one or not
404        String DF="root:"+folderStr+":"
405       
406        Struct ResSmearAAOStruct fs
407        WAVE resW = $(DF+folderStr+"_res")             
408        WAVE fs.resW =  resW
409        WAVE yw=$(DF+folderStr+"_i")
410        WAVE xw=$(DF+folderStr+"_q")
411        WAVE sw=$(DF+folderStr+"_s")
412        Wave fs.coefW = cw
413        Wave fs.yW = yw
414        Wave fs.xW = xw
415       
416        Duplicate/O yw $(DF+"FitYw")
417        WAVE fitYw = $(DF+"FitYw")
418        fitYw = NaN
419       
420        Variable useRes=0
421        if(stringmatch(funcStr, "Smear*"))              // if it's a smeared function, need a struct
422                useRes=1
423        endif
424       
425        Make/O/T/N=0 constr
426        if(useConstr)
427                String constraintExpression
428                Variable i, nPnts=DimSize(lolim, 0),nextRow=0
429                for (i=0; i < nPnts; i += 1)
430                        if (strlen(lolim[i]) > 0)
431                                InsertPoints nextRow, 1, constr
432                                sprintf constraintExpression, "K%d > %s", i, lolim[i]
433                                constr[nextRow] = constraintExpression
434                                nextRow += 1
435                        endif
436                        if (strlen(hilim[i]) > 0)
437                                InsertPoints nextRow, 1, constr
438                                sprintf constraintExpression, "K%d < %s", i, hilim[i]
439                                constr[nextRow] = constraintExpression
440                                nextRow += 1
441                        endif
442                endfor
443        endif
444
445        //if useCursors, and the data is USANS, need to feed a (reassigned) trimmed matrix to the fit
446        Variable pt1,pt2,newN
447        if(useCursors && (dimsize(resW,1) > 4) )
448                if(pcsr(A) > pcsr(B))
449                        pt1 = pcsr(B)
450                        pt2 = pcsr(A)
451                else
452                        pt1 = pcsr(A)
453                        pt2 = pcsr(B)
454                endif
455                newN = pt2 - pt1 + 1            // +1 includes both cursors in the fit
456                Make/O/D/N=(newN,newN) $(DF+"crsrResW")
457                WAVE crsrResW = $(DF+"crsrResW")
458                crsrResW = resW[p+pt1][q+pt1]
459                //assign to the struct
460                WAVE fs.resW =  crsrResW               
461        endif
462
463// create these variables so that FuncFit will set them on exit
464        Variable/G V_FitError=0                         //0=no err, 1=error,(2^1+2^0)=3=singular matrix
465        Variable/G V_FitQuitReason=0            //0=ok,1=maxiter,2=user stop,3=no chisq decrease
466       
467// don't use the auto-destination with no flag, it doesn't appear to work correctly
468// dispatch the fit
469        do
470                if(useRes && useEps && useCursors && useConstr)         //do it all
471                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pcsr(A),pcsr(B)] /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr /STRC=fs
472                        break
473                endif
474               
475                if(useRes && useEps && useCursors)              //no constr
476                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pcsr(A),pcsr(B)] /X=xw /W=sw /I=1 /E=eps /D=fitYw /STRC=fs
477                        break
478                endif
479               
480                if(useRes && useEps && useConstr)               //no crsr
481                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr /STRC=fs
482                        break
483                endif
484               
485                if(useRes && useCursors && useConstr)           //no eps
486                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pcsr(A),pcsr(B)] /X=xw /W=sw /I=1 /D=fitYw /C=constr /STRC=fs
487                        break
488                endif
489               
490                if(useRes && useCursors)                //no eps, no constr
491                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pcsr(A),pcsr(B)] /X=xw /W=sw /I=1 /D=fitYw /STRC=fs
492                        break
493                endif
494               
495                if(useRes && useEps)            //no crsr, no constr
496                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /E=eps /D=fitYw /STRC=fs
497                        break
498                endif
499       
500                if(useRes && useConstr)         //no crsr, no eps
501                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /D=fitYw /C=constr /STRC=fs
502                        break
503                endif
504               
505                if(useRes)              //just res
506                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /D=fitYw /STRC=fs
507                        break
508                endif
509               
510/////   same as above, but all without useRes
511                if(useEps && useCursors && useConstr)           //do it all
512                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pcsr(A),pcsr(B)] /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr
513                        break
514                endif
515               
516                if(useEps && useCursors)                //no constr
517                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pcsr(A),pcsr(B)] /X=xw /W=sw /I=1 /E=eps /D=fitYw
518                        break
519                endif
520               
521                if(useEps && useConstr)         //no crsr
522                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr
523                        break
524                endif
525               
526                if(useCursors && useConstr)             //no eps
527                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pcsr(A),pcsr(B)] /X=xw /W=sw /I=1 /D=fitYw /C=constr
528                        break
529                endif
530               
531                if(useCursors)          //no eps, no constr
532                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pcsr(A),pcsr(B)] /X=xw /W=sw /I=1 /D=fitYw
533                        break
534                endif
535               
536                if(useEps)              //no crsr, no constr
537                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /E=eps /D=fitYw
538                        break
539                endif
540       
541                if(useConstr)           //no crsr, no eps
542                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /D=fitYw /C=constr
543                        break
544                endif
545               
546                //just a plain vanilla fit
547                FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /D=fitYw
548       
549        while(0)
550       
551        // append the fit
552        // need to manage duplicate copies
553        // Don't plot the full curve if cursors were used (set fitYw to NaN on entry...)
554        String traces=TraceNameList("", ";", 1 )
555        if(strsearch(traces,"FitYw",0) == -1)
556                AppendToGraph fitYw vs xw
557        endif
558       
559        DoUpdate                //force update of table and graph with fitted values (why doesn't this work? - the table still does not update)
560       
561        // report the results (to the panel?)
562        print "V_chisq = ",V_chisq
563        print cw
564        WAVE w_sigma
565        print w_sigma
566        String resultStr=""
567               
568        //now re-write the results
569        sprintf resultStr,"Chi^2 = %g  Sqrt(X^2/N) = %g",V_chisq,sqrt(V_chisq/V_Npnts)
570        resultStr = PadString(resultStr,63,0x20)
571        GroupBox grpBox_2 title=resultStr
572        ControlUpdate/W=WrapperPanel grpBox_2
573        sprintf resultStr,"FitErr = %s : FitQuit = %s",W_ErrorMessage(V_FitError),W_QuitMessage(V_FitQuitReason)
574        resultStr = PadString(resultStr,63,0x20)
575        GroupBox grpBox_3 title=resultStr
576        ControlUpdate/W=WrapperPanel grpBox_3
577       
578        Variable yesSave=0,yesReport=0
579        ControlInfo check_4
580        yesReport = V_Value
581        ControlInfo check_5
582        yesSave = V_Value
583       
584       
585        if(yesReport)
586                String parStr=GetWavesDataFolder(cw,1)+ WaveList("*param*"+suffix, "", "TEXT:1," )              //this is *hopefully* one wave
587                String topGraph= WinName(0,1)   //this is the topmost graph
588       
589                W_GenerateReport(funcStr,folderStr,$parStr,cw,yesSave,V_chisq,W_sigma,V_npnts,V_FitError,V_FitQuitReason,V_startRow,V_endRow,topGraph)
590        endif
591       
592        SetDataFolder root:
593        return(0)
594End
595
596// parse something off of a table, or ?
597Function/S getHStr(hold)
598        Wave hold
599       
600        String str=""
601        Variable ii
602        for(ii=0;ii<numpnts(hold);ii+=1)
603                str += num2str(hold[ii])
604        endfor
605
606//      print str
607        if(strsearch(str, "1", 0) == -1)
608                return ("")
609        else
610                return(str)
611        endif
612End
613
614//taken from SRK Auto_Fit, and modified to work better with FitWrapper
615//must have AutoGraph as the name of the graph window (any size)
616// func is the name of the function (for print only)
617//par and coef are the exact names of the waves
618//yesSave==1 will save the file(name=func+time)
619//
620Function W_GenerateReport(func,dataname,param,ans,yesSave,chiSq,sigWave,npts,fitErr,fitQuit,fitStart,fitEnd,topGraph)
621        String func,dataname
622        Wave/T param
623        Wave ans
624        Variable yesSave,chiSq
625        Wave sigWave
626        Variable npts,fitErr,fitQuit,fitStart,fitEnd
627        String topGraph
628       
629        String str,pictStr="P_"
630        String nb="Report"
631               
632        // bring report up
633        DoWindow/F Report
634        if (V_flag == 0)                // Report notebook doesn't exist ?
635                NewNotebook/W=(10,45,550,620)/F=1/N=Report as "Report"
636        endif
637        // delete old stuff
638        Notebook $nb selection={startOfFile, endOfFile}, text="\r", selection={startOfFile, startOfFile}
639       
640        //setup
641        Notebook $nb defaultTab=36, statusWidth=252, pageMargins={72,72,72,72}
642        Notebook $nb showRuler=1, rulerUnits=1, updating={1, 60}
643        Notebook $nb newRuler=Normal, justification=0, margins={0,0,468}, spacing={0,0,0}, tabs={}, rulerDefaults={"Geneva",10,0,(0,0,0)}
644//     
645        // insert title
646        Notebook $nb newRuler=Title, justification=1, rulerDefaults={"Times", 16, 1, (0, 0, 0)}
647        sprintf str, "Fit to %s, %s, %s\r\r", func,Secs2Date(datetime, 0), time()
648        Notebook $nb ruler=Title, text=str
649       
650        // insert fit results
651        Variable num=numpnts(ans),ii=0
652        Notebook $nb ruler=Normal
653        Notebook Report  margins={18,18,504}, tabs={63 + 3*8192}
654        str = "Data file: " + dataname + "\r\r"
655        Notebook $nb text=str
656        Notebook $nb ruler=Normal
657        Notebook $nb margins={18,18,504}, tabs={144,234,252}
658        do
659                sprintf str, "%s = \t%g\t±\t%g\r", param[ii],ans[ii],sigwave[ii]
660                Notebook $nb text=str
661                ii+=1
662        while(ii<num)
663       
664        //
665        Wave dataXw = $("root:"+dataname+":"+dataname+"_q")     
666        //
667        Notebook $nb ruler=Normal
668        Notebook $nb  margins={18,18,504}, tabs={63+3*8192}, fStyle=1, textRGB=(65000,0,0)
669       
670        sprintf str,"chisq = %g\r",chisq
671        Notebook $nb textRGB=(65000,0,0),fstyle=1,text=str
672        sprintf str,"Npnts = %g \t\t Sqrt(X^2/N) = %g\r",npts,sqrt(chiSq/npts)
673        Notebook $nb textRGB=(0,0,0),fstyle=0, text=str
674        sprintf str "Fitted range = [%d,%d] = %g < Q < %g\r",fitStart,fitEnd,dataXw(fitStart),dataXw(fitEnd)
675        Notebook $nb textRGB=(0,0,0),fstyle=0, text=str
676        sprintf str,"FitError = %s\t\tFitQuitReason = %s\r",W_ErrorMessage(FitErr),W_QuitMessage(FitQuit)
677        Notebook $nb textRGB=(65000,0,0),fstyle=1,text=str
678        Notebook $nb ruler=Normal
679       
680        // insert graphs
681        Notebook $nb picture={$topGraph(0, 0, 400, 300), 0, 1}, text="\r"
682       
683
684        //Notebook Report picture={Table1, 0, 0}, text="\r"
685       
686        // show the top of the report
687        Notebook $nb  selection= {startOfFile, startOfFile},  findText={"", 1}
688       
689        //save the notebook and the graphic file
690        if(yesSave)
691                String nameStr=CleanupName(func,0)
692                nameStr = nameStr[0,8]  //shorten the name
693                nameStr += "_"+dataname
694                //make sure the name is no more than 31 characters
695                namestr = namestr[0,30]         //if shorter than 31, this will NOT pad to 31 characters
696                Print "file saved as ",nameStr
697                SaveNotebook /O/P=home/S=2 $nb as nameStr
698                //save the graph separately as a PICT file, 2x screen
699                pictStr += nameStr
700                pictStr = pictStr[0,28]         //need a shorter name - why?
701//              DoWindow/F $topGraph
702                // E=-5 is png @screen resolution
703                // E=2 is PICT @2x screen resolution
704///             SavePICT /E=-5/O/P=home /I/W=(0,0,3,3) as pictStr
705                SavePICT /E=-5/O/P=home/WIN=$topGraph /W=(0,0,400,300) as pictStr
706        Endif
707       
708        // ???maybe print the notebook too?
709End
710
711static Function/S W_ErrorMessage(code)
712        Variable code
713       
714        switch (code)
715                case 0:
716                        return "No Error"
717                        break
718                case 3: //2^0 + 2^1
719                        return "Singular Matrix"
720                        break
721                case 5:         //(2^0 + 2^2)
722                        return "Out of Memory"
723                        break
724                case 9:         //(2^0 + 2^3)
725                        return "Func= NaN or Inf"
726                        break
727                default:
728                        return "Unknown error code "+num2str(code)
729        endswitch
730end
731
732static Function/S W_QuitMessage(code)
733        Variable code
734       
735        switch (code)
736                case 0:
737                        return "No Error"
738                        break
739                case 1:
740                        return "Max iterations - re-run fit"
741                        break
742                case 2:
743                        return "User terminated fit"
744                        break
745                case 3:
746                        return "No decrease in chi-squared"
747                        break
748                default:
749                        return "Unknown Quit code "+num2str(code)
750        endswitch
751end
752
Note: See TracBrowser for help on using the repository browser.