24 #include "isoSpec++.h"
27 #define ISOSPEC_INIT_TABLE_SIZE 16
29 #define ISOSPEC_INIT_TABLE_SIZE 1024
57 sorted_by_mass(
false),
58 sorted_by_prob(
false),
68 FixedEnvelope(
double* masses,
double* probs,
size_t confs_no,
bool masses_sorted =
false,
bool probs_sorted =
false,
double _total_prob = NAN);
80 inline size_t confs_no()
const {
return _confs_no; }
81 inline int getAllDim()
const {
return allDim; }
83 inline const double* masses()
const {
return _masses; }
84 inline const double* probs()
const {
return _probs; }
85 inline const int* confs()
const {
return _confs; }
87 inline double* release_masses() {
double* ret = _masses; _masses =
nullptr;
return ret; }
88 inline double* release_probs() {
double* ret = _probs; _probs =
nullptr;
return ret; }
89 inline int* release_confs() {
int* ret = _confs; _confs =
nullptr;
return ret; }
92 inline double mass(
size_t i)
const {
return _masses[i]; }
93 inline double prob(
size_t i)
const {
return _probs[i]; }
94 inline const int* conf(
size_t i)
const {
return _confs + i*allDim; }
99 double get_total_prob();
100 void scale(
double factor);
103 double empiric_average_mass();
104 double empiric_variance();
105 double empiric_stddev() {
return sqrt(empiric_variance()); }
110 static FixedEnvelope LinearCombination(
const std::vector<const FixedEnvelope*>& spectra,
const std::vector<double>& intensities);
114 FixedEnvelope bin(
double bin_width = 1.0,
double middle = 0.0);
117 void sort_by(
double* order);
121 template<
typename T,
bool tgetConfs> ISOSPEC_FORCE_INLINE
void store_conf(
const T& generator)
123 *tmasses = generator.mass(); tmasses++;
124 *tprobs = generator.prob(); tprobs++;
125 constexpr_if(tgetConfs) { generator.get_conf_signature(tconfs); tconfs += allDim; }
128 ISOSPEC_FORCE_INLINE
void store_conf(
double _mass,
double _prob)
130 if(_confs_no == current_size)
131 reallocate_memory<false>(current_size*2);
141 template<
bool tgetConfs> ISOSPEC_FORCE_INLINE
void swap(
size_t idx1,
size_t idx2, ISOSPEC_MAYBE_UNUSED
int* conf_swapspace)
143 std::swap<double>(this->_probs[idx1], this->_probs[idx2]);
144 std::swap<double>(this->_masses[idx1], this->_masses[idx2]);
145 constexpr_if(tgetConfs)
147 int* c1 = this->_confs + (idx1*this->allDim);
148 int* c2 = this->_confs + (idx2*this->allDim);
149 memcpy(conf_swapspace, c1, this->allDimSizeofInt);
150 memcpy(c1, c2, this->allDimSizeofInt);
151 memcpy(c2, conf_swapspace, this->allDimSizeofInt);
155 template<
bool tgetConfs>
void reallocate_memory(
size_t new_size);
156 void slow_reallocate_memory(
size_t new_size);
159 template<
bool tgetConfs>
void threshold_init(
Iso&& iso,
double threshold,
bool absolute);
161 template<
bool tgetConfs,
typename GenType = IsoLayeredGenerator>
void addConfILG(
const GenType& generator)
163 if(this->_confs_no == this->current_size)
164 this->
template reallocate_memory<tgetConfs>(this->current_size*2);
166 this->
template store_conf<GenType, tgetConfs>(generator);
170 template<
bool tgetConfs>
void total_prob_init(
Iso&& iso,
double target_prob,
bool trim);
172 static FixedEnvelope FromThreshold(
Iso&& iso,
double threshold,
bool absolute,
bool tgetConfs =
false)
177 ret.threshold_init<
true>(std::move(iso), threshold, absolute);
179 ret.threshold_init<
false>(std::move(iso), threshold, absolute);
183 inline static FixedEnvelope FromThreshold(
const Iso& iso,
double _threshold,
bool _absolute,
bool tgetConfs =
false)
185 return FromThreshold(
Iso(iso,
false), _threshold, _absolute, tgetConfs);
188 static FixedEnvelope FromTotalProb(
Iso&& iso,
double target_total_prob,
bool optimize,
bool tgetConfs =
false)
193 ret.total_prob_init<
true>(std::move(iso), target_total_prob, optimize);
195 ret.total_prob_init<
false>(std::move(iso), target_total_prob, optimize);
200 inline static FixedEnvelope FromTotalProb(
const Iso& iso,
double _target_total_prob,
bool _optimize,
bool tgetConfs =
false)
202 return FromTotalProb(
Iso(iso,
false), _target_total_prob, _optimize, tgetConfs);
205 template<
bool tgetConfs>
void stochastic_init(
Iso&& iso,
size_t _no_molecules,
double _precision,
double _beta_bias);
207 inline static FixedEnvelope FromStochastic(
Iso&& iso,
size_t _no_molecules,
double _precision = 0.9999,
double _beta_bias = 5.0,
bool tgetConfs =
false)
212 ret.stochastic_init<
true>(std::move(iso), _no_molecules, _precision, _beta_bias);
214 ret.stochastic_init<
false>(std::move(iso), _no_molecules, _precision, _beta_bias);
219 static FixedEnvelope FromStochastic(
const Iso& iso,
size_t _no_molecules,
double _precision = 0.9999,
double _beta_bias = 5.0,
bool tgetConfs =
false)
221 return FromStochastic(
Iso(iso,
false), _no_molecules, _precision, _beta_bias, tgetConfs);
224 static FixedEnvelope Binned(
Iso&& iso,
double target_total_prob,
double bin_width,
double bin_middle = 0.0);
225 static FixedEnvelope Binned(
const Iso& iso,
double target_total_prob,
double bin_width,
double bin_middle = 0.0)
227 return Binned(
Iso(iso,
false), target_total_prob, bin_width, bin_middle);