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

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

Added a more graceful abort if the user cancels from the "GetSlope?" prompt

Added a report generator to the WrapperPanel?. If checked, it will generate a notebook with useful information and graph. If save is also checked, two files will be saved, the notebook, and a PNG of the graph. If save is generated without selecting "Report", nothing happens.

No changes to GaussUtils? (removed ThreadSafe? declarations from prototypes)

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