libpappsomspp
Library for mass spectrometry
Loading...
Searching...
No Matches
utils.cpp
Go to the documentation of this file.
1/*******************************************************************************
2 * Copyright (c) 2015 Olivier Langella <Olivier.Langella@moulon.inra.fr>.
3 *
4 * This file is part of the PAPPSOms++ library.
5 *
6 * PAPPSOms++ is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * PAPPSOms++ is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with PAPPSOms++. If not, see <http://www.gnu.org/licenses/>.
18 *
19 * Contributors:
20 * Olivier Langella <Olivier.Langella@moulon.inra.fr> - initial API and
21 *implementation
22 ******************************************************************************/
23
24/////////////////////// StdLib includes
25#include <cmath>
26
27
28/////////////////////// Qt includes
29#include <QDebug>
30#include <QFile>
31#include <QTextStream>
32#include <QJsonArray>
33
34
35/////////////////////// Local includes
36#include "pappsomspp/config.h"
37#include "utils.h"
39#include "types.h"
42
43
44namespace pappso
45{
46
47// Matches a double (decimal value, that is, m/z
48// value)
50 QRegularExpression("\\d*\\.?\\d+");
51
52// Matches anything that is not digit, '.', or '-'
53// (that is, matches a separator
54QRegularExpression Utils::anythingButDigitDotDash = QRegularExpression("[^\\d^\\.^-]+");
55
56// Matches a double (with exp notation
57// possibly) and also potentially a '-' sign. This is the intensity.
59 QRegularExpression("-?\\d*\\.?\\d*[e-]?\\d*");
60
61// Matches <number><separator><number>, that is: m/z<separator>intensity.
62QRegularExpression Utils::xyMassDataFormatRegExp =
63 // QRegularExpression("^(\\d*\\.?\\d+)([^\\d^\\.^-]+)(-?\\d*\\.?\\d*[e-]?\\d*)");
64 QRegularExpression(QString("^(%1)(%2)(%3)")
66 .arg(Utils::anythingButDigitDotDash.pattern())
68
69
70QRegularExpression Utils::endOfLineRegExp = QRegularExpression("^\\s+$");
71
72const QString
74{
75 int size = log10(num);
76 size += 97;
77 QLatin1Char latin1_char(size);
78 QString base(latin1_char);
79 base.append(QString().setNum(num));
80 return (base);
81}
82
83
84void
85Utils::writeLexicalOrderedString(QTextStream *p_out, unsigned int num)
86{
87 *p_out << (char)(log10(num) + 97) << num;
88}
89
90
91//! Determine the number of zero decimals between the decimal point and the
92//! first non-zero decimal.
93/*!
94 * 0.11 would return 0 (no empty decimal)
95 * 2.001 would return 2
96 * 1000.0001254 would return 3
97 *
98 * \param value the value to be analyzed
99 * \return the number of '0' decimals between the decimal separator '.' and
100 * the first non-0 decimal
101 */
102int
104{
105 // qDebug() << qSetRealNumberPrecision(10) << "Double value: " << value;
106
107 int intPart = static_cast<int>(value);
108
109 // qDebug() << "int part:" << intPart;
110
111 double decimalPart = value - intPart;
112
113 // qDebug() << qSetRealNumberPrecision(10) << "decimal part: " << decimalPart;
114
115 int count = 0;
116
117 while(decimalPart > 0)
118 {
119 ++count;
120
121 decimalPart *= 10;
122
123 // qDebug() << "Iteration " << count << "decimal part:" << decimalPart;
124
125 if(decimalPart >= 1)
126 {
127 // qDebug() << "Because decimal part " << decimalPart
128 //<< "is >= 1, breaking loop while count is " << count << ".";
129
130 break;
131 }
132 }
133
134 // qDebug() << "Returning count:" << count - 1;
135
136 return count - 1;
137}
138
139
141Utils::roundToDecimals(pappso_double value, int decimal_places)
142{
143 if(decimal_places < 0)
144 return value;
145
146 return ceil((value * pow(10, decimal_places)) - 0.49) / pow(10, decimal_places);
147}
148
149
150long long int
152{
153 pappso::pappso_double test_decimal = 100000000000;
154 if(sizeof(int *) == 4)
155 { // 32bits
156 test_decimal = 100000000;
157 }
158 return (floor(input * test_decimal));
159}
160
161
162// I think this is where the programs that I created for Win11 using MXE
163// crashed upon opening a mzML file. The crash occurred in pwizlite, but
164// my guess is that this is the function where we set the locale that makes
165// the program crash. Just to keep that in mind. Filippo Rusconi 20251209.
166std::string
167Utils::toUtf8StandardString(const QString &text)
168{
169 std::string env_backup;
170 try
171 {
172#ifdef MXE
173 // std::locale::global(std::locale("C")); // set locale to default locale
174 env_backup = std::setlocale(LC_ALL, nullptr);
175 std::setlocale(LC_ALL, "C");
176#else
177 std::locale::global(std::locale("C")); // set locale to default locale
178#endif
179 }
180 catch(std::exception &error)
181 {
183 QObject::tr("Error trying to set local to C : %1").arg(error.what()));
184 }
185 // Now perform the conversion.
186 QByteArray byte_array = text.toUtf8();
187 std::string stdText = "";
188
189 for(char c : byte_array)
190 {
191 stdText += c;
192 }
193
194 try
195 {
196#ifdef MXE
197 // std::locale::global(std::locale("C")); // set locale to default locale
198 std::setlocale(LC_ALL, env_backup.c_str());
199#else // Set back the locale to the backed-up one.
200 std::locale::global(std::locale("")); // sets locale according to OS environment
201#endif
202 }
203 catch(std::exception &error)
204 {
205
207 QObject::tr("Error trying to set local to original system one %1 : %2")
208 .arg(env_backup.c_str())
209 .arg(error.what()));
210 }
211
212 return stdText;
213}
214
215
216bool
217Utils::writeToFile(const QString &text, const QString &file_name)
218{
219
220 QFile file(file_name);
221
222 if(file.open(QFile::WriteOnly | QFile::Truncate))
223 {
224
225 QTextStream out(&file);
226
227 out << text;
228
229 out.flush();
230 file.close();
231
232 return true;
233 }
234
235 return false;
236}
237
238// Typically useful to debug bins...
239bool
240Utils::writeToFile(const std::vector<double> &data, int decimals, const QString &file_name)
241{
242 QFile file(file_name);
243
244 if(file.open(QFile::WriteOnly | QFile::Append))
245 {
246 file.open(QIODevice::WriteOnly);
247
248 QTextStream fileStream(&file);
249
250 for(auto &&value : data)
251 fileStream << QString("%1\n").arg(value, 0, 'f', decimals);
252
253 fileStream.flush();
254 file.close();
255
256 return true;
257 }
258
259 return false;
260}
261
262bool
263Utils::appendToFile(const QString &text, const QString &file_name)
264{
265
266 QFile file(file_name);
267
268 if(file.open(QFile::WriteOnly | QFile::Append))
269 {
270
271 QTextStream out(&file);
272
273 out << text;
274
275 out.flush();
276 file.close();
277
278 return true;
279 }
280
281 return false;
282}
283
284
285std::size_t
286Utils::extractScanNumberFromMzmlNativeId(const QString &spectrum_native_id)
287{
288 qDebug() << " " << spectrum_native_id;
289 QStringList native_id_list = spectrum_native_id.split("=");
290 if(native_id_list.size() < 2)
291 {
292 throw ExceptionNotFound(
293 QObject::tr("scan number not found in mzML native id %1").arg(spectrum_native_id));
294 }
295 else
296 {
297 /** TODO activate this in a future release to ensure scan number
298 for(auto i = 0; i < native_id_list.size(); i += 2)
299 {
300 if(native_id_list[i] == "scan")
301 {
302 return native_id_list[i + 1].toULong();
303 }
304 }
305
306 throw ExceptionNotFound(
307 QObject::tr("scan number not found in mzML native id %1")
308 .arg(spectrum_native_id));
309
310*/
311 return native_id_list.back().toULong();
312 }
313 return 0;
314}
315
316
317QString
318Utils::pointerToString(const void *const pointer)
319{
320 return QString("%1").arg((quintptr)pointer, QT_POINTER_SIZE * 2, 16, QChar('0'));
321}
322
323
324//! Tell if both double values, are equal within the double representation
325//! capabilities of the platform.
326bool
327Utils::almostEqual(double value1, double value2, int decimalPlaces)
328{
329 // QString value1String = QString("%1").arg(value1,
330 // 0, 'f', 60);
331 // QString value2String = QString("%1").arg(value2,
332 // 0, 'f', 60);
333
334 // qWarning() << __FILE__ << __LINE__ << __FUNCTION__
335 //<< "value1:" << value1String << "value2:" << value2String;
336
337 // The machine epsilon has to be scaled to the magnitude of the values used
338 // and multiplied by the desired precision in ULPs (units in the last place)
339 // (decimal places).
340
341 double valueSum = std::abs(value1 + value2);
342 // QString valueSumString = QString("%1").arg(valueSum,
343 // 0, 'f', 60);
344
345 double valueDiff = std::abs(value1 - value2);
346 // QString valueDiffString = QString("%1").arg(valueDiff,
347 // 0, 'f', 60);
348
349 double epsilon = std::numeric_limits<double>::epsilon();
350 // QString epsilonString = QString("%1").arg(epsilon,
351 // 0, 'f', 60);
352
353 double scaleFactor = epsilon * valueSum * decimalPlaces;
354 // QString scaleFactorString = QString("%1").arg(scaleFactor,
355 // 0, 'f', 60);
356
357 // qWarning() << "valueDiff:" << valueDiffString << "valueSum:" <<
358 // valueSumString <<
359 //"epsilon:" << epsilonString << "scaleFactor:" << scaleFactorString;
360
361 bool res = valueDiff < scaleFactor
362 // unless the result is subnormal:
363 || valueDiff < std::numeric_limits<double>::min();
364
365 // qWarning() << __FILE__ << __LINE__ << __FUNCTION__
366 //<< "returning res:" << res;
367
368 return res;
369}
370
371double
372Utils::roundValueToDecimalPlaces(double value, int decimal_places, bool round_up)
373{
374 if(decimal_places < 0)
375 return value;
376
377 double multiplier = std::pow(10.0, decimal_places);
378
379 if(round_up)
380 {
381 // Strict ceiling: round UP.
382 return std::ceil(value * multiplier) / multiplier;
383 }
384 else
385 {
386 // Add a tiny epsilon (1e-9) to counteract the "1.005" floating-point trap
387 return std::round(value * multiplier + 1e-9) / multiplier;
388 }
389}
390
391double
393{
394 return std::nextafter(value, value + 1);
395}
396
397
398QString
400 std::chrono::system_clock::time_point chrono_time)
401{
402
403 time_t tt;
404
405 tt = std::chrono::system_clock::to_time_t(chrono_time);
406
407 QString debug_text = QString("%1 - %2\n").arg(msg).arg(QString::fromLatin1(ctime(&tt)));
408
409 return debug_text;
410}
411
412
413QString
415 std::chrono::system_clock::time_point chrono_start,
416 std::chrono::system_clock::time_point chrono_finish)
417{
418 QString debug_text =
419 QString(
420 "%1 %2 min = %3 s = %4 ms = %5 "
421 "µs\n")
422 .arg(msg)
423 .arg(std::chrono::duration_cast<std::chrono::minutes>(chrono_finish - chrono_start).count())
424 .arg(std::chrono::duration_cast<std::chrono::seconds>(chrono_finish - chrono_start).count())
425 .arg(
426 std::chrono::duration_cast<std::chrono::milliseconds>(chrono_finish - chrono_start).count())
427 .arg(std::chrono::duration_cast<std::chrono::microseconds>(chrono_finish - chrono_start)
428 .count());
429
430 return debug_text;
431}
432
433
434std::vector<double>
435Utils::splitMzStringToDoubleVectorWithSpaces(const QString &text, std::size_t &error_count)
436{
437
438 QStringList string_list = text.split(QRegularExpression("[\\s]+"), Qt::SkipEmptyParts);
439
440 // qDebug() << "string list:" << string_list;
441
442 std::vector<double> double_vector;
443
444 for(int iter = 0; iter < string_list.size(); ++iter)
445 {
446 QString current_string = string_list.at(iter);
447
448 bool ok = false;
449
450 double current_double = current_string.toDouble(&ok);
451
452 if(!current_double && !ok)
453 {
454 ++error_count;
455 continue;
456 }
457
458 double_vector.push_back(current_double);
459 }
460
461 return double_vector;
462}
463
464
465std::vector<std::size_t>
466Utils::splitSizetStringToSizetVectorWithSpaces(const QString &text, std::size_t &error_count)
467{
468 // qDebug() << "Parsing text:" << text;
469
470 QStringList string_list = text.split(QRegularExpression("[\\s]+"), Qt::SkipEmptyParts);
471
472 // qDebug() << "string list size:" << string_list.size()
473 //<< "values:" << string_list;
474
475 std::vector<std::size_t> sizet_vector;
476
477 for(int iter = 0; iter < string_list.size(); ++iter)
478 {
479 QString current_string = string_list.at(iter);
480
481 bool ok = false;
482
483 std::size_t current_sizet = current_string.toUInt(&ok);
484
485 if(!current_sizet && !ok)
486 {
487 ++error_count;
488 continue;
489 }
490
491 sizet_vector.push_back(current_sizet);
492 }
493
494 return sizet_vector;
495}
496QString
498{
499 if(value)
500 return "TRUE";
501 return "FALSE";
502}
503
504QString
506{
507
508 if(mz_format == Enums::MsDataFormat::mzML)
509 return "mzML";
510 else if(mz_format == Enums::MsDataFormat::mzXML)
511 return "mzXML";
512 else if(mz_format == Enums::MsDataFormat::MGF)
513 return "MGF";
514 else if(mz_format == Enums::MsDataFormat::SQLite3)
515 return "SQLite3";
516 else if(mz_format == Enums::MsDataFormat::xy)
517 return "xy";
518 else if(mz_format == Enums::MsDataFormat::mz5)
519 return "mz5";
520 else if(mz_format == Enums::MsDataFormat::msn)
521 return "msn";
522 else if(mz_format == Enums::MsDataFormat::abSciexWiff)
523 return "abSciexWiff";
524 else if(mz_format == Enums::MsDataFormat::abSciexT2D)
525 return "abSciexT2D";
526 else if(mz_format == Enums::MsDataFormat::agilentMassHunter)
527 return "agilentMassHunter";
528 else if(mz_format == Enums::MsDataFormat::thermoRaw)
529 return "thermoRaw";
530 else if(mz_format == Enums::MsDataFormat::watersRaw)
531 return "watersRaw";
532 else if(mz_format == Enums::MsDataFormat::brukerFid)
533 return "brukerFid";
534 else if(mz_format == Enums::MsDataFormat::brukerYep)
535 return "brukerYep";
536 else if(mz_format == Enums::MsDataFormat::brukerBaf)
537 return "brukerBaf";
538 else if(mz_format == Enums::MsDataFormat::brukerTims)
539 return "brukerTims";
540 else if(mz_format == Enums::MsDataFormat::brukerBafAscii)
541 return "brukerBafAscii";
542 else
543 return "unknown";
544}
545
546
547QString
549{
550
551 if(file_reader_type == Enums::FileReaderType::pwiz)
552 return "pwiz";
553 else if(file_reader_type == Enums::FileReaderType::xy)
554 return "xy";
555 else if(file_reader_type == Enums::FileReaderType::tims)
556 return "tims";
557 else if(file_reader_type == Enums::FileReaderType::tims_frames)
558 return "tims_frames";
559 else
560 return "unknown";
561}
562
563QString
565{
566 switch(type)
567 {
569 return "AL";
570 break;
572 return "NA";
573 break;
575 return "RA";
576 break;
577 default:
578 return "ER";
579 }
580}
581
582
583QString
585{
586 switch(m_ionType)
587 {
589 return "y";
590 break;
592 return "yP";
593 break;
595 return "y*";
596 break;
598 return "yO";
599 break;
601 return "b*";
602 break;
604 return "bO";
605 break;
607 return "a";
608 break;
610 return "a*";
611 break;
613 return "aO";
614 break;
616 return "c";
617 break;
618 // SvgIon.moxygen - mN
620 return "z";
621 break;
623 return "b";
624 break;
626 return "bP";
627 break;
629 return "x";
630 break;
631 default:
632 throw PappsoException(QString("Enums::PeptideIon name not implemented"));
633 break;
634 }
635}
636
637
638QString
640{
641 switch(type)
642 {
644 return "both";
645 break;
647 return "native";
648 break;
650 return "symmetric";
651 break;
652 default:
653 return "synthetic";
654 }
655}
656
657QString
659{
660 auto it = precisionUnitMap.find(precision_unit);
661 if(it != precisionUnitMap.end())
662 {
663 return it->second;
664 }
665
666 throw pappso::ExceptionNotFound(QObject::tr("precision unit not found in precisionUnitMap"));
667}
668
669QString
671{
672 QString version(PAPPSOMSPP_VERSION);
673 return version;
674}
675
676
680 QChar position)
681{
682 if((position != '[') && (!Utils::isAminoAcidChar(aa)))
683 {
685 QObject::tr("Utils::guessAaModificationPbyMonoisotopicMassDelta => "
686 "not an amino acid %1")
687 .arg((char)aa));
688 }
690
691 pappso::AaModificationP oxidation =
692 pappso::AaModification::getInstance("MOD:00425"); // MOD:00425 15.994915
694 pappso::MzRange(oxidation->getMass(), precision).contains(mass))
695 {
696 return oxidation;
697 }
698 pappso::AaModificationP iodoacetamide =
699 pappso::AaModification::getInstance("MOD:00397"); // 57.021465
700 if(pappso::MzRange(iodoacetamide->getMass(), precision).contains(mass))
701 {
702 return iodoacetamide;
703 }
704 pappso::AaModificationP acetylated =
705 pappso::AaModification::getInstance("MOD:00408"); // 42.010567
706 if(pappso::MzRange(acetylated->getMass(), precision).contains(mass))
707 {
708 return acetylated;
709 }
710 pappso::AaModificationP phosphorylated =
711 pappso::AaModification::getInstance("MOD:00696"); // 79.96633
712 if(pappso::MzRange(phosphorylated->getMass(), precision).contains(mass))
713 {
714 return phosphorylated;
715 }
716 pappso::AaModificationP ammonia = pappso::AaModification::getInstance("MOD:01160"); //-17.026548
717 if(pappso::MzRange(ammonia->getMass(), precision).contains(mass))
718 {
719 return ammonia;
720 }
721 pappso::AaModificationP dehydrated =
722 pappso::AaModification::getInstance("MOD:00704"); //-18.010565
723 pappso::AaModificationP glu_pyroglu =
724 pappso::AaModification::getInstance("MOD:00420"); // Glu->pyro-Glu
725 if(pappso::MzRange(dehydrated->getMass(), precision).contains(mass))
726 {
727 if((aa == Enums::AminoAcidChar::glutamic_acid) && (position == '^'))
728 {
729 return glu_pyroglu;
730 }
731 else
732 {
733 return dehydrated;
734 }
735 }
736 pappso::AaModificationP dimethylated =
737 pappso::AaModification::getInstance("MOD:00429"); // 28.0313
738 if(pappso::MzRange(dimethylated->getMass(), precision).contains(mass))
739 {
740 return dimethylated;
741 }
742
743 pappso::AaModificationP dimethylated_medium = pappso::AaModification::getInstance("MOD:00552");
744 if(pappso::MzRange(dimethylated_medium->getMass(), precision).contains(mass))
745 {
746 return dimethylated_medium;
747 }
748
749 pappso::AaModificationP dimethylated_heavy = pappso::AaModification::getInstance("MOD:00638");
750 if(pappso::MzRange(dimethylated_heavy->getMass(), precision).contains(mass))
751 {
752 return dimethylated_heavy;
753 }
754 pappso::AaModificationP DimethylpyrroleAdduct = pappso::AaModification::getInstance("MOD:00628");
755 if(pappso::MzRange(DimethylpyrroleAdduct->getMass(), precision).contains(mass))
756 {
757 return DimethylpyrroleAdduct;
758 }
759
760 // modification not found, creating customized mod :
762
764 QObject::tr("Utils::guessAaModificationPbyMonoisotopicMassDelta => "
765 "modification not found for mass %1")
766 .arg(mass));
767}
768
769
771Utils::translateAaModificationFromUnimod(const QString &unimod_accession)
772{
773 if(unimod_accession == "UNIMOD:1")
774 {
775
776 return pappso::AaModification::getInstance("MOD:00394");
777 }
778 if(unimod_accession == "UNIMOD:4")
779 {
780
781 return pappso::AaModification::getInstance("MOD:00397");
782 }
783 if(unimod_accession == "UNIMOD:7")
784 {
785
786 return pappso::AaModification::getInstance("MOD:00400");
787 }
788 if(unimod_accession == "UNIMOD:27")
789 {
790
791 return pappso::AaModification::getInstance("MOD:00420");
792 }
793 // UNIMOD:28 => MOD:00040
794 if(unimod_accession == "UNIMOD:28")
795 {
796
797 return pappso::AaModification::getInstance("MOD:00040");
798 }
799
800 if(unimod_accession == "UNIMOD:35")
801 {
802
803 return pappso::AaModification::getInstance("MOD:00425");
804 }
805 qInfo() << "unimod_accession:" << unimod_accession << " not found";
806 return nullptr;
807}
808
809
810QJsonArray
811Utils::toJson(const std::vector<double> &myVec)
812{
813 QJsonArray result;
814 for(auto i = myVec.begin(); i != myVec.end(); i++)
815 {
816 result.push_back((*i));
817 }
818 return result;
819}
820
821bool
854
855} // namespace pappso
pappso_double getMass() const
static AaModificationP getInstance(const QString &accession)
static AaModificationP getInstanceCustomizedMod(pappso_double modificationMass)
bool contains(pappso_double) const
Definition mzrange.cpp:115
static PrecisionPtr getDaltonInstance(pappso_double value)
get a Dalton precision pointer
static std::size_t extractScanNumberFromMzmlNativeId(const QString &spectrum_native_id)
Definition utils.cpp:286
static QString chronoTimePointDebugString(const QString &msg, std::chrono::system_clock::time_point chrono_time=std::chrono::system_clock::now())
Definition utils.cpp:399
static QString toString(specglob::SpectralAlignmentType type)
Convenience function to return a string describing the specglob alingment type.
Definition utils.cpp:564
static QString pointerToString(const void *const pointer)
Definition utils.cpp:318
static QString msDataFormatAsString(Enums::MsDataFormat mz_format)
Convenience function to return a string describing the MzFormat of a file.
Definition utils.cpp:505
static pappso_double roundToDecimals(pappso_double value, int decimal_places)
Definition utils.cpp:141
static QRegularExpression anythingButDigitDotDash
Definition utils.h:55
static bool almostEqual(double value1, double value2, int decimalPlaces=10)
Tell if both double values, are equal within the double representation capabilities of the platform.
Definition utils.cpp:327
static std::vector< double > splitMzStringToDoubleVectorWithSpaces(const QString &text, std::size_t &error_count)
Definition utils.cpp:435
static bool isAminoAcidChar(Enums::AminoAcidChar x)
Definition utils.cpp:822
static double nearestGreater(double value)
Definition utils.cpp:392
static std::string toUtf8StandardString(const QString &text)
Definition utils.cpp:167
static bool appendToFile(const QString &text, const QString &file_name)
Definition utils.cpp:263
static double roundValueToDecimalPlaces(double value, int decimal_places, bool round_up=true)
Definition utils.cpp:372
static QString fileReaderTypeAsString(Enums::FileReaderType file_reader_type)
Definition utils.cpp:548
static QString booleanToString(bool value)
convenient function to transform a boolean to QString "TRUE" or "FALSE" QString returned is readable ...
Definition utils.cpp:497
static AaModificationP translateAaModificationFromUnimod(const QString &unimod_accession)
Definition utils.cpp:771
static QString chronoIntervalDebugString(const QString &msg, std::chrono::system_clock::time_point chrono_start, std::chrono::system_clock::time_point chrono_finish=std::chrono::system_clock::now())
Definition utils.cpp:414
static long long int roundToDecimal32bitsAsLongLongInt(pappso_double input)
Definition utils.cpp:151
static bool writeToFile(const QString &text, const QString &file_name)
Definition utils.cpp:217
static std::vector< std::size_t > splitSizetStringToSizetVectorWithSpaces(const QString &text, std::size_t &error_count)
Definition utils.cpp:466
static QRegularExpression signedDoubleNumberExponentialRegExp
Definition utils.h:56
static QRegularExpression xyMassDataFormatRegExp
Regular expression matching <numerical value><non-numerical*><numericalvalue>.
Definition utils.h:60
static AaModificationP guessAaModificationPbyMonoisotopicMassDelta(Enums::AminoAcidChar aa, pappso_double mass, QChar position=' ')
get the most suitable modification given an amino acid, a mass and a position
Definition utils.cpp:678
static QRegularExpression unsignedDoubleNumberNoExponentialRegExp
Definition utils.h:54
static const QString getLexicalOrderedString(unsigned int num)
Definition utils.cpp:73
static QJsonArray toJson(const std::vector< double > &myVec)
convert vector of double into json array
Definition utils.cpp:811
static void writeLexicalOrderedString(QTextStream *p_out, unsigned int num)
Definition utils.cpp:85
static int zeroDecimalsInValue(pappso_double value)
Determine the number of zero decimals between the decimal point and the first non-zero decimal.
Definition utils.cpp:103
static QRegularExpression endOfLineRegExp
Regular expression that tracks the end of line in text files.
Definition utils.h:69
static QString getVersion()
Definition utils.cpp:670
#define PAPPSOMSPP_VERSION
Definition config.h:6
@ SQLite3
SQLite3 format.
Definition types.h:147
@ MGF
Mascot format.
Definition types.h:146
PeptideIon
Enums::PeptideIon enum defines all types of ions (Nter or Cter).
Definition types.h:272
@ a
Nter aldimine ions.
Definition types.h:276
@ y
Cter amino ions.
Definition types.h:281
@ c
Nter amino ions.
Definition types.h:280
@ astar
Nter aldimine ions + NH3 loss.
Definition types.h:277
@ ystar
Cter amino ions + NH3 loss.
Definition types.h:282
@ yo
Cter amino ions + H2O loss.
Definition types.h:283
@ bstar
Nter acylium ions + NH3 loss.
Definition types.h:274
@ b
Nter acylium ions.
Definition types.h:273
@ x
Cter acylium ions.
Definition types.h:286
@ bo
Nter acylium ions + H2O loss.
Definition types.h:275
@ ao
Nter aldimine ions + H2O loss.
Definition types.h:278
@ z
Cter carbocations.
Definition types.h:284
@ pwiz
using libpwizlite
Definition types.h:170
@ tims
TimsMsRunReader : each scan is returned as a mass spectrum.
Definition types.h:174
@ nonAlign
the type of alignment to put in origin matrix NON Alignment (0 - NA)
Definition types.h:49
@ reAlign
Re Alignment (1 - RE).
Definition types.h:51
ExperimentalSpectrumDataPointType
Definition types.h:78
@ both
both, the ion and the complement exists in the original spectrum
Definition types.h:83
@ symmetric
new peak : computed symmetric mass from a corresponding native peak
Definition types.h:81
tries to keep as much as possible monoisotopes, removing any possible C13 peaks and changes multichar...
Definition aa.cpp:39
const AaModification * AaModificationP
double pappso_double
A type definition for doubles.
Definition types.h:61
const PrecisionBase * PrecisionPtr
Definition precision.h:122
std::map< Enums::PrecisionUnit, QString > precisionUnitMap
Definition precision.cpp:43