Changeset 743


Ignore:
Timestamp:
Sep 16, 2010 5:13:31 PM (12 years ago)
Author:
srkline
Message:

ticket #281: added a check for SAM and EMP data to both be present when updating the USANS transmission. An alert is presented if one or the other is missing.

ticket #194: added two more options for curve fitting information. users can no with checkboxes add residuals to the fit graph, and add a textbox of fit information. unchecking the boxes provides the option for removing them from the graph.

-- still need to make sure that the residuals stay in sync. if they are on the graph and then use is un-selected, the residual won't update with the new fit. The textbox is fine - it's automatically killed if not selected.

Location:
sans/Dev/trunk/NCNR_User_Procedures
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • sans/Dev/trunk/NCNR_User_Procedures/Analysis/Packages/Wrapper_v40.ipf

    r728 r743  
    7979        PopupMenu popup_2,pos={30,93},size={123,20},title="Coefficients" 
    8080        PopupMenu popup_2,mode=1,value= #"W_CoefPopupList()",proc=Coef_PopMenuProc 
    81         CheckBox check_0,pos={440,19},size={79,14},title="Use Cursors?",value= 0 
     81        CheckBox check_0,pos={430,19},size={79,14},title="Use Cursors?",value= 0 
    8282        CheckBox check_0,proc=UseCursorsWrapperProc 
    83         CheckBox check_1,pos={440,42},size={74,14},title="Use Epsilon?",value= 0 
    84         CheckBox check_2,pos={440,65},size={95,14},title="Use Constraints?",value= 0 
     83        CheckBox check_1,pos={430,42},size={74,14},title="Use Epsilon?",value= 0 
     84        CheckBox check_2,pos={430,65},size={95,14},title="Use Constraints?",value= 0 
    8585        CheckBox check_3,pos={530,18},size={72,14},title="2D Functions?",value= 0 
    8686        CheckBox check_3 proc=Toggle2DControlsCheckProc 
    87         CheckBox check_4,pos={440,85},size={72,14},title="Report?",value= 0 
    88         CheckBox check_5,pos={454,103},size={72,14},title="Save it?",value= 0 
     87        CheckBox check_4,pos={430,85},size={72,14},title="Report?",value= 0 
     88        CheckBox check_5,pos={444,103},size={72,14},title="Save it?",value= 0 
     89        CheckBox check_6,pos={530,42},size={72,14},title="Use Residuals?",value= 0 
     90        CheckBox check_6,proc=UseResidualsCheckProc 
     91        CheckBox check_7,pos={530,65},size={72,14},title="Info Box?",value= 0 
     92        CheckBox check_7,proc=UseInfoTextBoxCheckProc 
    8993        //change draw order to put button over text of checkbox 
    9094        Button button_0,pos={520,93},size={100,20},proc=DoTheFitButton,title="Do 1D Fit" 
     
    679683 
    680684        String folderStr,funcStr,coefStr 
    681         Variable useCursors,useEps,useConstr 
     685        Variable useCursors,useEps,useConstr,useResiduals,useTextBox 
    682686         
    683687        switch( ba.eventCode ) 
     
    699703                        useConstr=V_Value 
    700704                         
     705                        ControlInfo/W=WrapperPanel check_6 
     706                        useResiduals=V_Value 
     707                         
     708                        ControlInfo/W=WrapperPanel check_7 
     709                        useTextBox = V_Value 
     710                         
    701711                        if(!CheckFunctionAndCoef(funcStr,coefStr)) 
    702712                                DoAlert 0,"The coefficients and function type do not match. Please correct the selections in the popup menus." 
     
    704714                        endif 
    705715                         
    706                         FitWrapper(folderStr,funcStr,coefStr,useCursors,useEps,useConstr) 
     716                        FitWrapper(folderStr,funcStr,coefStr,useCursors,useEps,useConstr,useResiduals,useTextBox) 
    707717                         
    708718                        //      DoUpdate (does not work!) 
     
    743753// 
    744754// 
    745 Function FitWrapper(folderStr,funcStr,coefStr,useCursors,useEps,useConstr) 
     755Function FitWrapper(folderStr,funcStr,coefStr,useCursors,useEps,useConstr,useResiduals,useTextBox) 
    746756        String folderStr,funcStr,coefStr 
    747         Variable useCursors,useEps,useConstr 
     757        Variable useCursors,useEps,useConstr,useResiduals,useTextBox 
    748758 
    749759        String suffix=getModelSuffix(funcStr) 
     
    763773        Wave/T lolim=$("LoLim_"+suffix) 
    764774        Wave/T hilim=$("HiLim_"+suffix) 
    765         Wave eps=$("epsilon_"+suffix) 
    766          
     775         
     776        if(useEps) 
     777                Wave eps=$("epsilon_"+suffix) 
     778        endif 
    767779// fill a struct instance whether I need one or not 
    768780        String DF="root:"+folderStr+":"  
     
    789801                isUSANS=1 
    790802        endif 
     803         
    791804        // do not construct constraints for any of the coefficients that are being held 
    792805        // -- this will generate an "unknown error" from the curve fitting 
    793         Make/O/T/N=0 constr 
     806        // -- if constraints are not used, the constr wave is killed (null), but that's OK 
    794807        if(useConstr) 
     808                Make/O/T/N=0 constr 
    795809                String constraintExpression 
    796810                Variable i, nPnts=DimSize(lolim, 0),nextRow=0 
     
    809823                        endif 
    810824                endfor 
     825        else 
     826                KillWaves/Z constr 
    811827        endif 
    812828 
     
    850866                        pt2 = pcsr(B) 
    851867                endif 
     868        else 
     869                //if cursors are not being used, find the first and last points of the data set, and pass them 
     870                pt1 = 0 
     871                pt2 = numpnts(yw) 
    852872        endif 
    853873                 
     
    866886// The textwave would have to be parsed into a constraint matrix first, then passed as /C={cMat,cVec}. 
    867887// -- just something to watch out for. 
     888 
     889// now two more flags... ,useResiduals,useTextBox 
     890        Variable tb = 1+2+4+8+16+256+512                //See CurveFit docs for bit settings for /TBOX flag 
    868891 
    869892        do 
     
    881904                        // useEps and useConstr are not needed 
    882905                        // pass the structure to get the current waves, including the trimmed USANS matrix 
     906                        // 
     907                        // I don't know that GetCurveFit can do residuals, so I'm not passing that flag, or the text box flag 
     908                        // 
    883909                        Variable chi,pt 
    884910 
     
    890916                endif 
    891917                 
    892                  
    893                 if(useRes && useEps && useCursors && useConstr)         //do it all 
    894                         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 
    895                         break 
    896                 endif 
    897                  
    898                 if(useRes && useEps && useCursors)              //no constr 
    899                         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 
    900                         break 
    901                 endif 
    902                  
    903                 if(useRes && useEps && useConstr)               //no crsr 
    904                         FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr /STRC=fs 
    905                         break 
    906                 endif 
    907                  
    908                 if(useRes && useCursors && useConstr)           //no eps 
    909                         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 
    910                         break 
    911                 endif 
    912                  
    913                 if(useRes && useCursors)                //no eps, no constr 
    914                         FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pcsr(A),pcsr(B)] /X=xw /W=sw /I=1 /D=fitYw /STRC=fs 
    915                         break 
    916                 endif 
    917                  
    918                 if(useRes && useEps)            //no crsr, no constr 
    919 //                      Print "timing test for Cylinder_PolyRadius --- the supposedly threaded version ---" 
     918                // now useCursors, useEps, and useConstr are all handled w/ /NWOK 
     919                // so there are only three conditions to test == 1 + 3 + 3 + 1 = 8 conditions 
     920                 
     921                if(useRes && useResiduals && useTextBox)                //do it all 
     922                        FuncFit/H=getHStr(hold) /NTHR=0 /TBOX=(tb) $funcStr cw, yw[pt1,pt2] /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr /STRC=fs /R /NWOK 
     923                        break 
     924                endif 
     925                 
     926                if(useRes && useResiduals)              //res + resid 
     927                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pt1,pt2] /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr /STRC=fs /R /NWOK 
     928                        break 
     929                endif 
     930 
     931                 
     932                if(useRes && useTextBox)                //res + text 
     933                        FuncFit/H=getHStr(hold) /NTHR=0 /TBOX=(tb) $funcStr cw, yw[pt1,pt2] /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr /STRC=fs /NWOK 
     934                        break 
     935                endif 
     936                 
     937                if(useRes)              //res only 
     938//                      Print "timing test for Cylinder_PolyRadius---" 
    920939//                      Variable t0 = stopMStimer(-2) 
    921                         FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /E=eps /D=fitYw /STRC=fs 
     940 
     941                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pt1,pt2] /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr /STRC=fs /NWOK 
     942                         
    922943//                      t0 = (stopMSTimer(-2) - t0)*1e-6 
    923944//                      Printf  "CylPolyRad fit time using res and eps and /NTHR=0 time = %g seconds\r\r",t0 
    924                          
    925945//                      cw[0] = .01 
    926946//                      cw[1] = 20 
     
    931951//                       
    932952//                      t0 = stopMSTimer(-2) 
    933 //                      FuncFit/H=getHStr(hold) $funcStr cw, yw /X=xw /W=sw /I=1 /E=eps /D=fitYw /STRC=fs 
     953//                      FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pt1,pt2] /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr /STRC=fs /NWOK 
    934954//                      t0 = (stopMSTimer(-2) - t0)*1e-6 
    935955//                      Printf  "CylPolyRad fit time using res and eps and NO THREADING time = %g seconds\r\r",t0 
    936956                        break 
    937957                endif 
    938          
    939                 if(useRes && useConstr)         //no crsr, no eps 
    940                         FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /D=fitYw /C=constr /STRC=fs 
    941                         break 
    942                 endif 
    943                  
    944                 if(useRes)              //just res 
    945                         FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /D=fitYw /STRC=fs 
    946                         break 
    947                 endif 
     958                         
     959                 
    948960                 
    949961/////   same as above, but all without useRes (no /STRC flag) 
    950                 if(useEps && useCursors && useConstr)           //do it all 
    951                         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 
    952                         break 
    953                 endif 
    954                  
    955                 if(useEps && useCursors)                //no constr 
    956                         FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pcsr(A),pcsr(B)] /X=xw /W=sw /I=1 /E=eps /D=fitYw 
    957                         break 
    958                 endif 
    959                  
    960                 if(useEps && useConstr)         //no crsr 
    961                         FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr 
    962                         break 
    963                 endif 
    964                  
    965                 if(useCursors && useConstr)             //no eps 
    966                         FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pcsr(A),pcsr(B)] /X=xw /W=sw /I=1 /D=fitYw /C=constr 
    967                         break 
    968                 endif 
    969                  
    970                 if(useCursors)          //no eps, no constr 
    971                         FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pcsr(A),pcsr(B)] /X=xw /W=sw /I=1 /D=fitYw 
    972                         break 
    973                 endif 
    974                  
    975                 if(useEps)              //no crsr, no constr 
    976                         FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /E=eps /D=fitYw 
    977                         break 
    978                 endif 
    979          
    980                 if(useConstr)           //no crsr, no eps 
    981                         FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /D=fitYw /C=constr 
     962                if(useResiduals && useTextBox)          //resid+ text 
     963                        FuncFit/H=getHStr(hold) /NTHR=0 /TBOX=(tb) $funcStr cw, yw[pt1,pt2] /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr /R /NWOK 
     964                        break 
     965                endif 
     966                 
     967                if(useResiduals)                //resid 
     968                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pt1,pt2] /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr /R /NWOK 
     969                        break 
     970                endif 
     971 
     972                 
     973                if(useTextBox)          //text 
     974                        FuncFit/H=getHStr(hold) /NTHR=0 /TBOX=(tb) $funcStr cw, yw[pt1,pt2] /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr /NWOK 
    982975                        break 
    983976                endif 
    984977                 
    985978                //just a plain vanilla fit 
    986                 FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /D=fitYw 
    987          
     979 
     980                FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pt1,pt2] /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr /NWOK 
     981                 
    988982        while(0) 
    989983         
    990984        t0 = (stopMSTimer(-2) - t0)*1e-6 
    991985        Printf  "fit time = %g seconds\r\r",t0 
     986         
    992987         
    993988        // append the fit 
     
    12401235        endswitch 
    12411236end 
     1237 
     1238Function UseInfoTextBoxCheckProc(cba) : CheckBoxControl 
     1239        STRUCT WMCheckboxAction &cba 
     1240 
     1241        switch( cba.eventCode ) 
     1242                case 2: // mouse up 
     1243                        Variable checked = cba.checked 
     1244                        if(checked) 
     1245                                //print "checked, use textBox in the next fit" 
     1246                        else 
     1247                                //print "unchecked, ask to remove TextBox from the graph" 
     1248                                ControlInfo/W=WrapperPanel popup_0 
     1249                                RemoveTextBox(S_value) 
     1250                        endif 
     1251                        break 
     1252        endswitch 
     1253 
     1254        return 0 
     1255End 
     1256 
     1257//does not report an error if the text box is not there 
     1258// -- so I'll just be lazy and not check to see if it's there 
     1259// 
     1260Function RemoveTextBox(folderStr) 
     1261        String folderStr 
     1262         
     1263        DoAlert 1,"Remove the TextBox from the graph?" 
     1264        if(V_flag == 1) 
     1265                String str = "CF_"+folderStr+"_i" 
     1266                TextBox/K/N=$str 
     1267        endif 
     1268        return(0) 
     1269End 
     1270 
     1271Function UseResidualsCheckProc(cba) : CheckBoxControl 
     1272        STRUCT WMCheckboxAction &cba 
     1273 
     1274        switch( cba.eventCode ) 
     1275                case 2: // mouse up 
     1276                        Variable checked = cba.checked 
     1277                        if(checked) 
     1278                                //print "checked, use them in the next fit" 
     1279                        else 
     1280                                //print "unchecked, ask to remove residuals from the graph" 
     1281                                ControlInfo/W=WrapperPanel popup_0 
     1282                                RemoveResiduals(S_value) 
     1283                        endif 
     1284                        break 
     1285        endswitch 
     1286 
     1287        return 0 
     1288End 
     1289 
     1290// the default name from the /R flag is "Res_" + yWaveName 
     1291// 
     1292// better to find the wave that starts with "Res_" and remove that one in case the 
     1293// wave names get too long 
     1294// 
     1295// the difficulty now is that the residual wave ends up in root: and not with the data.... 
     1296// -- not really a problem, but adds to clutter 
     1297Function RemoveResiduals(folderStr) 
     1298        String folderStr 
     1299         
     1300        String list="",topWin="" 
     1301        Variable num,ii 
     1302        String str 
     1303 
     1304        DoAlert 1,"Remove the residuals from the graph?" 
     1305        if(V_flag == 1) 
     1306//              String topGraph= WinName(0,1)   //this is the topmost graph 
     1307                list=TraceNameList("", ";", 1 )         //"" as first parameter == look on the target graph 
     1308                num=ItemsInList(list) 
     1309                 
     1310                for(ii=0;ii<num;ii+=1) 
     1311                        str = StringFromList(ii, list ,";") 
     1312                        if(strsearch(str, "Res_", 0) != -1) 
     1313                                RemoveFromGraph $str 
     1314                        endif 
     1315                endfor 
     1316         
     1317                SetDataFolder root: 
     1318        endif 
     1319         
     1320        return(0) 
     1321End 
    12421322 
    12431323Function Toggle2DControlsCheckProc(cba) : CheckBoxControl 
  • sans/Dev/trunk/NCNR_User_Procedures/Reduction/USANS/COR_Graph.ipf

    r624 r743  
    360360        SVAR USANSFolder = root:Packages:NIST:USANS:Globals:gUSANSFolder 
    361361         
    362         Wave samCts=$(USANSFolder+":SAM:DetCts") 
    363         Wave empCts=$(USANSFolder+":EMP:DetCts") 
     362        Wave/Z samCts=$(USANSFolder+":SAM:DetCts") 
     363        Wave/Z empCts=$(USANSFolder+":EMP:DetCts") 
    364364        if((WaveExists(samCts)==0) || (WaveExists(empCts)==0)) 
     365                DoAlert 0,"Sample and Empty data must both be plotted before you can calculate the transmission" 
    365366                Variable/G $(USANSFolder+":Globals:MainPanel:gTransWide")=NaN           //error 
    366367                Variable/G $(USANSFolder+":Globals:MainPanel:gTransRock")=NaN 
Note: See TracChangeset for help on using the changeset viewer.