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/V_DetectorCorrections.ipf

    r1044 r1055  
    122122// 
    123123// 
    124 Function V_NonLinearCorrection(dataW,coefW,tube_width,detStr,destPath) 
     124Function V_NonLinearCorrection(fname,dataW,coefW,tube_width,detStr,destPath) 
     125        String fname            //can also be a folder such as "RAW" 
    125126        Wave dataW,coefW 
    126127        Variable tube_width 
     
    149150        // the distance perpendicular to the tube is n*(8.4mm) per tube index 
    150151         
     152        // TODO 
     153        // -- GAP IS HARD-WIRED 
     154        Variable offset,gap 
     155 
     156// kPanelTouchingGap is in mm    
     157        gap = kPanelTouchingGap/10              //cm 
     158         
    151159        if(cmpstr(orientation,"vertical")==0) 
    152160                //      this is data dimensioned as (Ntubes,Npix) 
     
    154162                data_realDistY[][] = coefW[0][p] + coefW[1][p]*q + coefW[2][p]*q*q 
    155163         
     164                // adjust the x postion based on the beam center being nominally (0,0) in units of cm, not pixels 
     165                if(cmpstr(fname,"VCALC")== 0 ) 
     166                        offset = VCALC_getPanelSeparation(detStr) 
     167                        offset /= 2                     // units of mm 
     168                else 
     169                        //normal case 
     170                offset = V_getDet_LateralOffset(fname,detStr) 
     171                offset *= 10 //convert cm to mm 
     172                endif 
     173                 
     174        // calculation is in mm, not cm 
     175                if(kBCTR_CM) 
     176                        if(cmpstr("L",detStr[1]) == 0) 
     177                                data_realDistX[][] = -offset - (dimX - p)*tube_width                    // TODO should this be dimX-1-p = 47-p? 
     178                        else 
     179                                data_realDistX[][] += offset + gap + tube_width                 //add to the Right det, not recalculate 
     180                        endif 
     181                endif 
     182         
     183         
    156184        elseif(cmpstr(orientation,"horizontal")==0) 
    157185                //      this is data (horizontal) dimensioned as (Npix,Ntubes) 
     
    159187                data_realDistY[][] = tube_width*q 
    160188 
     189                if(cmpstr(fname,"VCALC")== 0 ) 
     190                        offset = VCALC_getPanelSeparation(detStr) 
     191                        offset /= 2                     // units of mm 
     192                else 
     193                        //normal case 
     194                        offset = V_getDet_VerticalOffset(fname,detStr) 
     195                        offset *= 10 //convert cm to mm 
     196                endif 
     197                 
     198                if(kBCTR_CM) 
     199                        if(cmpstr("T",detStr[1]) == 0) 
     200                                data_realDistY[][] += offset + gap + tube_width                  
     201                        else 
     202                                data_realDistY[][] = -offset - (dimY - q)*tube_width    // TODO should this be dimY-1-q = 47-q? 
     203                        endif 
     204                endif 
     205 
    161206        else             
    162207                DoAlert 0,"Orientation not correctly passed in NonLinearCorrection(). No correction done." 
     208                return(0) 
    163209        endif 
    164210         
    165211        return(0) 
    166212end 
     213 
     214 
     215 
    167216 
    168217// TODO: 
     
    171220// 
    172221// 
    173 Function V_NonLinearCorrection_B(folder,detStr,destPath) 
    174         String folder,detStr,destPath 
     222Function V_NonLinearCorrection_B(folder,dataW,cal_x,cal_y,detStr,destPath) 
     223        String folder 
     224        Wave dataW,cal_x,cal_y 
     225        String detStr,destPath 
    175226 
    176227        if(cmpstr(detStr,"B") != 0) 
     
    181232        Variable dimX,dimY 
    182233         
    183         Wave dataW = V_getDetectorDataW(folder,detStr) 
     234//      Wave dataW = V_getDetectorDataW(folder,detStr) 
    184235         
    185236        dimX = DimSize(dataW,0) 
     
    194245         
    195246         
    196         Wave cal_x = V_getDet_cal_x(folder,detStr) 
    197         Wave cal_y = V_getDet_cal_y(folder,detStr) 
     247//      Wave cal_x = V_getDet_cal_x(folder,detStr) 
     248//      Wave cal_y = V_getDet_cal_y(folder,detStr) 
    198249         
    199250        data_realDistX[][] = cal_x[0]*p 
     
    262313end 
    263314 
     315// 
     316// 
     317// TODO 
     318// -- VERIFY the calculations 
     319// -- verify where this needs to be done (if the beam center is changed) 
     320// -- then the q-calculation needs to be re-done 
     321// -- the position along the tube length is referenced to tube[0], for no particular reason 
     322//    It may be better to take an average? but [0] is an ASSUMPTION 
     323// -- distance along tube is simple interpolation, or do I use the coefficients to 
     324//    calculate the actual value 
     325// 
     326// -- distance in the lateral direction is based on tube width, which is a fixed parameter 
     327// 
     328// 
     329Function V_ConvertBeamCtr_to_pix(folder,detStr,destPath) 
     330        String folder,detStr,destPath 
     331         
     332        Wave data_realDistX = $(destPath + ":entry:instrument:detector_"+detStr+":data_realDistX") 
     333        Wave data_realDistY = $(destPath + ":entry:instrument:detector_"+detStr+":data_realDistY")       
     334 
     335        String orientation 
     336        Variable dimX,dimY,xCtr,yCtr 
     337        dimX = DimSize(data_realDistX,0) 
     338        dimY = DimSize(data_realDistX,1) 
     339        if(dimX > dimY) 
     340                orientation = "horizontal" 
     341        else 
     342                orientation = "vertical" 
     343        endif 
     344         
     345        xCtr = V_getDet_beam_center_x(folder,detStr)            //these are in cm 
     346        yCtr = V_getDet_beam_center_y(folder,detStr)     
     347         
     348        Make/O/D/N=1 $(destPath + ":entry:instrument:detector_"+detStr+":beam_center_x_pix") 
     349        Make/O/D/N=1 $(destPath + ":entry:instrument:detector_"+detStr+":beam_center_y_pix") 
     350        WAVE x_pix = $(destPath + ":entry:instrument:detector_"+detStr+":beam_center_x_pix") 
     351        WAVE y_pix = $(destPath + ":entry:instrument:detector_"+detStr+":beam_center_y_pix") 
     352 
     353        Variable tube_width = V_getDet_tubeWidth(folder,detStr) 
     354 
     355        variable edge,delta 
     356 
     357// 
     358        if(cmpstr(orientation,"vertical")==0) 
     359                //      this is data dimensioned as (Ntubes,Npix) 
     360 
     361                if(kBCTR_CM) 
     362                        if(cmpstr("L",detStr[1]) == 0) 
     363                                edge = data_realDistX[47][0]            //tube 47 
     364                                delta = abs(xCtr*10 - edge) 
     365                                x_pix[0] = dimX-1 + delta/tube_width 
     366                        else 
     367                        // R panel 
     368                                edge = data_realDistX[0][0] 
     369                                delta = abs(xCtr*10 - edge + kPanelTouchingGap) 
     370                                x_pix[0] = -delta/tube_width            //since the left edge of the R panel is pixel 0 
     371                        endif 
     372                endif 
     373 
     374                Make/O/D/N=(dimY) tmpTube 
     375                tmpTube = data_RealDistY[0][p] 
     376                FindLevel /P/Q tmpTube, yCtr 
     377                 
     378                y_pix[0] = V_levelX 
     379                KillWaves/Z tmpTube 
     380        else 
     381                //      this is data (horizontal) dimensioned as (Npix,Ntubes) 
     382 
     383                if(kBCTR_CM) 
     384                        if(cmpstr("T",detStr[1]) == 0) 
     385                                edge = data_realDistY[0][0]             //tube 0 
     386                                delta = abs(yCtr*10 - edge + kPanelTouchingGap) 
     387                                y_pix[0] =  -delta/tube_width           //since the bottom edge of the T panel is pixel 0 
     388                        else 
     389                        // FM(B) panel 
     390                                edge = data_realDistY[0][47]            //y tube 47 
     391                                delta = abs(yCtr*10 - edge) 
     392                                y_pix[0] = dimY-1 + delta/tube_width            //since the top edge of the B panels is pixel 47                 
     393                        endif 
     394                endif 
     395 
     396                 
     397                Make/O/D/N=(dimX) tmpTube 
     398                tmpTube = data_RealDistX[p][0] 
     399                FindLevel /P/Q tmpTube, xCtr 
     400                 
     401                x_pix[0] = V_levelX 
     402                KillWaves/Z tmpTube 
     403                 
     404                 
     405        endif 
     406                 
     407        return(0) 
     408end 
    264409 
    265410// 
     
    421566        sdd = V_getDet_ActualDistance(fname,detStr)             //sdd derived, including setback [cm] 
    422567        sdd/=100                // sdd reported in cm, pass in m 
    423         // this is the ctr in pixels 
     568        // this is the ctr in pixels --xx-- (now it is in cm!) 
    424569//      xCtr = V_getDet_beam_center_x(fname,detStr) 
    425570//      yCtr = V_getDet_beam_center_y(fname,detStr) 
Note: See TracChangeset for help on using the changeset viewer.