00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "CSPadPixCoords/PixCoordsCSPadV2.h"
00017
00018
00019
00020
00021
00022 #include <math.h>
00023 #include <sstream>
00024
00025
00026
00027
00028
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
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
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
00080 double orient_2x1_in_quad[] = {0., 0., 270., 270., 180., 180., 270., 270.};
00081
00082
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
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
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
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
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
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
00268
00269
00270 PixCoordsCSPadV2::~PixCoordsCSPadV2 ()
00271 {
00272 }
00273
00274 }