From 2ce99c3f0bab1e83b23fdaa0c60169c3490150d2 Mon Sep 17 00:00:00 2001 From: maria Date: Tue, 19 Feb 2019 20:17:11 +0100 Subject: [PATCH] slim nnlsWork_ --- .../HcalRecAlgos/interface/MahiFit.h | 14 --- RecoLocalCalo/HcalRecAlgos/src/MahiFit.cc | 91 ++++++++++--------- 2 files changed, 47 insertions(+), 58 deletions(-) diff --git a/RecoLocalCalo/HcalRecAlgos/interface/MahiFit.h b/RecoLocalCalo/HcalRecAlgos/interface/MahiFit.h index 5c41c6487eb72..15c20a82b6aff 100644 --- a/RecoLocalCalo/HcalRecAlgos/interface/MahiFit.h +++ b/RecoLocalCalo/HcalRecAlgos/interface/MahiFit.h @@ -30,9 +30,6 @@ struct MahiNnlsWorkspace { //holds data samples SampleVector amplitudes; - //holds inverse covariance matrix - SampleMatrix invCovMat; - //holds diagonal noise terms SampleVector noiseTerms; @@ -49,30 +46,19 @@ struct MahiNnlsWorkspace { //holds full pulse shape derivatives std::array pulseDerivArray; - //holders for calculating pulse shape & covariance matrices - std::array pulseN; - std::array pulseM; - std::array pulseP; - //holds matrix of pulse shape templates for each BX SamplePulseMatrix pulseMat; //holds matrix of pulse shape derivatives for each BX SamplePulseMatrix pulseDerivMat; - //holds residual vector - PulseVector residuals; - //for FNNLS algorithm unsigned int nP; PulseVector ampVec; - PulseVector ampvecpermtest; - SamplePulseMatrix invcovp; PulseMatrix aTaMat; // A-transpose A (matrix) PulseVector aTbVec; // A-transpose b (vector) - PulseVector updateWork; // w (vector) SampleDecompLLT covDecomp; PulseDecompLDLT pulseDecomp; diff --git a/RecoLocalCalo/HcalRecAlgos/src/MahiFit.cc b/RecoLocalCalo/HcalRecAlgos/src/MahiFit.cc index 4e3247e4d8557..75233cb8a5ad9 100644 --- a/RecoLocalCalo/HcalRecAlgos/src/MahiFit.cc +++ b/RecoLocalCalo/HcalRecAlgos/src/MahiFit.cc @@ -155,9 +155,6 @@ void MahiFit::doFit(std::array &correctedOutput, int nbx) const { if (dynamicPed_) nnlsWork_.bxs[nnlsWork_.nPulseTot-1] = pedestalBX_; nnlsWork_.pulseMat.setZero(nnlsWork_.tsSize,nnlsWork_.nPulseTot); - nnlsWork_.invcovp.setZero(nnlsWork_.tsSize,nnlsWork_.nPulseTot); - nnlsWork_.ampVec.setZero(nnlsWork_.nPulseTot); - nnlsWork_.ampvecpermtest.setZero(nnlsWork_.nPulseTot); int offset=0; for (unsigned int iBX=0; iBX &correctedOutput, int nbx) const { } } - nnlsWork_.aTaMat.setZero(nnlsWork_.nPulseTot, nnlsWork_.nPulseTot); - nnlsWork_.aTbVec.setZero(nnlsWork_.nPulseTot); - nnlsWork_.updateWork.setZero(nnlsWork_.nPulseTot); - double chiSq = minimize(); bool foundintime = false; @@ -213,6 +206,12 @@ void MahiFit::doFit(std::array &correctedOutput, int nbx) const { double MahiFit::minimize() const { + nnlsWork_.invcovp.setZero(nnlsWork_.tsSize,nnlsWork_.nPulseTot); + nnlsWork_.ampVec.setZero(nnlsWork_.nPulseTot); + nnlsWork_.aTaMat.setZero(nnlsWork_.nPulseTot, nnlsWork_.nPulseTot); + nnlsWork_.aTbVec.setZero(nnlsWork_.nPulseTot); + + double oldChiSq=9999; double chiSq=oldChiSq; @@ -254,22 +253,26 @@ void MahiFit::updatePulseShape(double itQ, FullSampleVector &pulseShape, FullSam else t0+=hcalTimeSlewDelay_->delay(float(itQ),slewFlavor_); } - nnlsWork_.pulseN.fill(0); - nnlsWork_.pulseM.fill(0); - nnlsWork_.pulseP.fill(0); + std::array pulseN; + std::array pulseM; + std::array pulseP; + + pulseN.fill(0); + pulseM.fill(0); + pulseP.fill(0); const double xx[4]={t0, 1.0, 0.0, 3}; const double xxm[4]={-nnlsWork_.dt+t0, 1.0, 0.0, 3}; const double xxp[4]={ nnlsWork_.dt+t0, 1.0, 0.0, 3}; psfPtr_->singlePulseShapeFuncMahi(&xx[0]); - psfPtr_->getPulseShape(nnlsWork_.pulseN); + psfPtr_->getPulseShape(pulseN); psfPtr_->singlePulseShapeFuncMahi(&xxm[0]); - psfPtr_->getPulseShape(nnlsWork_.pulseM); + psfPtr_->getPulseShape(pulseM); psfPtr_->singlePulseShapeFuncMahi(&xxp[0]); - psfPtr_->getPulseShape(nnlsWork_.pulseP); + psfPtr_->getPulseShape(pulseP); //in the 2018+ case where the sample of interest (SOI) is in TS3, add an extra offset to align //with previous SOI=TS4 case assumed by psfPtr_->getPulseShape() @@ -279,18 +282,18 @@ void MahiFit::updatePulseShape(double itQ, FullSampleVector &pulseShape, FullSam for (unsigned int iTS=0; iTStimeLimit_) ? timeLimit_ : ((t<-timeLimit_) ? -timeLimit_ : t); @@ -354,6 +356,13 @@ float MahiFit::calculateArrivalTime() const { void MahiFit::nnls() const { const unsigned int npulse = nnlsWork_.nPulseTot; + const unsigned int nsamples = nnlsWork_.tsSize; + + PulseVector updateWork; + updateWork.setZero(npulse); + + PulseVector ampvecpermtest; + ampvecpermtest.setZero(npulse); nnlsWork_.invcovp = nnlsWork_.covDecomp.matrixL().solve(nnlsWork_.pulseMat); nnlsWork_.aTaMat = nnlsWork_.invcovp.transpose().lazyProduct(nnlsWork_.invcovp); @@ -368,14 +377,14 @@ void MahiFit::nnls() const { while (true) { if (iter>0 || nnlsWork_.nP==0) { - if ( nnlsWork_.nP==std::min(npulse, nnlsWork_.tsSize)) break; + if ( nnlsWork_.nP==std::min(npulse, nsamples)) break; const unsigned int nActive = npulse - nnlsWork_.nP; - nnlsWork_.updateWork = nnlsWork_.aTbVec - nnlsWork_.aTaMat*nnlsWork_.ampVec; + updateWork = nnlsWork_.aTbVec - nnlsWork_.aTaMat*nnlsWork_.ampVec; Index idxwmaxprev = idxwmax; double wmaxprev = wmax; - wmax = nnlsWork_.updateWork.tail(nActive).maxCoeff(&idxwmax); + wmax = updateWork.tail(nActive).maxCoeff(&idxwmax); if (wmax 0); + positive &= (ampvecpermtest(i) > 0); if (positive) { - nnlsWork_.ampVec.head(nnlsWork_.nP) = nnlsWork_.ampvecpermtest.head(nnlsWork_.nP); + nnlsWork_.ampVec.head(nnlsWork_.nP) = ampvecpermtest.head(nnlsWork_.nP); break; } @@ -413,16 +422,16 @@ void MahiFit::nnls() const { // no realizable optimization here (because it autovectorizes!) double minratio = std::numeric_limits::max(); for (unsigned int ipulse=0; ipulse