File indexing completed on 2023-03-17 11:19:41
0001 #include "RecoLocalTracker/SiPixelRecHits/interface/PixelCPEGenericBase.h"
0002 #include "Geometry/TrackerGeometryBuilder/interface/RectangularPixelTopology.h"
0003
0004 namespace {
0005 constexpr float micronsToCm = 1.0e-4;
0006 const auto convertDoubleVecToFloatVec = [](std::vector<double> const& iIn) {
0007 return std::vector<float>(iIn.begin(), iIn.end());
0008 };
0009 }
0010
0011 PixelCPEGenericBase::PixelCPEGenericBase(edm::ParameterSet const& conf,
0012 const MagneticField* mag,
0013 const TrackerGeometry& geom,
0014 const TrackerTopology& ttopo,
0015 const SiPixelLorentzAngle* lorentzAngle,
0016 const SiPixelGenErrorDBObject* genErrorDBObject,
0017 const SiPixelLorentzAngle* lorentzAngleWidth = nullptr)
0018 : PixelCPEBase(conf, mag, geom, ttopo, lorentzAngle, genErrorDBObject, nullptr, lorentzAngleWidth, 0),
0019 edgeClusterErrorX_{static_cast<float>(conf.getParameter<double>("EdgeClusterErrorX"))},
0020 edgeClusterErrorY_{static_cast<float>(conf.getParameter<double>("EdgeClusterErrorY"))},
0021 useErrorsFromTemplates_{conf.getParameter<bool>("UseErrorsFromTemplates")},
0022 truncatePixelCharge_{conf.getParameter<bool>("TruncatePixelCharge")},
0023 xerr_barrel_l1_{convertDoubleVecToFloatVec(conf.getParameter<std::vector<double>>("xerr_barrel_l1"))},
0024 yerr_barrel_l1_{convertDoubleVecToFloatVec(conf.getParameter<std::vector<double>>("yerr_barrel_l1"))},
0025 xerr_barrel_ln_{convertDoubleVecToFloatVec(conf.getParameter<std::vector<double>>("xerr_barrel_ln"))},
0026 yerr_barrel_ln_{convertDoubleVecToFloatVec(conf.getParameter<std::vector<double>>("yerr_barrel_ln"))},
0027 xerr_endcap_{convertDoubleVecToFloatVec(conf.getParameter<std::vector<double>>("xerr_endcap"))},
0028 yerr_endcap_{convertDoubleVecToFloatVec(conf.getParameter<std::vector<double>>("yerr_endcap"))},
0029 xerr_barrel_l1_def_{static_cast<float>(conf.getParameter<double>("xerr_barrel_l1_def"))},
0030 yerr_barrel_l1_def_{static_cast<float>(conf.getParameter<double>("yerr_barrel_l1_def"))},
0031 xerr_barrel_ln_def_{static_cast<float>(conf.getParameter<double>("xerr_barrel_ln_def"))},
0032 yerr_barrel_ln_def_{static_cast<float>(conf.getParameter<double>("yerr_barrel_ln_def"))},
0033 xerr_endcap_def_{static_cast<float>(conf.getParameter<double>("xerr_endcap_def"))},
0034 yerr_endcap_def_{static_cast<float>(conf.getParameter<double>("yerr_endcap_def"))} {};
0035
0036 std::unique_ptr<PixelCPEBase::ClusterParam> PixelCPEGenericBase::createClusterParam(const SiPixelCluster& cl) const {
0037 return std::make_unique<ClusterParamGeneric>(cl);
0038 }
0039
0040
0041
0042
0043
0044
0045 void PixelCPEGenericBase::collect_edge_charges(ClusterParam& theClusterParamBase,
0046 int& q_f_X,
0047 int& q_l_X,
0048 int& q_f_Y,
0049 int& q_l_Y,
0050 bool truncate) {
0051 ClusterParamGeneric& theClusterParam = static_cast<ClusterParamGeneric&>(theClusterParamBase);
0052
0053
0054 q_f_X = q_l_X = 0;
0055 q_f_Y = q_l_Y = 0;
0056
0057
0058 int xmin = theClusterParam.theCluster->minPixelRow();
0059 int xmax = theClusterParam.theCluster->maxPixelRow();
0060 int ymin = theClusterParam.theCluster->minPixelCol();
0061 int ymax = theClusterParam.theCluster->maxPixelCol();
0062
0063
0064 int isize = theClusterParam.theCluster->size();
0065 for (int i = 0; i != isize; ++i) {
0066 auto const& pixel = theClusterParam.theCluster->pixel(i);
0067
0068 int pix_adc = pixel.adc;
0069 if (truncate)
0070 pix_adc = std::min(pix_adc, theClusterParam.pixmx);
0071
0072
0073
0074 if (pixel.x == xmin)
0075 q_f_X += pix_adc;
0076 if (pixel.x == xmax)
0077 q_l_X += pix_adc;
0078
0079
0080 if (pixel.y == ymin)
0081 q_f_Y += pix_adc;
0082 if (pixel.y == ymax)
0083 q_l_Y += pix_adc;
0084 }
0085 }
0086
0087 void PixelCPEGenericBase::initializeLocalErrorVariables(
0088 float& xerr,
0089 float& yerr,
0090 bool& edgex,
0091 bool& edgey,
0092 bool& bigInX,
0093 bool& bigInY,
0094 int& maxPixelCol,
0095 int& maxPixelRow,
0096 int& minPixelCol,
0097 int& minPixelRow,
0098 uint& sizex,
0099 uint& sizey,
0100 DetParam const& theDetParam,
0101 ClusterParamGeneric const& theClusterParam) const {
0102
0103 xerr = edgeClusterErrorX_ * micronsToCm;
0104 yerr = edgeClusterErrorY_ * micronsToCm;
0105
0106
0107 maxPixelCol = theClusterParam.theCluster->maxPixelCol();
0108 maxPixelRow = theClusterParam.theCluster->maxPixelRow();
0109 minPixelCol = theClusterParam.theCluster->minPixelCol();
0110 minPixelRow = theClusterParam.theCluster->minPixelRow();
0111
0112 edgex = (theDetParam.theRecTopol->isItEdgePixelInX(minPixelRow)) ||
0113 (theDetParam.theRecTopol->isItEdgePixelInX(maxPixelRow));
0114 edgey = (theDetParam.theRecTopol->isItEdgePixelInY(minPixelCol)) ||
0115 (theDetParam.theRecTopol->isItEdgePixelInY(maxPixelCol));
0116
0117 sizex = theClusterParam.theCluster->sizeX();
0118 sizey = theClusterParam.theCluster->sizeY();
0119
0120
0121 bigInX = theDetParam.theRecTopol->containsBigPixelInX(minPixelRow, maxPixelRow);
0122 bigInY = theDetParam.theRecTopol->containsBigPixelInY(minPixelCol, maxPixelCol);
0123 };
0124
0125 void PixelCPEGenericBase::setXYErrors(float& xerr,
0126 float& yerr,
0127 const bool edgex,
0128 const bool edgey,
0129 const unsigned int sizex,
0130 const unsigned int sizey,
0131 const bool bigInX,
0132 const bool bigInY,
0133 const bool useTemplateErrors,
0134 DetParam const& theDetParam,
0135 ClusterParamGeneric const& theClusterParam) const {
0136 if (useTemplateErrors) {
0137 if (!edgex) {
0138 if (sizex == 1) {
0139 if (!bigInX) {
0140 xerr = theClusterParam.sx1;
0141 } else {
0142 xerr = theClusterParam.sx2;
0143 }
0144 } else {
0145 xerr = theClusterParam.sigmax;
0146 }
0147 }
0148
0149 if (!edgey) {
0150 if (sizey == 1) {
0151 if (!bigInY) {
0152 yerr = theClusterParam.sy1;
0153 } else {
0154 yerr = theClusterParam.sy2;
0155 }
0156 } else {
0157 yerr = theClusterParam.sigmay;
0158 }
0159 }
0160
0161 } else {
0162
0163 if (GeomDetEnumerators::isTrackerPixel(theDetParam.thePart)) {
0164 if (GeomDetEnumerators::isBarrel(theDetParam.thePart)) {
0165 DetId id = (theDetParam.theDet->geographicalId());
0166 int layer = ttopo_.layer(id);
0167 if (layer == 1) {
0168 if (!edgex) {
0169 if (sizex <= xerr_barrel_l1_.size())
0170 xerr = xerr_barrel_l1_[sizex - 1];
0171 else
0172 xerr = xerr_barrel_l1_def_;
0173 }
0174
0175 if (!edgey) {
0176 if (sizey <= yerr_barrel_l1_.size())
0177 yerr = yerr_barrel_l1_[sizey - 1];
0178 else
0179 yerr = yerr_barrel_l1_def_;
0180 }
0181 } else {
0182 if (!edgex) {
0183 if (sizex <= xerr_barrel_ln_.size())
0184 xerr = xerr_barrel_ln_[sizex - 1];
0185 else
0186 xerr = xerr_barrel_ln_def_;
0187 }
0188
0189 if (!edgey) {
0190 if (sizey <= yerr_barrel_ln_.size())
0191 yerr = yerr_barrel_ln_[sizey - 1];
0192 else
0193 yerr = yerr_barrel_ln_def_;
0194 }
0195 }
0196
0197 } else {
0198
0199 if (!edgex) {
0200 if (sizex <= xerr_endcap_.size())
0201 xerr = xerr_endcap_[sizex - 1];
0202 else
0203 xerr = xerr_endcap_def_;
0204 }
0205
0206 if (!edgey) {
0207 if (sizey <= yerr_endcap_.size())
0208 yerr = yerr_endcap_[sizey - 1];
0209 else
0210 yerr = yerr_endcap_def_;
0211 }
0212 }
0213 }
0214 }
0215 }
0216
0217 void PixelCPEGenericBase::fillPSetDescription(edm::ParameterSetDescription& desc) {
0218 desc.add<std::vector<double>>("xerr_barrel_l1", {0.00115, 0.00120, 0.00088});
0219 desc.add<std::vector<double>>("yerr_barrel_l1",
0220 {0.00375, 0.00230, 0.00250, 0.00250, 0.00230, 0.00230, 0.00210, 0.00210, 0.00240});
0221 desc.add<std::vector<double>>("xerr_barrel_ln", {0.00115, 0.00120, 0.00088});
0222 desc.add<std::vector<double>>("yerr_barrel_ln",
0223 {0.00375, 0.00230, 0.00250, 0.00250, 0.00230, 0.00230, 0.00210, 0.00210, 0.00240});
0224 desc.add<std::vector<double>>("xerr_endcap", {0.0020, 0.0020});
0225 desc.add<std::vector<double>>("yerr_endcap", {0.00210});
0226 desc.add<double>("xerr_barrel_l1_def", 0.01030);
0227 desc.add<double>("yerr_barrel_l1_def", 0.00210);
0228 desc.add<double>("xerr_barrel_ln_def", 0.01030);
0229 desc.add<double>("yerr_barrel_ln_def", 0.00210);
0230 desc.add<double>("xerr_endcap_def", 0.0020);
0231 desc.add<double>("yerr_endcap_def", 0.00075);
0232 }