Changeset 309


Ignore:
Timestamp:
Apr 17, 2008 12:23:29 PM (14 years ago)
Author:
srkline
Message:

Changes to how USANS resolution matrix is handled in fitting, both regular and global.
(1) - resolution matirx is re-calculated if the data is masked (with cursors)
(2) - if the matrix is appropriate, as stored in the wave note, it is not recalculated
(3) - global fit does the same, being sure to recalculate the matrix before the Global fit has started
(4) - the global fit report now has pararameter names rather than "coef_n". will need to be tweaked in future to accomodate different fit functions, and to improve the formatting.

Location:
sans/Analysis/branches/ajj_23APR07/IGOR_Package_Files/Put in User Procedures/SANS_Models_v4.00
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • sans/Analysis/branches/ajj_23APR07/IGOR_Package_Files/Put in User Procedures/SANS_Models_v4.00/GaussUtils_v40.ipf

    r306 r309  
    745745         
    746746        if (dimsize(resW,1) > 4 && useTrap !=1) 
     747                if(dimsize(resW,1) != dimsize(answer,0) ) 
     748                        Abort "ResW and answer are different dimensions - (res,ans)"+num2str(dimsize(resW,1))+","+num2str(dimsize(answer,0)) 
     749                endif 
    747750                //USANS Weighting matrix is present. 
    748751                fcn(w,answer,x) 
     
    790793         
    791794        if (dimsize(resW,1) > 4) 
     795                if(dimsize(resW,1) != dimsize(answer,0) ) 
     796                        Abort "ResW and answer are different dimensions - (res,ans)"+num2str(dimsize(resW,1))+","+num2str(dimsize(answer,0)) 
     797                endif 
    792798                //USANS Weighting matrix is present. 
    793799                fcn(w,answer,x) 
     
    841847         
    842848        if (dimsize(resW,1) > 4 && useTrap != 1) 
     849                if(dimsize(resW,1) != dimsize(answer,0) ) 
     850                        Abort "ResW and answer are different dimensions - (res,ans)"+num2str(dimsize(resW,1))+","+num2str(dimsize(answer,0)) 
     851                endif 
    843852                //USANS Weighting matrix is present. 
    844853                fcn(w,answer,x) 
     
    884893         
    885894        if (dimsize(resW,1) > 4  && useTrap != 1) 
     895                if(dimsize(resW,1) != dimsize(answer,0) ) 
     896                        Abort "ResW and answer are different dimensions - (res,ans)"+num2str(dimsize(resW,1))+","+num2str(dimsize(answer,0)) 
     897                endif 
    886898                //USANS Weighting matrix is present. 
    887899                fcn(w,answer,x) 
  • sans/Analysis/branches/ajj_23APR07/IGOR_Package_Files/Put in User Procedures/SANS_Models_v4.00/Packages/GlobalFit/GlobalFit2_NCNR_v40.ipf

    r291 r309  
    186186        Variable numSets = DimSize(CoefDataSetLinkage, 0) 
    187187        Variable MaskCol = FindDimLabel(DataSets, 1, "Masks") 
    188         Variable pt1,pt2,newN 
     188        Variable pt1,pt2,newN,mPt1,mPt2 
     189        String noteStr="" 
    189190 
    190191        if(numsets==1) 
     
    210211                ControlInfo/W=NewGlobalFitPanel#NewGF_GlobalControlArea NewGF_MaskingCheckBox 
    211212                Variable useCursors = V_Value 
    212                 if(useCursors && waveexists(mw)) 
     213                if(useCursors && waveexists(mw))                //(mask && yes, mask this data set) 
    213214                        //find the first 1,  then find the zero 
    214215                        pt1 = 0 
     
    230231                         
    231232                        newN = pt2 - pt1 + 1            // +1 includes both cursors in the fit 
    232                         if((dimsize(resW,1) > 4)) 
    233                                 Make/O/D/N=(newN,newN) $(DF+"crsrResW")         //USANS nxn 
    234                                 WAVE crsrResW = $(DF+"crsrResW") 
    235                                 crsrResW = resW[p+pt1][q+pt1] 
     233                        if((dimsize(resW,1) > 4))       //USANS, NxN 
     234//                              noteStr = note(resW)             
     235//                              mPt1 = NumberByKey("P1",noteStr,"=",";") 
     236//                              mPt2 = NumberByKey("P2",noteStr,"=",";") 
     237//                              if((mPt1 != pt1) || (mPt2 != pt2) ) 
     238//                                      // need to recalculate 
     239//                                      USANS_RE_CalcWeights(ParseFilePath(0, str, ":", 1, 0),pt1,pt2) 
     240//                              endif 
     241                                Wave trimResW=$(str+"_res"+"t") //put the trimmed resW in the struct for the fit! 
     242                                Wave fs.resW=trimResW 
    236243                        else 
    237244                                Make/O/D/N=(newN,4) $(DF+"crsrResW")                    //SANS nx4 
    238245                                WAVE crsrResW = $(DF+"crsrResW") 
    239246                                crsrResW = resW[p+pt1][q] 
    240                         endif 
    241                         //assign to the struct 
    242                         WAVE fs.resW =  crsrResW 
     247                                WAVE fs.resW =  crsrResW 
     248                        endif                    
    243249                else 
    244                 //use all the data points, use the resW as is    
    245                         WAVE fs.resW =  resW 
    246                 endif 
     250                        // Don't mask any of the data... 
     251                        //use all the data points, use the resW as is 
     252                        //if the data is USANS, be sure to re-copy the full resolution matrix 
     253                        if((dimsize(resW,1) > 4))               //it's USANS 
     254                                Duplicate/O $(DF+"weights_save"), $(DF+"crsrResW") 
     255                                WAVE crsrResW = $(DF+"crsrResW") 
     256                                WAVE fs.resW = crsrResW         //this is actually the FULL matrix - no trimming of data 
     257                        else     
     258                                WAVE fs.resW =  resW 
     259                        endif 
     260                endif           //end of "use cursors" 
    247261                 
    248262                //back to our normal program 
     
    546560                endfor           
    547561                ModifyGraph gbRGB=(17476,17476,17476) 
     562                Modifygraph log=1 
    548563                if (options & NewGFOptionLOG_DEST_WAVE) 
    549564                        WaveStats/Q/M=1 xW 
     
    33843399        ControlInfo/W=NewGlobalFitPanel#NewGF_GlobalControlArea NewGF_MaskingCheckBox 
    33853400        if (V_value) 
    3386                 GFUI_AddMaskWavesToDataSets(DataSets) 
    3387         endif 
     3401                GFUI_AddMaskWavesToDataSets(DataSets)  //SRK - if masking, recalculate the matrix for the USANS data if necessary 
     3402        endif 
     3403         
    33883404 
    33893405        // Build the Coefficient wave and CoefNames wave 
     
    40054021        Variable numSets = DimSize(DataSets, 0) 
    40064022        Variable i 
     4023        Variable pt1,pt2,mPt1,mPt2 
     4024        String str,noteStr,DF 
     4025         
    40074026        for (i = 0; i < NumSets; i += 1) 
    40084027                Wave/Z w = $(MaskingListWave[i][1]) 
     
    40144033                        endif 
    40154034                        DataSets[i][startingNCols] = MaskingListWave[i][1] 
    4016                 else 
    4017                         //SRK !!!! CHANGING THE BEHAVIOR !!!! 
     4035                        //SRK - recalculate the resolution matrix if not already present 
     4036                        // start of bits to add 
     4037                        str=DataSets[i][0]              //this seems to work 
     4038                        DF=ParseFilePath(1, str, ":", 1, 0) 
     4039// 
     4040                        str=str[0,strlen(str)-3]                //remove the "_i" = DataFolder:name 
     4041                        WAVE resW = $(str+"_res") 
     4042                        if((dimsize(resW,1) > 4))       //USANS, NxN 
     4043                                noteStr = note(resW)             
     4044                                mPt1 = NumberByKey("P1",noteStr,"=",";") 
     4045                                mPt2 = NumberByKey("P2",noteStr,"=",";") 
     4046                                Wave/Z mw = $(DataSets[i][startingNCols]) 
     4047                 
     4048                                //find the first 1,  then find the zero 
     4049                                pt1 = 0 
     4050                                do 
     4051                                        if(mw[pt1]==1) 
     4052                                                break 
     4053                                        endif 
     4054                                        pt1+=1 
     4055                                while(pt1<numpnts(mw)) 
     4056                                 
     4057                                pt2 = pt1 
     4058                                do 
     4059                                        if(mw[pt2]==0) 
     4060                                                break 
     4061                                        endif 
     4062                                        pt2+=1 
     4063                                while(pt2<numpnts(mw)) 
     4064                                pt2 -= 1 
     4065                                if((mPt1 != pt1) || (mPt2 != pt2) ) 
     4066                                        // need to recalculate 
     4067                                        USANS_RE_CalcWeights(ParseFilePath(0, str, ":", 1, 0),pt1,pt2) 
     4068                                endif 
     4069                        endif 
     4070                         
     4071                         
     4072                else                    //SRK !!!! CHANGING THE BEHAVIOR !!!! 
    40184073                        // if no masking wave was specified, use the entire set (==1) 
    40194074//                      Redimension/N=(-1,startingNCols) DataSets 
     
    47744829         
    47754830        //the text 
     4831        // -- modify to put in the coefficient labels... 
     4832        String dataFileStr,funcStr,nameStr,paramStr,suffix,savDF 
     4833        Variable num,ii 
     4834        savDF = GetDataFolder(1) 
     4835        sscanf StringFromList(4,GF_ResultStr,"\r"),"Data Set:%s ; Function: %s",dataFileStr,funcStr 
     4836        dataFileStr = dataFileStr[0,strlen(dataFileStr)-3]              //remove the "_i" 
     4837        suffix = getModelSuffix(getFunctionCoef(funcStr)) 
     4838        SetDataFolder $("root:"+dataFileStr+":") 
     4839        paramStr = WaveList("*param*_"+suffix, "", "TEXT:1," ) 
     4840        Wave/T pw = $paramStr 
     4841        num=numpnts(pw) 
     4842        for(ii=0;ii<num;ii+=1) 
     4843                GF_resultStr = ReplaceString("Coef_"+num2str(ii), GF_resultStr, pw[ii]) 
     4844        endfor 
     4845        SetDataFolder $savDF 
     4846         
    47764847        Notebook $nb ruler=Normal 
    47774848        Notebook $nb  margins={0,0,524}, tabs={63 + 3*8192} 
     
    47864857        //save the notebook and the graphic file 
    47874858//      if(yesSave) 
    4788                 String dataFileStr="",nameStr 
    4789                 sscanf StringFromList(4,GF_ResultStr,"\r"),"Data Set:%s",dataFileStr            //reads the 5th line to find the data set name 
    47904859//              String nameStr=CleanupName(func,0) 
    47914860//              nameStr = nameStr[0,8]  //shorten the name 
     
    48094878 
    48104879 
    4811  
    4812  
  • sans/Analysis/branches/ajj_23APR07/IGOR_Package_Files/Put in User Procedures/SANS_Models_v4.00/Packages/Wrapper_v40.ipf

    r306 r309  
    742742        endif 
    743743 
    744         //if useCursors, and the data is USANS, need to feed a (reassigned) trimmed matrix to the fit 
    745         Variable pt1,pt2,newN 
     744        //if useCursors, and the data is USANS, need to recalculate the matrix if the range is new 
     745        Variable pt1,pt2,newN,mPt1,mPt2 
     746        String noteStr 
    746747        if(useCursors && (dimsize(resW,1) > 4) ) 
     748                //where are the cursors, and what is the status of the current matrix? 
    747749                if(pcsr(A) > pcsr(B)) 
    748750                        pt1 = pcsr(B) 
     
    752754                        pt2 = pcsr(B) 
    753755                endif 
    754                 newN = pt2 - pt1 + 1            // +1 includes both cursors in the fit 
    755                 Make/O/D/N=(newN,newN) $(DF+"crsrResW") 
    756                 WAVE crsrResW = $(DF+"crsrResW") 
    757                 crsrResW = resW[p+pt1][q+pt1] 
    758                 //assign to the struct 
    759                 WAVE fs.resW =  crsrResW                 
    760         endif 
    761  
     756                 
     757                noteStr = note(resW) 
     758                mPt1 = NumberByKey("P1",noteStr,"=",";") 
     759                mPt2 = NumberByKey("P2",noteStr,"=",";") 
     760                if((mPt1 != pt1) || (mPt2 != pt2) ) 
     761                        // need to recalculate 
     762                        USANS_RE_CalcWeights(folderStr,pt1,pt2) 
     763                endif 
     764                Wave trimResW=$(DF+folderStr+"_res"+"t")        //put the trimmed resW in the struct for the fit! 
     765                Wave fs.resW=trimResW 
     766                 
     767                Print "Done recalculating the matrix" 
     768//////WRONG WAY 
     769//              Make/O/D/N=(newN,newN) $(DF+"crsrResW") 
     770//              WAVE crsrResW = $(DF+"crsrResW") 
     771//              crsrResW = resW[p+pt1][q+pt1] 
     772//              //assign to the struct 
     773//              WAVE fs.resW =  crsrResW                 
     774///////////// 
     775        endif 
     776         
     777        if(!useCursors && (dimsize(resW,1) > 4) ) 
     778                // avoid an odd sequence of y/n cursors that can lead to a truncated res matrix, but useCursors is not selected 
     779                if(waveExists($("root:"+folderStr+":weights_save"))) 
     780                        Duplicate/O $("root:"+folderStr+":weights_save"), $("root:"+folderStr+":"+folderStr+"_res") 
     781                endif 
     782        endif 
     783         
    762784// create these variables so that FuncFit will set them on exit 
    763785        Variable/G V_FitError=0                         //0=no err, 1=error,(2^1+2^0)=3=singular matrix 
     
    11511173                        else 
    11521174                                //print "unchecked, remove the cursors" 
     1175                                // go back to the full matrix for the resolution calculation (not if SANS data...) 
     1176                                if(waveExists($("root:"+folderStr+":weights_save"))) 
     1177                                        Duplicate/O $("root:"+folderStr+":weights_save"), $("root:"+folderStr+":"+folderStr+"_res") 
     1178                                endif 
    11531179                                HideInfo 
    11541180                                Cursor/K A 
  • sans/Analysis/branches/ajj_23APR07/IGOR_Package_Files/Put in User Procedures/SANS_Models_v4.00/USANS_SlitSmearing_v40.ipf

    r308 r309  
    3333        Variable/G USANS_m = -4 
    3434        Variable/G USANS_slope_numpnts = 15 
     35        String/G trimStr=""                     //null string if NOT using cursors, "t" if yes (and re-calculating) 
    3536         
    3637        Print "---- Calculating Weighting Matrix for USANS Data ----" 
     
    6061        Variable ms = stopMSTimer(tref) 
    6162        print "Time elapsed = ", ms/1e6, "s" 
    62         //return Weights 
    63 End 
    64  
     63         
     64        // put the point range of the matrix in a wave note (this is the full range) 
     65        String nStr="" 
     66        sprintf nStr,"P1=%d;P2=%d;",0,USANS_N-1 
     67        Note weights ,nStr 
     68         
     69        // save a copy of the untainted matrix to return to... 
     70        Duplicate/O weights, weights_save 
     71         
     72        return(0) 
     73End 
     74 
     75// re-calculate the weighting matrix, maybe easier to do in a separate function 
     76// 
     77// supposedly I'm in the data folder, not root:, double check to make sure 
     78// 
     79Function USANS_RE_CalcWeights(baseStr,pt1,pt2) 
     80        String baseStr 
     81        Variable pt1,pt2 
     82 
     83        SetDataFolder $("root:"+baseStr) 
     84        NVAR USANS_dQv = USANS_dQv 
     85        SVAR trimStr = trimStr 
     86        trimStr="t"             //yes, we're re-calculating, using trimmed data sets 
     87         
     88        Variable matN 
     89        matN=pt2-pt1+1          //new size of matrix 
     90 
     91        Make/D/O/N=(matN,matN) $(basestr+"_res"+trimStr)                //this is a temporary matrix 
     92        Make/D/O/N=(matN,matN) W1mat 
     93        Make/D/O/N=(matN,matN) W2mat 
     94        Make/D/O/N=(matN,matN) Rmat 
     95        Wave tmpWeights = $(basestr+"_res"+trimStr) 
     96        Wave fullWeights = $(basestr+"_res") 
     97 
     98        // make a trimmed set of QIS waves to match the size selected by the cursors 
     99        // == "t" added to the suffix 
     100        WAVE qval = $(baseStr+"_q") 
     101        WAVE ival = $(baseStr+"_i") 
     102        WAVE sval = $(baseStr+"_s") 
     103        Duplicate/O/R=[pt1,pt2] qval $(baseStr+"_qt") 
     104        Duplicate/O/R=[pt1,pt2] ival $(baseStr+"_it") 
     105        Duplicate/O/R=[pt1,pt2] sval $(baseStr+"_st") 
     106        WAVE qt = $(baseStr+"_qt")                      //these are trimmed based on the cursor points 
     107        WAVE it = $(baseStr+"_it") 
     108        WAVE st = $(baseStr+"_st") 
     109         
     110        //Variable/G USANS_m = EnterSlope(baseStr) 
     111        Variable/G USANS_m = -4 
     112        Variable/G USANS_slope_numpnts = 15 
     113         
     114        Print "---- Calculating Weighting Matrix for USANS Data ----" 
     115         
     116        EnterSlope(basestr) 
     117         
     118        //Deal with broken Pauseforuser 
     119        SetDataFolder $("root:"+basestr) 
     120         
     121        print USANS_m 
     122 
     123        if (USANS_m == 999) 
     124                KillWaves/Z  $(basestr+"_res"),W1Mat,W2mat,Rmat 
     125                return(1) 
     126        endif 
     127         
     128        Variable tref = startMSTimer 
     129        print "Calculating W1..." 
     130        W1mat = (p <= q ) && (q <= matN-2) ? CalcW1(p,q)  : 0 
     131        print "Calculating W2..." 
     132        W2mat = (p+1 <= q ) && (q <= matN-1) ?  CalcW2(p,q) : 0 
     133        print "Calculating Remainders..." 
     134        Rmat = (q == matN-1) ? CalcR(p) : 0 
     135//      print "Summing weights..." 
     136        tmpWeights = W1mat + W2mat + Rmat 
     137        print "Done" 
     138        Variable ms = stopMSTimer(tref) 
     139        print "Time elapsed = ", ms/1e6, "s" 
     140         
     141        //  - put the smaller matrix into the larger one (padded w/zero) 
     142        // get the smaller triangular weights into the proper place in the full matrix 
     143        // 
     144        // this is necessary since the original dependency (as plotted) was set up using the  
     145        // full data set in the STRUCT 
     146        fullWeights = 0 
     147        fullWeights[pt1,pt2][pt1,pt2] = tmpWeights[p-pt1][q-pt1] 
     148         
     149         
     150        // put the point range of the matrix in a wave note 
     151        String nStr="" 
     152        sprintf nStr,"P1=%d;P2=%d;",pt1,pt2 
     153        Note/K fullWeights ,nStr 
     154         
     155        return(0) 
     156End 
     157 
     158// trimStr = "" if the full (original) data set is to be used, == "t" if the set is trimmed to cursors 
    65159Function EnterSlope(baseStr) 
    66160        String baseStr 
     
    69163        NVAR USANS_m = $("root:"+baseStr+":USANS_m") 
    70164        NVAR USANS_slope_numpnts = $("root:"+baseStr+":USANS_slope_numpnts") 
    71  
     165        SVAR trimStr = $("root:"+baseStr+":trimStr") 
    72166         
    73167//      Variable slope=-4 
     
    93187        SetVariable setvar_slope, proc=USANS_ManualSlope 
    94188         
    95         Display/W=(9,6,402,305)/HOST=USANS_Slope $(basestr+"_i") vs $(basestr+"_q") 
     189        Display/W=(9,6,402,305)/HOST=USANS_Slope $(basestr+"_i"+trimStr) vs $(basestr+"_q"+trimStr) 
    96190        RenameWindow #,SlopePlot 
    97         ErrorBars/W=USANS_Slope#SlopePlot $(basestr+"_i"), Y wave=($(basestr+"_s"),$(basestr+"_s")) 
     191        ErrorBars/W=USANS_Slope#SlopePlot $(basestr+"_i"+trimStr), Y wave=($(basestr+"_s"+trimStr),$(basestr+"_s"+trimStr)) 
    98192        ModifyGraph log=1 
    99193        ModifyGraph mode=3,msize=3,marker=1,rgb=(0,0,0) 
     
    118212//      NVAR USANS_m 
    119213        NVAR USANS_m = $("root:"+baseStr+":USANS_m") 
    120          
    121         Wave iw = $(basestr+"_i") 
    122         Wave qw = $(basestr+"_q") 
    123         Wave sw = $(basestr+"_s") 
     214        SVAR trimStr = $("root:"+baseStr+":trimStr") 
     215         
     216        Wave iw = $(basestr+"_i"+trimStr) 
     217        Wave qw = $(basestr+"_q"+trimStr) 
     218        Wave sw = $(basestr+"_s"+trimStr) 
    124219 
    125220        Variable num_extr=25 
     
    188283        WAVE/Z extr_hqq = $("root:"+baseStr+":extr_hqq") 
    189284        WAVE/Z extr_hqi = $("root:"+baseStr+":extr_hqi") 
     285        SVAR trimStr = $("root:"+baseStr+":trimStr") 
    190286         
    191287        if(waveExists(extr_hqq)==0 || waveExists(extr_hqi)==0) 
     
    193289        endif 
    194290         
    195         Wave iw = $("root:"+basestr+":"+basestr+"_i") 
    196         Wave qw = $("root:"+basestr+":"+basestr+"_q") 
     291        Wave iw = $("root:"+basestr+":"+basestr+"_i"+trimStr) 
     292        Wave qw = $("root:"+basestr+":"+basestr+"_q"+trimStr) 
    197293 
    198294        Variable matchPt,num=numpnts(iw),correctedSlope 
     
    229325 
    230326Function CalcW1(i,j) 
    231  
    232327        Variable i,j 
     328         
    233329        SVAR USANS_basestr=root:Packages:NIST:USANS_basestr  
     330        SVAR trimStr = $("root:"+USANS_baseStr+":trimStr") 
    234331        SetDataFolder $("root:"+USANS_basestr) 
    235332 
     
    239336         
    240337        Variable UU,UL,dqj,rU,rL,wU,wL,dqw 
    241         Wave Qval = $(USANS_basestr+"_q") 
     338        Wave Qval = $(USANS_basestr+"_q"+trimStr) 
    242339         
    243340        UU =sqrt(Qval[j+1]^2-Qval[i]^2) 
     
    255352 
    256353Function CalcW2(i,j) 
    257  
    258354        Variable i,j 
    259355         
    260356        SVAR USANS_basestr=root:Packages:NIST:USANS_basestr  
     357        SVAR trimStr = $("root:"+USANS_baseStr+":trimStr") 
    261358        SetDataFolder $("root:"+USANS_basestr) 
    262359 
     
    267364        variable UU,UL,dqw,rU,rL,wU,wL 
    268365         
    269         Wave Qval = $(USANS_basestr+"_q") 
     366        Wave Qval = $(USANS_basestr+"_q"+trimStr) 
    270367 
    271368        UU = sqrt(Qval[j]^2-Qval[i]^2)                   
     
    282379 
    283380Function CalcR(i) 
    284  
    285381        Variable i 
    286382 
    287383        SVAR USANS_basestr=root:Packages:NIST:USANS_basestr  
     384        SVAR trimStr = $("root:"+USANS_baseStr+":trimStr") 
    288385        SetDataFolder $("root:"+USANS_basestr) 
    289386 
     
    294391         
    295392        Variable retval 
    296         Wave Qval = $(USANS_basestr+"_q") 
    297         Wave Ival = $(USANS_basestr+"_i") 
     393        Wave Qval = $(USANS_basestr+"_q"+trimStr) 
     394        Wave Ival = $(USANS_basestr+"_i"+trimStr) 
    298395        Variable/G USANS_intQpt = Qval[i] 
    299396         
     
    318415         
    319416        SVAR USANS_basestr=root:Packages:NIST:USANS_basestr  
     417        SVAR trimStr = $("root:"+USANS_baseStr+":trimStr") 
    320418        SetDataFolder $("root:"+USANS_basestr) 
    321419 
     
    323421        NVAR qi = USANS_intQpt 
    324422        NVAR N = USANS_N 
    325         WAVE Qval = $(USANS_basestr+"_q")        
     423        WAVE Qval = $(USANS_basestr+"_q"+trimStr)        
    326424        Variable retVal 
    327425         
Note: See TracChangeset for help on using the changeset viewer.