CSPadPixCoords/src/PixCoordsCSPadV2.cpp

Go to the documentation of this file.
00001 //--------------------------------------------------------------------------
00002 // File and Version Information:
00003 //      $Id$
00004 //
00005 // Description:
00006 //      Class PixCoordsCSPadV2...
00007 //
00008 // Author List:
00009 //      Mikhail S. Dubrovin
00010 //
00011 //------------------------------------------------------------------------
00012 
00013 //-----------------------
00014 // This Class's Header --
00015 //-----------------------
00016 #include "CSPadPixCoords/PixCoordsCSPadV2.h"
00017 //#include "MsgLogger/MsgLogger.h"
00018 
00019 //-----------------
00020 // C/C++ Headers --
00021 //-----------------
00022 #include <math.h>
00023 #include <sstream>
00024 
00025 //-------------------------------
00026 // Collaborating Class Headers --
00027 //-------------------------------
00028 //#include <boost/math/constants/constants.hpp>
00029 
00030 //-----------------------------------------------------------------------
00031 // Local Macros, Typedefs, Structures, Unions and Forward Declarations --
00032 //-----------------------------------------------------------------------
00033 
00034 using namespace std;
00035 
00036 namespace CSPadPixCoords {
00037 
00038 const char logger[] = "CSPadPixCoords";
00039 
00040 //----------------
00041 // Constructors --
00042 //----------------
00043 
00044 /*
00045 PixCoordsCSPadV2::PixCoordsCSPadV2 ()
00046     : PixCoords2x1V2 ()
00047     , m_tiltIsApplied (false)
00048 {
00049   // Use default calibration parameters
00050   m_cspad_calibpars  = new PSCalib::CSPadCalibPars(); 
00051   m_cspad_configpars = new CSPadConfigPars(); 
00052   fillPixelCoordinateArrays();
00053   resetXYOriginAndMinMax();
00054 }
00055 */
00056 
00057 //--------------
00058 
00059 PixCoordsCSPadV2::PixCoordsCSPadV2 (PSCalib::CSPadCalibPars *cspad_calibpars, bool tiltIsApplied, bool use_wide_pix_center)
00060     : PixCoords2x1V2(use_wide_pix_center)
00061     , m_cspad_calibpars(cspad_calibpars)
00062     , m_tiltIsApplied(tiltIsApplied)
00063 {
00064   fillPixelCoordinateArrays();
00065   resetXYOriginAndMinMax();
00066   //printXYLimits();
00067 }
00068 
00069 //--------------
00070 
00071 void PixCoordsCSPadV2::fillPixelCoordinateArrays()
00072 {
00073     m_coor_x_min = 1e5;
00074     m_coor_x_max = 0;
00075     m_coor_y_min = 1e5;
00076     m_coor_y_max = 0;
00077 
00078 
00079     // Orientation of 2x1s:        0   1     2     3     4     5     6     7
00080     double orient_2x1_in_quad[] = {0., 0., 270., 270., 180., 180., 270., 270.};
00081 
00082     // Orientation of quads:    0  1    2     3 
00083     double orient_of_quad[] = {90, 0, -90, -180};
00084 
00085     double xcenter, ycenter, zcenter, rotation, tilt;
00086     size_t q, s; 
00087 
00088     for (unsigned sect=0; sect < N2X1_IN_DET; ++sect)
00089       {
00090         q = sect / 8;
00091         s = sect % 8;
00092 
00093         xcenter  = m_cspad_calibpars -> getCenterGlobalX (q,s) * PIX_SIZE_UM;
00094         ycenter  = m_cspad_calibpars -> getCenterGlobalY (q,s) * PIX_SIZE_UM;
00095         zcenter  = m_cspad_calibpars -> getCenterGlobalZ (q,s) * PIX_SIZE_UM;
00096         tilt     = m_cspad_calibpars -> getTilt          (q,s);
00097 
00098         //cout << "sect:" << sect << "  quad:" << q << "  sect in quad:" << s << "\n"; // OK
00099 
00100         rotation = orient_of_quad[q] + orient_2x1_in_quad[s];
00101 
00102         if (m_tiltIsApplied) rotation += tilt;
00103 
00104         fillOneSectionInDet (sect, xcenter, ycenter, zcenter, rotation);
00105       }
00106 }
00107 
00108 //--------------
00109 
00110 void PixCoordsCSPadV2::fillOneSectionInDet(uint32_t sect, double xcenter, double ycenter, double zcenter, double rotation)
00111 {
00112     double* x_map_arr = get_coord_map_2x1 (AXIS_X, UM, rotation); 
00113     double* y_map_arr = get_coord_map_2x1 (AXIS_Y, UM, rotation); 
00114 
00115     for (unsigned row=0; row<ROWS2X1; row++) {
00116     for (unsigned col=0; col<COLS2X1; col++) {
00117 
00118        unsigned ind = row*COLS2X1 + col;
00119 
00120        double coor_x = xcenter + x_map_arr[ind];
00121        double coor_y = ycenter + y_map_arr[ind]; 
00122 
00123        m_coor_x[sect][row][col] = coor_x;
00124        m_coor_y[sect][row][col] = coor_y;
00125        m_coor_z[sect][row][col] = 0;
00126 
00127        if ( coor_x < m_coor_x_min ) m_coor_x_min = coor_x;
00128        if ( coor_x > m_coor_x_max ) m_coor_x_max = coor_x;
00129        if ( coor_y < m_coor_y_min ) m_coor_y_min = coor_y;
00130        if ( coor_y > m_coor_y_max ) m_coor_y_max = coor_y;
00131     }
00132     }
00133 }
00134 
00135 //--------------
00136 
00137 void PixCoordsCSPadV2::resetXYOriginAndMinMax()
00138 {
00139     for (unsigned sec=0; sec<N2X1_IN_DET; sec++) {
00140     for (unsigned row=0; row<ROWS2X1;  row++) {
00141     for (unsigned col=0; col<COLS2X1;  col++) {
00142 
00143        m_coor_x[sec][row][col] -= m_coor_x_min;
00144        m_coor_y[sec][row][col] -= m_coor_y_min;
00145     }
00146     }
00147     }
00148 
00149     m_coor_x_max -= m_coor_x_min;
00150     m_coor_y_max -= m_coor_y_min;
00151     m_coor_x_min = 0;
00152     m_coor_y_min = 0;
00153     m_coor_z_min = 0;
00154     m_coor_z_max = 0;
00155 }
00156 
00157 //--------------
00158 
00159 double PixCoordsCSPadV2::getPixCoor_um (AXIS axis, unsigned sect, unsigned row, unsigned col)
00160 {
00161   //cout << "      get sect:" << sect << "  r:" << row << "  c:" << col << "  axis:" << axis << "\n"; 
00162   switch (axis)
00163     {
00164     case AXIS_X : return m_coor_x[sect][row][col];
00165     case AXIS_Y : return m_coor_y[sect][row][col];
00166     case AXIS_Z : return m_coor_z[sect][row][col];
00167     default: return 0;
00168     }
00169 }
00170 
00171 //--------------
00172 
00173 double PixCoordsCSPadV2::getPixCoor_pix (AXIS axis, unsigned sect, unsigned row, unsigned col)
00174 {
00175     return getPixCoor_um (axis, sect, row, col) * UM_TO_PIX;
00176 }
00177 
00178 //--------------
00179 
00180 double* PixCoordsCSPadV2::getPixCoorArr_um (AXIS axis)
00181 {
00182   //cout << "  axis:" << axis << "\n"; 
00183   switch (axis)
00184     {
00185     case AXIS_X : return &m_coor_x[0][0][0];
00186     case AXIS_Y : return &m_coor_y[0][0][0];
00187     case AXIS_Z : return &m_coor_z[0][0][0];
00188     default     : return 0;
00189     }
00190 }
00191 
00192 //--------------
00193 
00194 ndarray<double,3> PixCoordsCSPadV2::getPixCoorNDArrShapedAsData_um (AXIS axis, CSPadConfigPars *cspad_configpars)
00195 {
00196   //cout << "  get pix coordinate ndarray for axis:" << axis << "\n"; 
00197 
00198   double *p_pix_arr=0;
00199       
00200   switch (axis)
00201     {
00202     case AXIS_X : { p_pix_arr = &m_coor_x[0][0][0]; break; }
00203     case AXIS_Y : { p_pix_arr = &m_coor_y[0][0][0]; break; } 
00204     case AXIS_Z : { p_pix_arr = &m_coor_z[0][0][0]; break;  }
00205     default     : { break; }
00206     }
00207 
00208   ndarray<double,3> nda = make_ndarray(p_pix_arr, N2X1_IN_DET, ROWS2X1, COLS2X1); 
00209   return cspad_configpars->getCSPadPixNDArrShapedAsData<double>( nda ); 
00210 }
00211 
00212 //--------------
00213 
00214 void PixCoordsCSPadV2::printXYLimits()
00215 {
00216   std::stringstream ss; ss << "  Xmin: " << m_coor_x_min 
00217                            << "  Xmax: " << m_coor_x_max
00218                            << "  Ymin: " << m_coor_y_min
00219                            << "  Ymax: " << m_coor_y_max
00220                            << "  Zmin: " << m_coor_z_min
00221                            << "  Zmax: " << m_coor_z_max;
00222 
00223   //MsgLog(logger, info, ss.str());
00224   cout << "PixCoordsCSPadV2::printXYLimits():" << ss.str() << "\n";
00225 }
00226 
00227 //--------------
00228 
00229 void PixCoordsCSPadV2::printConstants()
00230 {
00231   cout << "PixCoordsCSPadV2::printConstants():"    
00232        << "\n  ROWS2X1       = " << ROWS2X1    
00233        << "\n  COLS2X1       = " << COLS2X1     
00234        << "\n  COLS2X1HALF   = " << COLS2X1HALF 
00235        << "\n  SIZE2X1       = " << SIZE2X1     
00236        << "\n  PIX_SIZE_COLS = " << PIX_SIZE_COLS 
00237        << "\n  PIX_SIZE_ROWS = " << PIX_SIZE_ROWS 
00238        << "\n  PIX_SIZE_WIDE = " << PIX_SIZE_WIDE 
00239        << "\n  PIX_SIZE_UM   = " << PIX_SIZE_UM   
00240        << "\n  UM_TO_PIX     = " << UM_TO_PIX     
00241        << "\n";
00242 }
00243 
00244 //--------------
00245 
00246 void PixCoordsCSPadV2::printCoordArray(unsigned r1, unsigned r2, unsigned c1, unsigned c2)
00247 {
00248     cout << "PixCoordsCSPadV2::printCoordArray():"
00249          << "\nsizeof(m_coor_x) / sizeof(double)=" << sizeof(m_coor_x) / sizeof(double)
00250          << "\nsizeof(m_coor_y) / sizeof(double)=" << sizeof(m_coor_y) / sizeof(double) 
00251          << "\n";
00252 
00253     for (unsigned sec=0; sec<N2X1_IN_DET; sec++) {
00254       cout << "\nsection=" << sec << ": ";
00255     for (unsigned row=r1; row<r2;  row++) {
00256       cout << "\nrow=" << row << ": ";
00257     for (unsigned col=c1; col<c2;  col++) {
00258       cout << " (" << m_coor_x[sec][row][col] << ", " << m_coor_y[sec][row][col] << ") ";
00259     }
00260     }
00261     }
00262     cout <<"\n";  
00263 }
00264 
00265 
00266 //--------------
00267 // Destructor --
00268 //--------------
00269 
00270 PixCoordsCSPadV2::~PixCoordsCSPadV2 ()
00271 {
00272 }
00273 
00274 } // namespace CSPadPixCoords

Generated on 19 Dec 2016 for PSANAmodules by  doxygen 1.4.7