15 #include <CLHEP/Matrix/Matrix.h>
16 #include <CLHEP/Matrix/Vector.h>
19 #include "boost/io/ios_state.hpp"
25 int &bCr,
int &eCr,
int &nShape,
int &inShape, std::vector<double> &Shape,
bool lDebug)
26 : m_ind2icrMap(), m_icr2indMap() {
43 std::cout <<
" TileFilterManager constructor. NParamMax =" <<
m_nParamMax <<
", Ndig =" <<
m_nDig << std::endl;
63 std::cout <<
" Number of digits read =" <<
m_nDig <<
" . In-time digit has idig=" <<
m_inTdig <<
"." << std::endl;
65 for (
int icr = 0; icr <
m_nCross; icr++) {
76 std::cout <<
" Index =" <<
ind <<
" crossing # =" << icr <<
", displacement from InTdig =" << kdisp
77 <<
" crossings." << std::endl;
85 double * Xshape =
new double[
m_nDig];
86 for (
int idig = 0; idig <
m_nDig; idig++) {
87 int k = OffSet - icr + idig;
90 Xshape[idig] = Shape[
k];
96 boost::io::ios_base_all_saver coutsave(std::cout);
97 std::cout <<
" TileFilterManager: ShapingMatrix. Nshape=" <<
m_nShape <<
", InTshape=" <<
m_inTshape <<
", Ndig="
101 std::cout <<
" ind=" <<
ind <<
" Shape=";
102 for (
int idig = 0; idig <
m_nDig; idig++) {
103 std::cout <<
" " << std::setw(6) << std::setprecision(3) << Xshape[idig];
105 std::cout << std::endl;
111 std::vector<int> Crossings;
114 for (
int ipile = 0; ipile < NampMax; ipile++) {
117 std::cout <<
" Crossing configurations for Nparam=" << ipile + 2 <<
", Npileup=" << ipile <<
": " << Nmax
118 <<
" configurations." << std::endl;
119 for (
int iconfig = 0; iconfig < Nmax; iconfig++) {
122 int nParam = ipile + 2;
124 int ncr = Crossings.size();
126 std::cout <<
" Npile=" << std::setw(2) << ipile <<
", iconfig=" << std::setw(3) << iconfig <<
" (kF="
127 << std::setw(3) << kFitIndex <<
") => Vcross=";
128 for (
int icr = 0; icr < ncr; icr++) {
129 std::cout <<
" " << std::setw(3) << Crossings[icr];
131 std::cout << std::endl;
172 std::cout <<
" ERROR in TileFitDigits !! Fmode =" <<
m_filterMode << std::endl;
183 CLHEP::HepVector& digits = tResult.
getDigRef();
186 CLHEP::HepVector& residuals = tResult.
getResidRef();
208 double rchisq = 999.;
213 std::cout <<
" FilterManager.FitDigits1, while loop. Npar=" << Npar <<
", NParamMax=" <<
m_nParamMax << std::endl;
214 int iret = tResult.
addCross(jparam);
223 std::vector<TileFitter>& vFitter =
m_vNpFitter[Npar - 2];
225 (void) tileFitter.
fitAmp(tResult,
false);
227 rchisq = chisqRef / (
m_nDig - Npar);
244 int Namp = vcross.size();
245 for (
int i = 1;
i < Namp;
i++) {
246 if (vcross[
i] == jparam) ldup =
true;
253 double chi = ((jcross < 0) ? 0.0 : residuals[jcross] / digSigma);
260 std::cout <<
" End of loop. icode =" << icode <<
", Npar=" << Npar << std::endl;
273 CLHEP::HepVector& digits = tResult.
getDigRef();
275 CLHEP::HepVector& fitErr = tResult.
getErrRef();
283 boost::io::ios_base_all_saver coutsave(std::cout);
285 std::cout <<
" digits=";
287 std::cout <<
" " << std::setw(6) << std::setprecision(2) << digits[
i];
289 std::cout << std::endl;
294 for (
int iamp = 0; iamp < Namp; iamp++) {
314 std::cout <<
" FilterManager.FitDigits2, while loop. Npar=" << Npar <<
", NParamMax=" <<
m_nParamMax << std::endl;
317 if (
m_debug) std::cout <<
" Npar=" << Npar <<
", iFitIndex=" << iFitIndex << std::endl;
318 std::vector<TileFitter>& vFitter =
m_vNpFitter[Npar - 2];
321 tileFitter.
fitAmp(tResult,
false);
332 double chiAmp[Ndim] = {0};
333 int iAmp[Ndim] = {0};
335 for (
int i = 2;
i < Npar;
i++) {
336 chiAmp[Npile] = fitAmp[
i] / fitErr[
i];
337 iAmp[Npile] = vcross[
i - 1];
339 std::cout <<
" set chiAmp: i=" <<
i <<
", iAmp=" << iAmp[Npile] <<
", chi=" << chiAmp[Npile] << std::endl;
345 while (ndrop < ndropMax) {
346 if (
m_debug) std::cout <<
" top of drop loop. ndrop=" << ndrop <<
", Npass=" << Npass << std::endl;
350 for (
int i = 0;
i < Npile;
i++) {
351 if (iAmp[
i] < 0)
continue;
352 if (chiAmp[
i] > chiMin)
continue;
358 std::cout <<
" end of Npile loop. idrop=" << idrop <<
", crdrop=" << crdrop <<
", ndrop=" << ndrop
363 iAmp[idrop] = -iAmp[idrop];
366 std::cout <<
" ndrop=" << ndrop <<
", idrop=" << idrop <<
", crdrop=" << crdrop <<
", chiMin=" << chiMin
372 if (
m_debug) std::cout <<
"FitDig2: Npass=" << Npass <<
", ndrop=" << ndrop << std::endl;
374 if (
m_debug) std::cout <<
" have fallen out of drop loop. ndrop=" << ndrop <<
", Npass=" << Npass << std::endl;
382 std::cout <<
" TileFilterManager: End of pass loop. icode =" << icode <<
", Npar=" << Npar <<
", Npass=" << Npass
393 double ampMax = -999.;
394 for (
int icr = 0; icr <
m_nCross; icr++) {
395 if (digits[icr] > ampMax) {
397 ampMax = digits[icr];
407 double ampMin = +9999.;
408 for (
int icr = 0; icr <
m_nCross; icr++) {
410 if (digits[icr] < ampMin) {
412 ampMin = digits[icr];
424 int Npileup = NpileupMax;
426 std::cout <<
" Enter MakeFitterOffsetTables: Npileup=" << Npileup <<
", NampMax=" << NampMax <<
", Ncross="
447 for (
int ipile = 2; ipile < NampMax; ipile++) {
451 if (
index <= ipile) {
461 for (
int ipile = 0; ipile < NampMax; ipile++) {
464 if (ipile <= 1) Nmax = Offset[
m_nCross - 1] + 1;
474 std::cout <<
" *** TileFilter Offset table for Npileup=" << Npileup <<
" and Ncross=" <<
m_nCross << std::endl;
475 for (
int ipile = 0; ipile < NampMax; ipile++) {
477 std::cout <<
" ipile=" << std::setw(3) << ipile <<
": Offsets = ";
479 std::cout <<
" " << std::setw(3) << Offset[
index];
481 std::cout <<
"; NfitIndex=" << std::setw(3) <<
m_nFitIndex[ipile] << std::endl;
492 int Namp = vcross.size();
493 int Nparam = Namp + 1;
495 for (
int idig = 0; idig <
m_nDig; idig++) {
499 for (
int ipar = 1; ipar < Nparam; ipar++) {
500 int jcr = vcross[ipar - 1];
502 for (
int idig = 0; idig <
m_nDig; idig++) {
503 SPD[ipar][idig] = Xshape[idig];
507 std::cout <<
" Make SPD for NP=" << Nparam <<
", vcross=";
508 for (
int iamp = 0; iamp < Namp; iamp++) {
509 std::cout <<
" " << vcross[iamp];
511 std::cout << std::endl;
512 for (
int ipar = 0; ipar < Nparam; ipar++) {
513 std::cout <<
" ip=" << ipar <<
" SPD=";
514 for (
int idig = 0; idig <
m_nDig; idig++) {
515 std::cout <<
" " << SPD[ipar][idig];
517 std::cout << std::endl;
528 std::cout <<
" TileFilterManager::MakeFitterArrays. Will print out first matrix "
529 <<
"only for each vFitter vector (one for each value of Nparam)." << std::endl;
532 for (
int iamp = 0; iamp < NampMax; iamp++) {
533 int Nparam = iamp + 2;
536 std::cout <<
" ===> Nparam=" << Nparam <<
" => Nindex=" << Nindex <<
" TileFitter objects:" << std::endl;
537 std::vector<TileFitter> vFitter(Nindex);
541 std::vector<int> vcross;
543 CLHEP::HepMatrix SPD(Nparam,
m_nDig);
547 if (Nparam >
m_nDig - 1) Icon = 1;
548 if (Nparam >
m_nDig) Icon = 2;
550 vFitter[
index] = *tileFitter;
577 int kconfig = iconfig;
579 for (
int ipile = nPileup; ipile > -1; ipile--) {
581 for (
int icross = icrmax; icross >= 0; icross--) {
584 if (Offset[icross] <= kconfig) {
587 kconfig = kconfig - Offset[icross];
588 vcross.push_back(icr);
592 std::cout <<
" ERROR!! In getVcross, kconfig=" << kconfig << std::endl;
596 sort(vcross.begin(), vcross.end());
606 int Namp = nParam - 1;
608 std::cout <<
" TileFilterManager.getFitIndex called when Nparam=" << nParam << std::endl;
610 for (
int ipar = 0; ipar < Namp; ipar++) {
612 int jcr = vcross[ipar];
613 Index += Offset[jcr];
631 int ipile = nParam - 2;
632 std::vector<TileFitter>& vFitter =
m_vNpFitter[ipile];
634 std::vector<double>& fitErr = tileFitter.
getErr();