14 #include "boost/multi_array.hpp" 21 const bool MYDEBUG =
false;
34 :
PixelCPEBase(conf, mag, geom, ttopo, lorentzAngle, genErrorDBObject,
nullptr, lorentzAngleWidth, 0) {
36 LogDebug(
"PixelCPEGeneric") <<
" constructing a generic algorithm for ideal pixel detector.\n" 67 if (isUpgrade_ || (DoCosmics_))
68 UseErrorsFromTemplates_ =
false;
70 if (!UseErrorsFromTemplates_ && (TruncatePixelCharge_ || IrradiationBiasCorrection_ ||
LoadTemplatesFromDB_)) {
72 <<
"\nERROR: UseErrorsFromTemplates_ is set to False in PixelCPEGeneric_cfi.py. " 73 <<
" In this case it does not make sense to set any of the following to True: " 74 <<
" TruncatePixelCharge_, IrradiationBiasCorrection_, DoCosmics_, LoadTemplatesFromDB_ !!!" 79 if (UseErrorsFromTemplates_) {
83 <<
"ERROR: GenErrors not filled correctly. Check the sqlite file. Using SiPixelTemplateDBObject version " 84 << (*genErrorDBObject_).version();
86 cout <<
"Loaded genErrorDBObject v" << (*genErrorDBObject_).version() << endl;
90 <<
"ERROR: GenErrors not loaded correctly from text file. Reconstruction will fail.";
95 cout <<
" Use simple parametrised errors " << endl;
103 yerr_barrel_l1_ = {0.00375, 0.00230, 0.00250, 0.00250, 0.00230, 0.00230, 0.00210, 0.00210, 0.00240};
107 yerr_barrel_ln_ = {0.00375, 0.00230, 0.00250, 0.00250, 0.00230, 0.00230, 0.00210, 0.00210, 0.00240};
126 yerr_barrel_l1_ = {0.00199, 0.00136, 0.0015, 0.00153, 0.00152, 0.00171, 0.00154, 0.00157, 0.00154};
137 cout <<
"From PixelCPEGeneric::PixelCPEGeneric(...)" << endl;
138 cout <<
"(int)UseErrorsFromTemplates_ = " << (
int)UseErrorsFromTemplates_ << endl;
139 cout <<
"TruncatePixelCharge_ = " << (
int)TruncatePixelCharge_ << endl;
140 cout <<
"IrradiationBiasCorrection_ = " << (
int)IrradiationBiasCorrection_ << endl;
141 cout <<
"(int)DoCosmics_ = " << (
int)DoCosmics_ << endl;
169 float locBz = theDetParam.
bz;
170 float locBx = theDetParam.
bx;
173 theClusterParam.
pixmx = -999;
174 theClusterParam.
sigmay = -999.9;
175 theClusterParam.
deltay = -999.9;
176 theClusterParam.
sigmax = -999.9;
177 theClusterParam.
deltax = -999.9;
178 theClusterParam.
sy1 = -999.9;
179 theClusterParam.
dy1 = -999.9;
180 theClusterParam.
sy2 = -999.9;
181 theClusterParam.
dy2 = -999.9;
182 theClusterParam.
sx1 = -999.9;
183 theClusterParam.
dx1 = -999.9;
184 theClusterParam.
sx2 = -999.9;
185 theClusterParam.
dx2 = -999.9;
193 theClusterParam.
qBin_ = gtempl.
qbin(gtemplID_,
200 theClusterParam.
pixmx,
212 theClusterParam.
dx2);
216 bool useLAWidthFromGenError =
false;
217 if (useLAWidthFromGenError) {
218 chargeWidthX = (-micronsToCm * gtempl.
lorxwidth());
219 chargeWidthY = (-micronsToCm * gtempl.
lorywidth());
221 cout <<
" redefine la width (gen-error) " << chargeWidthX <<
" " << chargeWidthY << endl;
224 cout <<
" GenError: " << gtemplID_ << endl;
227 theClusterParam.
deltax = theClusterParam.
deltax * micronsToCm;
228 theClusterParam.
dx1 = theClusterParam.
dx1 * micronsToCm;
229 theClusterParam.
dx2 = theClusterParam.
dx2 * micronsToCm;
231 theClusterParam.
deltay = theClusterParam.
deltay * micronsToCm;
232 theClusterParam.
dy1 = theClusterParam.
dy1 * micronsToCm;
233 theClusterParam.
dy2 = theClusterParam.
dy2 * micronsToCm;
235 theClusterParam.
sigmax = theClusterParam.
sigmax * micronsToCm;
236 theClusterParam.
sx1 = theClusterParam.
sx1 * micronsToCm;
237 theClusterParam.
sx2 = theClusterParam.
sx2 * micronsToCm;
239 theClusterParam.
sigmay = theClusterParam.
sigmay * micronsToCm;
240 theClusterParam.
sy1 = theClusterParam.
sy1 * micronsToCm;
241 theClusterParam.
sy2 = theClusterParam.
sy2 * micronsToCm;
245 theClusterParam.
qBin_ = 0;
285 cout <<
"\n\t >>> theClusterParam.theCluster->x = " << theClusterParam.
theCluster->
x()
286 <<
"\n\t >>> theClusterParam.theCluster->y = " << theClusterParam.
theCluster->
y()
291 <<
"\n\t >>> meas: inner lower left = " << meas_URcorn_LLpix.
x() <<
"," << meas_URcorn_LLpix.
y()
292 <<
"\n\t >>> meas: inner upper right = " << meas_LLcorn_URpix.x() <<
"," << meas_LLcorn_URpix.y() << endl;
304 cout <<
"\t >>> Generic:: processing X" << endl;
311 local_URcorn_LLpix.x(),
312 local_LLcorn_URpix.
x(),
324 xPos = xPos + shiftX;
328 cout <<
"\t >>> Generic:: processing Y" << endl;
335 local_URcorn_LLpix.y(),
336 local_LLcorn_URpix.
y(),
348 yPos = yPos + shiftY;
360 xPos -= theClusterParam.
dx1;
362 xPos -= theClusterParam.
dx2;
366 xPos -= theClusterParam.
deltax;
377 yPos -= theClusterParam.
dy1;
379 yPos -= theClusterParam.
dy2;
383 yPos -= theClusterParam.
deltay;
404 float upper_edge_first_pix,
405 float lower_edge_last_pix,
412 float eff_charge_cut_low,
413 float eff_charge_cut_high,
418 float geom_center = 0.5f * (upper_edge_first_pix + lower_edge_last_pix);
429 float W_inner = lower_edge_last_pix - upper_edge_first_pix;
432 float W_pred = theThickness * cot_angle
438 float sum_of_edge = 2.0f;
445 float W_eff =
std::abs(W_pred) - W_inner;
453 if ((size >= size_cut) || ((W_eff / pitch < eff_charge_cut_low) | (W_eff / pitch > eff_charge_cut_high))) {
454 W_eff = pitch * 0.5f * sum_of_edge;
462 float Qdiff = Q_l - Q_f;
463 float Qsum = Q_l + Q_f;
469 float hit_pos = geom_center + 0.5f * (Qdiff / Qsum) * W_eff;
475 #warning "Debug printouts in PixelCPEGeneric.cc has been commented because they cannot be compiled" 540 for (
int i = 0;
i != isize; ++
i) {
543 int pix_adc =
pixel.adc;
572 const bool localPrint =
false;
592 if (
int(sizex) != (maxPixelRow - minPixelRow + 1))
593 cout <<
" wrong x" << endl;
594 if (
int(sizey) != (maxPixelCol - minPixelCol + 1))
595 cout <<
" wrong y" << endl;
603 cout <<
" edge clus " << xerr <<
" " << yerr << endl;
604 if (bigInX || bigInY)
605 cout <<
" big " << bigInX <<
" " << bigInY << endl;
607 cout <<
" edge " << edgex <<
" " << edgey << endl;
609 if (theClusterParam.
qBin_ == 0)
610 cout <<
" qbin 0! " << edgex <<
" " << edgey <<
" " << bigInX <<
" " << bigInY <<
" " << sizex <<
" " << sizey
623 xerr = theClusterParam.
sx1;
625 xerr = theClusterParam.
sx2;
628 xerr = theClusterParam.
sigmax;
635 yerr = theClusterParam.
sy1;
637 yerr = theClusterParam.
sy2;
640 yerr = theClusterParam.
sigmay;
645 cout <<
" in if " << edgex <<
" " << edgey <<
" " << sizex <<
" " << sizey << endl;
646 cout <<
" errors " << xerr <<
" " << yerr <<
" " << theClusterParam.
sx1 <<
" " << theClusterParam.
sx2 <<
" " 647 << theClusterParam.
sigmax << endl;
712 for (
int irow = 0; irow < 7; ++irow) {
717 for (
int icol = 0; icol < 21; ++icol) {
731 throw cms::Exception(
"PixelCPEGeneric::localError") <<
"\nERROR: Negative pixel error xerr = " << xerr <<
"\n\n";
734 throw cms::Exception(
"PixelCPEGeneric::localError") <<
"\nERROR: Negative pixel error yerr = " << yerr <<
"\n\n";
742 auto xerr_sq = xerr * xerr;
743 auto yerr_sq = yerr * yerr;
749 desc.
add<
double>(
"eff_charge_cut_highX", 1.0);
750 desc.
add<
double>(
"eff_charge_cut_highY", 1.0);
751 desc.
add<
double>(
"eff_charge_cut_lowX", 0.0);
752 desc.
add<
double>(
"eff_charge_cut_lowY", 0.0);
753 desc.
add<
double>(
"size_cutX", 3.0);
754 desc.
add<
double>(
"size_cutY", 3.0);
755 desc.
add<
double>(
"EdgeClusterErrorX", 50.0);
756 desc.
add<
double>(
"EdgeClusterErrorY", 85.0);
757 desc.
add<
bool>(
"inflate_errors",
false);
758 desc.
add<
bool>(
"inflate_all_errors_no_trk_angle",
false);
759 desc.
add<
bool>(
"UseErrorsFromTemplates",
true);
760 desc.
add<
bool>(
"TruncatePixelCharge",
true);
761 desc.
add<
bool>(
"IrradiationBiasCorrection",
false);
762 desc.
add<
bool>(
"DoCosmics",
false);
763 desc.
add<
bool>(
"Upgrade",
false);
764 desc.
add<
bool>(
"SmallPitch",
false);
T getParameter(std::string const &) const
std::vector< float > xerr_barrel_l1_
static bool pushfile(int filenum, std::vector< SiPixelGenErrorStore > &pixelTemp, std::string dir="")
float the_eff_charge_cut_highY
std::vector< float > xerr_barrel_ln_
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
const SiPixelCluster * theCluster
bool isBarrel(GeomDetEnumerators::SubDetector m)
bool UseErrorsFromTemplates_
std::vector< SiPixelGenErrorStore > thePixelGenError_
const PixelGeomDetUnit * theDet
GeomDetType::SubDetector thePart
LocalError localError(DetParam const &theDetParam, ClusterParam &theClusterParam) const override
bool IrradiationBiasCorrection_
const RectangularPixelTopology * theRecTopol
std::vector< float > yerr_endcap_
PixelCPEGeneric(edm::ParameterSet const &conf, const MagneticField *, const TrackerGeometry &, const TrackerTopology &, const SiPixelLorentzAngle *, const SiPixelGenErrorDBObject *, const SiPixelLorentzAngle *)
The constructor.
int qbin(int id, float cotalpha, float cotbeta, float locBz, float locBx, float qclus, bool irradiationCorrections, int &pixmx, float &sigmay, float &deltay, float &sigmax, float &deltax, float &sy1, float &dy1, float &sy2, float &dy2, float &sx1, float &dx1, float &sx2, float &dx2)
bool TruncatePixelCharge_
bool isItEdgePixelInX(int ixbin) const override
const PixelTopology * theTopol
bool LoadTemplatesFromDB_
float the_eff_charge_cut_lowX
bool inflate_all_errors_no_trk_angle
Abs< T >::type abs(const T &t)
DetId geographicalId() const
The label of this GeomDet.
float xerr_barrel_l1_def_
float lorxwidth()
signed lorentz x-width (microns)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
std::vector< float > xerr_endcap_
bool isItBigPixelInY(const int iybin) const override
bool isItBigPixelInX(const int ixbin) const override
Topology::LocalTrackPred loc_trk_pred
const TrackerTopology & ttopo_
const SiPixelGenErrorDBObject * genErrorDBObject_
float the_eff_charge_cut_lowY
ClusterParam * createClusterParam(const SiPixelCluster &cl) const override
std::vector< float > yerr_barrel_l1_
virtual LocalPoint localPosition(const MeasurementPoint &) const =0
float yerr_barrel_l1_def_
unsigned int layer(const DetId &id) const
std::vector< float > yerr_barrel_ln_
Pixel cluster – collection of neighboring pixels above threshold.
float generic_position_formula(int size, int Q_f, int Q_l, float upper_edge_first_pix, float lower_edge_last_pix, float lorentz_shift, float theThickness, float cot_angle, float pitch, bool first_is_big, bool last_is_big, float eff_charge_cut_low, float eff_charge_cut_high, float size_cut) const
float lorywidth()
signed lorentz y-width (microns)
float xerr_barrel_ln_def_
bool containsBigPixelInY(int iymin, int iymax) const override
LocalPoint localPosition(DetParam const &theDetParam, ClusterParam &theClusterParam) const override
bool containsBigPixelInX(int ixmin, int ixmax) const override
bool isItEdgePixelInY(int iybin) const override
float yerr_barrel_ln_def_
static void fillPSetDescription(edm::ParameterSetDescription &desc)
void collect_edge_charges(ClusterParam &theClusterParam, int &Q_f_X, int &Q_l_X, int &Q_f_Y, int &Q_l_Y) const
bool isTrackerPixel(GeomDetEnumerators::SubDetector m)
float the_eff_charge_cut_highX