27 #ifndef SI_PIXEL_TEMPLATE_STANDALONE 40 #ifndef SI_PIXEL_TEMPLATE_STANDALONE 44 #define LOGERROR(x) LogError(x) 45 #define LOGINFO(x) LogInfo(x) 51 #define LOGERROR(x) std::cout << x << ": " 52 #define LOGINFO(x) std::cout << x << ": " 53 #define ENDL std::endl 67 const int code_version={21};
75 #ifndef SI_PIXEL_TEMPLATE_STANDALONE 77 int nzeros = 4-tempfile.length();
82 tempfile = dir +
"template_summary2D_zp" + tempfile +
".out";
88 std::ostringstream tout;
89 tout <<
"template_summary2D_zp" << std::setw(4) << std::setfill(
'0') << std::right << filenum <<
".out" << std::ends;
90 tempfile = tout.str();
96 std::ifstream
in_file(tempfile);
97 if(in_file.is_open() && in_file.good()) {
104 for (
int i=0; (c=in_file.get()) !=
'\n'; ++
i) {
106 else {theCurrentTemp.
head.
title[79] =
'\0';}
108 LOGINFO(
"SiPixelTemplate2D") <<
"Loading Pixel Template File - " << theCurrentTemp.
head.
title <<
ENDL;
115 if(in_file.fail()) {
LOGERROR(
"SiPixelTemplate2D") <<
"Error reading file 0A, no template load" <<
ENDL;
return false;}
122 if(in_file.fail()) {
LOGERROR(
"SiPixelTemplate2D") <<
"Error reading file 0B, no template load" 123 <<
ENDL;
return false;}
130 theCurrentTemp.
head.
fbin[1] = 1.00f;
131 theCurrentTemp.
head.
fbin[2] = 0.85f;
135 <<
", NTy = " << theCurrentTemp.
head.
NTy <<
", NTyx = " << theCurrentTemp.
head.
NTyx<<
", NTxx = " << theCurrentTemp.
head.
NTxx <<
", Dtype = " << theCurrentTemp.
head.
Dtype 136 <<
", Bias voltage " << theCurrentTemp.
head.
Vbias <<
", temperature " 138 <<
", 1/2 multi dcol threshold " << theCurrentTemp.
head.
s50 <<
", 1/2 single dcol threshold " << theCurrentTemp.
head.
ss50 141 <<
", Q/Q_avg fractions for Qbin defs " << theCurrentTemp.
head.
fbin[0] <<
", " << theCurrentTemp.
head.
fbin[1]
142 <<
", " << theCurrentTemp.
head.
fbin[2]
145 if(theCurrentTemp.
head.
templ_version < code_version) {
LOGERROR(
"SiPixelTemplate2D") <<
"code expects version " << code_version <<
", no template load" <<
ENDL;
return false;}
147 if(theCurrentTemp.
head.
NTy != 0) {
LOGERROR(
"SiPixelTemplate2D") <<
"Trying to load 1-d template info into the 2-d template object, check your DB/global tag!" <<
ENDL;
return false;}
157 for (
int iy=0; iy < theCurrentTemp.
head.
NTyx; ++iy) {
158 for(
int jx=0; jx < theCurrentTemp.
head.
NTxx; ++jx) {
164 LOGERROR(
"SiPixelTemplate2D") <<
"Error reading file 1, no template load, run # " << theCurrentTemp.
entry[iy][jx].
runnum <<
ENDL;
165 delete [] theCurrentTemp.
entry[0];
166 delete [] theCurrentTemp.
entry;
180 LOGERROR(
"SiPixelTemplate2D") <<
"Error reading file 2, no template load, run # " << theCurrentTemp.
entry[iy][jx].
runnum <<
ENDL;
181 delete [] theCurrentTemp.
entry[0];
182 delete [] theCurrentTemp.
entry;
186 for (
int k=0;
k<2; ++
k) {
192 LOGERROR(
"SiPixelTemplate2D") <<
"Error reading file 3, no template load, run # " << theCurrentTemp.
entry[iy][jx].
runnum <<
ENDL;
193 delete [] theCurrentTemp.
entry[0];
194 delete [] theCurrentTemp.
entry;
199 for (
int k=0;
k<2; ++
k) {
205 LOGERROR(
"SiPixelTemplate2D") <<
"Error reading file 4, no template load, run # " << theCurrentTemp.
entry[iy][jx].
runnum <<
ENDL;
206 delete [] theCurrentTemp.
entry[0];
207 delete [] theCurrentTemp.
entry;
217 for (
int l=0;
l<7; ++
l) {
218 for (
int k=0;
k<7; ++
k) {
219 for (
int j=0; j<
T2XSIZE; ++j) {
224 LOGERROR(
"SiPixelTemplate2D") <<
"Error reading file 5, no template load, run # " << theCurrentTemp.
entry[iy][jx].
runnum <<
ENDL;
225 delete [] theCurrentTemp.
entry[0];
226 delete [] theCurrentTemp.
entry;
242 LOGERROR(
"SiPixelTemplate2D") <<
"Error reading file 6, no template load, run # " << theCurrentTemp.
entry[iy][jx].
runnum <<
ENDL;
243 delete [] theCurrentTemp.
entry[0];
244 delete [] theCurrentTemp.
entry;
252 LOGERROR(
"SiPixelTemplate2D") <<
"Error reading file 7, no template load, run # " << theCurrentTemp.
entry[iy][jx].
runnum <<
ENDL;
253 delete [] theCurrentTemp.
entry[0];
254 delete [] theCurrentTemp.
entry;
263 LOGERROR(
"SiPixelTemplate2D") <<
"Error reading file 8, no template load, run # " << theCurrentTemp.
entry[iy][jx].
runnum <<
ENDL;
264 delete [] theCurrentTemp.
entry[0];
265 delete [] theCurrentTemp.
entry;
278 pixelTemp.push_back(theCurrentTemp);
286 LOGERROR(
"SiPixelTemplate2D") <<
"Error opening File" << tempfile <<
ENDL;
294 #ifndef SI_PIXEL_TEMPLATE_STANDALONE 305 const int code_version={21};
320 for (
int i=0;
i<20; ++
i) {
329 LOGINFO(
"SiPixelTemplate2D") <<
"Loading Pixel Template File - " << theCurrentTemp.
head.
title <<
ENDL;
337 if(db.
fail()) {
LOGERROR(
"SiPixelTemplate2D") <<
"Error reading file 0A, no template load" <<
ENDL;
return false;}
339 LOGINFO(
"SiPixelTemplate2D") <<
"Loading Pixel Template File - " << theCurrentTemp.
head.
title 340 <<
" code version = "<<code_version
347 if(db.
fail()) {
LOGERROR(
"SiPixelTemplate2D") <<
"Error reading file 0B, no template load" 348 <<
ENDL;
return false;}
354 theCurrentTemp.
head.
fbin[0] = 1.50f;
355 theCurrentTemp.
head.
fbin[1] = 1.00f;
356 theCurrentTemp.
head.
fbin[2] = 0.85f;
360 <<
"Template ID = " << theCurrentTemp.
head.
ID <<
", Template Version " 362 << theCurrentTemp.
head.
Bfield<<
", NTy = " << theCurrentTemp.
head.
NTy <<
", NTyx = " 363 << theCurrentTemp.
head.
NTyx<<
", NTxx = " << theCurrentTemp.
head.
NTxx <<
", Dtype = " 364 << theCurrentTemp.
head.
Dtype<<
", Bias voltage " << theCurrentTemp.
head.
Vbias <<
", temperature " 366 <<
", Q-scaling factor " << theCurrentTemp.
head.
qscale 367 <<
", 1/2 multi dcol threshold " << theCurrentTemp.
head.
s50 <<
", 1/2 single dcol threshold " 372 <<
", Q/Q_avg fractions for Qbin defs " << theCurrentTemp.
head.
fbin[0]
373 <<
", " << theCurrentTemp.
head.
fbin[1]
374 <<
", " << theCurrentTemp.
head.
fbin[2]
375 <<
", pixel x-size " << theCurrentTemp.
head.
xsize 379 LOGINFO(
"SiPixelTemplate2D") <<
"code expects version "<< code_version <<
" finds " 383 if(theCurrentTemp.
head.
NTy != 0) {
LOGERROR(
"SiPixelTemplate2D") <<
"Trying to load 1-d template info into the 2-d template object, check your DB/global tag!" <<
ENDL;
return false;}
394 for (
int iy=0; iy < theCurrentTemp.
head.
NTyx; ++iy) {
395 for(
int jx=0; jx < theCurrentTemp.
head.
NTxx; ++jx) {
401 LOGERROR(
"SiPixelTemplate2D") <<
"Error reading file 1, no template load, run # " << theCurrentTemp.
entry[iy][jx].
runnum <<
ENDL;
402 delete [] theCurrentTemp.
entry[0];
403 delete [] theCurrentTemp.
entry;
417 LOGERROR(
"SiPixelTemplate2D") <<
"Error reading file 2, no template load, run # " << theCurrentTemp.
entry[iy][jx].
runnum <<
ENDL;
418 delete [] theCurrentTemp.
entry[0];
419 delete [] theCurrentTemp.
entry;
423 for (
int k=0;
k<2; ++
k) {
429 LOGERROR(
"SiPixelTemplate2D") <<
"Error reading file 3, no template load, run # " << theCurrentTemp.
entry[iy][jx].
runnum <<
ENDL;
430 delete [] theCurrentTemp.
entry[0];
431 delete [] theCurrentTemp.
entry;
437 for (
int k=0;
k<2; ++
k) {
443 LOGERROR(
"SiPixelTemplate2D") <<
"Error reading file 4, no template load, run # " << theCurrentTemp.
entry[iy][jx].
runnum <<
ENDL;
444 delete [] theCurrentTemp.
entry[0];
445 delete [] theCurrentTemp.
entry;
454 for (
int l=0;
l<7; ++
l) {
455 for (
int k=0;
k<7; ++
k) {
456 for (
int j=0; j<
T2XSIZE; ++j) {
461 LOGERROR(
"SiPixelTemplate2D") <<
"Error reading file 5, no template load, run # " << theCurrentTemp.
entry[iy][jx].
runnum <<
ENDL;
462 delete [] theCurrentTemp.
entry[0];
463 delete [] theCurrentTemp.
entry;
478 LOGERROR(
"SiPixelTemplate2D") <<
"Error reading file 6, no template load, run # " << theCurrentTemp.
entry[iy][jx].
runnum <<
ENDL;
479 delete [] theCurrentTemp.
entry[0];
480 delete [] theCurrentTemp.
entry;
488 LOGERROR(
"SiPixelTemplate2D") <<
"Error reading file 7, no template load, run # " << theCurrentTemp.
entry[iy][jx].
runnum <<
ENDL;
489 delete [] theCurrentTemp.
entry[0];
490 delete [] theCurrentTemp.
entry;
499 LOGERROR(
"SiPixelTemplate2D") <<
"Error reading file 8, no template load, run # " << theCurrentTemp.
entry[iy][jx].
runnum <<
ENDL;
500 delete [] theCurrentTemp.
entry[0];
501 delete [] theCurrentTemp.
entry;
510 pixelTemp.push_back(theCurrentTemp);
543 float acotb, dcota, dcotb;
547 if(
id != id_current_ || cotalpha != cota_current_ || cotbeta != cotb_current_) {
549 cota_current_ = cotalpha; cotb_current_ = cotbeta; success_ =
true;
551 if(
id != id_current_) {
556 for(
int i=0;
i<(
int)thePixelTemp_.size(); ++
i) {
558 if(
id == thePixelTemp_[
i].head.ID) {
565 Dtype_ = thePixelTemp_[index_id_].head.Dtype;
569 qscale_ = thePixelTemp_[index_id_].head.qscale;
573 s50_ = thePixelTemp_[index_id_].head.s50;
577 for(
int j=0; j<3; ++j) {fbin_[j] = thePixelTemp_[index_id_].head.fbin[j];}
581 lorywidth_ = thePixelTemp_[index_id_].head.lorywidth;
582 lorxwidth_ = thePixelTemp_[index_id_].head.lorxwidth;
586 xsize_ = thePixelTemp_[index_id_].head.xsize;
587 ysize_ = thePixelTemp_[index_id_].head.ysize;
588 zsize_ = thePixelTemp_[index_id_].head.zsize;
592 Nyx_ = thePixelTemp_[index_id_].head.NTyx;
593 Nxx_ = thePixelTemp_[index_id_].head.NTxx;
594 #ifndef SI_PIXEL_TEMPLATE_STANDALONE 595 if(Nyx_ < 2 || Nxx_ < 2) {
596 throw cms::Exception(
"DataCorrupt") <<
"template ID = " << id_current_ <<
"has too few entries: Nyx/Nxx = " << Nyx_ <<
"/" << Nxx_ << std::endl;
599 assert(Nyx_ > 1 && Nxx_ > 1);
603 cotalpha0_ = thePixelTemp_[index_id_].entry[0][0].cotalpha;
604 cotalpha1_ = thePixelTemp_[index_id_].entry[0][Nxx_-1].cotalpha;
605 deltacota_ = (cotalpha1_-cotalpha0_)/(
float)(Nxx_-1);
607 cotbeta0_ = thePixelTemp_[index_id_].entry[0][imidx].cotbeta;
608 cotbeta1_ = thePixelTemp_[index_id_].entry[Nyx_-1][imidx].cotbeta;
609 deltacotb_ = (cotbeta1_-cotbeta0_)/(
float)(Nyx_-1);
617 #ifndef SI_PIXEL_TEMPLATE_STANDALONE 618 if(index_id_ < 0 || index_id_ >= (
int)thePixelTemp_.size()) {
619 throw cms::Exception(
"DataCorrupt") <<
"SiPixelTemplate2D::interpolate can't find needed template ID = " <<
id 620 <<
", Are you using the correct global tag?" << std::endl;
623 assert(index_id_ >= 0 && index_id_ < (
int)thePixelTemp_.size());
628 float cota = cotalpha;
633 if(cotbeta < 0.
f) {flip_y_ =
true;}
636 if(locBz > 0.
f) {flip_y_ =
true;}
642 if(locBx*locBz < 0.
f) {
643 cota = fabs(cotalpha);
646 if(locBx < 0.
f) {flip_y_ =
true;}
649 #ifndef SI_PIXEL_TEMPLATE_STANDALONE 650 throw cms::Exception(
"DataCorrupt") <<
"SiPixelTemplate2D::illegal subdetector ID = " << thePixelTemp_[index_id_].head.Dtype << std::endl;
652 std::cout <<
"SiPixelTemplate:2D:illegal subdetector ID = " << thePixelTemp_[index_id_].head.Dtype << std::endl;
656 if(cota < cotalpha0_) {
661 }
else if(cota > cotalpha1_) {
667 jx0_ = (
int)((cota-cotalpha0_)/deltacota_+0.5f);
668 dcota = (cota - (cotalpha0_ + jx0_*deltacota_))/deltacota_;
669 adcota_ = fabs(dcota);
670 if(dcota > 0.
f) {jx1_ = jx0_ + 1;
if(jx1_ > Nxx_-1) jx1_ = jx0_-1;}
else {jx1_ = jx0_ - 1;
if(jx1_ < 0) jx1_ = jx0_+1;}
675 acotb = fabs(cotbeta);
677 if(acotb < cotbeta0_) {
682 }
else if(acotb > cotbeta1_) {
688 iy0_ = (
int)((acotb-cotbeta0_)/deltacotb_+0.5f);
689 dcotb = (acotb - (cotbeta0_ + iy0_*deltacotb_))/deltacotb_;
690 adcotb_ = fabs(dcotb);
691 if(dcotb > 0.
f) {iy1_ = iy0_ + 1;
if(iy1_ > Nyx_-1) iy1_ = iy0_-1;}
else {iy1_ = iy0_ - 1;
if(iy1_ < 0) iy1_ = iy0_+1;}
696 lorydrift_ = lorywidth_/2.;
697 if(flip_y_) lorydrift_ = -lorydrift_;
698 lorxdrift_ = lorxwidth_/2.;
699 if(flip_x_) lorxdrift_ = -lorxdrift_;
704 entry00_ = &thePixelTemp_[index_id_].entry[iy0_][jx0_];
705 entry10_ = &thePixelTemp_[index_id_].entry[iy1_][jx0_];
706 entry01_ = &thePixelTemp_[index_id_].entry[iy0_][jx1_];
710 qavg_ = entry00_->qavg
711 +adcota_*(entry01_->qavg - entry00_->qavg)
712 +adcotb_*(entry10_->qavg - entry00_->qavg);
714 pixmax_ = entry00_->pixmax
715 +adcota_*(entry01_->pixmax - entry00_->pixmax)
716 +adcotb_*(entry10_->pixmax - entry00_->pixmax);
718 sxymax_ = entry00_->sxymax
719 +adcota_*(entry01_->sxymax - entry00_->sxymax)
720 +adcotb_*(entry10_->sxymax - entry00_->sxymax);
722 chi2avgone_ = entry00_->chi2avgone
723 +adcota_*(entry01_->chi2avgone - entry00_->chi2avgone)
724 +adcotb_*(entry10_->chi2avgone - entry00_->chi2avgone);
726 chi2minone_ = entry00_->chi2minone
727 +adcota_*(entry01_->chi2minone - entry00_->chi2minone)
728 +adcotb_*(entry10_->chi2minone - entry00_->chi2minone);
730 clsleny_ = entry00_->clsleny
731 +adcota_*(entry01_->clsleny - entry00_->clsleny)
732 +adcotb_*(entry10_->clsleny - entry00_->clsleny);
734 clslenx_ = entry00_->clslenx
735 +adcota_*(entry01_->clslenx - entry00_->clslenx)
736 +adcotb_*(entry10_->clslenx - entry00_->clslenx);
739 chi2ppix_ = entry00_->chi2ppix
740 +adcota_*(entry01_->chi2ppix - entry00_->chi2ppix)
741 +adcotb_*(entry10_->chi2ppix - entry00_->chi2ppix);
743 chi2scale_ = entry00_->chi2scale
744 +adcota_*(entry01_->chi2scale - entry00_->chi2scale)
745 +adcotb_*(entry10_->chi2scale - entry00_->chi2scale);
747 scaleyavg_ = entry00_->scaleyavg
748 +adcota_*(entry01_->scaleyavg - entry00_->scaleyavg)
749 +adcotb_*(entry10_->scaleyavg - entry00_->scaleyavg);
751 scalexavg_ = entry00_->scalexavg
752 +adcota_*(entry01_->scalexavg - entry00_->scalexavg)
753 +adcotb_*(entry10_->scalexavg - entry00_->scalexavg);
755 delyavg_ = entry00_->delyavg
756 +adcota_*(entry01_->delyavg - entry00_->delyavg)
757 +adcotb_*(entry10_->delyavg - entry00_->delyavg);
759 delysig_ = entry00_->delysig
760 +adcota_*(entry01_->delysig - entry00_->delysig)
761 +adcotb_*(entry10_->delysig - entry00_->delysig);
763 mpvvav_ = entry00_->mpvvav
764 +adcota_*(entry01_->mpvvav - entry00_->mpvvav)
765 +adcotb_*(entry10_->mpvvav - entry00_->mpvvav);
767 sigmavav_ = entry00_->sigmavav
768 +adcota_*(entry01_->sigmavav - entry00_->sigmavav)
769 +adcotb_*(entry10_->sigmavav - entry00_->sigmavav);
771 kappavav_ = entry00_->kappavav
772 +adcota_*(entry01_->kappavav - entry00_->kappavav)
773 +adcotb_*(entry10_->kappavav - entry00_->kappavav);
775 for(
int i=0;
i<4 ; ++
i) {
776 scalex_[
i] = entry00_->scalex[
i]
777 +adcota_*(entry01_->scalex[
i] - entry00_->scalex[
i])
778 +adcotb_*(entry10_->scalex[
i] - entry00_->scalex[
i]);
780 scaley_[
i] = entry00_->scaley[
i]
781 +adcota_*(entry01_->scaley[
i] - entry00_->scaley[
i])
782 +adcotb_*(entry10_->scaley[
i] - entry00_->scaley[
i]);
784 offsetx_[
i] = entry00_->offsetx[
i]
785 +adcota_*(entry01_->offsetx[
i] - entry00_->offsetx[
i])
786 +adcotb_*(entry10_->offsetx[
i] - entry00_->offsetx[
i]);
787 if(flip_x_) offsetx_[
i] = -offsetx_[
i];
789 offsety_[
i] = entry00_->offsety[
i]
790 +adcota_*(entry01_->offsety[
i] - entry00_->offsety[
i])
791 +adcotb_*(entry10_->offsety[
i] - entry00_->offsety[
i]);
792 if(flip_y_) offsety_[
i] = -offsety_[
i];
795 for(
int i=0;
i<2 ; ++
i) {
796 for(
int j=0; j<5 ; ++j) {
799 xypary0x0_[1-
i][j] = (
float)entry00_->xypar[
i][j];
800 xypary1x0_[1-
i][j] = (
float)entry10_->xypar[
i][j];
801 xypary0x1_[1-
i][j] = (
float)entry01_->xypar[
i][j];
802 lanpar_[1-
i][j] = entry00_->lanpar[
i][j]
803 +adcota_*(entry01_->lanpar[
i][j] - entry00_->lanpar[
i][j])
804 +adcotb_*(entry10_->lanpar[
i][j] - entry00_->lanpar[
i][j]);
806 xypary0x0_[
i][j] = (
float)entry00_->xypar[
i][j];
807 xypary1x0_[
i][j] = (
float)entry10_->xypar[
i][j];
808 xypary0x1_[
i][j] = (
float)entry01_->xypar[
i][j];
809 lanpar_[
i][j] = entry00_->lanpar[
i][j]
810 +adcota_*(entry01_->lanpar[
i][j] - entry00_->lanpar[
i][j])
811 +adcotb_*(entry10_->lanpar[
i][j] - entry00_->lanpar[
i][j]);
828 void SiPixelTemplate2D::sideload(
SiPixelTemplateEntry2D*
entry,
int iDtype,
float locBx,
float locBz,
float lorwdy,
float lorwdx,
float q50,
float fbin[3],
float xsize,
float ysize,
float zsize)
843 for(
int i=0;
i<3; ++
i) {fbin_[
i] = fbin[
i];}
852 qavg_ = entry00_->qavg;
854 pixmax_ = entry00_->pixmax;
856 sxymax_ = entry00_->sxymax;
858 clsleny_ = entry00_->clsleny;
860 clslenx_ = entry00_->clslenx;
870 for(
int i=0;
i<4 ; ++
i) {
881 float cotbeta = entry00_->cotbeta;
884 if(cotbeta < 0.
f) {flip_y_ =
true;}
895 if(locBx*locBz < 0.
f) {
903 #ifndef SI_PIXEL_TEMPLATE_STANDALONE 904 throw cms::Exception(
"DataCorrupt") <<
"SiPixelTemplate2D::illegal subdetector ID = " << iDtype << std::endl;
906 std::cout <<
"SiPixelTemplate:2D:illegal subdetector ID = " << iDtype << std::endl;
912 lorydrift_ = lorywidth_/2.;
913 if(flip_y_) lorydrift_ = -lorydrift_;
914 lorxdrift_ = lorxwidth_/2.;
915 if(flip_x_) lorxdrift_ = -lorxdrift_;
917 for(
int i=0;
i<2 ; ++
i) {
918 for(
int j=0; j<5 ; ++j) {
921 xypary0x0_[1-
i][j] = (
float)entry00_->xypar[
i][j];
922 xypary1x0_[1-
i][j] = (
float)entry00_->xypar[
i][j];
923 xypary0x1_[1-
i][j] = (
float)entry00_->xypar[
i][j];
924 lanpar_[1-
i][j] = entry00_->lanpar[
i][j];
926 xypary0x0_[
i][j] = (
float)entry00_->xypar[
i][j];
927 xypary1x0_[
i][j] = (
float)entry00_->xypar[
i][j];
928 xypary0x1_[
i][j] = (
float)entry00_->xypar[
i][j];
929 lanpar_[
i][j] = entry00_->lanpar[
i][j];
945 bool SiPixelTemplate2D::xytemp(
float xhit,
float yhit,
bool ydouble[
BYM2],
bool xdouble[
BXM2],
float template2d[BXM2][BYM2],
bool derivatives,
float dpdx2d[2][BXM2][BYM2],
float& QTemplate)
950 int pixx, pixy,
k0, k1, l0, l1, deltax, deltay, iflipy, jflipx, imin, imax, jmin, jmax;
952 float dx,
dy, ddx, ddy, adx, ady;
954 const float deltaxy[2] = {16.67f, 25.0f};
964 pixy = (
int)floorf(yhit/ysize_);
965 dy = yhit-(pixy+0.5f)*ysize_;
966 if(flip_y_) {dy = -
dy;}
967 k0 = (
int)(dy/ysize_*6.
f+3.5
f);
970 ddy = 6.f*dy/ysize_ - (k0-3);
972 if(ddy > 0.
f) {k1 = k0 + 1;
if(k1 > 6) k1 = k0-1;}
else {k1 = k0 - 1;
if(k1 < 0) k1 = k0+1;}
973 pixx = (
int)floorf(xhit/xsize_);
974 dx = xhit-(pixx+0.5f)*xsize_;
975 if(flip_x_) {dx = -
dx;}
976 l0 = (
int)(dx/xsize_*6.
f+3.5
f);
979 ddx = 6.f*dx/xsize_ - (l0-3);
981 if(ddx > 0.
f) {l1 = l0 + 1;
if(l1 > 6) l1 = l0-1;}
else {l1 = l0 - 1;
if(l1 < 0) l1 = l0+1;}
987 imin =
std::min(entry00_->iymin,entry10_->iymin);
988 imin_ =
std::min(imin,entry01_->iymin);
990 jmin =
std::min(entry00_->jxmin,entry10_->jxmin);
991 jmin_ =
std::min(jmin,entry01_->jxmin);
993 imax =
std::max(entry00_->iymax,entry10_->iymax);
994 imax_ =
std::max(imax,entry01_->iymax);
996 jmax =
std::max(entry00_->jxmax,entry10_->jxmax);
997 jmax_ =
std::max(jmax,entry01_->jxmax);
1007 deltax = pixx -
T2HX;
1008 deltay = pixy -
T2HY;
1012 for(
int j=0; j<
BXM2; ++j) {
for(
int i=0;
i<
BYM2; ++
i) {xytemp_[j][
i] = 0.f;}}
1016 for(
int j=jmin_; j<=jmax_; ++j) {
1018 if(flip_x_) {jflipx=
T2XSIZE-1-j; m = deltax+jflipx;}
else {m = deltax+j;}
1019 for(
int i=imin_;
i<=imax_; ++
i) {
1020 if(flip_y_) {iflipy=
T2YSIZE-1-
i; n = deltay+iflipy;}
else {n = deltay+
i;}
1021 if(m>=0 && m<=BXM3 && n>=0 && n<=
BYM3) {
1022 xytemp_[
m][
n] = (
float)entry00_->xytemp[k0][l0][
i][j]
1023 + adx*(
float)(entry00_->xytemp[
k0][l1][
i][j] - entry00_->xytemp[
k0][l0][
i][j])
1024 + ady*(
float)(entry00_->xytemp[k1][l0][
i][j] - entry00_->xytemp[
k0][l0][
i][j])
1025 + adcota_*(
float)(entry01_->xytemp[
k0][l0][
i][j] - entry00_->xytemp[
k0][l0][
i][j])
1026 + adcotb_*(
float)(entry10_->xytemp[
k0][l0][
i][j] - entry00_->xytemp[
k0][l0][
i][j]);
1033 for(
int n=1; n<
BYM3; ++
n) {
1036 for(
int m=1; m<
BXM3; ++
m) {
1037 xytemp_[
m][
n] += xytemp_[
m][n+1];
1041 for(
int m=1; m<
BXM3; ++
m) {
1042 xytemp_[
m][
i] = xytemp_[
m][
i+1];
1050 for(
int m=1; m<
BXM3; ++
m) {
1053 for(
int n=1; n<
BYM3; ++
n) {
1054 xytemp_[
m][
n] += xytemp_[m+1][
n];
1057 for(
int j=m+1; j<
BXM3; ++j) {
1058 for(n=1; n<
BYM3; ++
n) {
1059 xytemp_[j][
n] = xytemp_[j+1][
n];
1067 float qtemptot = 0.f;
1069 for(
int n=1; n<
BYM3; ++
n) {
1070 for(
int m=1; m<
BXM3; ++
m) {
1071 if(xytemp_[m][n] != 0.
f) {template2d[
m][
n] += xytemp_[
m][
n]; qtemptot += xytemp_[
m][
n];}
1075 QTemplate = qtemptot;
1081 for(
int k = 0;
k<2; ++
k) {
1083 for(
int j = 0; j<
BYM2; ++j) {
1084 dxytempdx[
k][
i][j] = 0.f;
1085 dxytempdy[
k][
i][j] = 0.f;
1086 dpdx2d[
k][
i][j] = 0.f;
1093 pixx = (
int)floorf((xhit+deltaxy[0])/xsize_);
1094 dx = (xhit+deltaxy[0])-(pixx+0.5
f)*xsize_;
1095 if(flip_x_) {dx = -
dx;}
1096 l0 = (
int)(dx/xsize_*6.
f+3.5
f);
1099 ddx = 6.f*dx/xsize_ - (l0-3);
1101 if(ddx > 0.
f) {l1 = l0 + 1;
if(l1 > 6) l1 = l0-1;}
else {l1 = l0 - 1;
if(l1 < 0) l1 = l0+1;}
1113 deltax = pixx -
T2HX;
1117 for(
int j=jmin_; j<=jmax_; ++j) {
1119 if(flip_x_) {jflipx=
T2XSIZE-1-j; m = deltax+jflipx;}
else {m = deltax+j;}
1120 for(
int i=imin_;
i<=imax_; ++
i) {
1121 if(flip_y_) {iflipy=
T2YSIZE-1-
i; n = deltay+iflipy;}
else {n = deltay+
i;}
1122 if(m>=0 && m<=BXM3 && n>=0 && n<=BYM3) {
1123 dxytempdx[1][
m][
n] = (
float)entry00_->xytemp[k0][l0][
i][j]
1124 + adx*(
float)(entry00_->xytemp[
k0][l1][
i][j] - entry00_->xytemp[
k0][l0][
i][j])
1125 + ady*(
float)(entry00_->xytemp[k1][l0][
i][j] - entry00_->xytemp[
k0][l0][
i][j])
1126 + adcota_*(
float)(entry01_->xytemp[
k0][l0][
i][j] - entry00_->xytemp[
k0][l0][
i][j])
1127 + adcotb_*(
float)(entry10_->xytemp[
k0][l0][
i][j] - entry00_->xytemp[
k0][l0][
i][j]);
1134 for(
int n=1; n<
BYM3; ++
n) {
1137 for(
int m=1; m<
BXM3; ++
m) {
1138 dxytempdx[1][
m][
n] += dxytempdx[1][
m][n+1];
1142 for(
int m=1; m<
BXM3; ++
m) {
1143 dxytempdx[1][
m][
i] = dxytempdx[1][
m][
i+1];
1151 for(
int m=1; m<
BXM3; ++
m) {
1154 for(
int n=1; n<
BYM3; ++
n) {
1155 dxytempdx[1][
m][
n] += dxytempdx[1][m+1][
n];
1158 for(
int j=m+1; j<
BXM3; ++j) {
1159 for(
int n=1; n<
BYM3; ++
n) {
1160 dxytempdx[1][j][
n] = dxytempdx[1][j+1][
n];
1168 pixx = (
int)floorf((xhit-deltaxy[0])/xsize_);
1169 dx = (xhit-deltaxy[0])-(pixx+0.5
f)*xsize_;
1170 if(flip_x_) {dx = -
dx;}
1171 l0 = (
int)(dx/xsize_*6.
f+3.5
f);
1174 ddx = 6.f*dx/xsize_ - (l0-3);
1176 if(ddx > 0.
f) {l1 = l0 + 1;
if(l1 > 6) l1 = l0-1;}
else {l1 = l0 - 1;
if(l1 < 0) l1 = l0+1;}
1188 deltax = pixx -
T2HX;
1192 for(
int j=jmin_; j<=jmax_; ++j) {
1194 if(flip_x_) {jflipx=
T2XSIZE-1-j; m = deltax+jflipx;}
else {m = deltax+j;}
1195 for(
int i=imin_;
i<=imax_; ++
i) {
1196 if(flip_y_) {iflipy=
T2YSIZE-1-
i; n = deltay+iflipy;}
else {n = deltay+
i;}
1197 if(m>=0 && m<=BXM3 && n>=0 && n<=BYM3) {
1198 dxytempdx[0][
m][
n] = (
float)entry00_->xytemp[k0][l0][
i][j]
1199 + adx*(
float)(entry00_->xytemp[
k0][l1][
i][j] - entry00_->xytemp[
k0][l0][
i][j])
1200 + ady*(
float)(entry00_->xytemp[k1][l0][
i][j] - entry00_->xytemp[
k0][l0][
i][j])
1201 + adcota_*(
float)(entry01_->xytemp[
k0][l0][
i][j] - entry00_->xytemp[
k0][l0][
i][j])
1202 + adcotb_*(
float)(entry10_->xytemp[
k0][l0][
i][j] - entry00_->xytemp[
k0][l0][
i][j]);
1209 for(
int n=1; n<
BYM3; ++
n) {
1212 for(
int m=1; m<
BXM3; ++
m) {
1213 dxytempdx[0][
m][
n] += dxytempdx[0][
m][n+1];
1217 for(
int m=1; m<
BXM3; ++
m) {
1218 dxytempdx[0][
m][
i] = dxytempdx[0][
m][
i+1];
1226 for(
int m=1; m<
BXM3; ++
m) {
1229 for(
int n=1; n<
BYM3; ++
n) {
1230 dxytempdx[0][
m][
n] += dxytempdx[0][m+1][
n];
1233 for(
int j=m+1; j<
BXM3; ++j) {
1234 for(
int n=1; n<
BYM3; ++
n) {
1235 dxytempdx[0][j][
n] = dxytempdx[0][j+1][
n];
1244 for(
int n=1; n<
BYM3; ++
n) {
1245 for(
int m=1; m<
BXM3; ++
m) {
1246 dpdx2d[0][
m][
n] = (dxytempdx[1][
m][
n] - dxytempdx[0][
m][
n])/(2.*deltaxy[0]);
1252 pixy = (
int)floorf((yhit+deltaxy[1])/ysize_);
1253 dy = (yhit+deltaxy[1])-(pixy+0.5
f)*ysize_;
1254 if(flip_y_) {dy = -
dy;}
1255 k0 = (
int)(dy/ysize_*6.
f+3.5
f);
1258 ddy = 6.f*dy/ysize_ - (k0-3);
1260 if(ddy > 0.
f) {k1 = k0 + 1;
if(k1 > 6) k1 = k0-1;}
else {k1 = k0 - 1;
if(k1 < 0) k1 = k0+1;}
1261 pixx = (
int)floorf(xhit/xsize_);
1262 dx = xhit-(pixx+0.5f)*xsize_;
1263 if(flip_x_) {dx = -
dx;}
1264 l0 = (
int)(dx/xsize_*6.
f+3.5
f);
1267 ddx = 6.f*dx/xsize_ - (l0-3);
1269 if(ddx > 0.
f) {l1 = l0 + 1;
if(l1 > 6) l1 = l0-1;}
else {l1 = l0 - 1;
if(l1 < 0) l1 = l0+1;}
1281 deltax = pixx -
T2HX;
1282 deltay = pixy -
T2HY;
1286 for(
int j=jmin_; j<=jmax_; ++j) {
1288 if(flip_x_) {jflipx=
T2XSIZE-1-j; m = deltax+jflipx;}
else {m = deltax+j;}
1289 for(
int i=imin_;
i<=imax_; ++
i) {
1290 if(flip_y_) {iflipy=
T2YSIZE-1-
i; n = deltay+iflipy;}
else {n = deltay+
i;}
1291 if(m>=0 && m<=BXM3 && n>=0 && n<=BYM3) {
1292 dxytempdy[1][
m][
n] = (
float)entry00_->xytemp[k0][l0][
i][j]
1293 + adx*(
float)(entry00_->xytemp[
k0][l1][
i][j] - entry00_->xytemp[
k0][l0][
i][j])
1294 + ady*(
float)(entry00_->xytemp[k1][l0][
i][j] - entry00_->xytemp[
k0][l0][
i][j])
1295 + adcota_*(
float)(entry01_->xytemp[
k0][l0][
i][j] - entry00_->xytemp[
k0][l0][
i][j])
1296 + adcotb_*(
float)(entry10_->xytemp[
k0][l0][
i][j] - entry00_->xytemp[
k0][l0][
i][j]);
1303 for(
int n=1; n<
BYM3; ++
n) {
1306 for(
int m=1; m<
BXM3; ++
m) {
1307 dxytempdy[1][
m][
n] += dxytempdy[1][
m][n+1];
1311 for(
int m=1; m<
BXM3; ++
m) {
1312 dxytempdy[1][
m][
i] = dxytempdy[1][
m][
i+1];
1320 for(
int m=1; m<
BXM3; ++
m) {
1323 for(
int n=1; n<
BYM3; ++
n) {
1324 dxytempdy[1][
m][
n] += dxytempdy[1][m+1][
n];
1327 for(
int j=m+1; j<
BXM3; ++j) {
1328 for(
int n=1; n<
BYM3; ++
n) {
1329 dxytempdy[1][j][
n] = dxytempdy[1][j+1][
n];
1337 pixy = (
int)floorf((yhit-deltaxy[1])/ysize_);
1338 dy = (yhit-deltaxy[1])-(pixy+0.5
f)*ysize_;
1339 if(flip_y_) {dy = -
dy;}
1340 k0 = (
int)(dy/ysize_*6.
f+3.5
f);
1343 ddy = 6.f*dy/ysize_ - (k0-3);
1345 if(ddy > 0.
f) {k1 = k0 + 1;
if(k1 > 6) k1 = k0-1;}
else {k1 = k0 - 1;
if(k1 < 0) k1 = k0+1;}
1357 deltay = pixy -
T2HY;
1361 for(
int j=jmin_; j<=jmax_; ++j) {
1363 if(flip_x_) {jflipx=
T2XSIZE-1-j; m = deltax+jflipx;}
else {m = deltax+j;}
1364 for(
int i=imin_;
i<=imax_; ++
i) {
1365 if(flip_y_) {iflipy=
T2YSIZE-1-
i; n = deltay+iflipy;}
else {n = deltay+
i;}
1366 if(m>=0 && m<=BXM3 && n>=0 && n<=BYM3) {
1367 dxytempdy[0][
m][
n] = (
float)entry00_->xytemp[k0][l0][
i][j]
1368 + adx*(
float)(entry00_->xytemp[
k0][l1][
i][j] - entry00_->xytemp[
k0][l0][
i][j])
1369 + ady*(
float)(entry00_->xytemp[k1][l0][
i][j] - entry00_->xytemp[
k0][l0][
i][j])
1370 + adcota_*(
float)(entry01_->xytemp[
k0][l0][
i][j] - entry00_->xytemp[
k0][l0][
i][j])
1371 + adcotb_*(
float)(entry10_->xytemp[
k0][l0][
i][j] - entry00_->xytemp[
k0][l0][
i][j]);
1378 for(
int n=1; n<
BYM3; ++
n) {
1381 for(
int m=1; m<
BXM3; ++
m) {
1382 dxytempdy[0][
m][
n] += dxytempdy[0][
m][n+1];
1386 for(
int m=1; m<
BXM3; ++
m) {
1387 dxytempdy[0][
m][
i] = dxytempdy[0][
m][
i+1];
1395 for(
int m=1; m<
BXM3; ++
m) {
1398 for(
int n=1; n<
BYM3; ++
n) {
1399 dxytempdy[0][
m][
n] += dxytempdy[0][m+1][
n];
1402 for(
int j=m+1; j<
BXM3; ++j) {
1403 for(
int n=1; n<
BYM3; ++
n) {
1404 dxytempdy[0][j][
n] = dxytempdy[0][j+1][
n];
1412 for(
int n=1; n<
BYM3; ++
n) {
1413 for(
int m=1; m<
BXM3; ++
m) {
1414 dpdx2d[1][
m][
n] = (dxytempdy[1][
m][
n] - dxytempdy[0][
m][
n])/(2.*deltaxy[1]);
1437 bool derivatives =
false;
1464 bool derivatives =
false;
1468 if(cotbeta < 0.
f) {locBx = -1.f;}
1469 float locBz = locBx;
1470 if(cotalpha < 0.
f) {locBz = -locBx;}
1474 yd[0] =
false; yd[BYM2-1] =
false;
1475 for(
int i=0;
i<
TYSIZE; ++
i) { yd[
i+1] = ydouble[
i];}
1476 xd[0] =
false; xd[
BXM2-1] =
false;
1477 for(
int j=0; j<
TXSIZE; ++j) { xd[j+1] = xdouble[j];}
1504 float sigi, sigi2, sigi3, sigi4, qscale, err2, err00;
1508 #ifndef SI_PIXEL_TEMPLATE_STANDALONE 1509 if(index < 1 || index >=
BYM2) {
1510 throw cms::Exception(
"DataCorrupt") <<
"SiPixelTemplate2D::ysigma2 called with index = " << index << std::endl;
1513 assert(index > 0 && index <
BYM2);
1520 if(qpixel < sxymax_) {
1525 qscale = qpixel/sxymax_;
1527 sigi2 = sigi*sigi; sigi3 = sigi2*sigi; sigi4 = sigi3*sigi;
1529 err00 = xypary0x0_[0][0]+xypary0x0_[0][1]*sigi+xypary0x0_[0][2]*sigi2+xypary0x0_[0][3]*sigi3+xypary0x0_[0][4]*sigi4;
1531 +adcota_*(xypary0x1_[0][0]+xypary0x1_[0][1]*sigi+xypary0x1_[0][2]*sigi2+xypary0x1_[0][3]*sigi3+xypary0x1_[0][4]*sigi4 - err00)
1532 +adcotb_*(xypary1x0_[0][0]+xypary1x0_[0][1]*sigi+xypary1x0_[0][2]*sigi2+xypary1x0_[0][3]*sigi3+xypary1x0_[0][4]*sigi4 - err00);
1534 err00 = xypary0x0_[1][0]+xypary0x0_[1][1]*sigi+xypary0x0_[1][2]*sigi2+xypary0x0_[1][3]*sigi3+xypary0x0_[1][4]*sigi4;
1536 +adcota_*(xypary0x1_[1][0]+xypary0x1_[1][1]*sigi+xypary0x1_[1][2]*sigi2+xypary0x1_[1][3]*sigi3+xypary0x1_[1][4]*sigi4 - err00)
1537 +adcotb_*(xypary1x0_[1][0]+xypary1x0_[1][1]*sigi+xypary1x0_[1][2]*sigi2+xypary1x0_[1][3]*sigi3+xypary1x0_[1][4]*sigi4 - err00);
1539 xysig2 =qscale*err2;
1540 if(xysig2 <= 0.
f) {xysig2 = s50_*s50_;}
1555 for(
int i=0;
i<2; ++
i) {
1556 for(
int j=0; j<5; ++j) {
1557 lanpar[
i][j] = lanpar_[
i][j];
float pixmax
maximum charge for individual pixels in cluster
float qavg
average cluster charge for this set of track angles
bool xytemp(float xhit, float yhit, bool ydouble[21+2], bool xdouble[13+2], float template2d[13+2][21+2], bool dervatives, float dpdx2d[2][13+2][21+2], float &QTemplate)
int runnum
< Basic template entry corresponding to a single set of track angles
SiPixelTemplateHeader2D head
< template storage structure
void xysigma2(float qpixel, int index, float &xysig2)
float clsleny
cluster y-length in pixels at signal height symax/2
float sxymax
average pixel signal for use of the error parameterization
float xypar[2][5]
pixel uncertainty parameterization
std::vector< float > sVector() const
float scaleyavg
average y-error scale factor
float delyavg
average length difference between template and cluster
float delysig
rms of length difference between template and cluster
SiPixelTemplateEntry2D ** entry
use 2d entry to store BPix and FPix entries [dynamically allocated]
float cotbeta
cot(beta) is proportional to cluster length in y and is basis of interpolation
int iymax
the maximum nonzero pixel yindex in template (saves time during interpolation)
int iymin
the minimum nonzero pixel yindex in template (saves time during interpolation)
short int xytemp[7][7][21][7]
templates for y-reconstruction (binned over 1 central pixel)
float mpvvav
most probable charge in Vavilov distribution (not actually for larger kappa)
float scalex[4]
x-error scale factor in 4 charge bins
int jxmax
the maximum nonzero pixel xindex in template (saves time during interpolation)
float lanpar[2][5]
pixel landau distribution parameters
float costrk[3]
direction cosines of tracks used to generate this entry
float offsetx[4]
x-offset in 4 charge bins
int jxmin
the minimum nonzero pixel xindex in template (saves time during interpolation)
float sigmavav
"sigma" scale fctor for Vavilov distribution
float cotalpha
cot(alpha) is proportional to cluster length in x and is basis of interpolation
bool interpolate(int id, float cotalpha, float cotbeta, float locBz, float locBx)
float offsety[4]
y-offset in 4 charge bins
float chi2scale
scale factor for the chi2 distribution
float clslenx
cluster x-length in pixels at signal height sxmax/2
void incrementIndex(int i)
static bool pushfile(int filenum, std::vector< SiPixelTemplateStore2D > &pixelTemp, std::string dir="")
float scalexavg
average x-error scale factor
float scaley[4]
y-error scale factor in 4 charge bins
void landau_par(float lanpar[2][5])
Return the Landau probability parameters for this set of cot(alpha, cot(beta)
std::string fullPath() const
float chi2ppix
average chi^2 per pixel
void sideload(SiPixelTemplateEntry2D *entry, int iDtype, float locBx, float locBz, float lorwdy, float lorwdx, float q50, float fbin[3], float xsize, float ysize, float zsize)
float kappavav
kappa parameter for Vavilov distribution