00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "CSPadPixCoords/PixCoordsCSPad2x2V2.h"
00017
00018
00019
00020
00021
00022 #include <math.h>
00023 #include <sstream>
00024
00025
00026
00027
00028 #include <boost/math/constants/constants.hpp>
00029
00030
00031
00032
00033
00034 using namespace std;
00035
00036 namespace CSPadPixCoords {
00037
00038 const char logger[] = "CSPadPixCoords";
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 PixCoordsCSPad2x2V2::PixCoordsCSPad2x2V2 (PSCalib::CSPad2x2CalibPars *cspad2x2_calibpars, bool tiltIsApplied, bool use_wide_pix_center)
00059 : PixCoords2x1V2(use_wide_pix_center)
00060 , m_cspad2x2_calibpars(cspad2x2_calibpars)
00061 , m_tiltIsApplied (tiltIsApplied)
00062 {
00063 fillPixelCoordinateArrays();
00064 resetXYOriginAndMinMax();
00065
00066 }
00067
00068
00069
00070 void PixCoordsCSPad2x2V2::fillPixelCoordinateArrays()
00071 {
00072 m_coor_x_min = 1e5;
00073 m_coor_x_max = 0;
00074 m_coor_y_min = 1e5;
00075 m_coor_y_max = 0;
00076
00077 double rotation_2x1[] = {180,180};
00078
00079 double xcenter, ycenter, zcenter, rotation, tilt;
00080
00081 for (unsigned sect=0; sect < N2X1_IN_DET; ++sect)
00082 {
00083 xcenter = m_cspad2x2_calibpars -> getCenterX (sect) * PIX_SIZE_UM;
00084 ycenter = m_cspad2x2_calibpars -> getCenterY (sect) * PIX_SIZE_UM;
00085 zcenter = m_cspad2x2_calibpars -> getCenterZ (sect);
00086 tilt = m_cspad2x2_calibpars -> getTilt (sect);
00087
00088 rotation = rotation_2x1[sect];
00089 if (m_tiltIsApplied) rotation += tilt;
00090
00091 fillOneSectionInDet (sect, xcenter, ycenter, zcenter, rotation);
00092 }
00093 }
00094
00095
00096
00097 void PixCoordsCSPad2x2V2::fillOneSectionInDet(uint32_t sect, double xcenter, double ycenter, double zcenter, double rotation)
00098 {
00099 double* x_map_arr = get_coord_map_2x1 (AXIS_X, UM, rotation);
00100 double* y_map_arr = get_coord_map_2x1 (AXIS_Y, UM, rotation);
00101
00102 for (unsigned row=0; row<ROWS2X1; row++) {
00103 for (unsigned col=0; col<COLS2X1; col++) {
00104
00105 unsigned ind = row*COLS2X1 + col;
00106
00107 double coor_x = xcenter + x_map_arr[ind];
00108 double coor_y = ycenter + y_map_arr[ind];
00109
00110 m_coor_x[row][col][sect] = coor_x;
00111 m_coor_y[row][col][sect] = coor_y;
00112
00113 if ( coor_x < m_coor_x_min ) m_coor_x_min = coor_x;
00114 if ( coor_x > m_coor_x_max ) m_coor_x_max = coor_x;
00115 if ( coor_y < m_coor_y_min ) m_coor_y_min = coor_y;
00116 if ( coor_y > m_coor_y_max ) m_coor_y_max = coor_y;
00117 }
00118 }
00119 }
00120
00121
00122
00123 void PixCoordsCSPad2x2V2::resetXYOriginAndMinMax()
00124 {
00125 for (unsigned row=0; row<ROWS2X1; row++) {
00126 for (unsigned col=0; col<COLS2X1; col++) {
00127 for (unsigned sec=0; sec<N2X1_IN_DET; sec++) {
00128
00129 m_coor_x[row][col][sec] -= m_coor_x_min;
00130 m_coor_y[row][col][sec] -= m_coor_y_min;
00131 }
00132 }
00133 }
00134
00135 m_coor_x_max -= m_coor_x_min;
00136 m_coor_y_max -= m_coor_y_min;
00137 m_coor_x_min = 0;
00138 m_coor_y_min = 0;
00139 }
00140
00141
00142
00143 double PixCoordsCSPad2x2V2::getPixCoor_um (AXIS axis, unsigned sect, unsigned row, unsigned col)
00144 {
00145
00146 switch (axis)
00147 {
00148 case AXIS_X : return m_coor_x[row][col][sect];
00149 case AXIS_Y : return m_coor_y[row][col][sect];
00150 case AXIS_Z : return 0;
00151 default: return 0;
00152 }
00153 }
00154
00155
00156
00157 double PixCoordsCSPad2x2V2::getPixCoor_pix (AXIS axis, unsigned sect, unsigned row, unsigned col)
00158 {
00159 return getPixCoor_um (axis, sect, row, col) * UM_TO_PIX;
00160 }
00161
00162
00163
00164 void PixCoordsCSPad2x2V2::printXYLimits()
00165 {
00166 std::stringstream ss; ss << " Xmin: " << m_coor_x_min
00167 << " Xmax: " << m_coor_x_max
00168 << " Ymin: " << m_coor_y_min
00169 << " Ymax: " << m_coor_y_max;
00170
00171
00172 cout << "PixCoordsCSPad2x2V2::printXYLimits():" << ss.str() << "\n";
00173 }
00174
00175
00176
00177 void PixCoordsCSPad2x2V2::printConstants()
00178 {
00179 cout << "PixCoordsCSPad2x2V2::printConstants():"
00180 << "\n ROWS2X1 = " << ROWS2X1
00181 << "\n COLS2X1 = " << COLS2X1
00182 << "\n COLS2X1HALF = " << COLS2X1HALF
00183 << "\n SIZE2X1 = " << SIZE2X1
00184 << "\n PIX_SIZE_COLS = " << PIX_SIZE_COLS
00185 << "\n PIX_SIZE_ROWS = " << PIX_SIZE_ROWS
00186 << "\n PIX_SIZE_WIDE = " << PIX_SIZE_WIDE
00187 << "\n PIX_SIZE_UM = " << PIX_SIZE_UM
00188 << "\n UM_TO_PIX = " << UM_TO_PIX
00189 << "\n";
00190 }
00191
00192
00193
00194 void PixCoordsCSPad2x2V2::printCoordArray(unsigned r1, unsigned r2, unsigned c1, unsigned c2)
00195 {
00196 cout << "PixCoordsCSPad2x2V2::printCoordArray():"
00197 << "\nsizeof(m_coor_x) / sizeof(double)=" << sizeof(m_coor_x) / sizeof(double)
00198 << "\nsizeof(m_coor_y) / sizeof(double)=" << sizeof(m_coor_y) / sizeof(double)
00199 << "\n";
00200
00201 for (unsigned row=r1; row<r2; row++) {
00202 cout << "\nrow=" << row << ": ";
00203 for (unsigned col=c1; col<c2; col++) {
00204 for (unsigned sec=0; sec<N2X1_IN_DET; sec++) {
00205 cout << " (" << m_coor_x[row][col][sec] << ", " << m_coor_y[row][col][sec] << ") ";
00206 }
00207 }
00208 }
00209 cout <<"\n";
00210 }
00211
00212
00213
00214
00215
00216
00217 PixCoordsCSPad2x2V2::~PixCoordsCSPad2x2V2 ()
00218 {
00219 }
00220
00221 }