Ignore:
Timestamp:
Jul 20, 2017 3:22:34 PM (5 years ago)
Author:
srkline
Message:

LOTS of changes to accommodate the beam center being reported in cm rather than pixels. Required a lot of changes to VCALC (to fill in simulated data), and in the reading and interpreting of data for display, and most importantly, the calculation of q.

There may still be a few residual bugs with this. I am still re-testing with new sample data sets.

File:
1 edited

Legend:

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

    r1051 r1055  
    227227        String detStr 
    228228         
    229         String destPath = "root:Packages:NIST:VSANS:RAW" 
    230                          
     229        String destPath = "root:Packages:NIST:VSANS:VCALC" 
     230         
     231        // be sure that the real distance waves exist 
     232        // TODO -- this may not be the best location? 
     233 
     234// calibration waves do not exist yet, so make some fake ones   ' 
     235        // do I count on the orientation as an input, or do I just figure it out on my own? 
     236        String orientation 
     237        Variable dimX,dimY 
     238        dimX = DimSize(data,0) 
     239        dimY = DimSize(data,1) 
     240        if(dimX > dimY) 
     241                orientation = "horizontal" 
     242        else 
     243                orientation = "vertical" 
     244        endif 
     245         
     246        if(cmpstr(orientation,"vertical")==0) 
     247                Make/O/D/N=(3,48) tmpCalib 
     248                // for the "tall" L/R banks 
     249                tmpCalib[0][] = -512 
     250                tmpCalib[1][] = 8 
     251                tmpCalib[2][] = 0 
     252        else 
     253                Make/O/D/N=(3,48) tmpCalib 
     254                // for the "short" T/B banks 
     255                tmpCalib[0][] = -256 
     256                tmpCalib[1][] = 4 
     257                tmpCalib[2][] = 0 
     258        endif 
     259        // override if back panel 
     260        if(cmpstr(detStr,"B") == 0) 
     261                // and for the back detector "B" 
     262                Make/O/D/N=3 tmpCalib 
     263                tmpCalib[0] = 1 
     264                tmpCalib[1] = 1 
     265                tmpcalib[2] = 10000 
     266        endif 
     267         
     268//      Wave w_calib = V_getDetTube_spatialCalib("VCALC",detStr) 
     269        Variable tube_width = 8.4                       // TODO: Hard-wired value!! 
     270        if(cmpstr(detStr,"B") == 0) 
     271                V_NonLinearCorrection_B("VCALC",data,tmpCalib,tmpCalib,detStr,destPath) 
     272        else 
     273                V_NonLinearCorrection("VCALC",data,tmpCalib,tube_width,detStr,destPath) 
     274        endif 
     275                                 
    231276        Wave/Z data_realDistX = $(destPath + ":entry:instrument:detector_"+detStr+":data_realDistX") 
    232277        Wave/Z data_realDistY = $(destPath + ":entry:instrument:detector_"+detStr+":data_realDistY") 
    233278        NVAR gUseNonLinearDet = root:Packages:NIST:VSANS:VCALC:gUseNonLinearDet 
    234          
    235         if(gUseNonLinearDet && WaveExists(data_realDistX) && WaveExists(data_realDistY)) 
    236                 // convert the beam centers to mm 
    237                 String orientation 
    238                 Variable dimX,dimY,newX,newY 
    239                 dimX = DimSize(data_realDistX,0) 
    240                 dimY = DimSize(data_realDistX,1) 
    241                 if(dimX > dimY) 
    242                         orientation = "horizontal" 
     279 
     280        if(kBCTR_CM) 
     281                if(gUseNonLinearDet && WaveExists(data_realDistX) && WaveExists(data_realDistY)) 
     282                        // no need to convert the beam centers to real space, just to mm 
     283                        xCtr *= 10              // convert from cm to mm 
     284                        yCtr *= 10               
     285                        // calculate all of the q-values 
     286                        qTot = V_CalcQval(p,q,xCtr,yCtr,sdd,lam,data_realDistX,data_realDistY) 
     287                        qx = V_CalcQX(p,q,xCtr,yCtr,sdd,lam,data_realDistX,data_realDistY) 
     288                        qy = V_CalcQY(p,q,xCtr,yCtr,sdd,lam,data_realDistX,data_realDistY) 
     289                        qz = V_CalcQZ(p,q,xCtr,yCtr,sdd,lam,data_realDistX,data_realDistY) 
     290                 
     291        //              Print "det, x_mm, y_mm ",detStr,num2str(newX),num2str(newY) 
     292        //              Print "det, x_pix, y_pix ",detStr,num2str(xCtr),num2str(yCtr) 
    243293                else 
    244                         orientation = "vertical" 
    245                 endif 
    246                  
    247                 Variable tube_width = 8.4               //mm 
    248          
    249         // 
    250                 if(cmpstr(orientation,"vertical")==0) 
    251                         //      this is data dimensioned as (Ntubes,Npix) 
    252                         newX = tube_width*xCtr 
    253                         newY = data_realDistY[0][yCtr] 
     294                        // do the q-calculation using linear detector 
     295                        //VC_Detector_2Q(data,qTot,qx,qy,qz,xCtr,yCtr,sdd,lam,pixSizeX,pixSizeY) 
     296                        qTot = V_CalcQval(p,q,xCtr,yCtr,sdd,lam,data_realDistX,data_realDistY) 
     297                        qx = V_CalcQX(p,q,xCtr,yCtr,sdd,lam,data_realDistX,data_realDistY) 
     298                        qy = V_CalcQY(p,q,xCtr,yCtr,sdd,lam,data_realDistX,data_realDistY) 
     299                        qz = V_CalcQZ(p,q,xCtr,yCtr,sdd,lam,data_realDistX,data_realDistY) 
     300                endif    
     301         
     302         
     303        else 
     304        // using the old calculation with beam center in pixels 
     305                if(gUseNonLinearDet && WaveExists(data_realDistX) && WaveExists(data_realDistY)) 
     306                        // convert the beam centers to mm 
     307//                      String orientation 
     308                        Variable newX,newY 
     309                        dimX = DimSize(data_realDistX,0) 
     310                        dimY = DimSize(data_realDistX,1) 
     311                        if(dimX > dimY) 
     312                                orientation = "horizontal" 
     313                        else 
     314                                orientation = "vertical" 
     315                        endif 
     316                         
     317                 
     318                // 
     319                        if(cmpstr(orientation,"vertical")==0) 
     320                                //      this is data dimensioned as (Ntubes,Npix) 
     321                                newX = tube_width*xCtr 
     322                                newY = data_realDistY[0][yCtr] 
     323                        else 
     324                                //      this is data (horizontal) dimensioned as (Npix,Ntubes) 
     325                                newX = data_realDistX[xCtr][0] 
     326                                newY = tube_width*yCtr 
     327                        endif    
     328         
     329                        //if detector "B", different calculation for the centers (not tubes) 
     330                        if(cmpstr(detStr,"B")==0) 
     331                                newX = data_realDistX[xCtr][0] 
     332                                newY = data_realDistY[0][yCtr] 
     333                                //newX = xCtr 
     334                                //newY = yCtr 
     335                        endif            
     336                                         
     337                        // calculate all of the q-values 
     338                        qTot = V_CalcQval(p,q,newX,newY,sdd,lam,data_realDistX,data_realDistY) 
     339                        qx = V_CalcQX(p,q,newX,newY,sdd,lam,data_realDistX,data_realDistY) 
     340                        qy = V_CalcQY(p,q,newX,newY,sdd,lam,data_realDistX,data_realDistY) 
     341                        qz = V_CalcQZ(p,q,newX,newY,sdd,lam,data_realDistX,data_realDistY) 
     342                 
     343        //              Print "det, x_mm, y_mm ",detStr,num2str(newX),num2str(newY) 
     344        //              Print "det, x_pix, y_pix ",detStr,num2str(xCtr),num2str(yCtr) 
    254345                else 
    255                         //      this is data (horizontal) dimensioned as (Npix,Ntubes) 
    256                         newX = data_realDistX[xCtr][0] 
    257                         newY = tube_width*yCtr 
     346                        // do the q-calculation using linear detector 
     347                        VC_Detector_2Q(data,qTot,qx,qy,qz,xCtr,yCtr,sdd,lam,pixSizeX,pixSizeY) 
    258348                endif    
    259  
    260                 //if detector "B", different calculation for the centers (not tubes) 
    261                 if(cmpstr(detStr,"B")==0) 
    262                         newX = data_realDistX[xCtr][0] 
    263                         newY = data_realDistY[0][yCtr] 
    264                         //newX = xCtr 
    265                         //newY = yCtr 
    266                 endif            
    267                                  
    268                 // calculate all of the q-values 
    269                 qTot = V_CalcQval(p,q,newX,newY,sdd,lam,data_realDistX,data_realDistY) 
    270                 qx = V_CalcQX(p,q,newX,newY,sdd,lam,data_realDistX,data_realDistY) 
    271                 qy = V_CalcQY(p,q,newX,newY,sdd,lam,data_realDistX,data_realDistY) 
    272                 qz = V_CalcQZ(p,q,newX,newY,sdd,lam,data_realDistX,data_realDistY) 
    273          
    274 //              Print "det, x_mm, y_mm ",detStr,num2str(newX),num2str(newY) 
    275 //              Print "det, x_pix, y_pix ",detStr,num2str(xCtr),num2str(yCtr) 
    276         else 
    277                 // do the q-calculation using linear detector 
    278                 VC_Detector_2Q(data,qTot,qx,qy,qz,xCtr,yCtr,sdd,lam,pixSizeX,pixSizeY) 
    279         endif 
     349         
     350        endif 
     351         
     352        KillWaves/Z tmpCalib 
    280353         
    281354        return(0) 
     
    296369// 
    297370//returned magnitude of Q is in 1/Angstroms 
     371// 
    298372// 
    299373Function VC_CalcQval(xaxval,yaxval,xctr,yctr,sdd,lam,pixSizeX,pixSizeY) 
Note: See TracChangeset for help on using the changeset viewer.