62 std::map<MzIntegrationParams::MzIntegrationParams::BinningType,
63 QString>::const_iterator the_iterator_const =
67 [text](
const std::pair<MzIntegrationParams::BinningType, QString> &pair) {
68 return pair.second == text;
72 return the_iterator_const->first;
94 bool remove_zero_val_data_points,
128 return mz_integration_params_p;
139 return initialization_result;
150 bool binning_type_set =
false;
151 bool decimal_places_set =
false;
152 bool bin_size_model_set =
false;
153 bool bin_size_divisor_set =
false;
154 bool remove_zero_data_points_set =
false;
156 QStringList string_list = text.split(
"\n");
158 for(
int iter = 0; iter < string_list.size(); ++iter)
160 QString iter_string = string_list.at(iter);
164 if(iter_string.contains(
"Binning type:"))
168 binning_type_set =
true;
170 else if(iter_string.contains(
"Bin size model:"))
174 bin_size_model_set =
true;
176 else if(iter_string.contains(
"Bin size divisor:"))
179 bin_size_divisor_set =
true;
181 else if(iter_string.contains(
"Decimal places:"))
184 decimal_places_set =
true;
186 else if(iter_string.contains(
"Remove 0-val data points:"))
189 remove_zero_data_points_set =
true;
199 if(bin_size_model_set)
201 if(bin_size_divisor_set)
203 if(decimal_places_set)
206 if(remove_zero_data_points_set)
209 return initialization_result;
217 int bin_size_divisor,
219 bool remove_zero_val_data_points,
252 Q_ASSERT(other_p !=
nullptr);
263 if(
static_cast<bool>(
264 initialization_results &
268 if(
static_cast<bool>(
269 initialization_results &
273 if(
static_cast<bool>(
274 initialization_results &
278 if(
static_cast<bool>(
279 initialization_results &
466 errors += (
m_smallestMz == std::numeric_limits<double>::max() ? 1 : 0);
471 errors += (
m_greatestMz == std::numeric_limits<double>::min() ? 1 : 0);
476 qCritical() <<
"The m/z integration parameters are invalid.";
485 return (
m_smallestMz < std::numeric_limits<double>::max()) &&
494 std::vector<double> bins;
508 qFatal() <<
"Programming error. "
509 "Please use the createBins(pappso::MassSpectrumCstSPtr "
510 "mass_spectrum_csp) overload.";
521 std::vector<double> bins;
552 qFatal() <<
"Programming error. The MzIntegrationParams::BinningLogic is "
553 "not valid, cannot create bins.";
557 qDebug() << qSetRealNumberPrecision(6) <<
"The smallest and greatest m/z values:" <<
m_smallestMz
578 std::vector<double> bins;
588 qDebug() << qSetRealNumberPrecision(6)
589 <<
"The indicative bin size is being used:" << bin_size;
593 double half_way_mz = 0;
597 <<
"half_way_mz:" << half_way_mz;
599 qDebug() << qSetRealNumberPrecision(6)
600 <<
"The m/z range half way strategy is being used for bin size:" << bin_size;
606 qDebug() << qSetRealNumberPrecision(6) <<
"The normally computed bin size:" << bin_size;
609 qDebug() << qSetRealNumberPrecision(6) <<
"The bin size was computed to be" << bin_size;
623 qDebug() <<
"With binSize" << bin_size
636 qDebug() << qSetRealNumberPrecision(10)
637 <<
"After having accounted for the decimals, new min/max values:"
638 <<
"Very first data point to start from:" << first_mz
639 <<
"Very last data point to reach: " << last_mz;
641 double previous_mz_bin;
652 bins.push_back(first_mz);
659 bins.push_back(bin_size);
660 previous_mz_bin = bin_size;
664 previous_mz_bin = first_mz;
676 while(previous_mz_bin <= last_mz)
699 if(current_rounded_mz == previous_mz_bin)
703 qDebug() <<
"It was required to increment decimal places to" <<
m_decimalPlaces;
708 qDebug().noquote() <<
"Because current rounded mz is equal to previous mz bin, we had to "
709 "increment decimal places by one while creating the bins "
710 "in MzIntegrationParams::BinningType::ARBITRARY mode.";
713 bins.push_back(current_rounded_mz);
720 previous_mz_bin = current_rounded_mz;
727 QString file_name =
"/tmp/massSpecArbitraryBins.txt-at-" +
728 QDateTime::currentDateTime().toString(
"yyyyMMdd-HH-mm-ss");
730 qDebug() <<
"Writing the list of bins setup in the mass spectrum in file " << file_name;
736 qDebug() <<
"Prepared " << bins.size() <<
"arbitrary bins starting with mz" << bins.front()
737 <<
"ending with mz" << bins.back();
755 QList<double> deltas;
756 QList<double> resolutions;
758 double left_mz_value = 0;
759 double right_mz_value = 0;
761 double resolution = 0;
764 if(mass_spectrum_csp->size() < 3)
766 std::vector<double> bins_vector(bins.constBegin(), bins.constEnd());
774 mass_spectrum_copy.
sortMz();
776 std::vector<pappso::DataPoint>::const_iterator iterator_const =
777 mass_spectrum_copy.cbegin();
780 left_mz_value = iterator_const->x;
786 qDebug() << qSetRealNumberPrecision(6)
787 <<
"left_mz_value in the template mass spectrum:" << left_mz_value;
789 bins.append(left_mz_value);
794 resolutions.append(0.0);
798 while(iterator_const != mass_spectrum_copy.cend())
800 right_mz_value = iterator_const->x;
802 qDebug() << qSetRealNumberPrecision(6)
803 <<
"right_mz_value:" << right_mz_value;
809 bins.append(right_mz_value);
811 mz_delta = right_mz_value - left_mz_value;
812 deltas.append(mz_delta);
813 Q_ASSERT(mz_delta != 0.0);
815 resolution = right_mz_value / mz_delta;
816 resolutions.append(resolution);
818 left_mz_value = right_mz_value;
828 std::vector<double> bins_vector(bins.constBegin(), bins.constEnd());
833 "/tmp/massSpecDataBasedTemplateBinsWithDeltas.txt-at-" +
834 QDateTime::currentDateTime().toString(
"yyyyMMdd-HH-mm-ss");
865 bool uniform_deltas =
false;
866 std::size_t deltas_count = deltas.size();
868 double first_delta = deltas.at(1);
869 double middle_delta = deltas.at(deltas_count / 2);
870 double last_delta = deltas.at(deltas_count - 1);
872 if(first_delta == middle_delta && middle_delta == last_delta)
873 uniform_deltas =
true;
881 bool uniform_resolutions =
false;
882 std::size_t resolutions_count = resolutions.size();
884 double first_resolution = resolutions.at(01);
885 double middle_resolution = resolutions.at(resolutions_count / 2);
886 double last_resolution = resolutions.at(resolutions_count - 1);
888 if(first_resolution == middle_resolution &&
889 middle_resolution == last_resolution)
890 uniform_resolutions =
true;
907 double first_bin_mz = bins.first();
908 double last_bin_mz = bins.last();
936 double bin_mz = first_bin_mz;
944 double new_bin_mz = bin_mz - first_delta;
945 bins.prepend(new_bin_mz);
949 else if(uniform_resolutions)
955 double new_bin_mz = bin_mz - (bin_mz / first_resolution);
956 bins.prepend(new_bin_mz);
974 double bin_mz = last_bin_mz;
982 double new_bin_mz = bin_mz + first_delta;
983 bins.append(new_bin_mz);
987 else if(uniform_resolutions)
993 double new_bin_mz = bin_mz + (bin_mz / first_resolution);
994 bins.append(new_bin_mz);
1005 std::vector<double> full_bins_vector(bins.constBegin(), bins.constEnd());
1011 file_name =
"/tmp/massSpecDataBasedFullBinsWithDeltas.txt-at-" +
1012 QDateTime::currentDateTime().toString(
"yyyyMMdd-HH-mm-ss");
1014 qDebug() <<
"Writing the list of bins setup in the mass spectrum in file "
1025 return full_bins_vector;
1036 std::vector<double> bins;
1038 if(mass_spectrum_csp->size() < 2)
1045 sorted_mass_spectrum.
sortMz();
1059 double start_mz_in = min_mz;
1065 std::vector<pappso::DataPoint>::const_iterator it =
1066 sorted_mass_spectrum.begin();
1068 double prev_mz = it->x;
1076 while(it != sorted_mass_spectrum.end())
1078 double next_mz = it->x;
1084 double step = next_mz - prev_mz;
1085 end_mz_out = start_mz_in + step;
1096 bins.push_back(start_mz_in);
1099 start_mz_in = end_mz_out;
1110 QString fileName =
"/tmp/massSpecDataBasedBins.txt";
1112 qDebug() <<
"Writing the list of bins setup in the "
1113 "mass spectrum in file "
1116 QFile file(fileName);
1117 file.open(QIODevice::WriteOnly);
1119 QTextStream fileStream(&file);
1121 for(
auto &&bin : m_bins)
1122 fileStream << QString(
"[%1-%2]\n")
1123 .arg(bin.startMzIn, 0,
'f', 10)
1124 .arg(bin.endMzOut, 0,
'f', 10);
1129 qDebug() <<
"elements."
1130 <<
"starting with mz" << m_bins.front().startMzIn <<
"ending with mz"
1131 << m_bins.back().endMzOut;
1145 QString offset_lead;
1147 for(
int iter = 0; iter < offset; ++iter)
1148 offset_lead += spacer;
1150 QString text = offset_lead;
1151 text +=
"m/z integration parameters:\n";
1153 QString new_lead = QString(
"%1%2").arg(offset_lead, spacer);
1158 QString::asprintf(
"Smallest (first) m/z: %.6f\n",
m_smallestMz));
1162 text.append(QString::asprintf(
"Greatest (last) m/z: %.6f\n",
m_greatestMz));
1165 text += QString(
"Remove 0-val data points: %1\n")
1169 text.append(
"Binning logic:\n");
1178 text.append(QString(
"Bin size model: %1\n").arg(
m_binSizeModel->toString()));
1198 text.append(QString(
"Bin size model: %1\n").arg(
m_binSizeModel->toString()));
1211 const std::vector<double> bins)
const
1213 QString bins_with_delta;
1214 double previous_bin_value = 0;
1216 for(
auto &&value : bins)
1218 double delta = value - previous_bin_value;
1219 bins_with_delta += QString(
"%1 - %2\n")
1222 previous_bin_value = value;
1225 return bins_with_delta;
Class to represent a mass spectrum.
void sortMz()
Sort the DataPoint instances of this spectrum.
The MzIntegrationParams class provides the parameters definining how m/z integrations must be perform...
void binSizeDivisorChanged()
int getDecimalPlaces() const
@ REMOVE_ZERO_DATA_POINTS
MzIntegrationParams(QObject *parent=nullptr)
void updateGreatestMz(double value)
void binSizeModelChanged()
int getBinSizeDivisor() const
double m_indicativeBinSize
BinningType m_binningType
void setIndicativeBinSize(double value)
InitializationResult initialize(const QString &text)
std::vector< double > createDataBasedBinsOld(pappso::MassSpectrumCstSPtr massSpectrum)
void setBinSizeModel(pappso::PrecisionPtr bin_size_model_p)
void setBinSizeDivisor(int divisor)
std::vector< double > createArbitraryBins()
double getIndicativeBinSize() const
void setGreatestMz(double value)
void setSmallestMz(double value)
QString binsToStringWithDeltas(const std::vector< double > bins) const
bool isRemoveZeroValDataPoints() const
double getSmallestMz() const
pappso::PrecisionPtr m_binSizeModel
void indicativeBinSizeChanged()
BinningType getBinningType() const
pappso::PrecisionPtr getBinSizeModel() const
bool hasValidMzRange() const
@ DATA_BASED
binning based on mass spectral data
@ ARBITRARY
binning based on arbitrary bin size value
void decimalPlacesChanged()
void removeZeroValDataPointsChanged()
void updateSmallestMz(double value)
void binningTypeChanged()
MzIntegrationParams * clone(QObject *parent=nullptr) const
void setMzValues(double smallest, double greatest)
bool m_removeZeroValDataPoints
void setBinningType(BinningType binningType)
void reset()
Reset the instance to default values.
std::vector< double > createDataBasedBins(pappso::MassSpectrumCstSPtr massSpectrum)
void setDecimalPlaces(int decimal_places)
std::vector< double > createBins()
void setRemoveZeroValDataPoints(bool removeOrNot=true)
virtual ~MzIntegrationParams()
double getGreatestMz() const
static PrecisionPtr getResInstance(pappso_double value)
get a resolution precision pointer
static PrecisionPtr fromString(const QString &str)
get a precision pointer from a string
static PrecisionPtr getPpmInstance(pappso_double value)
get a ppm precision pointer
static double roundValueToDecimalPlaces(double value, int decimal_places, bool round_up=true)
static bool writeToFile(const QString &text, const QString &file_name)
static int zeroDecimalsInValue(pappso_double value)
Determine the number of zero decimals between the decimal point and the first non-zero decimal.
tries to keep as much as possible monoisotopes, removing any possible C13 peaks and changes multichar...
MzIntegrationParams::BinningType getBinningTypeFromString(const QString &text)
std::map< MzIntegrationParams::BinningType, QString > binningTypeMap
Map relating the BinningType to a textual representation.
std::shared_ptr< const MassSpectrum > MassSpectrumCstSPtr
const PrecisionBase * PrecisionPtr