CMS 3D CMS Logo

SiPixelDBErrorParametrization.cc

Go to the documentation of this file.
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 //These are the bin parameters -- they determine the width of the bins
00009 //998, 999 refer to bins where the 0 should always be returned
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 //Constants based on subpart 
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 //Garbage is set to hold a place for bx_b, though we don't parametrize it the same way
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 //Bin Sizes
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 //The function which is called to return errX and errY. Used in CPEs.
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),  //1 -- Bx
00069                                                        index(0, sizey, alpha, beta, bigInY)); //0 -- By
00070                         break;
00071                 case GeomDetEnumerators::PixelEndcap:
00072                         element = std::pair<float,float>(index(3, sizex, alpha, beta, bigInX),  //3 -- Fx
00073                                                              index(2, sizey, alpha, beta, bigInY)); //2 -- Fy
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 //The function which is called to return errX and errY. Used outside CPEs with access to ES.
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),  //1 -- Bx
00103                                                        index(0, sizey, alpha, beta, bigInY)); //0 -- By
00104                         break;
00105                 case GeomDetEnumerators::PixelEndcap:
00106                         element = std::pair<float,float>(index(3, sizex, alpha, beta, bigInX),  //3 -- Fx
00107                                                              index(2, sizey, alpha, beta, bigInY)); //2 -- Fy
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         //This is a check for big pixels. If it passes, the code returns a given error and the function ends.
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         //We must take into account that Fx(subpart=3) has different alpha parametrization
00146         if(ind_subpart == 3) alpha_rad = fabs(math_pi/2.0 - alpha);
00147         else                 alpha_rad = fabs(alpha);
00148 
00149         //Sets the correct binning for alpha and beta based on whether in x or y
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         //Binning for alpha
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         //Binning for beta -- we need to account for Bx(subpart=1) having uneven binning
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         //Index to be used to find error in database
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 }

Generated on Tue Jun 9 17:26:57 2009 for CMSSW by  doxygen 1.5.4