00001 #include "CondTools/SiPixel/interface/SiPixelDBErrorParametrization.h"
00002 #include "CondFormats/DataRecord/interface/SiPixelCPEParmErrorsRcd.h"
00003 #include <iostream>
00004 #include <cmath>
00005
00006 const float math_pi = 3.14159265;
00007
00008
00009
00010 const float SiPixelDBErrorParametrization::bx_a_min[3] = {1.525, 1.475, 1.425};
00011 const float SiPixelDBErrorParametrization::bx_a_max[3] = {1.725, 1.675, 1.625};
00012
00013 const float SiPixelDBErrorParametrization::fx_a_min[2] = {0.165, 0.185};
00014 const float SiPixelDBErrorParametrization::fx_a_max[2] = {0.285, 0.465};
00015 const float SiPixelDBErrorParametrization::fx_b_min[2] = {998, 998};
00016 const float SiPixelDBErrorParametrization::fx_b_max[2] = {999, 999};
00017
00018 const float SiPixelDBErrorParametrization::by_a_min[6] = {1.47078, 1.47078, 1.47078, 1.47078, 1.47078, 1.47078};
00019 const float SiPixelDBErrorParametrization::by_a_max[6] = {1.67078, 1.67078, 1.67078, 1.67078, 1.67078, 1.67078};
00020 const float SiPixelDBErrorParametrization::by_b_min[6] = {0.05, 0.15, 0.70, 0.95, 1.15, 1.20};
00021 const float SiPixelDBErrorParametrization::by_b_max[6] = {0.50, 0.90, 1.05, 1.15, 1.20, 1.40};
00022
00023 const float SiPixelDBErrorParametrization::fy_a_min[2] = {998, 998};
00024 const float SiPixelDBErrorParametrization::fy_a_max[2] = {999, 999};
00025 const float SiPixelDBErrorParametrization::fy_b_min[2] = {0.31, 0.31};
00026 const float SiPixelDBErrorParametrization::fy_b_max[2] = {0.39, 0.39};
00027
00028
00029 const float SiPixelDBErrorParametrization::errors_big_pix[4] = {0.0070, 0.0030, 0.0068, 0.0040};
00030 const int SiPixelDBErrorParametrization::size_max[4] = {5, 2, 1, 1};
00031
00032
00033 const float garbage[1] = {-9999.99};
00034
00035 const float* SiPixelDBErrorParametrization::a_min[4] = {by_a_min, bx_a_min, fy_a_min, fx_a_min};
00036 const float* SiPixelDBErrorParametrization::a_max[4] = {by_a_max, bx_a_max, fy_a_max, fx_a_max};
00037 const float* SiPixelDBErrorParametrization::b_min[4] = {by_b_min, garbage, fy_b_min, fx_b_min};
00038 const float* SiPixelDBErrorParametrization::b_max[4] = {by_b_max, garbage, fy_b_max, fx_b_max};
00039
00040
00041 const int SiPixelDBErrorParametrization::part_bin_size[4] = { 0, 240, 360, 400};
00042 const int SiPixelDBErrorParametrization::size_bin_size[4] = {40, 40, 40, 40};
00043 const int SiPixelDBErrorParametrization::alpha_bin_size[4] = {10, 1, 10, 1};
00044 const int SiPixelDBErrorParametrization::beta_bin_size[4] = { 1, 10, 1, 10};
00045
00046 SiPixelDBErrorParametrization::SiPixelDBErrorParametrization(){}
00047
00048 SiPixelDBErrorParametrization::~SiPixelDBErrorParametrization(){}
00049
00050 void SiPixelDBErrorParametrization::setDBAccess(const edm::EventSetup& es)
00051 {
00052 es.get<SiPixelCPEParmErrorsRcd>().get(errorsH);
00053 }
00054
00055
00056 std::pair<float,float> SiPixelDBErrorParametrization::getError(const SiPixelCPEParmErrors* parmErrors,
00057 GeomDetType::SubDetector pixelPart,
00058 int sizex, int sizey,
00059 float alpha, float beta,
00060 bool bigInX, bool bigInY)
00061 {
00062 std::pair<float,float> element;
00063 std::pair<float,float> errors;
00064
00065 switch (pixelPart)
00066 {
00067 case GeomDetEnumerators::PixelBarrel:
00068 element = std::pair<float,float>(index(1, sizex, alpha, beta, bigInX),
00069 index(0, sizey, alpha, beta, bigInY));
00070 break;
00071 case GeomDetEnumerators::PixelEndcap:
00072 element = std::pair<float,float>(index(3, sizex, alpha, beta, bigInX),
00073 index(2, sizey, alpha, beta, bigInY));
00074 break;
00075 default:
00076 throw cms::Exception("PixelDBErrorParametrization::getError")
00077 << "Non-pixel detector type !!!" ;
00078 }
00079
00080 const SiPixelCPEParmErrors::DbVector & db_errors = parmErrors->errors();
00081
00082 if (bigInX && sizex == 1) errors.first = element.first;
00083 else errors.first = db_errors[(int)element.first].sigma;
00084 if (bigInY && sizey == 1) errors.second = element.second;
00085 else errors.second = db_errors[(int)element.second].sigma;
00086
00087 return errors;
00088 }
00089
00090
00091 std::pair<float,float> SiPixelDBErrorParametrization::getError(GeomDetType::SubDetector pixelPart,
00092 int sizex, int sizey,
00093 float alpha, float beta,
00094 bool bigInX, bool bigInY)
00095 {
00096 std::pair<float,float> element;
00097 std::pair<float,float> errors;
00098
00099 switch (pixelPart)
00100 {
00101 case GeomDetEnumerators::PixelBarrel:
00102 element = std::pair<float,float>(index(1, sizex, alpha, beta, bigInX),
00103 index(0, sizey, alpha, beta, bigInY));
00104 break;
00105 case GeomDetEnumerators::PixelEndcap:
00106 element = std::pair<float,float>(index(3, sizex, alpha, beta, bigInX),
00107 index(2, sizey, alpha, beta, bigInY));
00108 break;
00109 default:
00110 throw cms::Exception("PixelDBErrorParametrization::getError")
00111 << "Non-pixel detector type !!!" ;
00112 }
00113
00114 const SiPixelCPEParmErrors::DbVector & db_errors = errorsH->errors();
00115
00116 if (bigInX && sizex == 1) errors.first = element.first;
00117 else errors.first = db_errors[(int)element.first].sigma;
00118 if (bigInY && sizey == 1) errors.second = element.second;
00119 else errors.second = db_errors[(int)element.second].sigma;
00120
00121 return errors;
00122 }
00123
00124
00125
00126 float SiPixelDBErrorParametrization::index(int ind_subpart, int size, float alpha, float beta, bool big)
00127 {
00128
00129 if ( big && size == 1) return errors_big_pix[ind_subpart];
00130
00131 int ind_size = std::min(size - 1, size_max[ind_subpart]);
00132
00133 float alpha_rad = -999.9;
00134 float betap_rad = -999.9;
00135
00136 int ind_alpha = -99;
00137 int ind_beta = -99;
00138
00139 float binw_a = -999.9;
00140 float binw_b = -999.9;
00141 int maxbin_a = -99;
00142 int maxbin_b = -99;
00143
00144 betap_rad = fabs(math_pi/2.0 - beta);
00145
00146 if(ind_subpart == 3) alpha_rad = fabs(math_pi/2.0 - alpha);
00147 else alpha_rad = fabs(alpha);
00148
00149
00150 if(ind_subpart == 0||ind_subpart == 2)
00151 {
00152 binw_a = (a_max[ind_subpart][ind_size] - a_min[ind_subpart][ind_size])/2.0;
00153 binw_b = (b_max[ind_subpart][ind_size] - b_min[ind_subpart][ind_size])/8.0;
00154 maxbin_a = 3;
00155 maxbin_b = 9;
00156 }
00157 else
00158 {
00159 binw_a = (a_max[ind_subpart][ind_size] - a_min[ind_subpart][ind_size])/8.0;
00160 binw_b = (b_max[ind_subpart][ind_size] - b_min[ind_subpart][ind_size])/2.0;
00161 maxbin_a = 3;
00162 maxbin_b = 9;
00163 }
00164
00165
00166 if ( alpha_rad < a_min[ind_subpart][ind_size]) ind_alpha = 0;
00167 else if ( alpha_rad >= a_max[ind_subpart][ind_size]) ind_alpha = maxbin_a;
00168 else ind_alpha = 1 + (int)((alpha_rad - a_min[ind_subpart][ind_size])/binw_a);
00169
00170
00171 if(ind_subpart == 1)
00172 {
00173 if ( betap_rad <= 0.7 ) ind_beta = 0;
00174 else if ( 0.7 < betap_rad && betap_rad <= 1.0 ) ind_beta = 1;
00175 else if ( 1.0 < betap_rad && betap_rad <= 1.2 ) ind_beta = 2;
00176 else if ( 1.2 <= betap_rad ) ind_beta = 3;
00177 }
00178 else if ( betap_rad < b_min[ind_subpart][ind_size]) ind_beta = 0;
00179 else if ( betap_rad >= b_max[ind_subpart][ind_size]) ind_beta = maxbin_b;
00180 else ind_beta = 1 + (int)((betap_rad - b_min[ind_subpart][ind_size])/binw_b);
00181
00182
00183 int index = part_bin_size[ind_subpart] + size_bin_size[ind_subpart] * ind_size + alpha_bin_size[ind_subpart] * ind_alpha + beta_bin_size[ind_subpart] * ind_beta;
00184
00185 return index;
00186 }