diff --git a/basicmath.cpp b/basicmath.cpp index 53cab7387043f31a482acb0cf13433df206c1fca..1c0c4f6319f2a6a13c7badf8e9011e3a3b2e7aae 100644 --- a/basicmath.cpp +++ b/basicmath.cpp @@ -49,6 +49,12 @@ std::complex<fvalue> eis::absGrad(const std::vector<eis::DataPoint>& data, size_ std::abs((data[index+1].im.imag()-data[index-1].im.imag())/(data[index+1].omega-data[index-1].omega))); } +void mulitplyAdd(std::vector<eis::DataPoint>& data, fvalue mult, fvalue add) +{ + for(eis::DataPoint& point : data) + point.im = point.im*mult + add; +} + fvalue eis::grad(const std::vector<fvalue>& data, const std::vector<fvalue>& omega, size_t index) { assert(data.size() == omega.size()); @@ -197,6 +203,28 @@ fvalue eis::pearsonCorrelation(const std::vector<eis::DataPoint>& data) return sumDeltaReDeltaIm/(sqrt(sumDeltaReSq)*sqrt(sumDeltaImSq)); } + +fvalue eis::nonConstantScore(const std::vector<eis::DataPoint>& data) +{ + std::complex<fvalue> meanValue = mean(data); + + fvalue reDeviationMax = std::numeric_limits<fvalue>::min(); + fvalue imDeviationMax = std::numeric_limits<fvalue>::min(); + + for(const eis::DataPoint& point : data) + { + fvalue reDeviation = 1-(std::abs(point.im.real())/std::abs(meanValue.real())); + fvalue imDeviation = 1-(std::abs(point.im.imag())/std::abs(meanValue.imag())); + + if(reDeviationMax < reDeviation) + reDeviationMax = reDeviation; + if(imDeviationMax < imDeviation) + imDeviationMax = imDeviation; + } + + return std::min(reDeviationMax, imDeviationMax); +} + fvalue eis::nyquistAreaVariance(const std::vector<eis::DataPoint>& data, eis::DataPoint* centroid) { assert(data.size() > 2); diff --git a/eisgenerator/basicmath.h b/eisgenerator/basicmath.h index a05377ac78a503c28bea5d8c9ea295fca5dec667..23792e2b486542b241b21479363e7ec1c79cf72c 100644 --- a/eisgenerator/basicmath.h +++ b/eisgenerator/basicmath.h @@ -30,6 +30,8 @@ namespace eis * @{ */ + void mulitplyAdd(std::vector<eis::DataPoint>& data, fvalue mult, fvalue add); + /** * @brief Calculates the element wise absolute gradient at the given point of the data given. * @@ -117,6 +119,8 @@ namespace eis */ fvalue pearsonCorrelation(const std::vector<eis::DataPoint>& data); + fvalue nonConstantScore(const std::vector<eis::DataPoint>& data); + /** * @brief Calculates the variance of the distance of the data from a centroid in the nyquist plane. * diff --git a/model.cpp b/model.cpp index c172bff8513cb581688a792117b95d5af81a8c74..6dedc7de4144b3b39d53bd5700a9235d46f21f39 100644 --- a/model.cpp +++ b/model.cpp @@ -576,6 +576,14 @@ std::vector<size_t> Model::getRecommendedParamIndices(eis::Range omegaRange, dou continue; } + fvalue nonConstantess = std::abs(pearsonCorrelation(data)); + if(nonConstantess < 0.1) + { + eis::Log(eis::Log::DEBUG)<<"skipping output for step "<<i + <<" as data is too constant: "<<nonConstantess; + continue; + } + std::vector<std::vector<eis::DataPoint>>::iterator search; if(threaded) {