Ignore:
Timestamp:
Apr 22, 2016 5:02:30 PM (7 years ago)
Author:
srkline
Message:

lots of changes to plotting of q-values, generating fake data with non-linear corrections, masking of data, etc.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sans/Dev/trunk/NCNR_User_Procedures/Reduction/VSANS/VC_DetectorBinning_Utils.ipf

    r992 r993  
    186186 
    187187 
     188// for testing, a version that will calculate the q-arrays for VCALC based on whatever nonlinear coefficients 
     189// exist in the RAW data folder 
     190// 
     191// reverts to the "regular" linear detector if waves not found or a flag is set 
     192// 
     193// need to convert the beam center to mm 
     194// need to call the VSANS V_CalcQval routines (these use the real-space distance, not pixel dims) 
     195// 
     196// TODO: 
     197// -- tube width is hard-wired in 
     198// 
     199// 
     200Function VC_Detector_2Q_NonLin(data,qTot,qx,qy,qz,xCtr,yCtr,sdd,lam,pixSizeX,pixSizeY,detStr) 
     201        Wave data,qTot,qx,qy,qz 
     202        Variable xCtr,yCtr,sdd,lam,pixSizeX,pixSizeY 
     203        String detStr 
     204         
     205        String destPath = "root:Packages:NIST:VSANS:RAW" 
     206                         
     207        Wave/Z data_realDistX = $(destPath + ":entry:instrument:detector_"+detStr+":data_realDistX") 
     208        Wave/Z data_realDistY = $(destPath + ":entry:instrument:detector_"+detStr+":data_realDistY") 
     209        NVAR gUseNonLinearDet = root:Packages:NIST:VSANS:VCALC:gUseNonLinearDet 
     210         
     211        if(gUseNonLinearDet && WaveExists(data_realDistX) && WaveExists(data_realDistY)) 
     212                // convert the beam centers to mm 
     213                String orientation 
     214                Variable dimX,dimY,newX,newY 
     215                dimX = DimSize(data_realDistX,0) 
     216                dimY = DimSize(data_realDistX,1) 
     217                if(dimX > dimY) 
     218                        orientation = "horizontal" 
     219                else 
     220                        orientation = "vertical" 
     221                endif 
     222                 
     223                Variable tube_width = 8.4               //mm 
     224         
     225        // 
     226                if(cmpstr(orientation,"vertical")==0) 
     227                        //      this is data dimensioned as (Ntubes,Npix) 
     228                        newX = tube_width*xCtr 
     229                        newY = data_realDistY[0][yCtr] 
     230                else 
     231                        //      this is data (horizontal) dimensioned as (Npix,Ntubes) 
     232                        newX = data_realDistX[xCtr][0] 
     233                        newY = tube_width*yCtr 
     234                endif    
     235 
     236                //if detector "B", different calculation for the centers (not tubes) 
     237                if(cmpstr(detStr,"B")==0) 
     238                        newX = data_realDistX[xCtr][0] 
     239                        newY = data_realDistY[0][yCtr] 
     240                endif            
     241                                 
     242                // calculate all of the q-values 
     243                qTot = V_CalcQval(p,q,newX,newY,sdd,lam,data_realDistX,data_realDistY) 
     244                qx = V_CalcQX(p,q,newX,newY,sdd,lam,data_realDistX,data_realDistY) 
     245                qy = V_CalcQY(p,q,newX,newY,sdd,lam,data_realDistX,data_realDistY) 
     246                qz = V_CalcQZ(p,q,newX,newY,sdd,lam,data_realDistX,data_realDistY) 
     247         
     248//              Print "det, x_mm, y_mm ",detStr,num2str(newX),num2str(newY) 
     249//              Print "det, x_pix, y_pix ",detStr,num2str(xCtr),num2str(yCtr) 
     250        else 
     251                // do the q-calculation using linear detector 
     252                VC_Detector_2Q(data,qTot,qx,qy,qz,xCtr,yCtr,sdd,lam,pixSizeX,pixSizeY) 
     253        endif 
     254         
     255        return(0) 
     256End 
     257 
     258 
    188259////////////////////// 
    189260// NOTE: The Q calculations are different than what is in GaussUtils in that they take into  
     
    593664// -- figure out what the best location is to put the averaged data? currently @ top level of WORK folder 
    594665//    but this is a lousy choice. 
    595 // 
     666// x- binning is now Mask-aware. If mask is not present, all data is used. If data is from VCALC, all data is used 
     667// -- Where do I put the solid angle correction? In here as a weight for each point, or later on as  
     668//    a blanket correction (matrix multiply) for an entire panel? 
     669// 
     670// folderStr = WORK folder, type = the binning type (may include multiple detectors) 
    596671Function VC_fDoBinning_QxQy2D(folderStr,type) 
    597672        String folderStr,type 
     
    601676        Variable ii,jj 
    602677        Variable qVal,nq,var,avesq,aveisq 
    603         Variable binIndex,val,isVCALC=0 
     678        Variable binIndex,val,isVCALC=0,maskMissing 
    604679 
    605680        String folderPath = "root:Packages:NIST:VSANS:"+folderStr 
     
    614689// since there may be more than one panel to step through. There may be two, there may be four 
    615690// 
     691 
     692// assume that the mask files are missing unless we can find them. If VCALC data,  
     693//  then the Mask is missing by definition 
     694        maskMissing = 1 
    616695 
    617696        strswitch(type) // string switch 
     
    625704                                Wave inten = V_getDetectorDataW(folderStr,detStr) 
    626705                                Wave iErr = V_getDetectorDataErrW(folderStr,detStr) 
     706                                Wave/Z mask = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":data") 
     707                                if(WaveExists(mask) == 1) 
     708                                        maskMissing = 0 
     709                                endif 
     710                                 
    627711                        endif 
    628712                        NVAR delQ = $(folderPath+instPath+detStr+":gDelQ_"+detStr) 
     
    640724                                Wave inten = V_getDetectorDataW(folderStr,detStr) 
    641725                                Wave iErr = V_getDetectorDataErrW(folderStr,detStr) 
     726                                Wave/Z mask = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":data") 
     727                                if(WaveExists(mask) == 1) 
     728                                        maskMissing = 0 
     729                                endif 
    642730                        endif 
    643731                        NVAR delQ = $(folderPath+instPath+detStr+":gDelQ_"+detStr) 
     
    655743                                Wave inten = V_getDetectorDataW(folderStr,detStr) 
    656744                                Wave iErr = V_getDetectorDataErrW(folderStr,detStr) 
     745                                Wave/Z mask = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":data") 
     746                                if(WaveExists(mask) == 1) 
     747                                        maskMissing = 0 
     748                                endif 
    657749                        endif    
    658750                        //TODO: 
     
    675767                                Wave inten = V_getDetectorDataW(folderStr,detStr) 
    676768                                Wave iErr = V_getDetectorDataErrW(folderStr,detStr) 
     769                                Wave/Z mask = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":data") 
     770                                if(WaveExists(mask) == 1) 
     771                                        maskMissing = 0 
     772                                endif 
    677773                        endif    
    678774                        NVAR delQ = $(folderPath+instPath+detStr+":gDelQ_"+detStr) 
     
    689785                                Wave inten = V_getDetectorDataW(folderStr,detStr) 
    690786                                Wave iErr = V_getDetectorDataErrW(folderStr,detStr) 
     787                                Wave/Z mask = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+detStr+":data") 
     788                                if(WaveExists(mask) == 1) 
     789                                        maskMissing = 0 
     790                                endif 
    691791                        endif    
    692792                        NVAR delQ = $(folderPath+instPath+detStr+":gDelQ_B") 
     
    709809                                Wave inten2 = V_getDetectorDataW(folderStr,"FR") 
    710810                                Wave iErr2 = V_getDetectorDataErrW(folderStr,"FR") 
     811                                Wave/Z mask = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+"FL"+":data") 
     812                                Wave/Z mask2 = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+"FR"+":data") 
     813                                if(WaveExists(mask) == 1 && WaveExists(mask2) == 1) 
     814                                        maskMissing = 0 
     815                                endif 
    711816                        endif    
    712817                        NVAR delQ = $(folderPath+instPath+"FL"+":gDelQ_FL") 
     
    729834                                Wave inten2 = V_getDetectorDataW(folderStr,"FB") 
    730835                                Wave iErr2 = V_getDetectorDataErrW(folderStr,"FB") 
     836                                Wave/Z mask = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+"FT"+":data") 
     837                                Wave/Z mask2 = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+"FB"+":data") 
     838                                if(WaveExists(mask) == 1 && WaveExists(mask2) == 1) 
     839                                        maskMissing = 0 
     840                                endif 
    731841                        endif    
    732842                        NVAR delQ = $(folderPath+instPath+"FT"+":gDelQ_FT") 
     
    757867                                Wave inten4 = V_getDetectorDataW(folderStr,"FB") 
    758868                                Wave iErr4 = V_getDetectorDataErrW(folderStr,"FB") 
     869                                Wave/Z mask = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+"FL"+":data") 
     870                                Wave/Z mask2 = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+"FR"+":data") 
     871                                Wave/Z mask3 = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+"FT"+":data") 
     872                                Wave/Z mask4 = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+"FB"+":data") 
     873                                if(WaveExists(mask) == 1 && WaveExists(mask2) == 1 && WaveExists(mask3) == 1 && WaveExists(mask4) == 1) 
     874                                        maskMissing = 0 
     875                                endif 
    759876                        endif    
    760877                        NVAR delQ = $(folderPath+instPath+"FL"+":gDelQ_FL") 
     
    779896                                Wave inten2 = V_getDetectorDataW(folderStr,"MR") 
    780897                                Wave iErr2 = V_getDetectorDataErrW(folderStr,"MR") 
     898                                Wave/Z mask = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+"ML"+":data") 
     899                                Wave/Z mask2 = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+"MR"+":data") 
     900                                if(WaveExists(mask) == 1 && WaveExists(mask2) == 1) 
     901                                        maskMissing = 0 
     902                                endif 
    781903                        endif    
    782904                        NVAR delQ = $(folderPath+instPath+"ML"+":gDelQ_ML") 
     
    799921                                Wave inten2 = V_getDetectorDataW(folderStr,"MB") 
    800922                                Wave iErr2 = V_getDetectorDataErrW(folderStr,"MB") 
     923                                Wave/Z mask = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+"MT"+":data") 
     924                                Wave/Z mask2 = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+"MB"+":data") 
     925                                if(WaveExists(mask) == 1 && WaveExists(mask2) == 1) 
     926                                        maskMissing = 0 
     927                                endif 
    801928                        endif    
    802929                        NVAR delQ = $(folderPath+instPath+"MT"+":gDelQ_MT") 
     
    827954                                Wave inten4 = V_getDetectorDataW(folderStr,"MB") 
    828955                                Wave iErr4 = V_getDetectorDataErrW(folderStr,"MB") 
     956                                Wave/Z mask = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+"ML"+":data") 
     957                                Wave/Z mask2 = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+"MR"+":data") 
     958                                Wave/Z mask3 = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+"MT"+":data") 
     959                                Wave/Z mask4 = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+"MB"+":data") 
     960                                if(WaveExists(mask) == 1 && WaveExists(mask2) == 1 && WaveExists(mask3) == 1 && WaveExists(mask4) == 1) 
     961                                        maskMissing = 0 
     962                                endif 
    829963                        endif    
    830964                        NVAR delQ = $(folderPath+instPath+"ML"+":gDelQ_ML") 
     
    9221056// this needs to be a double loop now... 
    9231057 
     1058// if any of the masks don't exist, display the error, and proceed with the averaging, using all data 
     1059        if(maskMissing == 1) 
     1060                Print "Mask file not found for at least one detector - so all data is used" 
     1061        endif 
     1062 
     1063        Variable mask_val 
    9241064// use set 1 (no number) only 
    9251065        if(nSets >= 1) 
     
    9331073                                binIndex = trunc(x2pnt(qBin_qxqy, qVal)) 
    9341074                                val = inten[ii][jj] 
    935                                 if (numType(val)==0)            //count only the good points, ignore Nan or Inf 
     1075                                 
     1076                                if(isVCALC || maskMissing)              // mask_val == 1 == keep 
     1077                                        mask_val = 1 
     1078                                else 
     1079                                        mask_val = mask[ii][jj] 
     1080                                endif 
     1081                                if (numType(val)==0 && mask_val == 1)           //count only the good points, ignore Nan or Inf 
    9361082                                        iBin_qxqy[binIndex] += val 
    9371083                                        iBin2_qxqy[binIndex] += val*val 
     
    9551101                                binIndex = trunc(x2pnt(qBin_qxqy, qVal)) 
    9561102                                val = inten2[ii][jj] 
    957                                 if (numType(val)==0)            //count only the good points, ignore Nan or Inf 
     1103                                 
     1104                                if(isVCALC || maskMissing) 
     1105                                        mask_val = 1 
     1106                                else 
     1107                                        mask_val = mask2[ii][jj] 
     1108                                endif 
     1109                                if (numType(val)==0 && mask_val == 1)           //count only the good points, ignore Nan or Inf 
    9581110                                        iBin_qxqy[binIndex] += val 
    9591111                                        iBin2_qxqy[binIndex] += val*val 
     
    9771129                                binIndex = trunc(x2pnt(qBin_qxqy, qVal)) 
    9781130                                val = inten3[ii][jj] 
    979                                 if (numType(val)==0)            //count only the good points, ignore Nan or Inf 
     1131                                 
     1132                                if(isVCALC || maskMissing) 
     1133                                        mask_val = 1 
     1134                                else 
     1135                                        mask_val = mask3[ii][jj] 
     1136                                endif 
     1137                                if (numType(val)==0 && mask_val == 1)           //count only the good points, ignore Nan or Inf 
    9801138                                        iBin_qxqy[binIndex] += val 
    9811139                                        iBin2_qxqy[binIndex] += val*val 
     
    9961154                                binIndex = trunc(x2pnt(qBin_qxqy, qVal)) 
    9971155                                val = inten4[ii][jj] 
    998                                 if (numType(val)==0)            //count only the good points, ignore Nan or Inf 
     1156                                 
     1157                                if(isVCALC || maskMissing) 
     1158                                        mask_val = 1 
     1159                                else 
     1160                                        mask_val = mask4[ii][jj] 
     1161                                endif 
     1162                                if (numType(val)==0 && mask_val == 1)           //count only the good points, ignore Nan or Inf 
    9991163                                        iBin_qxqy[binIndex] += val 
    10001164                                        iBin2_qxqy[binIndex] += val*val 
Note: See TracChangeset for help on using the changeset viewer.