24 #include "isoSpec++.h"
26 #define ISOSPEC_INIT_TABLE_SIZE 1024
53 sorted_by_mass(
false),
54 sorted_by_prob(
false),
64 FixedEnvelope(
double* masses,
double* probs,
size_t confs_no,
bool masses_sorted =
false,
bool probs_sorted =
false,
double _total_prob = NAN);
76 inline size_t confs_no()
const {
return _confs_no; }
77 inline int getAllDim()
const {
return allDim; }
79 inline const double* masses()
const {
return _masses; }
80 inline const double* probs()
const {
return _probs; }
81 inline const int* confs()
const {
return _confs; }
83 inline double* release_masses() {
double* ret = _masses; _masses =
nullptr;
return ret; }
84 inline double* release_probs() {
double* ret = _probs; _probs =
nullptr;
return ret; }
85 inline int* release_confs() {
int* ret = _confs; _confs =
nullptr;
return ret; }
88 inline double mass(
size_t i)
const {
return _masses[i]; }
89 inline double prob(
size_t i)
const {
return _probs[i]; }
90 inline const int* conf(
size_t i)
const {
return _confs + i*allDim; }
95 double get_total_prob();
96 void scale(
double factor);
99 double empiric_average_mass();
100 double empiric_variance();
101 double empiric_stddev() {
return sqrt(empiric_variance()); }
106 static FixedEnvelope LinearCombination(
const std::vector<const FixedEnvelope*>& spectra,
const std::vector<double>& intensities);
110 FixedEnvelope bin(
double bin_width = 1.0,
double middle = 0.0);
113 void sort_by(
double* order);
117 template<
typename T,
bool tgetConfs> ISOSPEC_FORCE_INLINE
void store_conf(
const T& generator)
119 *tmasses = generator.mass(); tmasses++;
120 *tprobs = generator.prob(); tprobs++;
121 constexpr_if(tgetConfs) { generator.get_conf_signature(tconfs); tconfs += allDim; }
124 ISOSPEC_FORCE_INLINE
void store_conf(
double _mass,
double _prob)
126 if(_confs_no == current_size)
129 reallocate_memory<false>(current_size);
140 template<
bool tgetConfs> ISOSPEC_FORCE_INLINE
void swap(
size_t idx1,
size_t idx2, ISOSPEC_MAYBE_UNUSED
int* conf_swapspace)
142 std::swap<double>(this->_probs[idx1], this->_probs[idx2]);
143 std::swap<double>(this->_masses[idx1], this->_masses[idx2]);
144 constexpr_if(tgetConfs)
146 int* c1 = this->_confs + (idx1*this->allDim);
147 int* c2 = this->_confs + (idx2*this->allDim);
148 memcpy(conf_swapspace, c1, this->allDimSizeofInt);
149 memcpy(c1, c2, this->allDimSizeofInt);
150 memcpy(c2, conf_swapspace, this->allDimSizeofInt);
154 template<
bool tgetConfs>
void reallocate_memory(
size_t new_size);
155 void slow_reallocate_memory(
size_t new_size);
158 template<
bool tgetConfs>
void threshold_init(
Iso&& iso,
double threshold,
bool absolute);
162 if(this->_confs_no == this->current_size)
164 this->current_size *= 2;
165 this->
template reallocate_memory<tgetConfs>(this->current_size);
168 this->
template store_conf<IsoLayeredGenerator, tgetConfs>(generator);
172 template<
bool tgetConfs>
void total_prob_init(
Iso&& iso,
double target_prob,
bool trim);
174 static FixedEnvelope FromThreshold(
Iso&& iso,
double threshold,
bool absolute,
bool tgetConfs =
false)
179 ret.threshold_init<
true>(std::move(iso), threshold, absolute);
181 ret.threshold_init<
false>(std::move(iso), threshold, absolute);
185 inline static FixedEnvelope FromThreshold(
const Iso& iso,
double _threshold,
bool _absolute,
bool tgetConfs =
false)
187 return FromThreshold(
Iso(iso,
false), _threshold, _absolute, tgetConfs);
190 static FixedEnvelope FromTotalProb(
Iso&& iso,
double target_total_prob,
bool optimize,
bool tgetConfs =
false)
195 ret.total_prob_init<
true>(std::move(iso), target_total_prob, optimize);
197 ret.total_prob_init<
false>(std::move(iso), target_total_prob, optimize);
202 inline static FixedEnvelope FromTotalProb(
const Iso& iso,
double _target_total_prob,
bool _optimize,
bool tgetConfs =
false)
204 return FromTotalProb(
Iso(iso,
false), _target_total_prob, _optimize, tgetConfs);