1#include "SpectralFitter.h"
3SpectralFitter::SpectralFitter(std::vector<double> &spectrum,
4 std::vector<std::vector<double>> &pool)
5 : _spectrum(spectrum), _pool(pool) {}
7void SpectralFitter::fitSpectrum() {
13 unsigned int npool = _pool.size();
14 unsigned int nspectrum = _spectrum.size();
16 double **nnlsMatrix =
new double *[npool];
18 double yArray[nspectrum];
20 if (_uncertainties.size() == nspectrum) {
21 for (
size_t i = 0; i < npool; i++) {
23 nnlsMatrix[i] =
new double[nspectrum];
25 for (
size_t j = 0; j < nspectrum; j++) {
27 nnlsMatrix[i][j] = _pool[i][j] / _uncertainties[j];
31 for (
size_t i = 0; i < nspectrum; i++) {
33 yArray[i] = _spectrum[i] / _uncertainties[i];
36 for (
size_t i = 0; i < npool; i++) {
38 nnlsMatrix[i] =
new double[nspectrum];
40 for (
size_t j = 0; j < nspectrum; j++) {
42 nnlsMatrix[i][j] = _pool[i][j];
46 for (
size_t i = 0; i < nspectrum; i++) {
48 yArray[i] = _spectrum[i];
52 double X[npool], ZZ[nspectrum], W[npool];
56 nnls(nnlsMatrix, nspectrum, npool, yArray, X, &_norm, W, ZZ, idx);
58 for (
const auto &value : X) {
60 _weights.push_back(value);
63 for (
size_t i = 0; i < npool; i++) {
65 delete[] nnlsMatrix[i];
71const std::vector<unsigned int> &SpectralFitter::getNonZeroIndices() {
73 if (_indices.size() > 0) {
79 for (
auto value : _weights) {
83 _indices.push_back(i);