CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Types | Public Member Functions | Protected Member Functions | Protected Attributes
PulseChiSqSNNLS Class Reference

#include <PulseChiSqSNNLS.h>

Public Types

typedef BXVector::Index Index
 

Public Member Functions

const BXVectorBXs () const
 
double ChiSq () const
 
void disableErrorCalculation ()
 
bool DoFit (const SampleVector &samples, const SampleMatrix &samplecor, double pederr, const BXVector &bxs, const FullSampleVector &fullpulse, const FullSampleMatrix &fullpulsecov)
 
const PulseVectorErrors () const
 
const SampleMatrixinvcov () const
 
 PulseChiSqSNNLS ()
 
const SamplePulseMatrixpulsemat () const
 
void setMaxIters (int n)
 
void setMaxIterWarnings (bool b)
 
const PulseVectorX () const
 
 ~PulseChiSqSNNLS ()
 

Protected Member Functions

double ComputeApproxUncertainty (unsigned int ipulse)
 
double ComputeChiSq ()
 
bool Minimize (const SampleMatrix &samplecor, double pederr, const FullSampleMatrix &fullpulsecov)
 
bool NNLS ()
 
bool OnePulseMinimize ()
 
bool updateCov (const SampleMatrix &samplecor, double pederr, const FullSampleMatrix &fullpulsecov)
 

Protected Attributes

PulseVector _ampvec
 
PulseVector _ampvecmin
 
BXVector _bxs
 
BXVector _bxsmin
 
double _chisq
 
bool _computeErrors
 
SampleDecompLLT _covdecomp
 
SampleMatrix _covdecompLinv
 
PulseVector _errvec
 
SampleMatrix _invcov
 
int _maxiters
 
bool _maxiterwarnings
 
unsigned int _nP
 
unsigned int _npulsetot
 
PulseDecompLDLT _pulsedecomp
 
SamplePulseMatrix _pulsemat
 
SampleVector _sampvec
 
PulseMatrix _topleft_work
 
PulseVector ampvecpermtest
 
PulseMatrix aTamat
 
PulseVector aTbvec
 
SamplePulseMatrix invcovp
 
PulseVector updatework
 
PulseVector wvec
 

Detailed Description

Definition at line 10 of file PulseChiSqSNNLS.h.

Member Typedef Documentation

typedef BXVector::Index PulseChiSqSNNLS::Index

Definition at line 13 of file PulseChiSqSNNLS.h.

Constructor & Destructor Documentation

PulseChiSqSNNLS::PulseChiSqSNNLS ( )

Definition at line 75 of file PulseChiSqSNNLS.cc.

75  :
76  _chisq(0.),
77  _computeErrors(true),
78  _maxiters(50),
79  _maxiterwarnings(true)
80 {
81 
82  Eigen::initParallel();
83 
84 }
PulseChiSqSNNLS::~PulseChiSqSNNLS ( )

Definition at line 86 of file PulseChiSqSNNLS.cc.

86  {
87 
88 }

Member Function Documentation

const BXVector& PulseChiSqSNNLS::BXs ( void  ) const
inline

Definition at line 26 of file PulseChiSqSNNLS.h.

References _bxsmin.

Referenced by EcalUncalibRecHitMultiFitAlgo::makeRecHit().

26 { return _bxsmin; }
double PulseChiSqSNNLS::ChiSq ( ) const
inline

Definition at line 28 of file PulseChiSqSNNLS.h.

References _chisq.

Referenced by EcalUncalibRecHitMultiFitAlgo::makeRecHit().

28 { return _chisq; }
double PulseChiSqSNNLS::ComputeApproxUncertainty ( unsigned int  ipulse)
protected

Definition at line 282 of file PulseChiSqSNNLS.cc.

References _covdecomp, and _pulsemat.

Referenced by DoFit().

282  {
283  //compute approximate uncertainties
284  //(using 1/second derivative since full Hessian is not meaningful in
285  //presence of positive amplitude boundaries.)
286 
287  return 1./_covdecomp.matrixL().solve(_pulsemat.col(ipulse)).norm();
288 
289 }
SamplePulseMatrix _pulsemat
SampleDecompLLT _covdecomp
double PulseChiSqSNNLS::ComputeChiSq ( )
protected

Definition at line 273 of file PulseChiSqSNNLS.cc.

References _ampvec, _covdecomp, _pulsemat, and _sampvec.

Referenced by DoFit(), and Minimize().

273  {
274 
275 // SampleVector resvec = _pulsemat*_ampvec - _sampvec;
276 // return resvec.transpose()*_covdecomp.solve(resvec);
277 
278  return _covdecomp.matrixL().solve(_pulsemat*_ampvec - _sampvec).squaredNorm();
279 
280 }
SamplePulseMatrix _pulsemat
SampleDecompLLT _covdecomp
SampleVector _sampvec
PulseVector _ampvec
void PulseChiSqSNNLS::disableErrorCalculation ( )
inline
bool PulseChiSqSNNLS::DoFit ( const SampleVector samples,
const SampleMatrix samplecor,
double  pederr,
const BXVector bxs,
const FullSampleVector fullpulse,
const FullSampleMatrix fullpulsecov 
)

Definition at line 90 of file PulseChiSqSNNLS.cc.

References _ampvec, _ampvecmin, _bxs, _bxsmin, _chisq, _computeErrors, _errvec, _nP, _npulsetot, _pulsemat, _sampvec, funct::abs(), aTamat, ComputeApproxUncertainty(), ComputeChiSq(), bookConverter::max, Minimize(), hltrates_dqm_sourceclient-live_cfg::offset, mathSSE::sqrt(), ntuplemaker::status, std::swap(), and wvec.

Referenced by EcalUncalibRecHitMultiFitAlgo::makeRecHit().

90  {
91 
92  //const unsigned int nsample = SampleVector::RowsAtCompileTime;
93  _npulsetot = bxs.rows();
94  //const unsigned int npulse = bxs.rows();
95 
96  _sampvec = samples;
97  _bxs = bxs;
98 
99  //_pulsemat = SamplePulseMatrix::Zero(nsample,npulse);
100  _pulsemat.resize(Eigen::NoChange,_npulsetot);
101  _ampvec = PulseVector::Zero(_npulsetot);
102  _errvec = PulseVector::Zero(_npulsetot);
103  _nP = 0;
104  _chisq = 0.;
105 
106  if (_bxs.rows()==1) {
107  _ampvec.coeffRef(0) = _sampvec.coeff(_bxs.coeff(0) + 5);
108  }
109 
110  aTamat.resize(_npulsetot,_npulsetot);
111  wvec.resize(_npulsetot);
112 
113  //initialize pulse template matrix
114  for (unsigned int ipulse=0; ipulse<_npulsetot; ++ipulse) {
115  int bx = _bxs.coeff(ipulse);
116  //int firstsamplet = std::max(0,bx + 3);
117  int offset = 7-3-bx;
118 
119  //const unsigned int nsamplepulse = nsample-firstsamplet;
120  //_pulsemat.col(ipulse).segment(firstsamplet,nsamplepulse) = fullpulse.segment(firstsamplet+offset,nsamplepulse);
121 
122  _pulsemat.col(ipulse) = fullpulse.segment<SampleVector::RowsAtCompileTime>(offset);
123  }
124 
125  //do the actual fit
126  bool status = Minimize(samplecor,pederr,fullpulsecov);
128  _bxsmin = _bxs;
129 
130  if (!status) return status;
131 
132  if(!_computeErrors) return status;
133 
134  //compute MINOS-like uncertainties for in-time amplitude
135  bool foundintime = false;
136  unsigned int ipulseintime = 0;
137  for (unsigned int ipulse=0; ipulse<_npulsetot; ++ipulse) {
138  if (_bxs.coeff(ipulse)==0) {
139  ipulseintime = ipulse;
140  foundintime = true;
141  break;
142  }
143  }
144  if (!foundintime) return status;
145 
146  const unsigned int ipulseintimemin = ipulseintime;
147 
148  double approxerr = ComputeApproxUncertainty(ipulseintime);
149  double chisq0 = _chisq;
150  double x0 = _ampvecmin[ipulseintime];
151 
152  //move in time pulse first to active set if necessary
153  if (ipulseintime<_nP) {
154  _pulsemat.col(_nP-1).swap(_pulsemat.col(ipulseintime));
155  std::swap(_ampvec.coeffRef(_nP-1),_ampvec.coeffRef(ipulseintime));
156  std::swap(_bxs.coeffRef(_nP-1),_bxs.coeffRef(ipulseintime));
157  ipulseintime = _nP - 1;
158  --_nP;
159  }
160 
161 
162  SampleVector pulseintime = _pulsemat.col(ipulseintime);
163  _pulsemat.col(ipulseintime).setZero();
164 
165  //two point interpolation for upper uncertainty when amplitude is away from boundary
166  double xplus100 = x0 + approxerr;
167  _ampvec.coeffRef(ipulseintime) = xplus100;
168  _sampvec = samples - _ampvec.coeff(ipulseintime)*pulseintime;
169  status &= Minimize(samplecor,pederr,fullpulsecov);
170  if (!status) return status;
171  double chisqplus100 = ComputeChiSq();
172 
173  double sigmaplus = std::abs(xplus100-x0)/sqrt(chisqplus100-chisq0);
174 
175  //if amplitude is sufficiently far from the boundary, compute also the lower uncertainty and average them
176  if ( (x0/sigmaplus) > 0.5 ) {
177  for (unsigned int ipulse=0; ipulse<_npulsetot; ++ipulse) {
178  if (_bxs.coeff(ipulse)==0) {
179  ipulseintime = ipulse;
180  break;
181  }
182  }
183  double xminus100 = std::max(0.,x0-approxerr);
184  _ampvec.coeffRef(ipulseintime) = xminus100;
185  _sampvec = samples - _ampvec.coeff(ipulseintime)*pulseintime;
186  status &= Minimize(samplecor,pederr,fullpulsecov);
187  if (!status) return status;
188  double chisqminus100 = ComputeChiSq();
189 
190  double sigmaminus = std::abs(xminus100-x0)/sqrt(chisqminus100-chisq0);
191  _errvec[ipulseintimemin] = 0.5*(sigmaplus + sigmaminus);
192 
193  }
194  else {
195  _errvec[ipulseintimemin] = sigmaplus;
196  }
197 
198  _chisq = chisq0;
199 
200  return status;
201 
202 }
PulseMatrix aTamat
unsigned int _npulsetot
unsigned int _nP
PulseVector _ampvecmin
Eigen::Matrix< double, 10, 1 > SampleVector
SamplePulseMatrix _pulsemat
double ComputeApproxUncertainty(unsigned int ipulse)
void swap(edm::DataFrameContainer &lhs, edm::DataFrameContainer &rhs)
T sqrt(T t)
Definition: SSEVec.h:18
PulseVector wvec
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
SampleVector _sampvec
bool Minimize(const SampleMatrix &samplecor, double pederr, const FullSampleMatrix &fullpulsecov)
PulseVector _errvec
tuple status
Definition: ntuplemaker.py:245
PulseVector _ampvec
const PulseVector& PulseChiSqSNNLS::Errors ( ) const
inline

Definition at line 25 of file PulseChiSqSNNLS.h.

References _errvec.

Referenced by EcalUncalibRecHitMultiFitAlgo::makeRecHit().

25 { return _errvec; }
PulseVector _errvec
const SampleMatrix& PulseChiSqSNNLS::invcov ( ) const
inline

Definition at line 22 of file PulseChiSqSNNLS.h.

References _invcov.

22 { return _invcov; }
SampleMatrix _invcov
bool PulseChiSqSNNLS::Minimize ( const SampleMatrix samplecor,
double  pederr,
const FullSampleMatrix fullpulsecov 
)
protected

Definition at line 204 of file PulseChiSqSNNLS.cc.

References _bxs, _chisq, _maxiters, _maxiterwarnings, funct::abs(), ComputeChiSq(), alignCSCRings::e, NNLS(), OnePulseMinimize(), ntuplemaker::status, and updateCov().

Referenced by DoFit().

204  {
205 
206  const unsigned int npulse = _bxs.rows();
207 
208  int iter = 0;
209  bool status = false;
210  while (true) {
211 
212  if (iter>=_maxiters) {
213  if (_maxiterwarnings) {
214  edm::LogWarning("PulseChiSqSNNLS::Minimize") << "Max Iterations reached at iter " << iter << std::endl;
215  }
216  break;
217  }
218 
219  status = updateCov(samplecor,pederr,fullpulsecov);
220  if (!status) break;
221  if (npulse>1) {
222  status = NNLS();
223  }
224  else {
225  //special case for one pulse fit (performance optimized)
226  status = OnePulseMinimize();
227  }
228  if (!status) break;
229 
230  double chisqnow = ComputeChiSq();
231  double deltachisq = chisqnow-_chisq;
232 
233  _chisq = chisqnow;
234  if (std::abs(deltachisq)<1e-3) {
235  break;
236  }
237  ++iter;
238  }
239 
240  return status;
241 
242 }
bool updateCov(const SampleMatrix &samplecor, double pederr, const FullSampleMatrix &fullpulsecov)
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
tuple status
Definition: ntuplemaker.py:245
bool PulseChiSqSNNLS::NNLS ( )
protected

Definition at line 291 of file PulseChiSqSNNLS.cc.

References _ampvec, _bxs, _covdecomp, _nP, _pulsemat, _sampvec, ampvecpermtest, aTamat, aTbvec, alignCSCRings::e, eigen_solve_submatrix(), invcovp, bookConverter::max, std::swap(), dtDQMClient_cfg::threshold, updatework, and wvec.

Referenced by Minimize().

291  {
292 
293  //Fast NNLS (fnnls) algorithm as per http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.157.9203&rep=rep1&type=pdf
294 
295  const unsigned int npulse = _bxs.rows();
296 
297  invcovp = _covdecomp.matrixL().solve(_pulsemat);
298  aTamat = invcovp.transpose()*invcovp; //.triangularView<Eigen::Lower>()
299  //aTamat = aTamat.selfadjointView<Eigen::Lower>();
300  aTbvec = invcovp.transpose()*_covdecomp.matrixL().solve(_sampvec);
301 
302  int iter = 0;
303  Index idxwmax = 0;
304  double wmax = 0.0;
305  double threshold = 1e-11;
306  //work = PulseVector::zeros();
307  while (true) {
308  //can only perform this step if solution is guaranteed viable
309  if (iter>0 || _nP==0) {
310  if ( _nP==npulse ) break;
311 
312  const unsigned int nActive = npulse - _nP;
313 
315  Index idxwmaxprev = idxwmax;
316  double wmaxprev = wmax;
317  wmax = updatework.tail(nActive).maxCoeff(&idxwmax);
318 
319  //convergence
320  if (wmax<threshold || (idxwmax==idxwmaxprev && wmax==wmaxprev)) break;
321 
322  //worst case protection
323  if (iter>=500) {
324  edm::LogWarning("PulseChiSqSNNLS::NNLS()") << "Max Iterations reached at iter " << iter << std::endl;
325  break;
326  }
327 
328  //unconstrain parameter
329  Index idxp = _nP + idxwmax;
330  //printf("adding index %i, orig index %i\n",int(idxp),int(_bxs.coeff(idxp)));
331  aTamat.col(_nP).swap(aTamat.col(idxp));
332  aTamat.row(_nP).swap(aTamat.row(idxp));
333  _pulsemat.col(_nP).swap(_pulsemat.col(idxp));
334  std::swap(aTbvec.coeffRef(_nP),aTbvec.coeffRef(idxp));
335  std::swap(_ampvec.coeffRef(_nP),_ampvec.coeffRef(idxp));
336  std::swap(_bxs.coeffRef(_nP),_bxs.coeffRef(idxp));
337 
338  // update now that we are done doing work
339  wvec.tail(nActive) = updatework.tail(nActive);
340  ++_nP;
341  }
342 
343 
344  while (true) {
345  //printf("iter in, idxsP = %i\n",int(_idxsP.size()));
346 
347  if (_nP==0) break;
348 
350 
351  //solve for unconstrained parameters
352  //need to have specialized function to call optimized versions
353  // of matrix solver... this is truly amazing...
355 
356  //check solution
357  auto ampvecpermhead = ampvecpermtest.head(_nP);
358  if ( ampvecpermhead.minCoeff()>0. ) {
359  _ampvec.head(_nP) = ampvecpermhead.head(_nP);
360  break;
361  }
362 
363  //update parameter vector
364  Index minratioidx=0;
365 
366  // no realizable optimization here (because it autovectorizes!)
367  double minratio = std::numeric_limits<double>::max();
368  for (unsigned int ipulse=0; ipulse<_nP; ++ipulse) {
369  if (ampvecpermtest.coeff(ipulse)<=0.) {
370  const double c_ampvec = _ampvec.coeff(ipulse);
371  const double ratio = c_ampvec/(c_ampvec-ampvecpermtest.coeff(ipulse));
372  if (ratio<minratio) {
373  minratio = ratio;
374  minratioidx = ipulse;
375  }
376  }
377  }
378 
379  _ampvec.head(_nP) += minratio*(ampvecpermhead - _ampvec.head(_nP));
380 
381  //avoid numerical problems with later ==0. check
382  _ampvec.coeffRef(minratioidx) = 0.;
383 
384  //printf("removing index %i, orig idx %i\n",int(minratioidx),int(_bxs.coeff(minratioidx)));
385  aTamat.col(_nP-1).swap(aTamat.col(minratioidx));
386  aTamat.row(_nP-1).swap(aTamat.row(minratioidx));
387  _pulsemat.col(_nP-1).swap(_pulsemat.col(minratioidx));
388  std::swap(aTbvec.coeffRef(_nP-1),aTbvec.coeffRef(minratioidx));
389  std::swap(_ampvec.coeffRef(_nP-1),_ampvec.coeffRef(minratioidx));
390  std::swap(_bxs.coeffRef(_nP-1),_bxs.coeffRef(minratioidx));
391  --_nP;
392  }
393  ++iter;
394 
395  //adaptive convergence threshold to avoid infinite loops but still
396  //ensure best value is used
397  if (iter%50==0) {
398  threshold *= 10.;
399  }
400  }
401 
402  return true;
403 
404 
405 }
PulseMatrix aTamat
unsigned int _nP
PulseVector aTbvec
PulseVector ampvecpermtest
SamplePulseMatrix _pulsemat
void swap(edm::DataFrameContainer &lhs, edm::DataFrameContainer &rhs)
SampleDecompLLT _covdecomp
PulseVector wvec
PulseVector updatework
SampleVector _sampvec
void eigen_solve_submatrix(PulseMatrix &mat, PulseVector &invec, PulseVector &outvec, unsigned NP)
BXVector::Index Index
SamplePulseMatrix invcovp
PulseVector _ampvec
bool PulseChiSqSNNLS::OnePulseMinimize ( )
protected

Definition at line 407 of file PulseChiSqSNNLS.cc.

References _ampvec, _covdecomp, _pulsemat, _sampvec, invcovp, and bookConverter::max.

Referenced by Minimize().

407  {
408 
409  //Fast NNLS (fnnls) algorithm as per http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.157.9203&rep=rep1&type=pdf
410 
411 // const unsigned int npulse = 1;
412 
413  invcovp = _covdecomp.matrixL().solve(_pulsemat);
414 // aTamat = invcovp.transpose()*invcovp;
415 // aTbvec = invcovp.transpose()*_covdecomp.matrixL().solve(_sampvec);
416 
417  SingleMatrix aTamatval = invcovp.transpose()*invcovp;
418  SingleVector aTbvecval = invcovp.transpose()*_covdecomp.matrixL().solve(_sampvec);
419  _ampvec.coeffRef(0) = std::max(0.,aTbvecval.coeff(0)/aTamatval.coeff(0));
420 
421  return true;
422 
423 }
SamplePulseMatrix _pulsemat
Eigen::Matrix< double, 1, 1 > SingleVector
SampleDecompLLT _covdecomp
SampleVector _sampvec
Eigen::Matrix< double, 1, 1 > SingleMatrix
SamplePulseMatrix invcovp
PulseVector _ampvec
const SamplePulseMatrix& PulseChiSqSNNLS::pulsemat ( ) const
inline

Definition at line 21 of file PulseChiSqSNNLS.h.

References _pulsemat.

21 { return _pulsemat; }
SamplePulseMatrix _pulsemat
void PulseChiSqSNNLS::setMaxIters ( int  n)
inline

Definition at line 30 of file PulseChiSqSNNLS.h.

References _maxiters, and gen::n.

Referenced by EcalUncalibRecHitMultiFitAlgo::EcalUncalibRecHitMultiFitAlgo().

void PulseChiSqSNNLS::setMaxIterWarnings ( bool  b)
inline

Definition at line 31 of file PulseChiSqSNNLS.h.

References _maxiterwarnings, and b.

Referenced by EcalUncalibRecHitMultiFitAlgo::EcalUncalibRecHitMultiFitAlgo().

31 { _maxiterwarnings = b;}
double b
Definition: hdecay.h:120
bool PulseChiSqSNNLS::updateCov ( const SampleMatrix samplecor,
double  pederr,
const FullSampleMatrix fullpulsecov 
)
protected

Definition at line 244 of file PulseChiSqSNNLS.cc.

References _ampvec, _bxs, _covdecomp, _invcov, bookConverter::max, hltrates_dqm_sourceclient-live_cfg::offset, and ntuplemaker::status.

Referenced by Minimize().

244  {
245 
246  const unsigned int nsample = SampleVector::RowsAtCompileTime;
247  const unsigned int npulse = _bxs.rows();
248 
249  const double pederr2 = pederr*pederr;
250  _invcov = pederr2*samplecor; //
251 
252  for (unsigned int ipulse=0; ipulse<npulse; ++ipulse) {
253  if (_ampvec.coeff(ipulse)==0.) continue;
254  int bx = _bxs.coeff(ipulse);
255  int firstsamplet = std::max(0,bx + 3);
256  int offset = 7-3-bx;
257 
258  const double ampveccoef = _ampvec.coeff(ipulse);
259  const double ampsq = ampveccoef*ampveccoef;
260 
261  const unsigned int nsamplepulse = nsample-firstsamplet;
262  _invcov.block(firstsamplet,firstsamplet,nsamplepulse,nsamplepulse) +=
263  ampsq*fullpulsecov.block(firstsamplet+offset,firstsamplet+offset,nsamplepulse,nsamplepulse);
264  }
265 
266  _covdecomp.compute(_invcov);
267 
268  bool status = true;
269  return status;
270 
271 }
SampleDecompLLT _covdecomp
SampleMatrix _invcov
tuple status
Definition: ntuplemaker.py:245
PulseVector _ampvec
const PulseVector& PulseChiSqSNNLS::X ( ) const
inline

Definition at line 24 of file PulseChiSqSNNLS.h.

References _ampvecmin.

Referenced by svgfig.Curve.Sample::__repr__(), and EcalUncalibRecHitMultiFitAlgo::makeRecHit().

24 { return _ampvecmin; }
PulseVector _ampvecmin

Member Data Documentation

PulseVector PulseChiSqSNNLS::_ampvec
protected

Definition at line 46 of file PulseChiSqSNNLS.h.

Referenced by ComputeChiSq(), DoFit(), NNLS(), OnePulseMinimize(), and updateCov().

PulseVector PulseChiSqSNNLS::_ampvecmin
protected

Definition at line 48 of file PulseChiSqSNNLS.h.

Referenced by DoFit(), and X().

BXVector PulseChiSqSNNLS::_bxs
protected

Definition at line 55 of file PulseChiSqSNNLS.h.

Referenced by DoFit(), Minimize(), NNLS(), and updateCov().

BXVector PulseChiSqSNNLS::_bxsmin
protected

Definition at line 56 of file PulseChiSqSNNLS.h.

Referenced by BXs(), and DoFit().

double PulseChiSqSNNLS::_chisq
protected

Definition at line 68 of file PulseChiSqSNNLS.h.

Referenced by ChiSq(), DoFit(), and Minimize().

bool PulseChiSqSNNLS::_computeErrors
protected

Definition at line 69 of file PulseChiSqSNNLS.h.

Referenced by disableErrorCalculation(), and DoFit().

SampleDecompLLT PulseChiSqSNNLS::_covdecomp
protected
SampleMatrix PulseChiSqSNNLS::_covdecompLinv
protected

Definition at line 51 of file PulseChiSqSNNLS.h.

PulseVector PulseChiSqSNNLS::_errvec
protected

Definition at line 47 of file PulseChiSqSNNLS.h.

Referenced by DoFit(), and Errors().

SampleMatrix PulseChiSqSNNLS::_invcov
protected

Definition at line 44 of file PulseChiSqSNNLS.h.

Referenced by invcov(), and updateCov().

int PulseChiSqSNNLS::_maxiters
protected

Definition at line 70 of file PulseChiSqSNNLS.h.

Referenced by Minimize(), and setMaxIters().

bool PulseChiSqSNNLS::_maxiterwarnings
protected

Definition at line 71 of file PulseChiSqSNNLS.h.

Referenced by Minimize(), and setMaxIterWarnings().

unsigned int PulseChiSqSNNLS::_nP
protected

Definition at line 58 of file PulseChiSqSNNLS.h.

Referenced by DoFit(), and NNLS().

unsigned int PulseChiSqSNNLS::_npulsetot
protected

Definition at line 57 of file PulseChiSqSNNLS.h.

Referenced by DoFit().

PulseDecompLDLT PulseChiSqSNNLS::_pulsedecomp
protected

Definition at line 53 of file PulseChiSqSNNLS.h.

SamplePulseMatrix PulseChiSqSNNLS::_pulsemat
protected
SampleVector PulseChiSqSNNLS::_sampvec
protected

Definition at line 43 of file PulseChiSqSNNLS.h.

Referenced by ComputeChiSq(), DoFit(), NNLS(), and OnePulseMinimize().

PulseMatrix PulseChiSqSNNLS::_topleft_work
protected

Definition at line 52 of file PulseChiSqSNNLS.h.

PulseVector PulseChiSqSNNLS::ampvecpermtest
protected

Definition at line 66 of file PulseChiSqSNNLS.h.

Referenced by NNLS().

PulseMatrix PulseChiSqSNNLS::aTamat
protected

Definition at line 61 of file PulseChiSqSNNLS.h.

Referenced by DoFit(), and NNLS().

PulseVector PulseChiSqSNNLS::aTbvec
protected

Definition at line 62 of file PulseChiSqSNNLS.h.

Referenced by NNLS().

SamplePulseMatrix PulseChiSqSNNLS::invcovp
protected

Definition at line 60 of file PulseChiSqSNNLS.h.

Referenced by NNLS(), and OnePulseMinimize().

PulseVector PulseChiSqSNNLS::updatework
protected

Definition at line 64 of file PulseChiSqSNNLS.h.

Referenced by NNLS().

PulseVector PulseChiSqSNNLS::wvec
protected

Definition at line 63 of file PulseChiSqSNNLS.h.

Referenced by DoFit(), and NNLS().