From 445ab04a2b1b0db7cd352494b92efe369a5467fa Mon Sep 17 00:00:00 2001 From: Jiri Novak Date: Mon, 25 Nov 2019 11:40:37 +0100 Subject: [PATCH] release 2.0.0 --- CycloBranch.sln | 7 +- CycloBranch/BrickDatabases/20_amino_acids.txt | 38 +- .../BrickDatabases/20_amino_acids_nl.txt | 19 + CycloBranch/BrickDatabases/db287_v1.txt | 574 ++--- CycloBranch/BrickDatabases/db287_v2.txt | 574 ++--- CycloBranch/BrickDatabases/db287_v3.txt | 574 ++--- CycloBranch/BrickDatabases/db291.txt | 582 ++--- CycloBranch/BrickDatabases/db33_v1.txt | 66 +- CycloBranch/BrickDatabases/db33_v2.txt | 66 +- .../inhouse_siderophores_blocks.txt | 38 +- .../BrickDatabases/pyoverdinDE_blocks.txt | 16 +- .../pyoverdinDE_blocks_retro_diels.txt | 20 +- CycloBranch/CycloBranch-Linux.pro | 2 +- CycloBranch/CycloBranch-MacOSX.pro | 2 +- CycloBranch/CycloBranch.vcxproj | 339 +-- CycloBranch/CycloBranch.vcxproj.user | 8 +- CycloBranch/External/linux/any2mzml.sh | 3 + CycloBranch/External/linux/correctprofile.sh | 6 +- CycloBranch/External/linux/raw2peaks.sh | 6 +- CycloBranch/External/macosx/any2mzml.sh | 2 + CycloBranch/External/macosx/correctprofile.sh | 2 +- CycloBranch/External/macosx/raw2peaks.sh | 6 +- CycloBranch/External/windows/any2mzml.bat | 2 + CycloBranch/External/windows/baf2mzml.bat | 3 + .../External/windows/correctprofile.bat | 6 +- CycloBranch/External/windows/raw2mzml.bat | 2 +- .../External/windows/raw2mzmlpeaks.bat | 2 + CycloBranch/External/windows/raw2peaks.bat | 6 +- ...siderophores_and_secondary_metabolites.txt | 440 ++-- .../tutorials/cb2_tutorial4_db.txt | 3 + .../Settings/tutorials/cb2_tutorial1.ini | 127 + .../Settings/tutorials/cb2_tutorial2.ini | 125 + .../Settings/tutorials/cb2_tutorial3.ini | 137 ++ .../Settings/tutorials/cb2_tutorial4.ini | 125 + .../Settings/tutorials/cb2_tutorial5.ini | 137 ++ .../Settings/tutorials/cb2_tutorial6.ini | 60 + CycloBranch/core/cBrick.cpp | 49 +- CycloBranch/core/cBrick.h | 36 +- CycloBranch/core/cBricksDatabase.cpp | 393 ++- CycloBranch/core/cBricksDatabase.h | 68 +- CycloBranch/core/cCandidate.cpp | 177 +- CycloBranch/core/cCandidate.h | 6 +- CycloBranch/core/cDeNovoGraph.cpp | 903 ++++--- CycloBranch/core/cFragmentIons.cpp | 408 ++-- CycloBranch/core/cMzML.cpp | 210 +- CycloBranch/core/cMzML.h | 5 +- CycloBranch/core/cParameters.cpp | 1795 +++++++++++--- CycloBranch/core/cParameters.h | 72 +- CycloBranch/core/cPeakListSeries.cpp | 10 +- CycloBranch/core/cPeaksList.cpp | 52 +- CycloBranch/core/cPeaksList.h | 28 + CycloBranch/core/cSequence.cpp | 57 +- CycloBranch/core/cSequenceDatabase.cpp | 7 + CycloBranch/core/cSequenceDatabase.h | 7 + CycloBranch/core/cSummaryFormula.cpp | 30 +- CycloBranch/core/cSummaryFormula.h | 2 +- CycloBranch/core/cTheoreticalSpectrum.cpp | 2136 +++++++++++++---- CycloBranch/core/cTheoreticalSpectrum.h | 74 +- CycloBranch/core/cTheoreticalSpectrumList.cpp | 87 +- CycloBranch/core/utilities.cpp | 260 +- CycloBranch/core/utilities.h | 150 +- CycloBranch/docs/cyclobranch_bba_bib.txt | 2 +- CycloBranch/docs/cyclobranch_jms_bib.txt | 10 + CycloBranch/docs/cyclobranch_jms_ris.txt | 16 + CycloBranch/gui/cAboutWidget.cpp | 14 +- CycloBranch/gui/cBranchCyclicWidget.cpp | 290 +-- CycloBranch/gui/cBranchCyclicWidget.h | 3 +- CycloBranch/gui/cBranchedWidget.cpp | 419 ++-- CycloBranch/gui/cBricksDatabaseProxyModel.cpp | 154 +- CycloBranch/gui/cBricksDatabaseProxyModel.h | 23 +- CycloBranch/gui/cBricksDatabaseWidget.cpp | 214 +- CycloBranch/gui/cBricksDatabaseWidget.h | 14 +- CycloBranch/gui/cChromatogramWindow.cpp | 132 +- CycloBranch/gui/cChromatogramWindow.h | 47 +- CycloBranch/gui/cChromatogramWindowWidget.cpp | 281 ++- CycloBranch/gui/cChromatogramWindowWidget.h | 36 +- CycloBranch/gui/cCyclicWidget.cpp | 261 +- CycloBranch/gui/cDrawPeptideWidget.cpp | 2 +- CycloBranch/gui/cGraphWidget.cpp | 2 +- CycloBranch/gui/cImageWindow.cpp | 13 +- CycloBranch/gui/cImageWindow.h | 12 +- CycloBranch/gui/cImageWindowWidget.cpp | 119 +- CycloBranch/gui/cImageWindowWidget.h | 36 +- CycloBranch/gui/cLinearWidget.cpp | 147 +- CycloBranch/gui/cLinearWidget.h | 15 +- CycloBranch/gui/cMainThread.cpp | 246 +- CycloBranch/gui/cMainWindow.cpp | 465 ++-- CycloBranch/gui/cMainWindow.h | 18 +- CycloBranch/gui/cMainWindowProxyModel.cpp | 152 +- CycloBranch/gui/cMainWindowProxyModel.h | 24 +- CycloBranch/gui/cModificationsProxyModel.cpp | 152 +- CycloBranch/gui/cModificationsProxyModel.h | 23 +- CycloBranch/gui/cModificationsWidget.cpp | 114 +- CycloBranch/gui/cModificationsWidget.h | 12 +- CycloBranch/gui/cMultipleButtonDelegate.cpp | 2 +- CycloBranch/gui/cNeutralLossesListWidget.cpp | 12 +- CycloBranch/gui/cNeutralLossesListWidget.h | 1 + CycloBranch/gui/cParametersWidget.cpp | 1226 ++++++---- CycloBranch/gui/cParametersWidget.h | 36 +- .../gui/cSequenceDatabaseProxyModel.cpp | 194 +- CycloBranch/gui/cSequenceDatabaseProxyModel.h | 25 +- CycloBranch/gui/cSequenceDatabaseWidget.cpp | 153 +- CycloBranch/gui/cSequenceDatabaseWidget.h | 12 +- CycloBranch/gui/cSpectrumDetailWidget.cpp | 600 +++-- CycloBranch/gui/cSpectrumDetailWidget.h | 9 + CycloBranch/gui/cSpectrumSceneWidget.cpp | 221 +- CycloBranch/gui/cSpectrumSceneWidget.h | 12 + .../gui/cSummaryPeaksTableProxyModel.cpp | 160 +- .../gui/cSummaryPeaksTableProxyModel.h | 24 +- CycloBranch/gui/cSummaryPeaksTableWidget.cpp | 382 ++- CycloBranch/gui/cSummaryPeaksTableWidget.h | 51 +- CycloBranch/gui/cViewButtonDelegate.cpp | 7 +- CycloBranch/images.qrc | 1 + CycloBranch/images/icons/12.png | Bin 0 -> 742 bytes CycloBranch/images/splash.cdr | Bin 1887752 -> 1885452 bytes CycloBranch/images/splash.png | Bin 51305 -> 51817 bytes CycloBranch/parallel/cGraphReaderThread.cpp | 87 +- .../parallel/cSpectrumComparatorThread.cpp | 1 + README.md | 68 +- readme.txt | 4 +- 120 files changed, 11892 insertions(+), 6011 deletions(-) create mode 100644 CycloBranch/BrickDatabases/20_amino_acids_nl.txt create mode 100644 CycloBranch/External/linux/any2mzml.sh create mode 100644 CycloBranch/External/macosx/any2mzml.sh create mode 100644 CycloBranch/External/windows/any2mzml.bat create mode 100644 CycloBranch/External/windows/baf2mzml.bat create mode 100644 CycloBranch/External/windows/raw2mzmlpeaks.bat create mode 100644 CycloBranch/SequenceDatabases/tutorials/cb2_tutorial4_db.txt create mode 100644 CycloBranch/Settings/tutorials/cb2_tutorial1.ini create mode 100644 CycloBranch/Settings/tutorials/cb2_tutorial2.ini create mode 100644 CycloBranch/Settings/tutorials/cb2_tutorial3.ini create mode 100644 CycloBranch/Settings/tutorials/cb2_tutorial4.ini create mode 100644 CycloBranch/Settings/tutorials/cb2_tutorial5.ini create mode 100644 CycloBranch/Settings/tutorials/cb2_tutorial6.ini create mode 100644 CycloBranch/docs/cyclobranch_jms_bib.txt create mode 100644 CycloBranch/docs/cyclobranch_jms_ris.txt create mode 100644 CycloBranch/images/icons/12.png diff --git a/CycloBranch.sln b/CycloBranch.sln index a6fcc20..ddcf3cb 100644 --- a/CycloBranch.sln +++ b/CycloBranch.sln @@ -1,5 +1,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.757 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CycloBranch", "CycloBranch\CycloBranch.vcxproj", "{B12702AD-ABFB-343A-A199-8E24837244A3}" EndProject Global @@ -22,4 +24,7 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A238D77E-2373-47EE-B2CF-D69807854B8B} + EndGlobalSection EndGlobal diff --git a/CycloBranch/BrickDatabases/20_amino_acids.txt b/CycloBranch/BrickDatabases/20_amino_acids.txt index 5c0f6bd..1b553cd 100644 --- a/CycloBranch/BrickDatabases/20_amino_acids.txt +++ b/CycloBranch/BrickDatabases/20_amino_acids.txt @@ -1,19 +1,19 @@ -Phenylalanine Phe C9H9NO 147.0684140000 CSID: 969 -Alanine Ala C3H5NO 71.0371110000 CSID: 582 -Leucine/Isoleucine Leu/Ile C6H11NO 113.0840700000 CSID: 834/CSID: 769 -Proline Pro C5H7NO 97.0527670000 CSID: 594 -Valine Val C5H9NO 99.0684140000 CSID: 1148 -Arginine Arg C6H12N4O 156.1011140000 CSID: 227 -Asparagine Asn C4H6N2O2 114.0429320000 CSID: 231 -Aspartic acid Asp C4H5NO3 115.0269410000 CSID: 411 -Cysteine Cys C3H5NOS 103.0091800000 CSID: 574 -Glutamine Gln C5H8N2O2 128.0584350000 CSID: 718 -Glutamic acid Glu C5H7NO3 129.0424290000 CSID: 591 -Glycine Gly C2H3NO 57.0214630000 CSID: 730 -Histidine His C6H7N3O 137.0589080000 CSID: 752 -Lysine Lys C6H12N2O 128.0949650000 CSID: 843 -Methionine Met C5H9NOS 131.0404910000 CSID: 853 -Serine Ser C3H5NO2 87.0320300000 CSID: 597 -Threonine Thr C4H7NO2 101.0476780000 CSID: 200 -Tryptophan Trp C11H10N2O 186.0793090000 CSID: 1116 -Tyrosine Tyr C9H9NO2 163.0633330000 CSID: 1121 +Phenylalanine Phe C9H9NO 147.0684140000 CSID: 969 +Alanine Ala C3H5NO 71.0371140000 CSID: 582 +Leucine/Isoleucine Leu/Ile C6H11NO 113.0840640000 CSID: 834/CSID: 769 +Proline Pro C5H7NO 97.0527640000 CSID: 594 +Valine Val C5H9NO 99.0684140000 CSID: 1148 +Arginine Arg C6H12N4O 156.1011110000 CSID: 227 +Asparagine Asn C4H6N2O2 114.0429270000 CSID: 231 +Aspartic acid Asp C4H5NO3 115.0269430000 CSID: 411 +Cysteine Cys C3H5NOS 103.0091840000 CSID: 574 +Glutamine Gln C5H8N2O2 128.0585780000 CSID: 718 +Glutamic acid Glu C5H7NO3 129.0425930000 CSID: 591 +Glycine Gly C2H3NO 57.0214640000 CSID: 730 +Histidine His C6H7N3O 137.0589120000 CSID: 752 +Lysine Lys C6H12N2O 128.0949630000 CSID: 843 +Methionine Met C5H9NOS 131.0404850000 CSID: 853 +Serine Ser C3H5NO2 87.0320280000 CSID: 597 +Threonine Thr C4H7NO2 101.0476780000 CSID: 200 +Tryptophan Trp C11H10N2O 186.0793130000 CSID: 1116 +Tyrosine Tyr C9H9NO2 163.0633290000 CSID: 1121 diff --git a/CycloBranch/BrickDatabases/20_amino_acids_nl.txt b/CycloBranch/BrickDatabases/20_amino_acids_nl.txt new file mode 100644 index 0000000..0593d2f --- /dev/null +++ b/CycloBranch/BrickDatabases/20_amino_acids_nl.txt @@ -0,0 +1,19 @@ +Phenylalanine Phe C9H9NO 147.0684140000 CSID: 969 +Alanine Ala C3H5NO 71.0371140000 CSID: 582 +Leucine/Isoleucine Leu/Ile C6H11NO 113.0840640000 CSID: 834/CSID: 769 +Proline Pro C5H7NO 97.0527640000 CSID: 594 +Valine Val C5H9NO 99.0684140000 CSID: 1148 +Arginine Arg C6H12N4O 156.1011110000 CH2N2 CSID: 227 +Asparagine Asn C4H6N2O2 114.0429270000 NH3;CONH CSID: 231 +Aspartic acid Asp C4H5NO3 115.0269430000 H2O;CO2 CSID: 411 +Cysteine Cys C3H5NOS 103.0091840000 H2S CSID: 574 +Glutamine Gln C5H8N2O2 128.0585780000 NH3;CONH CSID: 718 +Glutamic acid Glu C5H7NO3 129.0425930000 H2O;CO2 CSID: 591 +Glycine Gly C2H3NO 57.0214640000 CSID: 730 +Histidine His C6H7N3O 137.0589120000 CSID: 752 +Lysine Lys C6H12N2O 128.0949630000 CSID: 843 +Methionine Met C5H9NOS 131.0404850000 CSID: 853 +Serine Ser C3H5NO2 87.0320280000 H2O;CH2O CSID: 597 +Threonine Thr C4H7NO2 101.0476780000 H2O;CH2CH2O CSID: 200 +Tryptophan Trp C11H10N2O 186.0793130000 CSID: 1116 +Tyrosine Tyr C9H9NO2 163.0633290000 H2O CSID: 1121 diff --git a/CycloBranch/BrickDatabases/db287_v1.txt b/CycloBranch/BrickDatabases/db287_v1.txt index 336fbcf..173f16d 100644 --- a/CycloBranch/BrickDatabases/db287_v1.txt +++ b/CycloBranch/BrickDatabases/db287_v1.txt @@ -1,287 +1,287 @@ -Ethanolamine Eta C2H5N 43.0422000000 CSID: 13835336 -Glycine Gly C2H3NO 57.0214630000 CSID: 730 -pyrrolidone Pyr C4H5N 67.0422000000 CSID: 11530 -dehydroalanine dh-Ala C3H3NO 69.0214630000 CSID: 110510 -pyruvic acid Pya C3H2O2 70.0054800000 CSID: 1031 -butanoic acid C4:0 C4H6O 70.0418640000 CSID: 259 -DL-Alanine/beta-Alanine/Sarcosine Ala/bAla/Sar C3H5NO 71.0371110000 CSID: 582/CSID: 234/CSID: 1057 -Lactic acid Lac C3H4O2 72.0211280000 CSID: 592 -Serinol Serol C3H7NO 73.0527670000 CSID: 61591 -2.3-dehydro-2-aminobutyric acid/homoserine lactone/N-Methyl-dehydroalanine/hydroxy pyrrolidone dhAbu/HSL/NMe-Dha/OH-Pyr C4H5NO 83.0371110000 CSID: 4952645/CSID: 66194/CSID: 118845/CSID: 134682 -2-hydroxy-3-butenoic acid C4:1(3)-OH(2) C4H4O2 84.0211280000 CSID: 141066 -2-methyl-butanoic acid C4:0-Me(2) C5H8O 84.0575120000 CSID: 8012 -alpha-formylGlycine aFo-Gly C3H3NO2 85.0164350000 CSID: 28 -N-Methyl-L-alanine/ABU/2-Methylalanine/methyl alaninate NMe-Ala/Abu/Aib/D-3OMe-Ala C4H7NO 85.0527670000 CSID: 4450824/CSID: 6405/CSID: 5891/CSID: 99878 -isovalinol/valinol Ivalol/Valol C5H11N 85.0894330000 CSID: 8329525/CSID: 71352 -3-hydroxybutanoic acid C4:0-OH(3) C4H6O2 86.0367750000 CSID: 428 -2.3-Diaminopropionic acid Dpr C3H6N2O 86.0480130000 CSID: 357 -DL-Serine/isoserine Ser/Iser C3H5NO2 87.0320300000 CSID: 597/CSID: 10793 -Sorbic acid C6:2(t2.t4) C6H6O 94.0418640000 CSID: 558605 -methyl-succinimide Me-Suc C5H5NO 95.0371110000 CSID: 122158 -proline carboxamid ProC C5H8N2 96.0687500000 CSID: 479142 -DL-Proline/2-methylamino-2-dehydrobutyric acid/norcoronamic acid Pro/2Dh-Mabu/norCMA C5H7NO 97.0527670000 CSID: 594/CSID: 16743754/CSID: 28708240 -3-methylvaleric acid/hexanoic acid Me-Vaa/C6:0 C6H10O 98.0731680000 CSID: 7469/CSID: 8552 -N-formyl-Alanine NFo-Ala C4H5NO2 99.0320300000 CSID: 72251 -DL-Valine/Isovaline/Norvaline/2-methyl-3-aminobutanoic acid/N-dimethyl-Alanine/3-amino-pentanoic acid Val/Ival/Nva/Mab/NdMe-Ala/C5:0-NH2(3) C5H9NO 99.0684140000 CSID: 1148/CSID: 85483/CSID: 801/CSID: 471786/CSID: 9962964/CSID: 11271826 -Leucinol/Isoleucinol Leuol/Ileol C6H13N 99.1047990000 CSID: 71362/CSID: 82355 -2-hydroxy-3-epoxy-butanoic acid C4:0-OH(2)-Ep(3) C4H4O3 100.0160460000 CSID: 15475591 -2-hydroxyisovaleric acid Hiv C5H8O2 100.0524310000 CSID: 90190 -2.4-diaminobutyric acid/2.3-diaminobutyric acid Dab/Dbu C4H8N2O 100.0636610000 CSID: 457/CSID: 4475641 -dehydro-cysteine dhCys C3H3NOS 100.9935320000 CSID: 24784832 -Threonine/Homoserine/N-Methyl-Serine/4-amino-3-hydroxybutyric acid Thr/Hse/NMe-Ser/OH-4Abu C4H7NO2 101.0476780000 CSID: 200/CSID: 758/CSID: 481791/CSID: 2064 -2.3-dihydroxy-butanoic acid C4:0-OH(2.3) C4H6O3 102.0316940000 CSID: 219301 -DL-Cysteine Cys C3H5NOS 103.0091800000 CSID: 574 -benzoic acid Bz C7H4O 104.0262160000 CSID: 238 -4-oxo-proline/pyroglutamic acid 4oxo-Pro/pGlu C5H5NO2 111.0320220000 CSID: 366185/CSID: 485 -3-Methylproline/Pipecolic acid/coronamic acid Me-Pro/Pip/CMA C6H9NO 111.0684140000 CSID: 10610754/CSID: 826/CSID: 117751 -keto-Leucine/2-epoxy-hexanoic acid K-Leu/C6:0-Ep(2) C6H8O2 112.0524230000 CSID: 69/CSID: 14066572 -Hydroxy-cycloOrnithine OH-cOrn C5H8N2O 112.0636690000 CSID: 13539649 -heptanoic acid C7:0 C7H12O 112.0888150000 CSID: 7803 -aziridine dicarboxylic acid Azd C4H3NO3 113.0112860000 CSID: 11582505 -3-Hydroxyproline/2-formamidobutanoic acid 3OH-Pro/NFo-D-Abu C5H7NO2 113.0476780000 CSID: 486216/CSID: 486348 -Leucine/Isoleucine/N-Methyl-L-valine/3-Methylvaline/2-methyl-3-aminopentanoic acid/D-N-methyl-norvaline Leu/Ile/NMe-Val/t-Leu/Map/D-NMe-Nva C6H11NO 113.0840700000 CSID: 834/CSID: 769/CSID: 4225/CSID: 270637/CSID: 11643060/CSID: 10652938 -hydroxyacetyl propionyl/pentanedioic acid Hap/Pda C5H6O3 114.0316870000 C(C(C(CO)=O)C)(=O)O in CSID: 10477731/CSID: 723 -DL-Asparagine/N1-formyl-2.3-Diaminopropionic acid Asn/NFo-Dpr C4H6N2O2 114.0429320000 CSID: 231/C(C(CN)NC=O)(=O)O in CSID: 8873525 -D-Leucic acid (2-hydroxy-4-methylpentanoic acid)/(R)-Leucic acid/3-hydroxyhexanoic acid C5:0-Me(4)-OH(2)/4Me-D-Hva/C6:0-OH(3) C6H10O2 114.0680790000 CSID: 83753/CSID: 388986/CSID: 133518 -DL-Ornithine Orn C5H10N2O 114.0793090000 CSID: 380 -DL-Aspartic acid/N-formyl-isoserine Asp/NFo-Iser C4H5NO3 115.0269410000 CSID: 411/C(C(C(=O)O)O)NC=O in CSID: 8503913 -3-Hydroxyvaline/N-Methylthreonine/O-Methylthreonine OH-Val/NNe-Thr/OMe-Thr C5H9NO2 115.0633330000 CSID: 244525/CSID: 5373925/CSID: 193545 -2.3-dihydroxy-3-methylbutanoic acid/2.4-dihydroxy-3-methylbutanoic acid iC5:0-OH(2.3)/iC5:0-OH(2.4) C5H8O3 116.0474340000 CSID: 657/C(C(C(CO)C)O)(=O)O in: NOR00082 -2-Methylcysteine/Methylcysteine aMe-Cys/NMe-Cys C4H7NOS 117.0248350000 CSID: 8233116/CSID: 2074082 -4-Hydroxythreonine 4OH-Thr C4H7NO3 117.0425970000 CSID: 3137512 -2.3.4-trihydroxy-butanoic acid C4:0-OH(2.3.4) C4H6O4 118.0266050000 CSID: 388628 -phenylacetic acid Pha C8H6O 118.0418640000 CSID: 10181341 -4-Hydroxybenzoic acid pOH-Bz C7H4O2 120.0211280000 CSID: 132 -trans2.trans4.trans6-trioctaneic acid C8:3(t2.t4.t6) C8H8O 120.0575200000 CSID: 4520024 -hydroxypicolinic acid Hpa C6H3NO2 121.0163820000 CSID: 12827 -oct-7-ynoic acid/2.trans4-octenoic acid C8:0:1(7)/C8:2(2.t4) C8H10O 122.0731600000 CSID: 4472125/CSID: 4944992 -4-oxo-5-methylproline/4-oxo-homoproline/N-Formyl-Proline 4oxo-5Me-Pro/4oxo-Hpr/NFo-Pro C6H7NO2 125.0476780000 CSID: 2564339/CSID: 10739339/CSID: 87055 -octanoic acid/6-methylheptanoic acid C8:0/iC8:0 C8H14O 126.1044710000 CSID: 370/CSID: 81904 -beta-ureido-dehydroAlanine bU-dAla C4H5N3O2 127.0381761000 PDB: UAL -N-formyl-Valine/N-Acetyl-2-aminoisobutyric acid/3-Hydroxy-5-methylproline Nfo-Val/Ac-Aib/3OH-5Me-Pro C6H9NO2 127.0633330000 CSID: 90479/CSID: 203779/CSID: 3823469 -N-methylleucine/N-Methyl-Isoleucine/beta-methylisoleucine/homoisoleucine/alpha-ethylnorvaline/Dolavaline/2-methyl-3-aminohexadecanoic acid Me-Leu/NMe-Ile/bMe-Ile/Hil/Et-Nva/Dov/C6:0-Me(2)-NH2(3) C7H13NO 127.0997100000 CSID: 493595/CSID: 487199/CSID: 19951406/CSID: 454232/CSID: 452678/CSID: 10731564/CSID: 21378848 -DL-Glutamine/N-methylasparagine/beta-methyl-asparagine/D-N2-methyl-asparagine/N1-acetyl-2.3-Diaminopropionic acid Gln/NMe-Asn/bMe-Asn/D-N2Me-Asn/NAc-Dpr C5H8N2O2 128.0584350000 CSID: 718/CSID: 311563/CSID: 2284493/CSID: 288387/C(C(CN)NC(C)=O)(=O)O in CSID: 8570696 -3-methoxy-hexanoic acid/3-hydroxy-heptanoic acid C6:0-OMe(3)/C7:0-OH(3) C7H12O2 128.0837340000 CSID: 277923/CSID: 2340494 -DL-Lysine/N-Hydroxy-histamine Lys/N-OH-Hta C6H12N2O 128.0949650000 CSID: 843/C1(CCCN1)CCNO in CSID: 4589228 -DL-Glutamic acid/D-beta-methyl-aspartic acid/beta-methoxy-aspartic acid/O-acetyl-Serine Glu/D-bMe-Asp/bOMe-Asp/Ac-Ser C5H7NO3 129.0424290000 CSID: 591/CSID: 829/CSID: 92764/CSID: 184 -L-acosamine/3-hydroxyleucine/beta-hydroxy-N-Methyl-Valine/gamma-hydroxy-N-Methyl-Valine/L-ristosamine Aco/OH-LeuOH/bOH-NMe-Val/gOH-NMe-Val/Ria C6H11NO2 129.0789740000 CSID: 370989/CSID: 244507/CSID: 9205156/CID: 12439044/CSID: 370989 -2-hydroxy-3-methyl-butanedioic acid iC5:0-OH(2)-CA(4) C5H6O4 130.0266050000 CSID: 485839 -Hydroxyasparagine OH-Asn C4H6N2O3 130.0378360000 CSID: 3670287 -alpha-guanidino Serine gSer C3H6N4O2 130.0490751000 C(C(=O)O)(N)(O)NC(=N)N in: NOR00426 -2.3-dihydroxy-3-methylpentanoic acid aC6:0-OH(2.3) C6H10O3 130.0634400000 CSID: 7 -N5-hydroxy ornithine/hydroxy-beta lysine OH-Orn/OH-bLys C5H10N2O2 130.0742280000 CSID: 148381/C(NCC(=O)O)(CCN)O in: NOR00634 -Hydroxyaspartic acid OH-Asp C4H5NO4 131.0218600000 CSID: 5232 -Methionine/N.S-dimethylcysteine Met/diMe-Cys C5H9NOS 131.0404910000 CSID: 853/CSID: 4450935 -arabinose/lyxose Ara/Lyx C5H8O4 132.0422610000 CSID: 224/CSID: 831 -L-Olivose Oli C6H12O3 132.0786380000 CSID: 164228 -phenylglycine Ph-Gly C8H7NO 133.0527590000 CSID: 3732 -phenylalaninol Pheol C9H11N 133.0891510000 CSID: 69116 -4-Chloro-Threonine 4Cl-Thr C4H6ClNO2 135.0087070000 CSID: 111708 -2.3-dihydroxy-4-chloro-butanoic acid C4:0-OH(2.3)-Cl(4) C4H5ClO3 135.9924350000 CSID: 25900403 -2.3-dihydroxybenzoic acid diOH-Bz C7H4O3 136.0160460000 CSID: 18 -2-methyl-7-octynoic acid/2.trans4-7-methyl-octenoic acid C8:0:1(7)-Me(2)/iC9:2(2.t4) C9H12O 136.0888150000 CSID: 24770189/CSID: 10761068 -DL-Histidine His C6H7N3O 137.0589080000 CSID: 752 -dehydropyrrolidone dPyr C6H6N2O2 138.0429271000 C1(CC(C(=CC(=O)O)N1)N)=O in CSID: 10199318 -2.3-dimethylpyroglutamic acid 2Me-3Me-pGlu C7H9NO2 139.0633330000 CSID: 13080150 -5.5-dimethyl-2-oxo-hexanoic acid C6:0-Me(5.5)-oxo(2) C8H12O2 140.0837293000 CID: 21197379 -argininal Argal C6H12N4 140.1061950000 CSID: 10655329 -Nonanoic acid/d-6-Methyloctanoic acid/7-Methyloctanoic acid C9:0/aC9:0/iC9:0 C9H16O 140.1201110000 CSID: 7866/CSID: 10015/CSID: 31022 -N-methylchloropyrrole MCP C6H4ClNO 140.9981480000 CSID: 7404981 -N-Acetylisovaline/N-Acetylvaline/N-Formylisoleucine/N-Formylleucin/4-Amino-2.2-dimethyl-3-oxopentanoic acid/4-oxovancosamine Ac-Ival/Ac-Val/Fo-Ile/Fo-Leu/Ibu/4oxo-Van C7H11NO2 141.0789740000 CSID: 272193/CSID: 198159/CSID: 383482/CSID: 90475/CSID: 29322188/C1(C(C(CC(O1)O)(C)N)=O)C in CSID: 10249894 -N-dimethyl-leucine/2-Amino-4-methylpentyl acetate Dme-Leu/Ac-Leuol C8H15NO 141.1153660000 CSID: 500040/CSID: 14603948 -N-methylglutamine NMe-Gln C6H10N2 142.0742280000 CSID: 10652941 -D-beta-methylglutamine D-bMe-Gln C6H10N2O2 142.0742280000 CSID: 24604116 -3-hydroxy-octanoic acid/2.2-dimethyl-3-hydroxyhexanoic acid/3-hydroxy-2-methyl-heptanoic acid C8:0-OH(3)/C6:0-Me(2.2)-OH(3)/C7:0-Me(2)-OH(3) C8H14O2 142.0993750000 CSID: 24791/CSID: 21418738/CSID: 27143447 -3-Methyl-Glutamic acid/2-Aminoadipic acid Me-Glu/Aad C6H9NO3 143.0582370000 CSID: 207514/CSID: 456 -L-actinosamine/L-eremosamine/norstatine/Vancosamine/N-methyl-hydroxyisoleucine Act/Ere/Nst/Van/Me-OH-Ile C7H13NO2 143.0946290000 CID: 20377364/CSID: 9542085/CSID: 151726/CSID: 164304/CSID: 24770217 -beta-hydroxyglutamine/D-beta-hydroxy-N2-methyl-asparagine OH-Gln/Me-OH-Asn C5H8N2O3 144.0534910000 CID: 22592766/CSID: 24604117 -methoxyaspartic acid OMe-Asp C5H7NO4 145.0375000000 C(C(C(C(=O)O)N)=[O]C)(=O)O in: NOR00717 -3.5-hydroxy-4-amino-hexadecanoic acid C6:0-OH(3.5)-NH2(4) C6H11NO3 145.0738920000 C(CC(C(C(C)O)N)O)(O)=O in: NOR00444 -L-rhamnose Rha C6H10O4 146.0579010000 CSID: 190747 -Methionine-S-oxide O-Met C5H9NO2S 147.0353940000 CSID: 824 -Chloro-Isoleucine Cl-Ile C6H10ClNO 147.0450840000 C(C(O)=O)(N)C(C(C)Cl)C in CSID: 10269389 -DL-Phenylalanine/N-methyl-phenylglycine Phe/NMe-Ph-Gly C9H9NO 147.0684140000 CSID: 969/CSID: 198596 -2-hydroxyphenyl-2-oxo-ethanoic acid Hpoe C8H4O3 148.0160460000 CSID: 348 -Phenyl-lactate Ph-Lac C9H8O2 148.0524230000 CSID: 3715 -HydroxyPhenylGlycine Hpg C8H7NO2 149.0476780000 CSID: 83189 -2.trans4-8-methyl-noneoic acid iC10:2(2.t4) C10H14O 150.1044710000 C(C=CC=CCCC(C)C)(O)=O in CSID: 16736750 -cysteic acid CysA C3H5NO4S 150.9939210000 CSID: 23942 -D-4-fluoroPhenylGlycin D-F-ph-Gly C8H6FNO 151.0433440000 CSID: 88776 -3-amino-2-methyloct-7-ynoic acid C8:0:1(7)-Me(2)-NH2(3) C9H13NO 151.0997100000 C(CCCC#C)(C(C(=O)O)C)N in CSID: 8230475 -2-methyl-3-hydroxy-7-octynoic acid C8:0:1(7)-Me(2)-OH(3) C9H12O2 152.0837340000 CSID: 9964309 -2-methyl-8-noneic acid C9:1(8)-Me(2) C10H16O 152.1201110000 CID: 17824924 -Hydroxyhistidine OH-His C6H7N3O2 153.0538270000 CSID: 379547 -N-methyl homo vinylogous Valine NMe-hv-Val C9H15NO 153.1153660000 C(C(NC)C(C)C)=C(C(O)=O)C in CSID: 10213622 -Alanine-thiazole Ala-Thz C6H7N2OS 154.0200900000 CSID: 23916434 -capreomycidine/enduracididine Cap/End C6H10N4O 154.0854590000 CSID: 3818574/CSID: 24775830 -decanoic acid C10:0 C10H18O 154.1357670000 CSID: 2863 -N-Acetylisoleucine/N-acetyl-Leucine/O-desmethyldolaproine N-Ac-Ile/N-Ac-Leu/Ddap C8H13NO2 155.0946290000 CSID: 270615/CSID: 1918/C(C1CCCN1)(C(C(=O)O)C)O in CSID: 9938808 -2-Aminononanoic acid Me-AOA C9H17NO 155.1310210000 CSID: 198341 -2-carboxyquinoxaline COOH-Qui C9H4N2O 156.0323580000 CSID: 87301 -N-formyl-Glutamine NFo-Gln C6H8N2O3 156.0534910000 CSID: 2106926 -hydroxyisovalerylpropionyl Hip C8H12O3 156.0786380000 CID: 18942657 -3.4-dimethylglutamine 3Me-4Me-Gln C7H12N2O2 156.0898840000 CSID: 21376706 -DL-Arginine/L-(+)-Arginine Arg/L-Arg C6H12N4O 156.1011140000 CSID: 227/CSID: 6082 -3-hydroxy-4-methyloctanoic acid/3-hydroxy-nonanoic acid C8:0-Me(4)-OH(3)/C9:0-OH(3) C9H16O2 156.1150300000 CSID: 17247549/CSID: 33630 -N-trimethyl-leucine NtMe-Leu C9H18NO 156.1382840000 C(C(=O)O)(CC(C)C)[N](C)(C)C in: NOR00695 -Citrulline Cit C6H11N3O2 157.0851230000 CSID: 810 -isostatine/statine Ist/Sta C8H15NO2 157.1102850000 CSID: 19578058/CSID: 2632509 -N6-formyl-HydroxyOrnithine Fo-OH-Orn C6H10N2O3 158.0691470000 C(C(=O)O)(CCCN(C=O)O)N in CSID: 3294 -alpha-amino-hydroxyadipic acid Ahad C6H9NO4 159.0531560000 CID: 22326384 -N-methyl-2.3-dehydrophenylalanine NMe-dPhe C10H9NO 159.0684140000 C(C(O)=O)(=CC1=CC=CC=C1)NC in CSID: 4444584 -O-methyl-L-rhamnose 2OMe-Rha C7H12O4 160.0735570000 CSID: 4352115 -N-Methyl-Phenylalanine/Homophenylalanine Me-Phe/Hph C10H11NO 161.0840700000 CSID: 3846742/CSID: 92605 -Hexose Hexose C6H10O5 162.0528200000 CSID: 23139 -N-hydroxy-dehydro-HydroxyPhenylGlycine OH-dHpg C8H5NO3 163.0269410000 CID: 20339127 -Methionine sulfone O2-Met C5H9NO3S 163.0303130000 CSID: 63154 -phosphinothricin PT C5H10NO3P 163.0398350000 CSID: 4630 -Tyrosine/Phenylserine/N-methyl-HydroxyPhenylGlycine Tyr/Ph-Ser/NMe-Hpg C9H9NO2 163.0633330000 CSID: 1121/CSID: 84951/CID: 15118056 -4-hydroxy-D-phenyl-lactate 4OH-D-Ph-Lac C9H8O3 164.0473420000 CID: 9378 -propenoyl-alanyloxazole acid PALOA C8H8N2O2 164.0585730000 C(C=CC1=COC(=N1)C(N)C)(=O)O in CSID: 10477875 -3.4-dichloro-proline Cl2-Pro C5H5Cl2NO 164.9748170000 CID: 21295133 -3.5-dihydroxyphenylglycine Dhpg C8H7NO3 165.0425970000 CSID: 97113 -cyclo alpha-ketoarginine ck-Arg C7H10N4O 166.0854590000 C12(C(CCCN1C(=NC2=O)-N)N)O in CSID: 9977717 -2.2-dimethyl-3-hydroxy-7-octynoic acid C8:0:1(7)-Me(2.2)-OH(3) C10H14O2 166.0993750000 CSID: 29330001 -2-carboxy-6-hydroxyoctahydroindole Choi C9H13NO2 167.0946290000 C1C(NC2C1CCC(C2)O)C(=O)O in CSID: 10480056 -3-Desoxy-Methyl-4-butenyl-4-methyl threonine 3d-NMe-Bmt C10H17NO 167.1310210000 CC=CCC(C)CC(NC)C(=O)O in CSID: 4953086 -1-methoxy-beta-alanine-thiazole OMe-bAla-Thz C7H8N2OS 168.0357300000 C(N)(CC(=O)OC)C1=NC=CS1 in CSID: 26365309 -2.2-dimethyl-3-hydroxy-7-octenoic acid C8:1(7)-Me(2.2)-OH(3) C10H16O2 168.1150300000 C(C(C(CCCC=C)O)(C)C)(O)=O in CSID: 8732670 -9-methyldecanoic acid C11:0 C11H20O 168.1514220000 CSID: 4471714 -4-butenyl-4-methyl threonine/Dolaproine Bmt/Dap C9H15NO2 169.1102850000 CC=CCC(C)C(C(C(=O)O)N)O in CSID: 4444325/C1C(CCN1)C(C(C(O)=O)C)OC in CSID: 7986684 -5-hydroxy-capreomycidine 5OH-Cap C6H10N4O2 170.0803770000 C1C(NC(NC1C(C(=O)O)N)=N)O in CSID: 2301596 -hydroxysecbutyl acetyl propionyl Hysp C9H14O3 170.0942930000 C(C(C(C(O)C(CC)C)=O)C)(=O)O in CSID: 10477730 -homoarginine Har C7H14N4O 170.1167540000 CSID: 8732 -3-hydroxy-decanoic acid/3-hydroxy-2-methyl-nonanoic acid/2.2-dimethyl-3-hydroxy-octanoic acid C10:0-OH(3)/C9:0-Me(2)-OH(3)/C8:0-Me(2.2)-OH(3) C10H18O2 170.1306860000 CSID: 24790/CSID: 9587708/CSID: 8949283 -N-methoxyacetyl-valine NOMe-Ac-Val C8H13NO3 171.0895480000 CSID: 11856685 -N-desmethyldolaisoleuine/alpha-hydroxy-6-methyl-3-aminooctanoic acid Ddil/aC9:0-OH(2)-NH2(3) C9H17NO2 171.1259250000 C(C(N)C(C)CC)(CC(O)=O)OC in CSID: 9938808/C(C(C(CCC(CC)C)N)O)(=O)O in CSID: 10475103 -N-acetyl-HydroxyOrnithine Ac-OH-Orn C7H12N2O3 172.0847870000 CSID: 3670289 -tryptophanol Trpol C11H12N2 172.1000460000 CSID: 10234 -N-methyldichloropyrrole-2-carboxylic acid MdCP C6H3Cl2NO 174.9591620000 CSID: 21926880 -beta.beta-dimethyl-Methionine-S-oxide bbMe2-O-Met C7H13NO2S 175.0667060000 CSID: 29322228 -alpha-amino-phenyl-valeric acid Apv C11H13NO 175.0997100000 CSID: 262061 -Homotyrosine/N-methyltyrosine Hty/Me-Tyr C10H11NO2 177.0789740000 CSID: 3365526/CSID: 453342 -propenoyl-2-aminobutanoyloxazole acid PAOA C9H10N2O2 178.0742280000 C(C=CC1=COC(=N1)C(N)CC)(=O)O in CSID: 27026296 -2.4-dimethyl-dec-9-ynoic acid/10-methyl-2.trans4-undecanoic acid C10:0:1(9)-Me(2.4)/iC12:2(2.t4) C12H18O 178.1357670000 C(C(CC(CCCCC#C)C)C)(=O)O in CSID: 23076292/C(C=CC=CCCCCC(C)C)(O)=O in CSID: 24677772 -beta-hydroxy-tyrosine/3.4-dihydroxyphenylalanine OH-Tyr/diOH-Phe C9H9NO3 179.0582370000 CSID: 13930867/CSID: 813 -proline-thiazole Pro-Thz C8H8N2OS 180.0357300000 C1=CSC(=N1)C2CCC(N2)C(=O)O in CSID: 8971346 -2-methyl-5-dodecenoic acid C12:1(5) C12H20O 180.1514220000 CSID: 4471802 -Anticapsin Aca C9H11NO3 181.0738920000 CSID: 2796855 -D-homoarginine D-Har C7H10N4O2 182.0803770000 CSID: 53295 -vinylogous arginine v-Arg C8H14N4O 182.1167540000 C(C(N)CCCNC(=N)N)=CC(=O)O in CSID: 8946030 -dodecanoic acid C12:0 C12H22O 182.1670630000 CSID: 3756 -3-chloro-4-hydroxyphenylglycine Cl-Hpg C8H6ClNO2 183.0087070000 CSID: 3817439 -MeBmt/2-amino-8-oxo-decanoic acid MeBmt/C10:0-NH2(2)-oxo(8) C10H17NO2 183.1259250000 CSID: 9944222/CSID: 16281719 -2.3-Dehydro-Tryptophan dh-Trp C11H8N2O 184.0636690000 CSID: 7991355 -ureido-4-oxovancosamine U4oxo-Van C8H12N2O3 184.0847870000 C1(C2(C(CC(O1)O)(C)NC(N2)=O)O)C in: NOR00711 -alpha-ketoarginine k-Arg C7H12N4O2 184.0960180000 C(C(C(CCCNC(=N)N)N)=O)(=O)O in CSID: 10477079 -3-hydroxy-undecanoic acid/3-hydroxy-2-methyl-decanoic acid C11:0-OH(3)/C10:0-Me(2)-OH(3) C11H20O2 184.1464330000 CSID: 2340495/CSID: 13775620 -Dolapyrrolidone Dpy C12H11NO 185.0840700000 CSID: 8735462 -Dolaisoleucine/8-hydroxy-2-amino-decanoic acid/9-hydroxy-2-amino-decanoic acid Dil/C10:0-OH(8)-NH2(2)/C10:0-OH(9)-NH2(2) C10H19NO2 185.1415800000 C(CC(O)=O)(OC)C(C(C)CC)NC in CSID: 7986684/CSID: 26949211/C(C(N)CCCCCCC(C)O)(=O)O in CSID: 10279723 -DL-Tryptophan Trp C11H10N2O 186.0793090000 CSID: 1116 -hydrated alpha-ketoarginine hk-Arg C7H14N4O2 186.1116730000 C(C(C(CCCN=C(N)N)N)O)(=O)O in CSID: 8946570 -dehydro vinylogous tyrosine dv-Tyr C11H9NO2 187.0633330000 C(C(N)=CC1=CC=C(C=C1)O)=CC(=O)O in CSID: 8185737 -3.4-dihydroxyArginine diOH-Arg C6H12N4O3 188.0909360000 C(C(C(C(O)=O)N)O)(CN=C(N)N)O in CSID: 8801410 -vinylogous tyrosine/N-acetylphenylalanine V-Tyr/Ac-Phe C11H11NO2 189.0789740000 C(C(N)CC1=CC=C(C=C1)O)=CC(=O)O in CSID: 10477079/CSID: 1923 -kynurenine Kyn C10H10N2O2 190.0742280000 CSID: 823 -coronafacic acid CFA C12H14O2 190.0993750000 CSID: 13300082 -N-methyl-4-methylamino-phenylalanine Me-MeA-Phe C11H14N2O 190.1106200000 CID: 21137790 -alpha-amino-hydroxyphenyl-valeric acid/N-methyl-homotyrosine/ethylene inserted tyrosine/N.O-dimethyl-tyrosine Ahv/Me-Hty/e-Tyr/NMe-OMe-Tyr C11H13NO2 191.0946290000 C(C(=O)O)(CCCC1=CC=C(C=C1)O)N in CSID: 142959/C1=CC(=CC=C1CCC(C(=O)O)NC)O in CSID: 10477716/C(C(N)CC1=CC=C(C=C1)O)CC(=O)O in CSID: 9977717/CID: 18925327 -10-methyl-2.trans4-dodecenoic acid aC13:2(2.t4) C13H20O 192.1514220000 C(C=CC=CCCCCC(CC)C)(O)=O in CSID: 24665012 -di-chloro-N-methyl-dehydroLeucine Cl2-NMe-dhLeu C7H9Cl2NO 193.0061130000 C(C(O)=O)(NC)=CC(C)C(Cl)Cl in CSID: 8701761 -beta-methoxy-tyrosine bOMe-Tyr C10H11NO3 193.0738920000 CSID: 16174140 -O-sulfate-2-hydroxy-3-methylpentanoic acid OSu-Hmp C6H10O5S 194.0248960000 C(C(C(CC)C)O[S](=O)(=O)O)(=O)O in CSID: 10477875 -methyloxazoline-isoleucine MeOx-Ile C11H18N2O 194.1419160000 C(N)(C(C)CC)C1=NC(C(C1)C)C(=O)O in CSID: 10477991 -10-methyl-3-dodecenoic acid aC13:1(3) C13H22O 194.1670630000 C(CC=CCCCCCC(CC)C)(O)=O in: NOR00767 -di-chloro-N-methyl-Leucine Cl2-NMe-Leu C7H11Cl2NO 195.0217680000 C(C(O)=O)(NC)CC(C)C(Cl)Cl in CSID: 8773801 -3-hydroxy-5-dodecenoic acid/9-oxo-2.4-dimethyldecanoic acid/8-hydroxy-2.4.6-trimethyl-4-nonenoic acid C12:1(5)-OH(3)/C10:0-Me(2.4)-oxo(9)/C9:1(4)-Me(2.4.6)-OH(8) C12H20O2 196.1463260000 CSID: 10761118/C(C(CC(CCCCC(C)=O)C)C)(=O)O in CSID: 8946480/C(C(CC(=CC(CC(C)O)C)C)C)(O)=O in CSID: 8007368 -10-methyldodecanoic acid aC13:0 C13H24O 196.1824280000 CSID: 2282934 -chloro-tyrosine Cl-Tyr C9H8ClNO2 197.0243620000 CSID: 106510 -2-amino-9.10-epoxi-8-oxodecanoic acid C10:0-NH2(2)-Ep(9)-oxo(8) C10H15NO3 197.1051880000 CSID: 11345228 -4-butenyl-4-methyl-N.4-methyl threonine Me2-Bmt C11H19NO2 197.1414280000 CSID: 4450325 -3-hydroxy-dodecanoic acid/3-hydroxy-2-methyl-undecanoic acid C12:0-OH(3)/C11:0-Me(2)-OH(3) C12H22O2 198.1619810000 CSID: 85026/CSID: 13775586 -9-hydroxy-2-amino-8-oxo-decanoic acid C10:0-OH(9)-NH2(2)-oxo(8) C10H17NO3 199.1204350000 CSID: 25942012 -N-acetyl-N6-formyl-N6-hydroxyOrnithine NAc-Fo-OH-Orn C8H12N2O4 200.0797060000 C(C(=O)O)(NC(C)=O)CCCN(O)C=O in CSID: 3294 -N1-methyl-tryptophan 1Me-Trp C12H12N2O 200.0949650000 CSID: 88584 -5-hydroxytryptophan OH-Trp C11H10N2O2 202.0742280000 CSID: 141 -N-methyl-4-dimethylamino-phenylalanine NMe-Me2A-Phe C12H16N2O 204.1262610000 CSID: 27594543 -vinylogous hydroxy tyrosine v-OH-Tyr C11H11NO3 205.0738920000 C(C(N)CC1=CC(=C(C=C1)O)O)=CC(=O)O in CSID: 9204437 -alpha-amino-methoxyphenyl-valeric acid Amv C12H15NO2 205.1104370000 CSID: 9681632 -N-Methyl-Lanthionine NMe-Lan C6H10N2O4S 206.0361270000 C(SCC(C(=O)O)N)C(C(O)=O)NO in: NOR00149 -3-nitrotyrosine 3NO2-Tyr C9H8N2O4 208.0484100000 CSID: 205676 -7-tetradecenoic acid C14:1(7) C14H24O 208.1827180000 CSID: 10722652 -D-PhosphateAsparagine D-PO-Asn C4H7N2O6P 210.0041721000 C(C(C(C(O)=O)N)O[P](O)(=O)O)(=O)N in: NOR00025 -propenoyl-O-methylserinylthiazole acid PMST C9H10N2O2S 210.0463050000 C(C=CC1=CSC(=N1)C(N)COC)(=O)O in CSID: 8503913 -5-oxo-8-hydroxy-2.4.6-trimethyl-4-nonaneic acid C9:1(Me4)-Me(2.4.6)-OH(8)-Oxo(5) C12H18O3 210.1255890000 C(C(CC(C(C(CC(C)O)C)=O)=C)C)(O)=O in CSID: 8434247 -tetradecanoic acid C14:0 C14H26O 210.1983580000 CSID: 10539 -Chloro-N-methyl-tyrosine Cl-NMe-Tyr C10H10ClNO2 211.0400030000 CSID: 27594554 -3-amino-tridecanoic acid C13:0-NH2 C13H25NO 211.1934350000 CSID: 26283438 -3-hydroxy-tridecanoic acid C13:0-OH C13H24O2 212.1776370000 CSID: 4472174 -beta-hydroxy-chloro-tyrosine bOH-Cl-Tyr C9H8ClNO3 213.0192660000 CSID: 25938524 -3-amino-6-hydroxy-2-piperidone Ahp C9H14N2O4 214.0954350000 CSID: 25058696 -N-methyl-5-hydroxytryptophan/methoxytryptophan NMe-OH-Trp/OMe-Trp C12H12N2O2 216.0898840000 C(C(=O)O)(NC)CC1=C[N]C2=C1C=C(C=C2)O in CSID: 10476796/O(C(=O)[C@@H](N([H])[H])CC1=C[N](C2=CC=CC=C12)OC)[H] in CSID: 5293532 -2.6-diamino-7-hydroxyazelaic acid Daz C9H16N2O4 216.1110020000 CSID: 391749 -4-amino-7-guanidino-2.3-dihydroxyheptanoic acid Agdha C8H16N4O3 216.1222480000 CSID: 21377788 -3.5-dichloro-4-hydroxyphenylglycine Cl2-Hpg C8H5Cl2NO2 216.9694310000 CSID: 9804791 -DHP-methyloxazolinyl group DMOG C11H9NO4 219.0531560000 CSID: 12721 -N-methoxyacetyl-D-phenylalanine NOMe-Ac-D-Phe C12H13NO3 219.0895480000 CSID: 11859621 -D-6'-chloro-tryptophan D-Cl-Trp C11H9ClN2O 220.0403380000 C(C(=O)O)(N)CC1=NC2=C(C1)C=CC(=C2)Cl in CSID: 8094776 -dihydroxyphenylthiazol group DHPT C10H7NO3S 221.0146580000 CSID: 23110909 -12-methyl-3-tetradecenoic acid aC15:1(3) C15H26O 222.1984350000 C(CC=CCCCCCCCC(CC)C)(O)=O in: NOR00768 -2.3-dihydroxy-2.6.8-trimethyldeca-(4Z.6E)-dienoic acid/2.3-dihydroxy-trans4.trans6-tridecenoic acid aC11:2(4.6)-Me(2.6)-OH(2.3)/C13:2(t4.t6)-OH(2.3) C13H20O3 224.1412450000 C(C(C(C=CC(=CC(CC)C)C)O)(O)C)(O)=O in CSID: 4977118/C(C(C(C=CC=CCCCCCC)O)O)(O)=O in CSID: 4976886 -12-methyltetradecanoic acid aC15:0 C15H28O 224.2140140000 CSID: 20368 -bromophenylalanine Br-Phe C9H8BrNO 224.9789220000 CSID: 77275 -3-amino-tetradecanoic acid C14:0-NH2(3) C14H27NO 225.2092680000 CSID: 15571256 -3-hydroxy-tetradecanoic acid C14:0-OH(3) C14H26O2 226.1932770000 CSID: 15252 -tri-chloro-N-methyl-dehydroLeucine Cl3-NMe-dhLeu C7H8Cl3NO 226.9671420000 C(C(O)=O)(NC)=CC(C)C(Cl)(Cl)Cl in CSID: 10477276 -N-acetyltryptophan Ac-Trp C13H12N2O2 228.0898840000 CSID: 1925 -beta.beta.N-trimethyltryptophan bbMe-NMe-Trp C14H16N2O 228.1262610000 C1=CC=CC2=C1C(=C[N]2)C(C(C(O)=O)NC)(C)C in CSID: 8158974 -3-hydroxy-2.2.4-trimethyl-7-hydroxydecanoic acid C10:0-Me(2.2.4)-OH(3.7) C13H24O3 228.1725400000 C(C(C(C(=O)O)(C)C)O)(CCC(CCC)O)C in CSID: 8184030 -tri-chloro-N-methyl-Leucine Cl3-NMe-Leu C7H10Cl3NO 228.9827970000 C(C(O)=O)(NC)CC(C)C(Cl)(Cl)Cl in CSID: 10477275 -thiazolylphenylalanine Phe-Thz C12H10N2OS 230.0513860000 C(N)(CC1=CC=CC=C1)C2=NC(=CS2)C(O)=O in CSID: 8593238 -D-2-carboxy-tryptophan D-COOH-Trp C12H10N2O3 230.0691470000 C(C(O)=O)(N)CC1=C([N]C2=C1C=CC=C2)C(=O)O in CSID: 7987591 -N-methyl-6-chloro-tryptophan NMe-Cl-Trp C12H11ClN2O 234.0559940000 C(C(=O)O)(NC)CC1=C[N]C2=C1C=CC(=C2)Cl in CSID: 8805002 -7-hexadecenoic acid/9-hexadecenoic acid C16:1(7)/C16:1(9) C16H28O 236.2144410000 CSID: 4895966/CSID: 4445872 -2.3-dihydroxy-trans4.trans6-tetradecenoic acid/2.6.8-trimethyl-5.7-dihydroxy-trans2.trans8-undecenoic acid C14:2(t4.t6)-OH(2.3)/C11:2(t2.t8)-Me(2.6.8)-OH(5.7) C14H22O3 238.1568850000 C(C(C(C=CC=CCCCCCCC)O)O)(O)=O in CSID: 8924310/C(C(=CCC(C(C(C(=CCC)C)O)C)O)C)(O)=O in CSID: 10481263 -hexadecanoic acid C16:0 C16H30O 238.2296690000 CSID: 960 -beta-methyl-bromophenylalanine bMe-Br-Phe C10H10BrNO 238.9945620000 C(C(=O)O)(C(C1=CC=C(C=C1)Br)C)N in CSID: 10475327 -3-amino-pentadecanoic acid C15:0-NH2(3) C15H29NO 239.2244350000 CSID: 26283439 -3-hydroxy-13-methyltetradecanoic acid/3-hydroxy-pentadecanoic acid C14:0-Me(13)-OH(3)/C15:0-OH(3) C15H28O2 240.2089170000 CSID: 9218624/CSID: 158374 -bromotyrosine/beta-hydroxy-bromophenylalanine Br-Tyr/OH-Br-Phe C9H8BrNO2 240.9738410000 CSID: 131083/CSID: 19757850 -beta.beta.N1.N-tetramethyltryptophan bbNMe-NMe-Trp C15H18N2O 242.1419010000 C1=CC=CC2=C1C(=C[N]2C)C(C(C(O)=O)NC)(C)C in CSID: 8570259 -3.4-dihydroxy-tetradecanoic acid/ 3-hydroxy-2.2.4-trimethyl-7-methoxydecanoic acid C14:0-OH(3.4)/C10:0-Me(2.2.4)-OH(3)-OMe(7) C14H26O3 242.1881960000 CID: 22667431/CSID: 28587148 -3-amino-4-hydroxy-6-methyl-8-phenyl-5.7-octadienoic acid C8:2(5.7)-Me(6)-OH(4)-NH2(3)-Ph(8) C15H17NO2 243.1259400000 C(CC(C(C=C(C=CC1=CC=CC=C1)C)O)N)(=O)O in CSID: 10475327 -tri-chloro-2-hydroxy-N-methyl-Leucine Cl3-2OH-NMe-Leu C7H10Cl3NO2 244.9777160000 C(C(O)=O)(NC)(CC(C)C(Cl)(Cl)Cl)O in CSID: 10477276 -N-methyl-6-chloro-5-hydroxytryptophan NMe-Cl-OH-Trp C12H11ClN2O2 250.0508970000 C(C(=O)O)(NC)CC1=C[N]C2=C1C=C(C(=C2)Cl)O in CSID: 10473575 -2.3-dihydroxy-trans4.trans6-pentadecenoic acid C15:2(t4.t6)-OH(2.3) C15H24O3 252.1725400000 C(C(C(C=CC=CCCCCCCCC)O)O)(O)=O in CSID: 4976888 -3-hydroxy-9-hexadecenoic acid C16:1(9)-OH(3) C16H28O2 252.2089170000 C(CC(CCCCCC=CCCCCCC)O)(O)=O in: NOR00720 -3-amino-hexadecanoic acid C16:0-NH2(3) C16H31NO 253.2405640000 CSID: 24597602 -3-hydroxy-hexadecanoic acid C16:0-OH(3) C16H30O2 254.2245730000 CSID: 266538 -D-3-bromo-N-methyl-Tyrosine D-Br-NMe-Tyr C10H10BrNO2 254.9894960000 CSID: 2128826 -N1-carboxy-bichomotryptophan N1-COOH-bhTrp C14H14N2O3 258.1004270000 C(CC1=C[N](C2=C1C=CC=C2)C(=O)O)CC(C(=O)O)N in CSID: 9968260 -isopyoverdin chromophore/pyoverdin chromophore ChrI/ChrP C13H13N3O3 259.0956970000 C1=C(C(=CC2=C1N3C(C(=C2)N)NC(CC3)C(O)=O)O)O in: NOR00163/C1=C(C(=CC2=C1N3C(C(=C2)N)NC(CC3)C(O)=O)O)O in CID: 5289234 -5.6-dihydropyoverdin chromophore ChrD C13H15N3O3 261.1113530000 C1=C(C(=CC2=C1N3C(C(N)C2)NCCC3C(O)=O)O)O in: NOR00903 -D-6-chloro-N2-formamidotryptophan D-Cl-CONH2-Trp C12H10ClN3O2 263.0461670000 C(C(O)=O)(N)CC1=C[N](C2=C1C=CC(=C2)Cl)C(=O)N in CSID: 8138519 -3-amino-8-phenyl-2.4.5-trihydroxyoct-7-enoic acid C8:1(7)-OH(2.4.5)-NH2(3)-Ph(8) C14H17NO4 263.1157470000 CSID: 29330841 -5-bromo-tryptophan Br-Trp C11H9BrN2O 263.9898320000 CSID: 87339 -9-octadecenoic acid C18:1(9) C18H32O 264.2453250000 CSID: 553123 -8.10-Dimethyl-9-hydroxy-7-methoxytridecadienoic acid DHMDA C16H26O3 266.1881960000 C(C(C(CCC)C)O)(C(C=CC=CCC(=O)O)OC)C in CSID: 10479168 -3-amino-14-methyl-hexadecanoic acid/3-amino-15-methyl-hexadecanoic acid aC17:0-NH2(3)/iC17:0-NH2(3) C17H33NO 267.2562200000 C(CC(CCCCCCCCCCC(CC)C)N)(O)=O in CSID: 2340866/C(CC(CCCCCCCCCCCC(C)C)N)(O)=O in: NOR00801 -3-hydroxy-14-methyl-hexadecanoic acid/3-hydroxy-15-methyl-hexadecanoic acid aC17:0-OH(3)/iC17:0-OH(3) C17H32O2 268.2402280000 C(CC(CCCCCCCCCCC(CC)C)O)(O)=O in: NOR00900/CSID: 141849 -3.4-dihydroxy-hexadecanoic acid C16:0-OH(3.4) C16H30O3 270.2195070000 CID: 22348653 -4-propenoyl-2-tyrosylthiazole acid PTTA C14H12N2O2S 272.0619450000 C(O)(=O)C=CC1=CSC(=N1)C(N)CC2=CC=C(C=C2)O in CSID: 16738243 -N-methyl-2-Bromo-tryptophan NMe-Br-Trp C12H11BrN2O 278.0054570000 C(C(=O)O)(NC)CC1=C([N]C2=C1C=CC=C2)Br in CSID: 8007368 -2-bromo-5-hydroxytryptophan Br-OH-Trp C11H9BrN2O2 279.9847350000 CSID: 643874 -3-hydroxy-9-octadecenoic acid C18:1(9)-OH(3) C18H32O2 280.2404420000 C(CC(CCCCCC=CCCCCCCCC)O)(O)=O in: NOR00724 -azotobactins chromophore ChrA C14H11N3O4 285.0749450000 C1=C(C(=CC2=C1N4C3C(=C2)NC(N3CCC4C(O)=O)=O)O)O in: NOR00208 -O-demethyl-Adda DMAdda C19H25NO2 299.1885320000 C(C(C(C=CC(=CC(C(CC1=CC=CC=C1)O)C)C)N)C)(O)=O in: NOR00129 -D-3-iodo-N-methyl-Tyrosine D-I-NMe-Tyr C10H10INO2 302.9756110000 C(C(=O)O)(NC)CC1=CC(=C(C=C1)O)I in CSID: 9017332 -actinomycin chromophore ChrAct C16H10N2O5 310.0589850000 CSID: 86817 -3-amino-9-methoxy-2.6.8-trimethyl-10-phenyldeca-4.6-dienoic acid Adda C20H27NO2 313.2041870000 CSID: 10471100 -3-amino-4-hydroxy-6-methyl-8-(p-bromophenyl)-5.7-octadienoic acid C8:2(5.7)-Me(6)-OH(4)-NH2(3)-brPh(8) C15H16BrNO2 321.0364320000 C(CC(C(C=C(C=CC1=CC=C(C=C1)Br)C)O)N)(=O)O in CSID: 10476834 -3-amino-6-methyl-12-phenyl-2.4.5-trihydroxydodeca-7.9.11-trienoic acid C12:3(7.9.11)-Me(6)-OH(2.4.5)-NH2(3)-Ph(12) C19H23NO4 329.1627140000 C(C(C(C(C(C(C=CC=CC=CC1=CC=CC=C1)C)O)O)N)O)(O)=O in CSID: 8923613 -3-amino-10-(p-ethoxyphenyl)-2.4.5-trihydroxydeca-7.9-dienoic acid C10:2(7.9)-OH(2.4.5)-NH2(3)-ePh(10) C18H23NO5 333.1576170000 CSID: 29330839 -O-Acetyl-O-demethylAdda ADMAdda C21H27NO3 341.1990910000 C(C(C(C=CC(=CC(C(CC1=CC=CC=C1)OC(C)=O)C)C)N)C)(O)=O in: NOR00144 -3-amino-6.10-dimethyl-12-phenyl-2.4.5-trihydroxydodeca-7.9.11-trienoic acid C12:3(7.9.11)-Me(6.10)-OH(2.4.5)-NH2(3)-Ph(12) C20H25NO4 343.1783690000 C(C(C(C(C(C(C=CC=C(C=CC1=CC=CC=C1)C)C)O)O)N)O)(O)=O in CSID: 10187168 -3-amino-6-methyl-12-(p-methoxyphenyl)-2.4.5-trihydroxydodec-11-enoic acid C12:1(11)-Me(6)-OH(2.4.5)-NH2(3)-mPhe(11) C20H29NO5 363.2045840000 CSID: 29330842 -pyoverdin A chromophore derivate ChrPder C13H11N3O3 257.080048 C1=C(C(=CC2=C1N3C(C(=C2)N)=NC(CC3)C(O)=O)O)O in CSID: 0 -Succinic acid Suc C4H4O3 100.016045 CSID: 7634 +Ethanolamine Eta C2H5N 43.0421990000 CSID: 13835336 +Glycine Gly C2H3NO 57.0214640000 CSID: 730 +pyrrolidone Pyr C4H5N 67.0421990000 CSID: 11530 +dehydroalanine dh-Ala C3H3NO 69.0214640000 CSID: 110510 +pyruvic acid Pya C3H2O2 70.0054790000 CSID: 1031 +butanoic acid C4:0 C4H6O 70.0418650000 CSID: 259 +DL-Alanine/beta-Alanine/Sarcosine Ala/bAla/Sar C3H5NO 71.0371140000 CSID: 582/CSID: 234/CSID: 1057 +Lactic acid Lac C3H4O2 72.0211290000 CSID: 592 +Serinol Serol C3H7NO 73.0527640000 CSID: 61591 +2.3-dehydro-2-aminobutyric acid/homoserine lactone/N-Methyl-dehydroalanine/hydroxy pyrrolidone dhAbu/HSL/NMe-Dha/OH-Pyr C4H5NO 83.0371140000 CSID: 4952645/CSID: 66194/CSID: 118845/CSID: 134682 +2-hydroxy-3-butenoic acid C4:1(3)-OH(2) C4H4O2 84.0211290000 CSID: 141066 +2-methyl-butanoic acid C4:0-Me(2) C5H8O 84.0575150000 CSID: 8012 +alpha-formylGlycine aFo-Gly C3H3NO2 85.0163780000 CSID: 28 +N-Methyl-L-alanine/ABU/2-Methylalanine/methyl alaninate NMe-Ala/Abu/Aib/D-3OMe-Ala C4H7NO 85.0527640000 CSID: 4450824/CSID: 6405/CSID: 5891/CSID: 99878 +isovalinol/valinol Ivalol/Valol C5H11N 85.0891490000 CSID: 8329525/CSID: 71352 +3-hydroxybutanoic acid C4:0-OH(3) C4H6O2 86.0367790000 CSID: 428 +2.3-Diaminopropionic acid Dpr C3H6N2O 86.0480130000 CSID: 357 +DL-Serine/isoserine Ser/Iser C3H5NO2 87.0320280000 CSID: 597/CSID: 10793 +Sorbic acid C6:2(t2.t4) C6H6O 94.0418650000 CSID: 558605 +methyl-succinimide Me-Suc C5H5NO 95.0371140000 CSID: 122158 +proline carboxamid ProC C5H8N2 96.0687480000 CSID: 479142 +DL-Proline/2-methylamino-2-dehydrobutyric acid/norcoronamic acid Pro/2Dh-Mabu/norCMA C5H7NO 97.0527640000 CSID: 594/CSID: 16743754/CSID: 28708240 +3-methylvaleric acid/hexanoic acid Me-Vaa/C6:0 C6H10O 98.0731650000 CSID: 7469/CSID: 8552 +N-formyl-Alanine NFo-Ala C4H5NO2 99.0320280000 CSID: 72251 +DL-Valine/Isovaline/Norvaline/2-methyl-3-aminobutanoic acid/N-dimethyl-Alanine/3-amino-pentanoic acid Val/Ival/Nva/Mab/NdMe-Ala/C5:0-NH2(3) C5H9NO 99.0684140000 CSID: 1148/CSID: 85483/CSID: 801/CSID: 471786/CSID: 9962964/CSID: 11271826 +Leucinol/Isoleucinol Leuol/Ileol C6H13N 99.1047990000 CSID: 71362/CSID: 82355 +2-hydroxy-3-epoxy-butanoic acid C4:0-OH(2)-Ep(3) C4H4O3 100.0160440000 CSID: 15475591 +2-hydroxyisovaleric acid Hiv C5H8O2 100.0524300000 CSID: 90190 +2.4-diaminobutyric acid/2.3-diaminobutyric acid Dab/Dbu C4H8N2O 100.0636630000 CSID: 457/CSID: 4475641 +dehydro-cysteine dhCys C3H3NOS 100.9935340000 CSID: 24784832 +Threonine/Homoserine/N-Methyl-Serine/4-amino-3-hydroxybutyric acid Thr/Hse/NMe-Ser/OH-4Abu C4H7NO2 101.0476780000 CSID: 200/CSID: 758/CSID: 481791/CSID: 2064 +2.3-dihydroxy-butanoic acid C4:0-OH(2.3) C4H6O3 102.0316940000 CSID: 219301 +DL-Cysteine Cys C3H5NOS 103.0091840000 CSID: 574 +benzoic acid Bz C7H4O 104.0262150000 CSID: 238 +4-oxo-proline/pyroglutamic acid 4oxo-Pro/pGlu C5H5NO2 111.0320280000 CSID: 366185/CSID: 485 +3-Methylproline/Pipecolic acid/coronamic acid Me-Pro/Pip/CMA C6H9NO 111.0684140000 CSID: 10610754/CSID: 826/CSID: 117751 +keto-Leucine/2-epoxy-hexanoic acid K-Leu/C6:0-Ep(2) C6H8O2 112.0524300000 CSID: 69/CSID: 14066572 +Hydroxy-cycloOrnithine OH-cOrn C5H8N2O 112.0636630000 CSID: 13539649 +heptanoic acid C7:0 C7H12O 112.0888150000 CSID: 7803 +aziridine dicarboxylic acid Azd C4H3NO3 113.0112930000 CSID: 11582505 +3-Hydroxyproline/2-formamidobutanoic acid 3OH-Pro/NFo-D-Abu C5H7NO2 113.0476780000 CSID: 486216/CSID: 486348 +Leucine/Isoleucine/N-Methyl-L-valine/3-Methylvaline/2-methyl-3-aminopentanoic acid/D-N-methyl-norvaline Leu/Ile/NMe-Val/t-Leu/Map/D-NMe-Nva C6H11NO 113.0840640000 CSID: 834/CSID: 769/CSID: 4225/CSID: 270637/CSID: 11643060/CSID: 10652938 +hydroxyacetyl propionyl/pentanedioic acid Hap/Pda C5H6O3 114.0316940000 C(C(C(CO)=O)C)(=O)O in CSID: 10477731/CSID: 723 +DL-Asparagine/N1-formyl-2.3-Diaminopropionic acid Asn/NFo-Dpr C4H6N2O2 114.0429270000 CSID: 231/C(C(CN)NC=O)(=O)O in CSID: 8873525 +D-Leucic acid (2-hydroxy-4-methylpentanoic acid)/(R)-Leucic acid/3-hydroxyhexanoic acid C5:0-Me(4)-OH(2)/4Me-D-Hva/C6:0-OH(3) C6H10O2 114.0680800000 CSID: 83753/CSID: 388986/CSID: 133518 +DL-Ornithine Orn C5H10N2O 114.0793130000 CSID: 380 +DL-Aspartic acid/N-formyl-isoserine Asp/NFo-Iser C4H5NO3 115.0269430000 CSID: 411/C(C(C(=O)O)O)NC=O in CSID: 8503913 +3-Hydroxyvaline/N-Methylthreonine/O-Methylthreonine OH-Val/NNe-Thr/OMe-Thr C5H9NO2 115.0633290000 CSID: 244525/CSID: 5373925/CSID: 193545 +2.3-dihydroxy-3-methylbutanoic acid/2.4-dihydroxy-3-methylbutanoic acid iC5:0-OH(2.3)/iC5:0-OH(2.4) C5H8O3 116.0473440000 CSID: 657/C(C(C(CO)C)O)(=O)O in: NOR00082 +2-Methylcysteine/Methylcysteine aMe-Cys/NMe-Cys C4H7NOS 117.0248350000 CSID: 8233116/CSID: 2074082 +4-Hydroxythreonine 4OH-Thr C4H7NO3 117.0425930000 CSID: 3137512 +2.3.4-trihydroxy-butanoic acid C4:0-OH(2.3.4) C4H6O4 118.0266090000 CSID: 388628 +phenylacetic acid Pha C8H6O 118.0418650000 CSID: 10181341 +4-Hydroxybenzoic acid pOH-Bz C7H4O2 120.0211290000 CSID: 132 +trans2.trans4.trans6-trioctaneic acid C8:3(t2.t4.t6) C8H8O 120.0575150000 CSID: 4520024 +hydroxypicolinic acid Hpa C6H3NO2 121.0163780000 CSID: 12827 +oct-7-ynoic acid/2.trans4-octenoic acid C8:0:1(7)/C8:2(2.t4) C8H10O 122.0731650000 CSID: 4472125/CSID: 4944992 +4-oxo-5-methylproline/4-oxo-homoproline/N-Formyl-Proline 4oxo-5Me-Pro/4oxo-Hpr/NFo-Pro C6H7NO2 125.0476780000 CSID: 2564339/CSID: 10739339/CSID: 87055 +octanoic acid/6-methylheptanoic acid C8:0/iC8:0 C8H14O 126.1044650000 CSID: 370/CSID: 81904 +beta-ureido-dehydroAlanine bU-dAla C4H5N3O2 127.0381760000 PDB: UAL +N-formyl-Valine/N-Acetyl-2-aminoisobutyric acid/3-Hydroxy-5-methylproline Nfo-Val/Ac-Aib/3OH-5Me-Pro C6H9NO2 127.0633290000 CSID: 90479/CSID: 203779/CSID: 3823469 +N-methylleucine/N-Methyl-Isoleucine/beta-methylisoleucine/homoisoleucine/alpha-ethylnorvaline/Dolavaline/2-methyl-3-aminohexadecanoic acid Me-Leu/NMe-Ile/bMe-Ile/Hil/Et-Nva/Dov/C6:0-Me(2)-NH2(3) C7H13NO 127.0997140000 CSID: 493595/CSID: 487199/CSID: 19951406/CSID: 454232/CSID: 452678/CSID: 10731564/CSID: 21378848 +DL-Glutamine/N-methylasparagine/beta-methyl-asparagine/D-N2-methyl-asparagine/N1-acetyl-2.3-Diaminopropionic acid Gln/NMe-Asn/bMe-Asn/D-N2Me-Asn/NAc-Dpr C5H8N2O2 128.0585780000 CSID: 718/CSID: 311563/CSID: 2284493/CSID: 288387/C(C(CN)NC(C)=O)(=O)O in CSID: 8570696 +3-methoxy-hexanoic acid/3-hydroxy-heptanoic acid C6:0-OMe(3)/C7:0-OH(3) C7H12O2 128.0837300000 CSID: 277923/CSID: 2340494 +DL-Lysine/N-Hydroxy-histamine Lys/N-OH-Hta C6H12N2O 128.0949630000 CSID: 843/C1(CCCN1)CCNO in CSID: 4589228 +DL-Glutamic acid/D-beta-methyl-aspartic acid/beta-methoxy-aspartic acid/O-acetyl-Serine Glu/D-bMe-Asp/bOMe-Asp/Ac-Ser C5H7NO3 129.0425930000 CSID: 591/CSID: 829/CSID: 92764/CSID: 184 +L-acosamine/3-hydroxyleucine/beta-hydroxy-N-Methyl-Valine/gamma-hydroxy-N-Methyl-Valine/L-ristosamine Aco/OH-LeuOH/bOH-NMe-Val/gOH-NMe-Val/Ria C6H11NO2 129.0789790000 CSID: 370989/CSID: 244507/CSID: 9205156/CID: 12439044/CSID: 370989 +2-hydroxy-3-methyl-butanedioic acid iC5:0-OH(2)-CA(4) C5H6O4 130.0266090000 CSID: 485839 +Hydroxyasparagine OH-Asn C4H6N2O3 130.0378420000 CSID: 3670287 +alpha-guanidino Serine gSer C3H6N4O2 130.0490750000 C(C(=O)O)(N)(O)NC(=N)N in: NOR00426 +2.3-dihydroxy-3-methylpentanoic acid aC6:0-OH(2.3) C6H10O3 130.0629940000 CSID: 7 +N5-hydroxy ornithine/hydroxy-beta lysine OH-Orn/OH-bLys C5H10N2O2 130.0742280000 CSID: 148381/C(NCC(=O)O)(CCN)O in: NOR00634 +Hydroxyaspartic acid OH-Asp C4H5NO4 131.0218580000 CSID: 5232 +Methionine/N.S-dimethylcysteine Met/diMe-Cys C5H9NOS 131.0404850000 CSID: 853/CSID: 4450935 +arabinose/lyxose Ara/Lyx C5H8O4 132.0422590000 CSID: 224/CSID: 831 +L-Olivose Oli C6H12O3 132.0786440000 CSID: 164228 +phenylglycine Ph-Gly C8H7NO 133.0527640000 CSID: 3732 +phenylalaninol Pheol C9H11N 133.0891490000 CSID: 69116 +4-Chloro-Threonine 4Cl-Thr C4H6ClNO2 135.0087060000 CSID: 111708 +2.3-dihydroxy-4-chloro-butanoic acid C4:0-OH(2.3)-Cl(4) C4H5ClO3 135.9927220000 CSID: 25900403 +2.3-dihydroxybenzoic acid diOH-Bz C7H4O3 136.0160440000 CSID: 18 +2-methyl-7-octynoic acid/2.trans4-7-methyl-octenoic acid C8:0:1(7)-Me(2)/iC9:2(2.t4) C9H12O 136.0888150000 CSID: 24770189/CSID: 10761068 +DL-Histidine His C6H7N3O 137.0589120000 CSID: 752 +dehydropyrrolidone dPyr C6H6N2O2 138.0429270000 C1(CC(C(=CC(=O)O)N1)N)=O in CSID: 10199318 +2.3-dimethylpyroglutamic acid 2Me-3Me-pGlu C7H9NO2 139.0633290000 CSID: 13080150 +5.5-dimethyl-2-oxo-hexanoic acid C6:0-Me(5.5)-oxo(2) C8H12O2 140.0837300000 CID: 21197379 +argininal Argal C6H12N4 140.1061960000 CSID: 10655329 +Nonanoic acid/d-6-Methyloctanoic acid/7-Methyloctanoic acid C9:0/aC9:0/iC9:0 C9H16O 140.1201150000 CSID: 7866/CSID: 10015/CSID: 31022 +N-methylchloropyrrole MCP C6H4ClNO 140.9981420000 CSID: 7404981 +N-Acetylisovaline/N-Acetylvaline/N-Formylisoleucine/N-Formylleucin/4-Amino-2.2-dimethyl-3-oxopentanoic acid/4-oxovancosamine Ac-Ival/Ac-Val/Fo-Ile/Fo-Leu/Ibu/4oxo-Van C7H11NO2 141.0789790000 CSID: 272193/CSID: 198159/CSID: 383482/CSID: 90475/CSID: 29322188/C1(C(C(CC(O1)O)(C)N)=O)C in CSID: 10249894 +N-dimethyl-leucine/2-Amino-4-methylpentyl acetate Dme-Leu/Ac-Leuol C8H15NO 141.1153640000 CSID: 500040/CSID: 14603948 +N-methylglutamine NMe-Gln C6H10N2 110.0843980000 CSID: 10652941 +D-beta-methylglutamine D-bMe-Gln C6H10N2O2 142.0742280000 CSID: 24604116 +3-hydroxy-octanoic acid/2.2-dimethyl-3-hydroxyhexanoic acid/3-hydroxy-2-methyl-heptanoic acid C8:0-OH(3)/C6:0-Me(2.2)-OH(3)/C7:0-Me(2)-OH(3) C8H14O2 142.0993800000 CSID: 24791/CSID: 21418738/CSID: 27143447 +3-Methyl-Glutamic acid/2-Aminoadipic acid Me-Glu/Aad C6H9NO3 143.0582430000 CSID: 207514/CSID: 456 +L-actinosamine/L-eremosamine/norstatine/Vancosamine/N-methyl-hydroxyisoleucine Act/Ere/Nst/Van/Me-OH-Ile C7H13NO2 143.0946290000 CID: 20377364/CSID: 9542085/CSID: 151726/CSID: 164304/CSID: 24770217 +beta-hydroxyglutamine/D-beta-hydroxy-N2-methyl-asparagine OH-Gln/Me-OH-Asn C5H8N2O3 144.0534920000 CID: 22592766/CSID: 24604117 +methoxyaspartic acid OMe-Asp C5H7NO4 145.0375080000 C(C(C(C(=O)O)N)=[O]C)(=O)O in: NOR00717 +3.5-hydroxy-4-amino-hexadecanoic acid C6:0-OH(3.5)-NH2(4) C6H11NO3 145.0738930000 C(CC(C(C(C)O)N)O)(O)=O in: NOR00444 +L-rhamnose Rha C6H10O4 146.0579090000 CSID: 190747 +Methionine-S-oxide O-Met C5H9NO2S 147.0353990000 CSID: 824 +Chloro-Isoleucine Cl-Ile C6H10ClNO 147.0450920000 C(C(O)=O)(N)C(C(C)Cl)C in CSID: 10269389 +DL-Phenylalanine/N-methyl-phenylglycine Phe/NMe-Ph-Gly C9H9NO 147.0684140000 CSID: 969/CSID: 198596 +2-hydroxyphenyl-2-oxo-ethanoic acid Hpoe C8H4O3 148.0160440000 CSID: 348 +Phenyl-lactate Ph-Lac C9H8O2 148.0524300000 CSID: 3715 +HydroxyPhenylGlycine Hpg C8H7NO2 149.0476780000 CSID: 83189 +2.trans4-8-methyl-noneoic acid iC10:2(2.t4) C10H14O 150.1044650000 C(C=CC=CCCC(C)C)(O)=O in CSID: 16736750 +cysteic acid CysA C3H5NO4S 150.9939280000 CSID: 23942 +D-4-fluoroPhenylGlycin D-F-ph-Gly C8H6FNO 151.0433430000 CSID: 88776 +3-amino-2-methyloct-7-ynoic acid C8:0:1(7)-Me(2)-NH2(3) C9H13NO 151.0997140000 C(CCCC#C)(C(C(=O)O)C)N in CSID: 8230475 +2-methyl-3-hydroxy-7-octynoic acid C8:0:1(7)-Me(2)-OH(3) C9H12O2 152.0837300000 CSID: 9964309 +2-methyl-8-noneic acid C9:1(8)-Me(2) C10H16O 152.1201150000 CID: 17824924 +Hydroxyhistidine OH-His C6H7N3O2 153.0538260000 CSID: 379547 +N-methyl homo vinylogous Valine NMe-hv-Val C9H15NO 153.1153640000 C(C(NC)C(C)C)=C(C(O)=O)C in CSID: 10213622 +Alanine-thiazole Ala-Thz C6H7N2OS 155.0279090000 CSID: 23916434 +capreomycidine/enduracididine Cap/End C6H10N4O 154.0854610000 CSID: 3818574/CSID: 24775830 +decanoic acid C10:0 C10H18O 154.1357650000 CSID: 2863 +N-Acetylisoleucine/N-acetyl-Leucine/O-desmethyldolaproine N-Ac-Ile/N-Ac-Leu/Ddap C8H13NO2 155.0946290000 CSID: 270615/CSID: 1918/C(C1CCCN1)(C(C(=O)O)C)O in CSID: 9938808 +2-Aminononanoic acid Me-AOA C9H17NO 155.1310140000 CSID: 198341 +2-carboxyquinoxaline COOH-Qui C9H4N2O 156.0323630000 CSID: 87301 +N-formyl-Glutamine NFo-Gln C6H8N2O3 156.0534920000 CSID: 2106926 +hydroxyisovalerylpropionyl Hip C8H12O3 156.0786440000 CID: 18942657 +3.4-dimethylglutamine 3Me-4Me-Gln C7H12N2O2 156.0898780000 CSID: 21376706 +DL-Arginine/L-(+)-Arginine Arg/L-Arg C6H12N4O 156.1011110000 CSID: 227/CSID: 6082 +3-hydroxy-4-methyloctanoic acid/3-hydroxy-nonanoic acid C8:0-Me(4)-OH(3)/C9:0-OH(3) C9H16O2 156.1150300000 CSID: 17247549/CSID: 33630 +N-trimethyl-leucine NtMe-Leu C9H18NO 156.1388390000 C(C(=O)O)(CC(C)C)[N](C)(C)C in: NOR00695 +Citrulline Cit C6H11N3O2 157.0851270000 CSID: 810 +isostatine/statine Ist/Sta C8H15NO2 157.1102790000 CSID: 19578058/CSID: 2632509 +N6-formyl-HydroxyOrnithine Fo-OH-Orn C6H10N2O3 158.0691420000 C(C(=O)O)(CCCN(C=O)O)N in CSID: 3294 +alpha-amino-hydroxyadipic acid Ahad C6H9NO4 159.0531580000 CID: 22326384 +N-methyl-2.3-dehydrophenylalanine NMe-dPhe C10H9NO 159.0684140000 C(C(O)=O)(=CC1=CC=CC=C1)NC in CSID: 4444584 +O-methyl-L-rhamnose 2OMe-Rha C7H12O4 160.0735590000 CSID: 4352115 +N-Methyl-Phenylalanine/Homophenylalanine Me-Phe/Hph C10H11NO 161.0840640000 CSID: 3846742/CSID: 92605 +Hexose Hexose C6H10O5 162.0528230000 CSID: 23139 +N-hydroxy-dehydro-HydroxyPhenylGlycine OH-dHpg C8H5NO3 163.0269430000 CID: 20339127 +Methionine sulfone O2-Met C5H9NO3S 163.0303140000 CSID: 63154 +phosphinothricin PT C5H10NO3P 163.0398300000 CSID: 4630 +Tyrosine/Phenylserine/N-methyl-HydroxyPhenylGlycine Tyr/Ph-Ser/NMe-Hpg C9H9NO2 163.0633290000 CSID: 1121/CSID: 84951/CID: 15118056 +4-hydroxy-D-phenyl-lactate 4OH-D-Ph-Lac C9H8O3 164.0473440000 CID: 9378 +propenoyl-alanyloxazole acid PALOA C8H8N2O2 164.0585780000 C(C=CC1=COC(=N1)C(N)C)(=O)O in CSID: 10477875 +3.4-dichloro-proline Cl2-Pro C5H5Cl2NO 164.9748200000 CID: 21295133 +3.5-dihydroxyphenylglycine Dhpg C8H7NO3 165.0425930000 CSID: 97113 +cyclo alpha-ketoarginine ck-Arg C7H10N4O 166.0854610000 C12(C(CCCN1C(=NC2=O)-N)N)O in CSID: 9977717 +2.2-dimethyl-3-hydroxy-7-octynoic acid C8:0:1(7)-Me(2.2)-OH(3) C10H14O2 166.0993800000 CSID: 29330001 +2-carboxy-6-hydroxyoctahydroindole Choi C9H13NO2 167.0946290000 C1C(NC2C1CCC(C2)O)C(=O)O in CSID: 10480056 +3-Desoxy-Methyl-4-butenyl-4-methyl threonine 3d-NMe-Bmt C10H17NO 167.1310140000 CC=CCC(C)CC(NC)C(=O)O in CSID: 4953086 +1-methoxy-beta-alanine-thiazole OMe-bAla-Thz C7H8N2OS 168.0357340000 C(N)(CC(=O)OC)C1=NC=CS1 in CSID: 26365309 +2.2-dimethyl-3-hydroxy-7-octenoic acid C8:1(7)-Me(2.2)-OH(3) C10H16O2 168.1150300000 C(C(C(CCCC=C)O)(C)C)(O)=O in CSID: 8732670 +9-methyldecanoic acid C11:0 C11H20O 168.1514150000 CSID: 4471714 +4-butenyl-4-methyl threonine/Dolaproine Bmt/Dap C9H15NO2 169.1102790000 CC=CCC(C)C(C(C(=O)O)N)O in CSID: 4444325/C1C(CCN1)C(C(C(O)=O)C)OC in CSID: 7986684 +5-hydroxy-capreomycidine 5OH-Cap C6H10N4O2 170.0803760000 C1C(NC(NC1C(C(=O)O)N)=N)O in CSID: 2301596 +hydroxysecbutyl acetyl propionyl Hysp C9H14O3 170.0942940000 C(C(C(C(O)C(CC)C)=O)C)(=O)O in CSID: 10477730 +homoarginine Har C7H14N4O 170.1167610000 CSID: 8732 +3-hydroxy-decanoic acid/3-hydroxy-2-methyl-nonanoic acid/2.2-dimethyl-3-hydroxy-octanoic acid C10:0-OH(3)/C9:0-Me(2)-OH(3)/C8:0-Me(2.2)-OH(3) C10H18O2 170.1306800000 CSID: 24790/CSID: 9587708/CSID: 8949283 +N-methoxyacetyl-valine NOMe-Ac-Val C8H13NO3 171.0895430000 CSID: 11856685 +N-desmethyldolaisoleuine/alpha-hydroxy-6-methyl-3-aminooctanoic acid Ddil/aC9:0-OH(2)-NH2(3) C9H17NO2 171.1259290000 C(C(N)C(C)CC)(CC(O)=O)OC in CSID: 9938808/C(C(C(CCC(CC)C)N)O)(=O)O in CSID: 10475103 +N-acetyl-HydroxyOrnithine Ac-OH-Orn C7H12N2O3 172.0847920000 CSID: 3670289 +tryptophanol Trpol C11H12N2 172.1000480000 CSID: 10234 +N-methyldichloropyrrole-2-carboxylic acid MdCP C6H3Cl2NO 174.9591700000 CSID: 21926880 +beta.beta-dimethyl-Methionine-S-oxide bbMe2-O-Met C7H13NO2S 175.0666990000 CSID: 29322228 +alpha-amino-phenyl-valeric acid Apv C11H13NO 175.0997140000 CSID: 262061 +Homotyrosine/N-methyltyrosine Hty/Me-Tyr C10H11NO2 177.0789790000 CSID: 3365526/CSID: 453342 +propenoyl-2-aminobutanoyloxazole acid PAOA C9H10N2O2 178.0742280000 C(C=CC1=COC(=N1)C(N)CC)(=O)O in CSID: 27026296 +2.4-dimethyl-dec-9-ynoic acid/10-methyl-2.trans4-undecanoic acid C10:0:1(9)-Me(2.4)/iC12:2(2.t4) C12H18O 178.1357650000 C(C(CC(CCCCC#C)C)C)(=O)O in CSID: 23076292/C(C=CC=CCCCCC(C)C)(O)=O in CSID: 24677772 +beta-hydroxy-tyrosine/3.4-dihydroxyphenylalanine OH-Tyr/diOH-Phe C9H9NO3 179.0582430000 CSID: 13930867/CSID: 813 +proline-thiazole Pro-Thz C8H8N2OS 180.0357340000 C1=CSC(=N1)C2CCC(N2)C(=O)O in CSID: 8971346 +2-methyl-5-dodecenoic acid C12:1(5) C12H20O 180.1514150000 CSID: 4471802 +Anticapsin Aca C9H11NO3 181.0738930000 CSID: 2796855 +D-homoarginine D-Har C7H10N4O2 182.0803760000 CSID: 53295 +vinylogous arginine v-Arg C8H14N4O 182.1167610000 C(C(N)CCCNC(=N)N)=CC(=O)O in CSID: 8946030 +dodecanoic acid C12:0 C12H22O 182.1670650000 CSID: 3756 +3-chloro-4-hydroxyphenylglycine Cl-Hpg C8H6ClNO2 183.0087060000 CSID: 3817439 +MeBmt/2-amino-8-oxo-decanoic acid MeBmt/C10:0-NH2(2)-oxo(8) C10H17NO2 183.1259290000 CSID: 9944222/CSID: 16281719 +2.3-Dehydro-Tryptophan dh-Trp C11H8N2O 184.0636630000 CSID: 7991355 +ureido-4-oxovancosamine U4oxo-Van C8H12N2O3 184.0847920000 C1(C2(C(CC(O1)O)(C)NC(N2)=O)O)C in: NOR00711 +alpha-ketoarginine k-Arg C7H12N4O2 184.0960260000 C(C(C(CCCNC(=N)N)N)=O)(=O)O in CSID: 10477079 +3-hydroxy-undecanoic acid/3-hydroxy-2-methyl-decanoic acid C11:0-OH(3)/C10:0-Me(2)-OH(3) C11H20O2 184.1463300000 CSID: 2340495/CSID: 13775620 +Dolapyrrolidone Dpy C12H11NO 185.0840640000 CSID: 8735462 +Dolaisoleucine/8-hydroxy-2-amino-decanoic acid/9-hydroxy-2-amino-decanoic acid Dil/C10:0-OH(8)-NH2(2)/C10:0-OH(9)-NH2(2) C10H19NO2 185.1415790000 C(CC(O)=O)(OC)C(C(C)CC)NC in CSID: 7986684/CSID: 26949211/C(C(N)CCCCCCC(C)O)(=O)O in CSID: 10279723 +DL-Tryptophan Trp C11H10N2O 186.0793130000 CSID: 1116 +hydrated alpha-ketoarginine hk-Arg C7H14N4O2 186.1116760000 C(C(C(CCCN=C(N)N)N)O)(=O)O in CSID: 8946570 +dehydro vinylogous tyrosine dv-Tyr C11H9NO2 187.0633290000 C(C(N)=CC1=CC=C(C=C1)O)=CC(=O)O in CSID: 8185737 +3.4-dihydroxyArginine diOH-Arg C6H12N4O3 188.0909400000 C(C(C(C(O)=O)N)O)(CN=C(N)N)O in CSID: 8801410 +vinylogous tyrosine/N-acetylphenylalanine V-Tyr/Ac-Phe C11H11NO2 189.0789790000 C(C(N)CC1=CC=C(C=C1)O)=CC(=O)O in CSID: 10477079/CSID: 1923 +kynurenine Kyn C10H10N2O2 190.0742280000 CSID: 823 +coronafacic acid CFA C12H14O2 190.0993800000 CSID: 13300082 +N-methyl-4-methylamino-phenylalanine Me-MeA-Phe C11H14N2O 190.1106130000 CID: 21137790 +alpha-amino-hydroxyphenyl-valeric acid/N-methyl-homotyrosine/ethylene inserted tyrosine/N.O-dimethyl-tyrosine Ahv/Me-Hty/e-Tyr/NMe-OMe-Tyr C11H13NO2 191.0946290000 C(C(=O)O)(CCCC1=CC=C(C=C1)O)N in CSID: 142959/C1=CC(=CC=C1CCC(C(=O)O)NC)O in CSID: 10477716/C(C(N)CC1=CC=C(C=C1)O)CC(=O)O in CSID: 9977717/CID: 18925327 +10-methyl-2.trans4-dodecenoic acid aC13:2(2.t4) C13H20O 192.1514150000 C(C=CC=CCCCCC(CC)C)(O)=O in CSID: 24665012 +di-chloro-N-methyl-dehydroLeucine Cl2-NMe-dhLeu C7H9Cl2NO 193.0061200000 C(C(O)=O)(NC)=CC(C)C(Cl)Cl in CSID: 8701761 +beta-methoxy-tyrosine bOMe-Tyr C10H11NO3 193.0738930000 CSID: 16174140 +O-sulfate-2-hydroxy-3-methylpentanoic acid OSu-Hmp C6H10O5S 194.0248940000 C(C(C(CC)C)O[S](=O)(=O)O)(=O)O in CSID: 10477875 +methyloxazoline-isoleucine MeOx-Ile C11H18N2O 194.1419130000 C(N)(C(C)CC)C1=NC(C(C1)C)C(=O)O in CSID: 10477991 +10-methyl-3-dodecenoic acid aC13:1(3) C13H22O 194.1670650000 C(CC=CCCCCCC(CC)C)(O)=O in: NOR00767 +di-chloro-N-methyl-Leucine Cl2-NMe-Leu C7H11Cl2NO 195.0217700000 C(C(O)=O)(NC)CC(C)C(Cl)Cl in CSID: 8773801 +3-hydroxy-5-dodecenoic acid/9-oxo-2.4-dimethyldecanoic acid/8-hydroxy-2.4.6-trimethyl-4-nonenoic acid C12:1(5)-OH(3)/C10:0-Me(2.4)-oxo(9)/C9:1(4)-Me(2.4.6)-OH(8) C12H20O2 196.1463300000 CSID: 10761118/C(C(CC(CCCCC(C)=O)C)C)(=O)O in CSID: 8946480/C(C(CC(=CC(CC(C)O)C)C)C)(O)=O in CSID: 8007368 +10-methyldodecanoic acid aC13:0 C13H24O 196.1827150000 CSID: 2282934 +chloro-tyrosine Cl-Tyr C9H8ClNO2 197.0243570000 CSID: 106510 +2-amino-9.10-epoxi-8-oxodecanoic acid C10:0-NH2(2)-Ep(9)-oxo(8) C10H15NO3 197.1051930000 CSID: 11345228 +4-butenyl-4-methyl-N.4-methyl threonine Me2-Bmt C11H19NO2 197.1415790000 CSID: 4450325 +3-hydroxy-dodecanoic acid/3-hydroxy-2-methyl-undecanoic acid C12:0-OH(3)/C11:0-Me(2)-OH(3) C12H22O2 198.1619800000 CSID: 85026/CSID: 13775586 +9-hydroxy-2-amino-8-oxo-decanoic acid C10:0-OH(9)-NH2(2)-oxo(8) C10H17NO3 199.1208430000 CSID: 25942012 +N-acetyl-N6-formyl-N6-hydroxyOrnithine NAc-Fo-OH-Orn C8H12N2O4 200.0797070000 C(C(=O)O)(NC(C)=O)CCCN(O)C=O in CSID: 3294 +N1-methyl-tryptophan 1Me-Trp C12H12N2O 200.0949630000 CSID: 88584 +5-hydroxytryptophan OH-Trp C11H10N2O2 202.0742280000 CSID: 141 +N-methyl-4-dimethylamino-phenylalanine NMe-Me2A-Phe C12H16N2O 204.1262630000 CSID: 27594543 +vinylogous hydroxy tyrosine v-OH-Tyr C11H11NO3 205.0738930000 C(C(N)CC1=CC(=C(C=C1)O)O)=CC(=O)O in CSID: 9204437 +alpha-amino-methoxyphenyl-valeric acid Amv C12H15NO2 205.1102790000 CSID: 9681632 +N-Methyl-Lanthionine NMe-Lan C6H10N2O4S 206.0361280000 C(SCC(C(=O)O)N)C(C(O)=O)NO in: NOR00149 +3-nitrotyrosine 3NO2-Tyr C9H8N2O4 208.0484070000 CSID: 205676 +7-tetradecenoic acid C14:1(7) C14H24O 208.1827150000 CSID: 10722652 +D-PhosphateAsparagine D-PO-Asn C4H7N2O6P 210.0041720000 C(C(C(C(O)=O)N)O[P](O)(=O)O)(=O)N in: NOR00025 +propenoyl-O-methylserinylthiazole acid PMST C9H10N2O2S 210.0462980000 C(C=CC1=CSC(=N1)C(N)COC)(=O)O in CSID: 8503913 +5-oxo-8-hydroxy-2.4.6-trimethyl-4-nonaneic acid C9:1(Me4)-Me(2.4.6)-OH(8)-Oxo(5) C12H18O3 210.1255940000 C(C(CC(C(C(CC(C)O)C)=O)=C)C)(O)=O in CSID: 8434247 +tetradecanoic acid C14:0 C14H26O 210.1983650000 CSID: 10539 +Chloro-N-methyl-tyrosine Cl-NMe-Tyr C10H10ClNO2 211.0400070000 CSID: 27594554 +3-amino-tridecanoic acid C13:0-NH2 C13H25NO 211.1936140000 CSID: 26283438 +3-hydroxy-tridecanoic acid C13:0-OH C13H24O2 212.1776300000 CSID: 4472174 +beta-hydroxy-chloro-tyrosine bOH-Cl-Tyr C9H8ClNO3 213.0192710000 CSID: 25938524 +3-amino-6-hydroxy-2-piperidone Ahp C9H14N2O4 214.0953570000 CSID: 25058696 +N-methyl-5-hydroxytryptophan/methoxytryptophan NMe-OH-Trp/OMe-Trp C12H12N2O2 216.0898780000 C(C(=O)O)(NC)CC1=C[N]C2=C1C=C(C=C2)O in CSID: 10476796/O(C(=O)[C@@H](N([H])[H])CC1=C[N](C2=CC=CC=C12)OC)[H] in CSID: 5293532 +2.6-diamino-7-hydroxyazelaic acid Daz C9H16N2O4 216.1110070000 CSID: 391749 +4-amino-7-guanidino-2.3-dihydroxyheptanoic acid Agdha C8H16N4O3 216.1222400000 CSID: 21377788 +3.5-dichloro-4-hydroxyphenylglycine Cl2-Hpg C8H5Cl2NO2 216.9697340000 CSID: 9804791 +DHP-methyloxazolinyl group DMOG C11H9NO4 219.0531580000 CSID: 12721 +N-methoxyacetyl-D-phenylalanine NOMe-Ac-D-Phe C12H13NO3 219.0895430000 CSID: 11859621 +D-6'-chloro-tryptophan D-Cl-Trp C11H9ClN2O 220.0403410000 C(C(=O)O)(N)CC1=NC2=C(C1)C=CC(=C2)Cl in CSID: 8094776 +dihydroxyphenylthiazol group DHPT C10H7NO3S 221.0146640000 CSID: 23110909 +12-methyl-3-tetradecenoic acid aC15:1(3) C15H26O 222.1983650000 C(CC=CCCCCCCCC(CC)C)(O)=O in: NOR00768 +2.3-dihydroxy-2.6.8-trimethyldeca-(4Z.6E)-dienoic acid/2.3-dihydroxy-trans4.trans6-tridecenoic acid aC11:2(4.6)-Me(2.6)-OH(2.3)/C13:2(t4.t6)-OH(2.3) C13H20O3 224.1412450000 C(C(C(C=CC(=CC(CC)C)C)O)(O)C)(O)=O in CSID: 4977118/C(C(C(C=CC=CCCCCCC)O)O)(O)=O in CSID: 4976886 +12-methyltetradecanoic acid aC15:0 C15H28O 224.2140160000 CSID: 20368 +bromophenylalanine Br-Phe C9H8BrNO 224.9789160000 CSID: 77275 +3-amino-tetradecanoic acid C14:0-NH2(3) C14H27NO 225.2092640000 CSID: 15571256 +3-hydroxy-tetradecanoic acid C14:0-OH(3) C14H26O2 226.1932800000 CSID: 15252 +tri-chloro-N-methyl-dehydroLeucine Cl3-NMe-dhLeu C7H8Cl3NO 226.9671480000 C(C(O)=O)(NC)=CC(C)C(Cl)(Cl)Cl in CSID: 10477276 +N-acetyltryptophan Ac-Trp C13H12N2O2 228.0898780000 CSID: 1925 +beta.beta.N-trimethyltryptophan bbMe-NMe-Trp C14H16N2O 228.1262630000 C1=CC=CC2=C1C(=C[N]2)C(C(C(O)=O)NC)(C)C in CSID: 8158974 +3-hydroxy-2.2.4-trimethyl-7-hydroxydecanoic acid C10:0-Me(2.2.4)-OH(3.7) C13H24O3 228.1725450000 C(C(C(C(=O)O)(C)C)O)(CCC(CCC)O)C in CSID: 8184030 +tri-chloro-N-methyl-Leucine Cl3-NMe-Leu C7H10Cl3NO 228.9827980000 C(C(O)=O)(NC)CC(C)C(Cl)(Cl)Cl in CSID: 10477275 +thiazolylphenylalanine Phe-Thz C12H10N2OS 230.0513840000 C(N)(CC1=CC=CC=C1)C2=NC(=CS2)C(O)=O in CSID: 8593238 +D-2-carboxy-tryptophan D-COOH-Trp C12H10N2O3 230.0691420000 C(C(O)=O)(N)CC1=C([N]C2=C1C=CC=C2)C(=O)O in CSID: 7987591 +N-methyl-6-chloro-tryptophan NMe-Cl-Trp C12H11ClN2O 234.0559910000 C(C(=O)O)(NC)CC1=C[N]C2=C1C=CC(=C2)Cl in CSID: 8805002 +7-hexadecenoic acid/9-hexadecenoic acid C16:1(7)/C16:1(9) C16H28O 236.2140160000 CSID: 4895966/CSID: 4445872 +2.3-dihydroxy-trans4.trans6-tetradecenoic acid/2.6.8-trimethyl-5.7-dihydroxy-trans2.trans8-undecenoic acid C14:2(t4.t6)-OH(2.3)/C11:2(t2.t8)-Me(2.6.8)-OH(5.7) C14H22O3 238.1568950000 C(C(C(C=CC=CCCCCCCC)O)O)(O)=O in CSID: 8924310/C(C(=CCC(C(C(C(=CCC)C)O)C)O)C)(O)=O in CSID: 10481263 +hexadecanoic acid C16:0 C16H30O 238.2296660000 CSID: 960 +beta-methyl-bromophenylalanine bMe-Br-Phe C10H10BrNO 238.9945660000 C(C(=O)O)(C(C1=CC=C(C=C1)Br)C)N in CSID: 10475327 +3-amino-pentadecanoic acid C15:0-NH2(3) C15H29NO 239.2249150000 CSID: 26283439 +3-hydroxy-13-methyltetradecanoic acid/3-hydroxy-pentadecanoic acid C14:0-Me(13)-OH(3)/C15:0-OH(3) C15H28O2 240.2089300000 CSID: 9218624/CSID: 158374 +bromotyrosine/beta-hydroxy-bromophenylalanine Br-Tyr/OH-Br-Phe C9H8BrNO2 240.9738310000 CSID: 131083/CSID: 19757850 +beta.beta.N1.N-tetramethyltryptophan bbNMe-NMe-Trp C15H18N2O 242.1419130000 C1=CC=CC2=C1C(=C[N]2C)C(C(C(O)=O)NC)(C)C in CSID: 8570259 +3.4-dihydroxy-tetradecanoic acid/ 3-hydroxy-2.2.4-trimethyl-7-methoxydecanoic acid C14:0-OH(3.4)/C10:0-Me(2.2.4)-OH(3)-OMe(7) C14H26O3 242.1881950000 CID: 22667431/CSID: 28587148 +3-amino-4-hydroxy-6-methyl-8-phenyl-5.7-octadienoic acid C8:2(5.7)-Me(6)-OH(4)-NH2(3)-Ph(8) C15H17NO2 243.1259290000 C(CC(C(C=C(C=CC1=CC=CC=C1)C)O)N)(=O)O in CSID: 10475327 +tri-chloro-2-hydroxy-N-methyl-Leucine Cl3-2OH-NMe-Leu C7H10Cl3NO2 244.9777130000 C(C(O)=O)(NC)(CC(C)C(Cl)(Cl)Cl)O in CSID: 10477276 +N-methyl-6-chloro-5-hydroxytryptophan NMe-Cl-OH-Trp C12H11ClN2O2 250.0509060000 C(C(=O)O)(NC)CC1=C[N]C2=C1C=C(C(=C2)Cl)O in CSID: 10473575 +2.3-dihydroxy-trans4.trans6-pentadecenoic acid C15:2(t4.t6)-OH(2.3) C15H24O3 252.1725450000 C(C(C(C=CC=CCCCCCCCC)O)O)(O)=O in CSID: 4976888 +3-hydroxy-9-hexadecenoic acid C16:1(9)-OH(3) C16H28O2 252.2089300000 C(CC(CCCCCC=CCCCCCC)O)(O)=O in: NOR00720 +3-amino-hexadecanoic acid C16:0-NH2(3) C16H31NO 253.2405650000 CSID: 24597602 +3-hydroxy-hexadecanoic acid C16:0-OH(3) C16H30O2 254.2245800000 CSID: 266538 +D-3-bromo-N-methyl-Tyrosine D-Br-NMe-Tyr C10H10BrNO2 254.9894810000 CSID: 2128826 +N1-carboxy-bichomotryptophan N1-COOH-bhTrp C14H14N2O3 258.1004420000 C(CC1=C[N](C2=C1C=CC=C2)C(=O)O)CC(C(=O)O)N in CSID: 9968260 +isopyoverdin chromophore/pyoverdin chromophore ChrI/ChrP C13H13N3O3 259.0956910000 C1=C(C(=CC2=C1N3C(C(=C2)N)NC(CC3)C(O)=O)O)O in: NOR00163/C1=C(C(=CC2=C1N3C(C(=C2)N)NC(CC3)C(O)=O)O)O in CID: 5289234 +5.6-dihydropyoverdin chromophore ChrD C13H15N3O3 261.1113410000 C1=C(C(=CC2=C1N3C(C(N)C2)NCCC3C(O)=O)O)O in: NOR00903 +D-6-chloro-N2-formamidotryptophan D-Cl-CONH2-Trp C12H10ClN3O2 263.0461550000 C(C(O)=O)(N)CC1=C[N](C2=C1C=CC(=C2)Cl)C(=O)N in CSID: 8138519 +3-amino-8-phenyl-2.4.5-trihydroxyoct-7-enoic acid C8:1(7)-OH(2.4.5)-NH2(3)-Ph(8) C14H17NO4 263.1157580000 CSID: 29330841 +5-bromo-tryptophan Br-Trp C11H9BrN2O 263.9898150000 CSID: 87339 +9-octadecenoic acid C18:1(9) C18H32O 264.2453160000 CSID: 553123 +8.10-Dimethyl-9-hydroxy-7-methoxytridecadienoic acid DHMDA C16H26O3 266.1881950000 C(C(C(CCC)C)O)(C(C=CC=CCC(=O)O)OC)C in CSID: 10479168 +3-amino-14-methyl-hexadecanoic acid/3-amino-15-methyl-hexadecanoic acid aC17:0-NH2(3)/iC17:0-NH2(3) C17H33NO 267.2562150000 C(CC(CCCCCCCCCCC(CC)C)N)(O)=O in CSID: 2340866/C(CC(CCCCCCCCCCCC(C)C)N)(O)=O in: NOR00801 +3-hydroxy-14-methyl-hexadecanoic acid/3-hydroxy-15-methyl-hexadecanoic acid aC17:0-OH(3)/iC17:0-OH(3) C17H32O2 268.2402300000 C(CC(CCCCCCCCCCC(CC)C)O)(O)=O in: NOR00900/CSID: 141849 +3.4-dihydroxy-hexadecanoic acid C16:0-OH(3.4) C16H30O3 270.2194950000 CID: 22348653 +4-propenoyl-2-tyrosylthiazole acid PTTA C14H12N2O2S 272.0619480000 C(O)(=O)C=CC1=CSC(=N1)C(N)CC2=CC=C(C=C2)O in CSID: 16738243 +N-methyl-2-Bromo-tryptophan NMe-Br-Trp C12H11BrN2O 278.0054650000 C(C(=O)O)(NC)CC1=C([N]C2=C1C=CC=C2)Br in CSID: 8007368 +2-bromo-5-hydroxytryptophan Br-OH-Trp C11H9BrN2O2 279.9847300000 CSID: 643874 +3-hydroxy-9-octadecenoic acid C18:1(9)-OH(3) C18H32O2 280.2402300000 C(CC(CCCCCC=CCCCCCCCC)O)(O)=O in: NOR00724 +azotobactins chromophore ChrA C14H11N3O4 285.0749560000 C1=C(C(=CC2=C1N4C3C(=C2)NC(N3CCC4C(O)=O)=O)O)O in: NOR00208 +O-demethyl-Adda DMAdda C19H25NO2 299.1885290000 C(C(C(C=CC(=CC(C(CC1=CC=CC=C1)O)C)C)N)C)(O)=O in: NOR00129 +D-3-iodo-N-methyl-Tyrosine D-I-NMe-Tyr C10H10INO2 302.9756110000 C(C(=O)O)(NC)CC1=CC(=C(C=C1)O)I in CSID: 9017332 +actinomycin chromophore ChrAct C16H10N2O5 310.0589710000 CSID: 86817 +3-amino-9-methoxy-2.6.8-trimethyl-10-phenyldeca-4.6-dienoic acid Adda C20H27NO2 313.2041790000 CSID: 10471100 +3-amino-4-hydroxy-6-methyl-8-(p-bromophenyl)-5.7-octadienoic acid C8:2(5.7)-Me(6)-OH(4)-NH2(3)-brPh(8) C15H16BrNO2 321.0364310000 C(CC(C(C=C(C=CC1=CC=C(C=C1)Br)C)O)N)(=O)O in CSID: 10476834 +3-amino-6-methyl-12-phenyl-2.4.5-trihydroxydodeca-7.9.11-trienoic acid C12:3(7.9.11)-Me(6)-OH(2.4.5)-NH2(3)-Ph(12) C19H23NO4 329.1627080000 C(C(C(C(C(C(C=CC=CC=CC1=CC=CC=C1)C)O)O)N)O)(O)=O in CSID: 8923613 +3-amino-10-(p-ethoxyphenyl)-2.4.5-trihydroxydeca-7.9-dienoic acid C10:2(7.9)-OH(2.4.5)-NH2(3)-ePh(10) C18H23NO5 333.1576230000 CSID: 29330839 +O-Acetyl-O-demethylAdda ADMAdda C21H27NO3 341.1990940000 C(C(C(C=CC(=CC(C(CC1=CC=CC=C1)OC(C)=O)C)C)N)C)(O)=O in: NOR00144 +3-amino-6.10-dimethyl-12-phenyl-2.4.5-trihydroxydodeca-7.9.11-trienoic acid C12:3(7.9.11)-Me(6.10)-OH(2.4.5)-NH2(3)-Ph(12) C20H25NO4 343.1783580000 C(C(C(C(C(C(C=CC=C(C=CC1=CC=CC=C1)C)C)O)O)N)O)(O)=O in CSID: 10187168 +3-amino-6-methyl-12-(p-methoxyphenyl)-2.4.5-trihydroxydodec-11-enoic acid C12:1(11)-Me(6)-OH(2.4.5)-NH2(3)-mPhe(11) C20H29NO5 363.2045730000 CSID: 29330842 +pyoverdin A chromophore derivate ChrPder C13H11N3O3 257.0800410000 C1=C(C(=CC2=C1N3C(C(=C2)N)=NC(CC3)C(O)=O)O)O in CSID: 0 +Succinic acid Suc C4H4O3 100.0160440000 CSID: 7634 diff --git a/CycloBranch/BrickDatabases/db287_v2.txt b/CycloBranch/BrickDatabases/db287_v2.txt index 0f1023d..8cdf421 100644 --- a/CycloBranch/BrickDatabases/db287_v2.txt +++ b/CycloBranch/BrickDatabases/db287_v2.txt @@ -1,287 +1,287 @@ -Ethanolamine Eta C2H5N 43.0421991657 CSID: 13835336 -Glycine Gly C2H3NO 57.0214637236 CSID: 730 -pyrrolidone Pyr C4H5N 67.0421991657 CSID: 11530 -dehydroalanine dh-Ala C3H3NO 69.0214637236 CSID: 110510 -pyruvic acid Pya C3H2O2 70.0054793084 CSID: 1031 -butanoic acid C4:0 C4H6O 70.0418648147 CSID: 259 -DL-Alanine/D-Alanine/beta-Alanine/N-Methyl-Glycine Ala/D-Ala/bAla/NMe-Gly C3H5NO 71.0371137878 CSID: 582/CSID: 64234/CSID: 234/CSID: 1057 -Lactic acid/D-lactic acid Lac/D-Lac C3H4O2 72.0211293726 CSID: 592/CSID: 55423 -Serinol Serol C3H7NO 73.0527638520 CSID: 61591 -2.3-dehydro-2-aminobutyric acid/homoserine lactone/N-Methyl-dehydroalanine/hydroxy pyrrolidone dhAbu/HseL/NMe-Dha/OH-Pyr C4H5NO 83.0371137878 CSID: 4952645/CSID: 66194/CSID: 118845/CSID: 134682 -2-hydroxy-3-butenoic acid C4:1(3)-OH(2) C4H4O2 84.0211293726 CSID: 141066 -2-methyl-butanoic acid C4:0-Me(2) C5H8O 84.0575148789 CSID: 8012 -alpha-formylGlycine aFo-Gly C3H3NO2 85.0163783457 CSID: 28 -N-Methyl-L-alanine/N-methyl-beta-alanine/alpha-aminobutyric acid/D-alpha-aminobutyric acid/2-Methylalanine/methyl alaninate NMe-Ala/NMe-bAla/Abu/D-Abu/Aib/D-3OMe-Ala C4H7NO 85.0527638520 CSID: 4450824/CSID: 68396/PDB: ABA/PDB: DBB/CSID: 5891/CSID: 99878 -isovalinol/valinol Ivalol/Valol C5H11N 85.0891493583 CSID: 8329525/CSID: 71352 -3-hydroxybutanoic acid C4:0-OH(3) C4H6O2 86.0367794368 CSID: 428 -2.3-Diaminopropionic acid Dpr C3H6N2O 86.0480128251 CSID: 357 -DL-Serine/D-Serine/isoserine Ser/D-Ser/Iser C3H5NO2 87.0320284099 CSID: 597/CSID: 64231/CSID: 10793 -Sorbic acid C6:2(t2.t4) C6H6O 94.0418648147 CSID: 558605 -methyl-succinimide Me-Suc C5H5NO 95.0371137878 CSID: 122158 -proline carboxamid ProC C5H8N2 96.0687482672 CSID: 479142 -DL-Proline/D-Proline/2-methylamino-2-dehydrobutyric acid/norcoronamic acid Pro/D-Pro/2Dh-Mabu/norCMA C5H7NO 97.0527638520 CSID: 594/CSID: 8640/CSID: 16743754/CSID: 28708240 -3-methylvaleric acid/hexanoic acid Me-Vaa/C6:0 C6H10O 98.0731649431 CSID: 7469/CSID: 8552 -N-formyl-Alanine/D-N-formyl-Alanine NFo-Ala/D-NFo-Ala C4H5NO2 99.0320284099 CSID: 72251/CSID: 72251 -DL-Valine/D-Valine/Isovaline/D-Isovaline/Norvaline/D-Norvaline/2-methyl-3-aminobutanoic acid/N-dimethyl-Alanine/3-amino-pentanoic acid Val/D-Val/Ival/D-Ival/Nva/D-Nva/Mab/NdMe-Ala/C5:0-NH2(3) C5H9NO 99.0684139162 CSID: 1148/CSID: 64635/CSID: 85483/PDB: DIV/CSID: 801/CSID: 388660/CSID: 471786/CSID: 9962964/CSID: 11271826 -Leucinol/Isoleucinol Leuol/Ileol C6H13N 99.1047994225 CSID: 71362/CSID: 82355 -2-hydroxy-3-epoxy-butanoic acid C4:0-OH(2)-Ep(3) C4H4O3 100.0160439947 CSID: 15475591 -Succinic acid Suc C4H4O3 100.0160439947 CSID: 7634 -2-hydroxyisovaleric acid/D-2-hydroxyisovalerate Hiv/D-Hiv C5H8O2 100.0524295010 CSID: 90190/CID: 5289545 -2.4-diaminobutyric acid/D-2.4-diaminobutyric acid/2.3-diaminobutyric acid/(2S.3S)-2.3-diaminobutyric acid/(2R.3R)-2.3-diaminobutyric acid Dab/D-Dab/Dbu/L-Dbu/D-Dbu C4H8N2O 100.0636628893 CSID: 457/CID: 638153/CSID: 4475641/CID: 11768553/PDB: VDL -dehydro-cysteine dhCys C3H3NOS 100.9935344136 CSID: 24784832 -Threonine/D-Threonine/allo-Threonine/D-allo-Threonine/Homoserine/D-Homoserine/N-Methyl-Serine/N-Methyl-D-Serine/4-amino-3-hydroxybutyric acid Thr/D-Thr/aThr/D-aThr/Hse/D-Hse/NMe-Ser/D-NMe-Ser/OH-4Abu C4H7NO2 101.0476784741 PDB: THR/PDB: DTH/PDB: ALO/CSID: 81824/CSID: 758/CSID: 2006329/CSID: 481791/PDB: DSE/CSID: 2064 -2.3-dihydroxy-butanoic acid C4:0-OH(2.3) C4H6O3 102.0316940589 CSID: 219301 -DL-Cysteine Cys C3H5NOS 103.0091844778 CSID: 574 -benzoic acid Bz C7H4O 104.0262147505 CSID: 238 -N-methylglutamine NMe-Gln C6H10N2 110.0843983314 CSID: 10652941 -4-oxo-proline/pyroglutamic acid 4oxo-Pro/pGlu C5H5NO2 111.0320284099 CSID: 366185/CSID: 485 -3-Methylproline/4-Methylproline/homoproline/D-homoproline/coronamic acid 3Me-Pro/4Me-Pro/Hpr/D-Hpr/CMA C6H9NO 111.0684139162 CSID: 10610754/CSID: 312597/CSID: 826/CSID: 643442/CSID: 117751 -keto-Leucine/2-epoxy-hexanoic acid k-Leu/C6:0-Ep(2) C6H8O2 112.0524295010 CSID: 69/CSID: 14066572 -Hydroxy-cycloOrnithine/D-Hydroxy-cycloOrnithine OH-cOrn/D-OH-cOrn C5H8N2O 112.0636628893 CSID: 13539649/CSID: 13539649 -heptanoic acid/5-methyl-hexanoic acid C7:0/iC7:0 C7H12O 112.0888150073 CSID: 7803/CID: 12344 -aziridine dicarboxylic acid Azd C4H3NO3 113.0112929678 CSID: 11582505 -3-Hydroxyproline/4-Hydroxyproline/D-Hydroxyproline/2-formamidobutanoic acid 3OH-Pro/4OH-Pro/D-4OH-Pro/NFo-D-Abu C5H7NO2 113.0476784741 CSID: 486216/PDB: HYP/CID: 440014/CSID: 486348 -Leucine/D-Leucine/Isoleucine/D-Isoleucine/allo-Isoleucine/D-allo-Isoleucine/N-Methyl-L-valine/D-N-Methylvaline/3-Methylvaline/D-tert-Leu/2-methyl-3-aminopentanoic acid/D-N-methyl-norvaline Leu/D-Leu/Ile/D-Ile/aIle/D-aIle/NMe-Val/D-NMe-Val/t-Leu/D-t-Leu/Map/D-NMe-Nva C6H11NO 113.0840639804 CSID: 834/CSID: 388617/CSID: 769/CSID: 69017/CSID: 89698/CSID: 85019/CSID: 4225/CSID: 4225/CSID: 270637/CID: 6950340/CSID: 11643060/CSID: 10652938 -hydroxyacetyl propionyl/pentanedioic acid Hap/Pda C5H6O3 114.0316940589 C(C(C(CO)=O)C)(=O)O in CSID: 10477731/CSID: 723 -DL-Asparagine/D-Asparagine/N1-formyl-2.3-Diaminopropionic acid Asn/D-Asn/NFo-Dpr C4H6N2O2 114.0429274472 PDB: ASN/PDB: DSG/C(C(CN)NC=O)(=O)O in CSID: 8873525 -D-Leucic acid (2-hydroxy-4-methylpentanoic acid)/(R)-Leucic acid/3-hydroxyhexanoic acid/2-hydroxy-3-methyl-pentanoic acid/D-2-hydroxy-3-methyl-pentanoic acid C5:0-Me(4)-OH(2)/4Me-D-Hva/C6:0-OH(3)/Hmp/D-Hmp C6H10O2 114.0680795652 CSID: 83753/CSID: 388986/CSID: 133518/CSID: 144317/CSID: 144317 -DL-Ornithine/D-Ornithine Orn/D-Orn C5H10N2O 114.0793129535 CSID: 380/CSID: 64236 -DL-Aspartic acid/D-Aspartic acid/N-formyl-isoserine Asp/D-Asp/NFo-Iser C4H5NO3 115.0269430320 CSID: 411/CSID: 75697/C(C(C(=O)O)O)NC=O in CSID: 8503913 -beta-hydroxyvaline/D-beta-hydroxyvaline/N-Methylthreonine/O-Methylthreonine bOH-Val/D-bOH-Val/NMe-Thr/OMe-Thr C5H9NO2 115.0633285383 CSID: 244525/CID: 192763/CSID: 5373925/CSID: 193545 -2.3-dihydroxy-3-methylbutanoic acid/2.4-dihydroxy-3-methylbutanoic acid iC5:0-OH(2.3)/iC5:0-OH(2.4) C5H8O3 116.0473441231 CSID: 657/C(C(C(CO)C)O)(=O)O in: NOR00082 -2-Methylcysteine/Methylcysteine aMe-Cys/NMe-Cys C4H7NOS 117.0248345420 CSID: 8233116/CSID: 2074082 -4-Hydroxythreonine 4OH-Thr C4H7NO3 117.0425930962 CSID: 3137512 -2.3.4-trihydroxy-butanoic acid C4:0-OH(2.3.4) C4H6O4 118.0266086810 CSID: 388628 -phenylacetic acid Pha C8H6O 118.0418648147 CSID: 10181341 -4-Hydroxybenzoic acid pOH-Bz C7H4O2 120.0211293726 CSID: 132 -trans2.trans4.trans6-trioctaneic acid C8:3(t2.t4.t6) C8H8O 120.0575148789 CSID: 4520024 -hydroxypicolinic acid Hpa C6H3NO2 121.0163783457 CSID: 12827 -oct-7-ynoic acid/2.trans4-octenoic acid C8:0:1(7)/C8:2(2.t4) C8H10O 122.0731649431 CSID: 4472125/CSID: 4944992 -4-oxo-5-methylproline/4-oxo-homoproline/N-Formyl-Proline 4oxo-5Me-Pro/4oxo-Hpr/NFo-Pro C6H7NO2 125.0476784741 CSID: 2564339/CSID: 10739339/CSID: 87055 -octanoic acid/6-methylheptanoic acid C8:0/iC8:0 C8H14O 126.1044650715 CSID: 370/CSID: 81904 -beta-ureido-dehydroAlanine bU-dAla C4H5N3O2 127.0381764203 PDB: UAL -N-formyl-Valine/N-Acetyl-2-aminoisobutyric acid/3-Hydroxy-5-methylproline NFo-Val/Ac-Aib/3OH-5Me-Pro C6H9NO2 127.0633285383 CSID: 90479/CSID: 203779/CSID: 3823469 -N-Methyl-Leucine/D-N-methyl-Leucine/N-Methyl-Isoleucine/N-methyl-alloIsoleucine/D-N-methyl-alloIsoleucine/beta-methylisoleucine/homoisoleucine/alpha-ethylnorvaline/Dolavaline/2-methyl-3-aminohexadecanoic acid NMe-Leu/D-NMe-Leu/NMe-Ile/NMe-aIle/D-NMe-aIle/bMe-Ile/Hil/Et-Nva/Dov/C6:0-Me(2)-NH2(3) C7H13NO 127.0997140446 CSID: 493595/CSID: 493595/CSID: 487199/CCC(C)C(C(=O)O)NC in: NOR00428/CCC(C)C(C(=O)O)NC in: NOR00428/CSID: 19951406/CSID: 454232/CSID: 452678/CSID: 10731564/CSID: 21378848 -DL-Glutamine/D-Glutamine/N-methylasparagine/beta-methyl-asparagine/D-N2-methyl-asparagine/N1-acetyl-2.3-Diaminopropionic acid Gln/D-Gln/NMe-Asn/bMe-Asn/D-N2Me-Asn/NAc-Dpr C5H8N2O2 128.0585775114 PDB: GLN/PDB: DGN/CSID: 311563/CSID: 2284493/CSID: 288387/C(C(CN)NC(C)=O)(=O)O in CSID: 8570696 -3-methoxy-hexanoic acid/3-hydroxy-heptanoic acid C6:0-OMe(3)/C7:0-OH(3) C7H12O2 128.0837296294 CSID: 277923/CSID: 2340494 -DL-Lysine/D-Lysine/beta lysine/N-Hydroxy-histamine Lys/D-Lys/bLys/N-OH-Hta C6H12N2O 128.0949630177 CSID: 843/CSID: 51793/PDB: KBE/C1(CCCN1)CCNO in CSID: 4589228 -DL-Glutamic acid/D-Glutamic Acid/beta-methyl-aspartic acid/D-beta-methyl-aspartic acid/beta-methoxy-aspartic acid/O-acetyl-Serine Glu/D-Glu/bMe-Asp/D-bMe-Asp/bOMe-Asp/Ac-Ser C5H7NO3 129.0425930962 CSID: 591/PDB: DGL/PDB: 2AS/PDB: ACB/CSID: 92764/CSID: 184 -L-acosamine/3-hydroxyleucine/beta-hydroxy-N-Methyl-Valine/gamma-hydroxy-N-Methyl-Valine/L-ristosamine Aco/3OH-Leu/bOH-NMe-Val/gOH-NMe-Val/Ria C6H11NO2 129.0789786025 CSID: 370989/CSID: 244507/CSID: 9205156/CID: 12439044/CSID: 370989 -2-hydroxy-3-methyl-butanedioic acid iC5:0-OH(2)-CA(4) C5H6O4 130.0266086810 CSID: 485839 -Hydroxyasparagine/D-HydroxyAsparagine OH-Asn/D-OH-Asn C4H6N2O3 130.0378420693 CSID: 3670287/CSID: 3670287 -alpha-guanidino Serine gSer C3H6N4O2 130.0490754576 C(C(=O)O)(N)(O)NC(=N)N in: NOR00426 -2.3-dihydroxy-3-methylpentanoic acid aC6:0-OH(2.3) C6H10O3 130.0629941873 CSID: 7 -N5-hydroxy ornithine/D-N5-HydroxyOrnithine/hydroxy-beta lysine OH-Orn/D-OH-Orn/OH-bLys C5H10N2O2 130.0742275756 CSID: 148381/C(CC(C(=O)O)N)CNO in: NOR00205/C(NCC(=O)O)(CCN)O in: NOR00634 -Hydroxyaspartic acid/D-Hydroxyaspartic acid OH-Asp/D-OH-Asp C4H5NO4 131.0218576541 CSID: 5232/CSID: 5232 -Methionine/N.S-dimethylcysteine Met/diMe-Cys C5H9NOS 131.0404846062 CSID: 853/CSID: 4450935 -arabinose/lyxose Ara/Lyx C5H8O4 132.0422587452 CSID: 224/CSID: 831 -L-Olivose Oli C6H12O3 132.0786442515 CSID: 164228 -PhenylGlycine/D-PhenylGlycine Ph-Gly/D-ph-Gly C8H7NO 133.0527638520 CSID: 3732/PDB: PG9 -phenylalaninol Pheol C9H11N 133.0891493583 CSID: 69116 -4-Chloro-Threonine 4Cl-Thr C4H6ClNO2 135.0087064420 CSID: 111708 -2.3-dihydroxy-4-chloro-butanoic acid C4:0-OH(2.3)-Cl(4) C4H5ClO3 135.9927220268 CSID: 25900403 -2.3-dihydroxybenzoic acid diOH-Bz C7H4O3 136.0160439947 CSID: 18 -2-methyl-7-octynoic acid/2.trans4-7-methyl-octenoic acid C8:0:1(7)-Me(2)/iC9:2(2.t4) C9H12O 136.0888150073 CSID: 24770189/CSID: 10761068 -DL-Histidine His C6H7N3O 137.0589118624 CSID: 752 -dehydropyrrolidone dPyr C6H6N2O2 138.0429274472 C1(CC(C(=CC(=O)O)N1)N)=O in CSID: 10199318 -acetylproline/2.3-dimethylpyroglutamic acid Ac-Pro/2Me-3Me-pGlu C7H9NO2 139.0633285383 CSID: 285677/CSID: 13080150 -5.5-dimethyl-2-oxo-hexanoic acid C6:0-Me(5.5)-oxo(2) C8H12O2 140.0837296294 CID: 21197379 -argininal Argal C6H12N4 140.1061964060 CSID: 10655329 -Nonanoic acid/d-6-Methyloctanoic acid/7-Methyloctanoic acid C9:0/aC9:0/iC9:0 C9H16O 140.1201151357 CSID: 7866/CSID: 10015/CSID: 31022 -N-methylchloropyrrole MCP C6H4ClNO 140.9981417557 CSID: 7404981 -N-Acetylisovaline/N-Acetylvaline/N-Formylisoleucine/N-Formylleucin/4-Amino-2.2-dimethyl-3-oxopentanoic acid/4-oxovancosamine Ac-Ival/Ac-Val/NFo-Ile/NFo-Leu/Ibu/4oxo-Van C7H11NO2 141.0789786025 CSID: 272193/CSID: 198159/CSID: 383482/CSID: 90475/CSID: 29322188/C1(C(C(CC(O1)O)(C)N)=O)C in CSID: 10249894 -N-dimethyl-leucine/N.beta-dimethyl-leucine/O-acetyl-leucinol/N.O-dimethyl-isoleucine NdMe-Leu/NMe-bMe-Leu/OAc-Leuol/NMe-OMe-Ile C8H15NO 141.1153641088 CSID: 500040/CID: 15385160/CID: 23037829/CSID: 27194495 -beta-methylglutamine/D-beta-methylglutamine bMe-Gln/D-bMe-Gln C6H10N2O2 142.0742275756 CID: 44602399/CSID: 24604116 -3-hydroxy-octanoic acid/2.2-dimethyl-3-hydroxyhexanoic acid/3-hydroxy-2-methyl-heptanoic acid C8:0-OH(3)/C6:0-Me(2.2)-OH(3)/C7:0-Me(2)-OH(3) C8H14O2 142.0993796936 CSID: 24791/CSID: 21418738/CSID: 27143447 -3-Methyl-Glutamic acid/Glutamic Acid methyl ester/D-Glutamic Acid methyl ester/D-Glutamic Acid methyl ester/2-Aminoadipic acid 3Me-Glu/MeO-Glu/D-MeO-Glu/MeO-D-Glu/Aad C6H9NO3 143.0582431604 CSID: 207514/CSID: 66546/CSID: 66546/CSID: 66546/CSID: 456 -L-actinosamine/L-eremosamine/norstatine/Vancosamine/N-methyl-hydroxyisoleucine Act/Ere/Nst/Van/NMe-OH-Ile C7H13NO2 143.0946286667 CID: 20377364/CSID: 9542085/CSID: 151726/CSID: 164304/CSID: 24770217 -beta-hydroxyglutamine/D-beta-hydroxy-N2-methyl-asparagine/D-beta-hydroxy-N2-methyl-asparagine OH-Gln/Me-OH-Asn/D-N2Me-bOH-Asn C5H8N2O3 144.0534921335 CID: 22592766/CSID: 24604117/C(C(=O)O)(N)C(C(=O)NC)O in: NOR00669 -methoxyaspartic acid OMe-Asp C5H7NO4 145.0375077183 C(C(C(C(=O)O)N)=[O]C)(=O)O in: NOR00717 -3.5-hydroxy-4-amino-hexadecanoic acid C6:0-OH(3.5)-NH2(4) C6H11NO3 145.0738932246 C(CC(C(C(C)O)N)O)(O)=O in: NOR00444 -L-rhamnose Rha C6H10O4 146.0579088094 CSID: 190747 -Methionine-S-oxide O-Met C5H9NO2S 147.0353992283 CSID: 824 -Chloro-Isoleucine Cl-Ile C6H10ClNO 147.0450919483 C(C(O)=O)(N)C(C(C)Cl)C in CSID: 10269389 -DL-Phenylalanine/D-Phenylalanine/beta-phenylalanine/D-beta-phenylalanine/N-methyl-phenylglycine Phe/D-Phe/bPhe/D-bPhe/NMe-Ph-Gly C9H9NO 147.0684139162 CSID: 969/CSID: 64639/CSID: 62403/CSID: 598357/CSID: 198596 -2-hydroxyphenyl-2-oxo-ethanoic acid Hpoe C8H4O3 148.0160439947 CSID: 348 -Phenyl-lactate/D-Phenyl-lactate Ph-Lac/D-Ph-Lac C9H8O2 148.0524295010 CSID: 3715/CID: 643327 -HydroxyPhenylGlycine/D-HydroxyPhenylGlycine Hpg/D-Hpg C8H7NO2 149.0476784741 CSID: 83189/CID: 89853 -2.trans4-8-methyl-noneoic acid iC10:2(2.t4) C10H14O 150.1044650715 C(C=CC=CCCC(C)C)(O)=O in CSID: 16736750 -cysteic acid/D-cysteic acid CysA/D-CysA C3H5NO4S 150.9939283441 PDB: OCS/PDB: 00C -D-4-fluoroPhenylGlycin D-F-ph-Gly C8H6FNO 151.0433428199 CSID: 88776 -3-amino-2-methyloct-7-ynoic acid C8:0:1(7)-Me(2)-NH2(3) C9H13NO 151.0997140446 C(CCCC#C)(C(C(=O)O)C)N in CSID: 8230475 -2-methyl-3-hydroxy-7-octynoic acid C8:0:1(7)-Me(2)-OH(3) C9H12O2 152.0837296294 CSID: 9964309 -2-methyl-8-noneic acid C9:1(8)-Me(2) C10H16O 152.1201151357 CID: 17824924 -Hydroxyhistidine OH-His C6H7N3O2 153.0538264845 CSID: 379547 -N-methyl homo vinylogous Valine NMe-hv-Val C9H15NO 153.1153641088 C(C(NC)C(C)C)=C(C(O)=O)C in CSID: 10213622 -capreomycidine/enduracididine/D-enduracididine Cap/End/D-End C6H10N4O 154.0854609639 CSID: 3818574/CSID: 24775830/CSID: 24775830 -decanoic acid/isodecanoic acid/7-methylnonanoic acid C10:0/iC10:0/aC10:0 C10H18O 154.1357651999 CSID: 2863/CID: 111470/CSID: 4471754 -Alanine-thiazole Ala-Thz C6H7N2OS 155.0279085472 CSID: 23916434 -N-Acetylisoleucine/N-acetyl-Leucine/O-desmethyldolaproine NAc-Ile/NAc-Leu/dDap C8H13NO2 155.0946286667 CSID: 270615/CSID: 1918/C(C1CCCN1)(C(C(=O)O)C)O in CSID: 9938808 -2-Aminononanoic acid Me-AOA C9H17NO 155.1310141730 CSID: 198341 -2-carboxyquinoxaline COOH-Qui C9H4N2O 156.0323627609 CSID: 87301 -N-formyl-Glutamine NFo-Gln C6H8N2O3 156.0534921335 CSID: 2106926 -hydroxyisovalerylpropionyl Hip C8H12O3 156.0786442515 CID: 18942657 -3.4-dimethylglutamine 3Me-4Me-Gln C7H12N2O2 156.0898776398 CSID: 21376706 -DL-Arginine/D-Arginine/L-(+)-Arginine Arg/D-Arg/L-Arg C6H12N4O 156.1011110281 PDB: ARG/PDB: DAR/CSID: 6082 -3-hydroxy-4-methyloctanoic acid/3-hydroxy-nonanoic acid/3-hydroxy-isononanoic acid/3-hydroxy-6-methyloctanoic acid C8:0-Me(4)-OH(3)/C9:0-OH(3)/iC9:0-OH(3)/aC9:0-OH(3) C9H16O2 156.1150297578 CSID: 17247549/CSID: 33630/CID: 22472006/CSID: 10361823 -N-trimethyl-leucine NtMe-Leu C9H18NO 156.1388392051 C(C(=O)O)(CC(C)C)[N](C)(C)C in: NOR00695 -Citrulline/D-Citrulline Cit/D-Cit C6H11N3O2 157.0851266129 CSID: 810/CID: 637599 -isostatine/statine Ist/Sta C8H15NO2 157.1102787309 CSID: 19578058/CSID: 2632509 -N6-formyl-HydroxyOrnithine/D-formyl-hydroxyOrnithine Fo-OH-Orn/D-Fo-OH-Orn C6H10N2O3 158.0691421977 PDB: FHO/PDB: FH7 -alpha-amino-hydroxyadipic acid Ahad C6H9NO4 159.0531577825 CID: 22326384 -N-methyl-2.3-dehydrophenylalanine NMe-dPhe C10H9NO 159.0684139162 C(C(O)=O)(=CC1=CC=CC=C1)NC in CSID: 4444584 -O-methyl-L-rhamnose 2OMe-Rha C7H12O4 160.0735588736 CSID: 4352115 -N-Methyl-Phenylalanine/D-N-Methyl-Phenylalanine/3-methylphenylalanine/Homophenylalanine NMe-Phe/D-NMe-Phe/3Me-Phe/Hph C10H11NO 161.0840639804 PDB: MEA/PDB: ZAE/PDB: APD/CSID: 92605 -Hexose/L-glucose/D-Glucose Hexose/Glc/D-Glc C6H10O5 162.0528234315 CSID: 23139/CSID: 201/PDB: GLC -N-hydroxy-dehydro-HydroxyPhenylGlycine/D-N-hydroxy-dehydro-HydroxyPhenylGlycine OH-dHpg/D-OH-dHpg C8H5NO3 163.0269430320 CID: 20339127/C(C(=O)O)(C1=CC=C(C=C1)O)=NO in: NOR00822 -Methionine sulfone O2-Met C5H9NO3S 163.0303138504 CSID: 63154 -phosphinothricin PT C5H10NO3P 163.0398297025 CSID: 4630 -Tyrosine/D-Tyrosine/beta-tyrosine/Phenylserine/N-methyl-HydroxyPhenylGlycine Tyr/D-Tyr/bTyr/Ph-Ser/NMe-Hpg C9H9NO2 163.0633285383 CSID: 1121/CSID: 64252/CSID: 389285/CSID: 84951/CID: 15118056 -4-hydroxy-D-phenyl-lactate 4OH-D-Ph-Lac C9H8O3 164.0473441231 CID: 9378 -propenoyl-alanyloxazole acid PALOA C8H8N2O2 164.0585775114 C(C=CC1=COC(=N1)C(N)C)(=O)O in CSID: 10477875 -3.4-dichloro-proline Cl2-Pro C5H5Cl2NO 164.9748197878 CID: 21295133 -3.5-dihydroxyphenylglycine/D-3.5-dihydroxyphenylglycine Dhpg/D-Dhpg C8H7NO3 165.0425930962 PDB: D3P/PDB: D3P -cyclo alpha-ketoarginine ck-Arg C7H10N4O 166.0854609639 C12(C(CCCN1C(=NC2=O)-N)N)O in CSID: 9977717 -2.2-dimethyl-3-hydroxy-7-octynoic acid C8:0:1(7)-Me(2.2)-OH(3) C10H14O2 166.0993796936 CSID: 29330001 -2-carboxy-6-hydroxyoctahydroindole Choi C9H13NO2 167.0946286667 C1C(NC2C1CCC(C2)O)C(=O)O in CSID: 10480056 -3-Desoxy-Methyl-4-butenyl-4-methyl threonine 3d-NMe-Bmt C10H17NO 167.1310141730 CC=CCC(C)CC(NC)C(=O)O in CSID: 4953086 -1-methoxy-beta-alanine-thiazole OMe-bAla-Thz C7H8N2OS 168.0357335793 C(N)(CC(=O)OC)C1=NC=CS1 in CSID: 26365309 -2.2-dimethyl-3-hydroxy-7-octenoic acid C8:1(7)-Me(2.2)-OH(3) C10H16O2 168.1150297578 C(C(C(CCCC=C)O)(C)C)(O)=O in CSID: 8732670 -9-methyldecanoic acid/8-methyldecanoic acid iC11:0/aC11:0 C11H20O 168.1514152641 CSID: 4471714/CID: 21813 -4-butenyl-4-methyl threonine/Dolaproine Bmt/Dap C9H15NO2 169.1102787309 CC=CCC(C)C(C(C(=O)O)N)O in CSID: 4444325/C1C(CCN1)C(C(C(O)=O)C)OC in CSID: 7986684 -5-hydroxy-capreomycidine 5OH-Cap C6H10N4O2 170.0803755860 C1C(NC(NC1C(C(=O)O)N)=N)O in CSID: 2301596 -hydroxysecbutyl acetyl propionyl Hysp C9H14O3 170.0942943157 C(C(C(C(O)C(CC)C)=O)C)(=O)O in CSID: 10477730 -homoarginine Har C7H14N4O 170.1167610923 CSID: 8732 -3-hydroxy-decanoic acid/3-hydroxy-2-methyl-nonanoic acid/2.2-dimethyl-3-hydroxy-octanoic acid/2.4-dimethyl-3-hydroxyisooctanoic acid C10:0-OH(3)/C9:0-Me(2)-OH(3)/C8:0-Me(2.2)-OH(3)/iC8:0-Me(2.4)-OH(3) C10H18O2 170.1306798220 CSID: 24790/CSID: 9587708/CSID: 8949283/CSID: 25944197 -N-methoxyacetyl-valine NOMe-Ac-Val C8H13NO3 171.0895432888 CSID: 11856685 -N-desmethyldolaisoleuine/alpha-hydroxy-6-methyl-3-aminooctanoic acid dDil/aC9:0-OH(2)-NH2(3) C9H17NO2 171.1259287951 C(C(N)C(C)CC)(CC(O)=O)OC in CSID: 9938808/C(C(C(CCC(CC)C)N)O)(=O)O in CSID: 10475103 -N-acetyl-HydroxyOrnithine/D-N-acetyl-HydroxyOrnithine Ac-OH-Orn/D-Ac-OH-Orn C7H12N2O3 172.0847922619 PDB: AHO/CSID: 3670289 -tryptophanol Trpol C11H12N2 172.1000483956 CSID: 10234 -N-methyldichloropyrrole-2-carboxylic acid MdCP C6H3Cl2NO 174.9591697236 CSID: 21926880 -beta.beta-dimethyl-Methionine-S-oxide bbMe2-O-Met C7H13NO2S 175.0666993567 CSID: 29322228 -alpha-amino-phenyl-valeric acid Apv C11H13NO 175.0997140446 CSID: 262061 -Homotyrosine/N-methyltyrosine/beta-hydroxy-N-Methyl-Phenylalanine Hty/NMe-Tyr/bOH-NMe-Phe C10H11NO2 177.0789786025 CSID: 3365526/CSID: 453342/CSID: 14028021 -propenoyl-2-aminobutanoyloxazole acid PAOA C9H10N2O2 178.0742275756 C(C=CC1=COC(=N1)C(N)CC)(=O)O in CSID: 27026296 -2.4-dimethyl-dec-9-ynoic acid/10-methyl-2.trans4-undecanoic acid C10:0:1(9)-Me(2.4)/iC12:2(2.t4) C12H18O 178.1357651999 C(C(CC(CCCCC#C)C)C)(=O)O in CSID: 23076292/C(C=CC=CCCCCC(C)C)(O)=O in CSID: 24677772 -beta-hydroxy-tyrosine/3.4-dihydroxyphenylalanine bOH-Tyr/diOH-Phe C9H9NO3 179.0582431604 CSID: 13930867/CSID: 813 -proline-thiazole Pro-Thz C8H8N2OS 180.0357335793 C1=CSC(=N1)C2CCC(N2)C(=O)O in CSID: 8971346 -2-methyl-5-dodecenoic acid C12:1(5) C12H20O 180.1514152641 CSID: 4471802 -Anticapsin Aca C9H11NO3 181.0738932246 CSID: 2796855 -D-homoarginine D-Har C7H10N4O2 182.0803755860 CSID: 53295 -vinylogous arginine v-Arg C8H14N4O 182.1167610923 C(C(N)CCCNC(=N)N)=CC(=O)O in CSID: 8946030 -dodecanoic acid/isododecanoic acid C12:0/iC12:0 C12H22O 182.1670653283 CSID: 3756/CID: 75942 -3-chloro-4-hydroxyphenylglycine Cl-Hpg C8H6ClNO2 183.0087064420 CSID: 3817439 -N-methyl-butenylthreonine/2-amino-8-oxo-decanoic acid NMe-Bmt/C10:0-NH2(2)-oxo(8) C10H17NO2 183.1259287951 CSID: 9944222/CSID: 16281719 -2.3-Dehydro-Tryptophan dh-Trp C11H8N2O 184.0636628893 CSID: 7991355 -ureido-4-oxovancosamine U4oxo-Van C8H12N2O3 184.0847922619 C1(C2(C(CC(O1)O)(C)NC(N2)=O)O)C in: NOR00711 -alpha-ketoarginine k-Arg C7H12N4O2 184.0960256502 C(C(C(CCCNC(=N)N)N)=O)(=O)O in CSID: 10477079 -3-hydroxy-undecanoic acid/3-hydroxy-isoundecanoic acid/3-hydroxy-2-methyl-decanoic acid/3-hydroxy-4-methyl-decanoic acid C11:0-OH(3)/iC11:0-OH(3)/C10:0-Me(2)-OH(3)/C10:0-Me(4)-OH(3) C11H20O2 184.1463298862 CSID: 2340495/CC(C)CCCCCC(CC(=O)O)O in: NOR00398/CSID: 13775620/CSID: 28533406 -Dolapyrrolidone Dpy C12H11NO 185.0840639804 CSID: 8735462 -Dolaisoleucine/8-hydroxy-2-amino-decanoic acid/9-hydroxy-2-amino-decanoic acid Dil/C10:0-OH(8)-NH2(2)/C10:0-OH(9)-NH2(2) C10H19NO2 185.1415788593 C(CC(O)=O)(OC)C(C(C)CC)NC in CSID: 7986684/CSID: 26949211/C(C(N)CCCCCCC(C)O)(=O)O in CSID: 10279723 -DL-Tryptophan/D-Tryptophan Trp/D-Trp C11H10N2O 186.0793129535 CSID: 1116/CSID: 8707 -hydrated alpha-ketoarginine hk-Arg C7H14N4O2 186.1116757144 C(C(C(CCCN=C(N)N)N)O)(=O)O in CSID: 8946570 -dehydro vinylogous tyrosine dv-Tyr C11H9NO2 187.0633285383 C(C(N)=CC1=CC=C(C=C1)O)=CC(=O)O in CSID: 8185737 -3.4-dihydroxyArginine diOH-Arg C6H12N4O3 188.0909402723 C(C(C(C(O)=O)N)O)(CN=C(N)N)O in CSID: 8801410 -vinylogous tyrosine/N-acetylphenylalanine v-Tyr/Ac-Phe C11H11NO2 189.0789786025 C(C(N)CC1=CC=C(C=C1)O)=CC(=O)O in CSID: 10477079/CSID: 1923 -kynurenine/D-kynurenine Kyn/D-Kyn C10H10N2O2 190.0742275756 CSID: 823/CID: 1152206 -coronafacic acid CFA C12H14O2 190.0993796936 CSID: 13300082 -N-methyl-4-methylamino-phenylalanine/N.O-dimethyl-tyrosinecarboxamid NMe-MeA-Phe/NMe-OMe-TyrC C11H14N2O 190.1106130819 CID: 21137790/CID: 19003692 -alpha-amino-hydroxyphenyl-valeric acid/N-methyl-homotyrosine/3-methyl-homotyrosine/ethylene inserted tyrosine/N.O-dimethyl-tyrosine/D-N.O-dimethyl-tyrosine Ahv/NMe-Hty/3Me-Hty/e-Tyr/NMe-OMe-Tyr/D-NMe-OMe-Tyr C11H13NO2 191.0946286667 C(C(=O)O)(CCCC1=CC=C(C=C1)O)N in CSID: 142959/C1=CC(=CC=C1CCC(C(=O)O)NC)O in CSID: 10477716/C1=CC(=CC=C1CC(C(C(=O)O)N)C)O in: NOR00265/C(C(N)CC1=CC=C(C=C1)O)CC(=O)O in CSID: 9977717/CID: 18925327/CID: 18925327 -10-methyl-2.trans4-dodecenoic acid aC13:2(2.t4) C13H20O 192.1514152641 C(C=CC=CCCCCC(CC)C)(O)=O in CSID: 24665012 -di-chloro-N-methyl-dehydroLeucine Cl2-NMe-dhLeu C7H9Cl2NO 193.0061199162 C(C(O)=O)(NC)=CC(C)C(Cl)Cl in CSID: 8701761 -beta-methoxy-tyrosine bOMe-Tyr C10H11NO3 193.0738932246 CSID: 16174140 -O-sulfate-2-hydroxy-3-methylpentanoic acid OSu-Hmp C6H10O5S 194.0248941215 C(C(C(CC)C)O[S](=O)(=O)O)(=O)O in CSID: 10477875 -methyloxazoline-isoleucine MeOx-Ile C11H18N2O 194.1419132103 C(N)(C(C)CC)C1=NC(C(C1)C)C(=O)O in CSID: 10477991 -11-methyl-3-dodecenoic acid/10-methyl-3-dodecenoic acid iC13:1(3)/aC13:1(3) C13H22O 194.1670653283 C(CC=CCCCCCCC(C)C)(O)=O in: NOR00296/C(CC=CCCCCCC(CC)C)(O)=O in: NOR00767 -di-chloro-N-methyl-Leucine Cl2-NMe-Leu C7H11Cl2NO 195.0217699804 C(C(O)=O)(NC)CC(C)C(Cl)Cl in CSID: 8773801 -3-hydroxy-5-dodecenoic acid/9-oxo-2.4-dimethyldecanoic acid/8-hydroxy-2.4.6-trimethyl-4-nonenoic acid C12:1(5)-OH(3)/C10:0-Me(2.4)-oxo(9)/C9:1(4)-Me(2.4.6)-OH(8) C12H20O2 196.1463298862 CSID: 10761118/C(C(CC(CCCCC(C)=O)C)C)(=O)O in CSID: 8946480/C(C(CC(=CC(CC(C)O)C)C)C)(O)=O in CSID: 8007368 -11-methyldodecanoic acid/10-methyldodecanoic acid iC13:0/aC13:0 C13H24O 196.1827153925 CID: 33002/CSID: 2282934 -chloro-tyrosine Cl-Tyr C9H8ClNO2 197.0243565062 CSID: 106510 -2-amino-9.10-epoxi-8-oxodecanoic acid C10:0-NH2(2)-Ep(9)-oxo(8) C10H15NO3 197.1051933530 CSID: 11345228 -4-butenyl-4-methyl-N.4-methyl threonine Me2-Bmt C11H19NO2 197.1415788593 CSID: 4450325 -3-hydroxy-dodecanoic acid/3-hydroxy-isododecanoic acid/3-hydroxy-2-methyl-undecanoic acid C12:0-OH(3)/iC12:0-OH(3)/C11:0-Me(2)-OH(3) C12H22O2 198.1619799504 CSID: 85026/CID: 15089799/CSID: 13775586 -9-hydroxy-2-amino-8-oxo-decanoic acid C10:0-OH(9)-NH2(2)-oxo(8) C10H17NO3 199.1208434172 CSID: 25942012 -N-acetyl-N6-formyl-N6-hydroxyOrnithine NAc-Fo-OH-Orn C8H12N2O4 200.0797068840 C(C(=O)O)(NC(C)=O)CCCN(O)C=O in CSID: 3294 -N1-methyl-tryptophan 1Me-Trp C12H12N2O 200.0949630177 CSID: 88584 -5-hydroxytryptophan/phototryptophan OH-Trp/pTrp C11H10N2O2 202.0742275756 CSID: 141/CID: 10331043 -N-methyl-4-dimethylamino-phenylalanine NMe-Me2A-Phe C12H16N2O 204.1262631461 CSID: 27594543 -vinylogous hydroxy tyrosine v-OH-Tyr C11H11NO3 205.0738932246 C(C(N)CC1=CC(=C(C=C1)O)O)=CC(=O)O in CSID: 9204437 -alpha-amino-methoxyphenyl-valeric acid Amv C12H15NO2 205.1102787309 CSID: 9681632 -N-Methyl-Lanthionine NMe-Lan C6H10N2O4S 206.0361275098 C(SCC(C(=O)O)N)C(C(O)=O)NO in: NOR00149 -3-nitrotyrosine 3NO2-Tyr C9H8N2O4 208.0484067556 CSID: 205676 -7-tetradecenoic acid/12-methyl-3-tridecenoic acid C14:1(7)/iC14:1(3) C14H24O 208.1827153925 CSID: 10722652/PDB: LNG -D-PhosphateAsparagine D-PO-Asn C4H7N2O6P 210.0041724777 C(C(C(C(O)=O)N)O[P](O)(=O)O)(=O)N in: NOR00025 -propenoyl-O-methylserinylthiazole acid PMST C9H10N2O2S 210.0462982656 C(C=CC1=CSC(=N1)C(N)COC)(=O)O in CSID: 8503913 -5-oxo-8-hydroxy-2.4.6-trimethyl-4-nonaneic acid C9:1(Me4)-Me(2.4.6)-OH(8)-Oxo(5) C12H18O3 210.1255944441 C(C(CC(C(C(CC(C)O)C)=O)=C)C)(O)=O in CSID: 8434247 -tetradecanoic acid/12-methyl-tridecanoic acid C14:0/iC14:0 C14H26O 210.1983654567 PDB: MYR/CID: 520298 -Chloro-N-methyl-tyrosine/D-3-chloro-N-methyl-Tyrosine Cl-NMe-Tyr/D-Cl-NMe-Tyr C10H10ClNO2 211.0400065704 PDB: CNT/C(C(=O)O)(NC)CC1=CC(=C(C=C1)O)Cl in: NOR00614 -3-amino-tridecanoic acid C13:0-NH2(3) C13H25NO 211.1936144298 CSID: 26283438 -3-hydroxy-tridecanoic acid/3-hydroxy-isotridecanoic acid/3-hydroxy-10-methyl-dodecanoic acid C13:0-OH(3)/iC13:0-OH(3)/aC13:0-OH(3) C13H24O2 212.1776300146 CSID: 4472174/CID: 15089800/C(CC(CCCCCCC(CC)C)O)(O)=O in: NOR00857 -beta-hydroxy-chloro-tyrosine bOH-Cl-Tyr C9H8ClNO3 213.0192711283 CSID: 25938524 -3-amino-6-hydroxy-2-piperidone Ahp C9H14N2O4 214.0953569482 CSID: 25058696 -N-methyl-5-hydroxytryptophan/methoxytryptophan NMe-OH-Trp/OMe-Trp C12H12N2O2 216.0898776398 C(C(=O)O)(NC)CC1=C[N]C2=C1C=C(C=C2)O in CSID: 10476796/O(C(=O)[C@@H](N([H])[H])CC1=C[N](C2=CC=CC=C12)OC)[H] in CSID: 5293532 -2.6-diamino-7-hydroxyazelaic acid Daz C9H16N2O4 216.1110070124 CSID: 391749 -4-amino-7-guanidino-2.3-dihydroxyheptanoic acid Agdha C8H16N4O3 216.1222404007 CSID: 21377788 -3.5-dichloro-4-hydroxyphenylglycine Cl2-Hpg C8H5Cl2NO2 216.9697344099 CSID: 9804791 -DHP-methyloxazolinyl group DMOG C11H9NO4 219.0531577825 CSID: 12721 -N-methoxyacetyl-D-phenylalanine NOMe-Ac-D-Phe C12H13NO3 219.0895432888 CSID: 11859621 -D-6'-chloro-tryptophan D-Cl-Trp C11H9ClN2O 220.0403409214 C(C(=O)O)(N)CC1=NC2=C(C1)C=CC(=C2)Cl in CSID: 8094776 -dihydroxyphenylthiazol group DHPT C10H7NO3S 221.0146637862 CSID: 23110909 -12-methyl-3-tetradecenoic acid aC15:1(3) C15H26O 222.1983654567 C(CC=CCCCCCCCC(CC)C)(O)=O in: NOR00768 -2.3-dihydroxy-2.6.8-trimethyldeca-(4Z.6E)-dienoic acid/2.3-dihydroxy-trans4.trans6-tridecenoic acid aC11:2(4.6)-Me(2.6)-OH(2.3)/C13:2(t4.t6)-OH(2.3) C13H20O3 224.1412445083 C(C(C(C=CC(=CC(CC)C)C)O)(O)C)(O)=O in CSID: 4977118/C(C(C(C=CC=CCCCCCC)O)O)(O)=O in CSID: 4976886 -12-methyltetradecanoic acid aC15:0 C15H28O 224.2140155209 CSID: 20368 -bromophenylalanine Br-Phe C9H8BrNO 224.9789158841 CSID: 77275 -3-amino-tetradecanoic acid/3-amino-isotetradecanoic acid C14:0-NH2(3)/iC14:0-NH2(3) C14H27NO 225.2092644940 CSID: 15571256/CID: 22471993 -3-hydroxy-tetradecanoic acid/3-hydroxy-12-methyl-tridecanoic acid C14:0-OH(3)/iC14:0-OH(3) C14H26O2 226.1932800788 CSID: 15252/CID: 22471995 -tri-chloro-N-methyl-dehydroLeucine Cl3-NMe-dhLeu C7H8Cl3NO 226.9671478841 C(C(O)=O)(NC)=CC(C)C(Cl)(Cl)Cl in CSID: 10477276 -N-acetyltryptophan Ac-Trp C13H12N2O2 228.0898776398 CSID: 1925 -beta.beta.N-trimethyltryptophan bbMe-NMe-Trp C14H16N2O 228.1262631461 C1=CC=CC2=C1C(=C[N]2)C(C(C(O)=O)NC)(C)C in CSID: 8158974 -3-hydroxy-2.2.4-trimethyl-7-hydroxydecanoic acid C10:0-Me(2.2.4)-OH(3.7) C13H24O3 228.1725446367 C(C(C(C(=O)O)(C)C)O)(CCC(CCC)O)C in CSID: 8184030 -tri-chloro-N-methyl-Leucine Cl3-NMe-Leu C7H10Cl3NO 228.9827979483 C(C(O)=O)(NC)CC(C)C(Cl)(Cl)Cl in CSID: 10477275 -thiazolylphenylalanine Phe-Thz C12H10N2OS 230.0513836435 C(N)(CC1=CC=CC=C1)C2=NC(=CS2)C(O)=O in CSID: 8593238 -D-2-carboxy-tryptophan D-COOH-Trp C12H10N2O3 230.0691421977 C(C(O)=O)(N)CC1=C([N]C2=C1C=CC=C2)C(=O)O in CSID: 7987591 -N-methyl-6-chloro-tryptophan NMe-Cl-Trp C12H11ClN2O 234.0559909856 C(C(=O)O)(NC)CC1=C[N]C2=C1C=CC(=C2)Cl in CSID: 8805002 -7-hexadecenoic acid/9-hexadecenoic acid C16:1(7)/C16:1(9) C16H28O 236.2140155209 CSID: 4895966/CSID: 4445872 -2.3-dihydroxy-trans4.trans6-tetradecenoic acid/2.6.8-trimethyl-5.7-dihydroxy-trans2.trans8-undecenoic acid C14:2(t4.t6)-OH(2.3)/C11:2(t2.t8)-Me(2.6.8)-OH(5.7) C14H22O3 238.1568945725 C(C(C(C=CC=CCCCCCCC)O)O)(O)=O in CSID: 8924310/C(C(=CCC(C(C(C(=CCC)C)O)C)O)C)(O)=O in CSID: 10481263 -hexadecanoic acid C16:0 C16H30O 238.2296655851 CSID: 960 -beta-methyl-bromophenylalanine bMe-Br-Phe C10H10BrNO 238.9945659483 C(C(=O)O)(C(C1=CC=C(C=C1)Br)C)N in CSID: 10475327 -3-amino-pentadecanoic acid/3-amino-isopentadecanoic acid/3-amino-12-methyl-tetradecanoic acid C15:0-NH2(3)/iC15:0-NH2(3)/aC15:0-NH2(3) C15H29NO 239.2249145582 CSID: 26283439/C(CC(CCCCCCCCCC(C)C)N)(O)=O in: NOR00784/C(CC(CCCCCCCCC(CC)C)N)(O)=O in: NOR00785 -3-hydroxy-13-methyltetradecanoic acid/3-hydroxy-pentadecanoic acid/3-hydroxy-isopentadecanoic acid/3-hydroxy-12-methyl-tetradecanoic acid C14:0-Me(13)-OH(3)/C15:0-OH(3)/iC15:0-OH(3)/aC15:0-OH(3) C15H28O2 240.2089301430 CSID: 9218624/CSID: 158374/CSID: 9218624/C(CC(CCCCCCCCC(CC)C)O)(O)=O in: NOR00211 -bromotyrosine/beta-hydroxy-bromophenylalanine Br-Tyr/bOH-Br-Phe C9H8BrNO2 240.9738305062 CSID: 131083/CSID: 19757850 -beta.beta.N1.N-tetramethyltryptophan bbNMe-NMe-Trp C15H18N2O 242.1419132103 C1=CC=CC2=C1C(=C[N]2C)C(C(C(O)=O)NC)(C)C in CSID: 8570259 -3.4-dihydroxy-tetradecanoic acid/ 3-hydroxy-2.2.4-trimethyl-7-methoxydecanoic acid C14:0-OH(3.4)/C10:0-Me(2.2.4)-OH(3)-OMe(7) C14H26O3 242.1881947009 CID: 22667431/CSID: 28587148 -3-amino-4-hydroxy-6-methyl-8-phenyl-5.7-octadienoic acid C8:2(5.7)-Me(6)-OH(4)-NH2(3)-Ph(8) C15H17NO2 243.1259287951 C(CC(C(C=C(C=CC1=CC=CC=C1)C)O)N)(=O)O in CSID: 10475327 -tri-chloro-2-hydroxy-N-methyl-Leucine/tri-chloro-5-hydroxy-N-methyl-Leucine Cl3-2OH-NMe-Leu/Cl3-5OH-NMe-Leu C7H10Cl3NO2 244.9777125704 C(C(O)=O)(NC)(CC(C)C(Cl)(Cl)Cl)O in CSID: 10477276/C(C(O)=O)(NC)CC(CO)C(Cl)(Cl)Cl in: NOR00511 -N-methyl-6-chloro-5-hydroxytryptophan NMe-Cl-OH-Trp C12H11ClN2O2 250.0509056077 C(C(=O)O)(NC)CC1=C[N]C2=C1C=C(C(=C2)Cl)O in CSID: 10473575 -2.3-dihydroxy-trans4.trans6-pentadecenoic acid C15:2(t4.t6)-OH(2.3) C15H24O3 252.1725446367 C(C(C(C=CC=CCCCCCCCC)O)O)(O)=O in CSID: 4976888 -3-hydroxy-9-hexadecenoic acid C16:1(9)-OH(3) C16H28O2 252.2089301430 C(CC(CCCCCC=CCCCCCC)O)(O)=O in: NOR00720 -3-amino-hexadecanoic acid/3-amino-isohexadecanoic acid C16:0-NH2(3)/iC16:0-NH2(3) C16H31NO 253.2405646224 CSID: 24597602/C(CC(CCCCCCCCCCC(C)C)N)(O)=O in: NOR00793 -3-hydroxy-hexadecanoic acid/3-hydroxy-isohexadecanoic acid C16:0-OH(3)/iC16:0-OH(3) C16H30O2 254.2245802072 CSID: 266538/C(CC(CCCCCCCCCCC(C)C)O)(O)=O in: NOR00897 -D-3-bromo-N-methyl-Tyrosine D-Br-NMe-Tyr C10H10BrNO2 254.9894805704 CSID: 2128826 -pyoverdin Pa A chromophore ChrPaA C13H11N3O3 257.0800412350 C1=C(C(=CC2=C1N3C(C(=C2)N)=NC(CC3)C(O)=O)O)O in CSID: 0 -N1-carboxy-bichomotryptophan N1-COOH-bhTrp C14H14N2O3 258.1004423261 C(CC1=C[N](C2=C1C=CC=C2)C(=O)O)CC(C(=O)O)N in CSID: 9968260 -isopyoverdin chromophore/pyoverdin chromophore ChrI/ChrP C13H13N3O3 259.0956912992 C1=C(C(=CC2=C1N3C(C(=C2)N)NC(CC3)C(O)=O)O)O in: NOR00163/C1=C(C(=CC2=C1N3C(C(=C2)N)NC(CC3)C(O)=O)O)O in CID: 5289234 -5.6-dihydropyoverdin chromophore ChrD C13H15N3O3 261.1113413634 C1=C(C(=CC2=C1N3C(C(N)C2)NCCC3C(O)=O)O)O in: NOR00903 -D-6-chloro-N2-formamidotryptophan D-Cl-CONH2-Trp C12H10ClN3O2 263.0461545808 C(C(O)=O)(N)CC1=C[N](C2=C1C=CC(=C2)Cl)C(=O)N in CSID: 8138519 -3-amino-8-phenyl-2.4.5-trihydroxyoct-7-enoic acid C8:1(7)-OH(2.4.5)-NH2(3)-Ph(8) C14H17NO4 263.1157580393 CSID: 29330841 -5-bromo-tryptophan Br-Trp C11H9BrN2O 263.9898149214 CSID: 87339 -9-octadecenoic acid C18:1(9) C18H32O 264.2453156493 CSID: 553123 -8.10-Dimethyl-9-hydroxy-7-methoxytridecadienoic acid DHMDA C16H26O3 266.1881947009 C(C(C(CCC)C)O)(C(C=CC=CCC(=O)O)OC)C in CSID: 10479168 -3-amino-14-methyl-hexadecanoic acid/3-amino-15-methyl-hexadecanoic acid aC17:0-NH2(3)/iC17:0-NH2(3) C17H33NO 267.2562146866 C(CC(CCCCCCCCCCC(CC)C)N)(O)=O in CSID: 2340866/C(CC(CCCCCCCCCCCC(C)C)N)(O)=O in: NOR00801 -3-hydroxy-14-methyl-hexadecanoic acid/3-hydroxy-15-methyl-hexadecanoic acid aC17:0-OH(3)/iC17:0-OH(3) C17H32O2 268.2402302714 C(CC(CCCCCCCCCCC(CC)C)O)(O)=O in: NOR00900/CSID: 141849 -3.4-dihydroxy-hexadecanoic acid C16:0-OH(3.4) C16H30O3 270.2194948293 CID: 22348653 -4-propenoyl-2-tyrosylthiazole acid PTTA C14H12N2O2S 272.0619483298 C(O)(=O)C=CC1=CSC(=N1)C(N)CC2=CC=C(C=C2)O in CSID: 16738243 -N-methyl-2-Bromo-tryptophan NMe-Br-Trp C12H11BrN2O 278.0054649856 C(C(=O)O)(NC)CC1=C([N]C2=C1C=CC=C2)Br in CSID: 8007368 -2-bromo-5-hydroxytryptophan Br-OH-Trp C11H9BrN2O2 279.9847295435 CSID: 643874 -3-hydroxy-9-octadecenoic acid C18:1(9)-OH(3) C18H32O2 280.2402302714 C(CC(CCCCCC=CCCCCCCCC)O)(O)=O in: NOR00724 -azotobactins chromophore ChrA C14H11N3O4 285.0749558571 C1=C(C(=CC2=C1N4C3C(=C2)NC(N3CCC4C(O)=O)=O)O)O in: NOR00208 -O-demethyl-Adda DMAdda C19H25NO2 299.1885290519 C(C(C(C=CC(=CC(C(CC1=CC=CC=C1)O)C)C)N)C)(O)=O in: NOR00129 -D-3-iodo-N-methyl-Tyrosine D-I-NMe-Tyr C10H10INO2 302.9756105704 C(C(=O)O)(NC)CC1=CC(=C(C=C1)O)I in CSID: 9017332 -actinomycin chromophore ChrAct C16H10N2O5 310.0589714419 CSID: 86817 -3-amino-9-methoxy-2.6.8-trimethyl-10-phenyldeca-4.6-dienoic acid Adda C20H27NO2 313.2041791161 CSID: 10471100 -3-amino-4-hydroxy-6-methyl-8-(p-bromophenyl)-5.7-octadienoic acid C8:2(5.7)-Me(6)-OH(4)-NH2(3)-brPh(8) C15H16BrNO2 321.0364307630 C(CC(C(C=C(C=CC1=CC=C(C=C1)Br)C)O)N)(=O)O in CSID: 10476834 -3-amino-6-methyl-12-phenyl-2.4.5-trihydroxydodeca-7.9.11-trienoic acid C12:3(7.9.11)-Me(6)-OH(2.4.5)-NH2(3)-Ph(12) C19H23NO4 329.1627082319 C(C(C(C(C(C(C=CC=CC=CC1=CC=CC=C1)C)O)O)N)O)(O)=O in CSID: 8923613 -3-amino-10-(p-ethoxyphenyl)-2.4.5-trihydroxydeca-7.9-dienoic acid C10:2(7.9)-OH(2.4.5)-NH2(3)-ePh(10) C18H23NO5 333.1576228540 CSID: 29330839 -O-Acetyl-O-demethylAdda ADMAdda C21H27NO3 341.1990937382 C(C(C(C=CC(=CC(C(CC1=CC=CC=C1)OC(C)=O)C)C)N)C)(O)=O in: NOR00144 -3-amino-6.10-dimethyl-12-phenyl-2.4.5-trihydroxydodeca-7.9.11-trienoic acid C12:3(7.9.11)-Me(6.10)-OH(2.4.5)-NH2(3)-Ph(12) C20H25NO4 343.1783582961 C(C(C(C(C(C(C=CC=C(C=CC1=CC=CC=C1)C)C)O)O)N)O)(O)=O in CSID: 10187168 -3-amino-6-methyl-12-(p-methoxyphenyl)-2.4.5-trihydroxydodec-11-enoic acid C12:1(11)-Me(6)-OH(2.4.5)-NH2(3)-mPhe(11) C20H29NO5 363.2045730466 CSID: 29330842 +Ethanolamine Eta C2H5N 43.0421990000 CSID: 13835336 +Glycine Gly C2H3NO 57.0214640000 CSID: 730 +pyrrolidone Pyr C4H5N 67.0421990000 CSID: 11530 +dehydroalanine dh-Ala C3H3NO 69.0214640000 CSID: 110510 +pyruvic acid Pya C3H2O2 70.0054790000 CSID: 1031 +butanoic acid C4:0 C4H6O 70.0418650000 CSID: 259 +DL-Alanine/D-Alanine/beta-Alanine/N-Methyl-Glycine Ala/D-Ala/bAla/NMe-Gly C3H5NO 71.0371140000 CSID: 582/CSID: 64234/CSID: 234/CSID: 1057 +Lactic acid/D-lactic acid Lac/D-Lac C3H4O2 72.0211290000 CSID: 592/CSID: 55423 +Serinol Serol C3H7NO 73.0527640000 CSID: 61591 +2.3-dehydro-2-aminobutyric acid/homoserine lactone/N-Methyl-dehydroalanine/hydroxy pyrrolidone dhAbu/HseL/NMe-Dha/OH-Pyr C4H5NO 83.0371140000 CSID: 4952645/CSID: 66194/CSID: 118845/CSID: 134682 +2-hydroxy-3-butenoic acid C4:1(3)-OH(2) C4H4O2 84.0211290000 CSID: 141066 +2-methyl-butanoic acid C4:0-Me(2) C5H8O 84.0575150000 CSID: 8012 +alpha-formylGlycine aFo-Gly C3H3NO2 85.0163780000 CSID: 28 +N-Methyl-L-alanine/N-methyl-beta-alanine/alpha-aminobutyric acid/D-alpha-aminobutyric acid/2-Methylalanine/methyl alaninate NMe-Ala/NMe-bAla/Abu/D-Abu/Aib/D-3OMe-Ala C4H7NO 85.0527640000 CSID: 4450824/CSID: 68396/PDB: ABA/PDB: DBB/CSID: 5891/CSID: 99878 +isovalinol/valinol Ivalol/Valol C5H11N 85.0891490000 CSID: 8329525/CSID: 71352 +3-hydroxybutanoic acid C4:0-OH(3) C4H6O2 86.0367790000 CSID: 428 +2.3-Diaminopropionic acid Dpr C3H6N2O 86.0480130000 CSID: 357 +DL-Serine/D-Serine/isoserine Ser/D-Ser/Iser C3H5NO2 87.0320280000 CSID: 597/CSID: 64231/CSID: 10793 +Sorbic acid C6:2(t2.t4) C6H6O 94.0418650000 CSID: 558605 +methyl-succinimide Me-Suc C5H5NO 95.0371140000 CSID: 122158 +proline carboxamid ProC C5H8N2 96.0687480000 CSID: 479142 +DL-Proline/D-Proline/2-methylamino-2-dehydrobutyric acid/norcoronamic acid Pro/D-Pro/2Dh-Mabu/norCMA C5H7NO 97.0527640000 CSID: 594/CSID: 8640/CSID: 16743754/CSID: 28708240 +3-methylvaleric acid/hexanoic acid Me-Vaa/C6:0 C6H10O 98.0731650000 CSID: 7469/CSID: 8552 +N-formyl-Alanine/D-N-formyl-Alanine NFo-Ala/D-NFo-Ala C4H5NO2 99.0320280000 CSID: 72251/CSID: 72251 +DL-Valine/D-Valine/Isovaline/D-Isovaline/Norvaline/D-Norvaline/2-methyl-3-aminobutanoic acid/N-dimethyl-Alanine/3-amino-pentanoic acid Val/D-Val/Ival/D-Ival/Nva/D-Nva/Mab/NdMe-Ala/C5:0-NH2(3) C5H9NO 99.0684140000 CSID: 1148/CSID: 64635/CSID: 85483/PDB: DIV/CSID: 801/CSID: 388660/CSID: 471786/CSID: 9962964/CSID: 11271826 +Leucinol/Isoleucinol Leuol/Ileol C6H13N 99.1047990000 CSID: 71362/CSID: 82355 +2-hydroxy-3-epoxy-butanoic acid C4:0-OH(2)-Ep(3) C4H4O3 100.0160440000 CSID: 15475591 +Succinic acid Suc C4H4O3 100.0160440000 CSID: 7634 +2-hydroxyisovaleric acid/D-2-hydroxyisovalerate Hiv/D-Hiv C5H8O2 100.0524300000 CSID: 90190/CID: 5289545 +2.4-diaminobutyric acid/D-2.4-diaminobutyric acid/2.3-diaminobutyric acid/(2S.3S)-2.3-diaminobutyric acid/(2R.3R)-2.3-diaminobutyric acid Dab/D-Dab/Dbu/L-Dbu/D-Dbu C4H8N2O 100.0636630000 CSID: 457/CID: 638153/CSID: 4475641/CID: 11768553/PDB: VDL +dehydro-cysteine dhCys C3H3NOS 100.9935340000 CSID: 24784832 +Threonine/D-Threonine/allo-Threonine/D-allo-Threonine/Homoserine/D-Homoserine/N-Methyl-Serine/N-Methyl-D-Serine/4-amino-3-hydroxybutyric acid Thr/D-Thr/aThr/D-aThr/Hse/D-Hse/NMe-Ser/D-NMe-Ser/OH-4Abu C4H7NO2 101.0476780000 PDB: THR/PDB: DTH/PDB: ALO/CSID: 81824/CSID: 758/CSID: 2006329/CSID: 481791/PDB: DSE/CSID: 2064 +2.3-dihydroxy-butanoic acid C4:0-OH(2.3) C4H6O3 102.0316940000 CSID: 219301 +DL-Cysteine Cys C3H5NOS 103.0091840000 CSID: 574 +benzoic acid Bz C7H4O 104.0262150000 CSID: 238 +N-methylglutamine NMe-Gln C6H10N2 110.0843980000 CSID: 10652941 +4-oxo-proline/pyroglutamic acid 4oxo-Pro/pGlu C5H5NO2 111.0320280000 CSID: 366185/CSID: 485 +3-Methylproline/4-Methylproline/homoproline/D-homoproline/coronamic acid 3Me-Pro/4Me-Pro/Hpr/D-Hpr/CMA C6H9NO 111.0684140000 CSID: 10610754/CSID: 312597/CSID: 826/CSID: 643442/CSID: 117751 +keto-Leucine/2-epoxy-hexanoic acid k-Leu/C6:0-Ep(2) C6H8O2 112.0524300000 CSID: 69/CSID: 14066572 +Hydroxy-cycloOrnithine/D-Hydroxy-cycloOrnithine OH-cOrn/D-OH-cOrn C5H8N2O 112.0636630000 CSID: 13539649/CSID: 13539649 +heptanoic acid/5-methyl-hexanoic acid C7:0/iC7:0 C7H12O 112.0888150000 CSID: 7803/CID: 12344 +aziridine dicarboxylic acid Azd C4H3NO3 113.0112930000 CSID: 11582505 +3-Hydroxyproline/4-Hydroxyproline/D-Hydroxyproline/2-formamidobutanoic acid 3OH-Pro/4OH-Pro/D-4OH-Pro/NFo-D-Abu C5H7NO2 113.0476780000 CSID: 486216/PDB: HYP/CID: 440014/CSID: 486348 +Leucine/D-Leucine/Isoleucine/D-Isoleucine/allo-Isoleucine/D-allo-Isoleucine/N-Methyl-L-valine/D-N-Methylvaline/3-Methylvaline/D-tert-Leu/2-methyl-3-aminopentanoic acid/D-N-methyl-norvaline Leu/D-Leu/Ile/D-Ile/aIle/D-aIle/NMe-Val/D-NMe-Val/t-Leu/D-t-Leu/Map/D-NMe-Nva C6H11NO 113.0840640000 CSID: 834/CSID: 388617/CSID: 769/CSID: 69017/CSID: 89698/CSID: 85019/CSID: 4225/CSID: 4225/CSID: 270637/CID: 6950340/CSID: 11643060/CSID: 10652938 +hydroxyacetyl propionyl/pentanedioic acid Hap/Pda C5H6O3 114.0316940000 C(C(C(CO)=O)C)(=O)O in CSID: 10477731/CSID: 723 +DL-Asparagine/D-Asparagine/N1-formyl-2.3-Diaminopropionic acid Asn/D-Asn/NFo-Dpr C4H6N2O2 114.0429270000 PDB: ASN/PDB: DSG/C(C(CN)NC=O)(=O)O in CSID: 8873525 +D-Leucic acid (2-hydroxy-4-methylpentanoic acid)/(R)-Leucic acid/3-hydroxyhexanoic acid/2-hydroxy-3-methyl-pentanoic acid/D-2-hydroxy-3-methyl-pentanoic acid C5:0-Me(4)-OH(2)/4Me-D-Hva/C6:0-OH(3)/Hmp/D-Hmp C6H10O2 114.0680800000 CSID: 83753/CSID: 388986/CSID: 133518/CSID: 144317/CSID: 144317 +DL-Ornithine/D-Ornithine Orn/D-Orn C5H10N2O 114.0793130000 CSID: 380/CSID: 64236 +DL-Aspartic acid/D-Aspartic acid/N-formyl-isoserine Asp/D-Asp/NFo-Iser C4H5NO3 115.0269430000 CSID: 411/CSID: 75697/C(C(C(=O)O)O)NC=O in CSID: 8503913 +beta-hydroxyvaline/D-beta-hydroxyvaline/N-Methylthreonine/O-Methylthreonine bOH-Val/D-bOH-Val/NMe-Thr/OMe-Thr C5H9NO2 115.0633290000 CSID: 244525/CID: 192763/CSID: 5373925/CSID: 193545 +2.3-dihydroxy-3-methylbutanoic acid/2.4-dihydroxy-3-methylbutanoic acid iC5:0-OH(2.3)/iC5:0-OH(2.4) C5H8O3 116.0473440000 CSID: 657/C(C(C(CO)C)O)(=O)O in: NOR00082 +2-Methylcysteine/Methylcysteine aMe-Cys/NMe-Cys C4H7NOS 117.0248350000 CSID: 8233116/CSID: 2074082 +4-Hydroxythreonine 4OH-Thr C4H7NO3 117.0425930000 CSID: 3137512 +2.3.4-trihydroxy-butanoic acid C4:0-OH(2.3.4) C4H6O4 118.0266090000 CSID: 388628 +phenylacetic acid Pha C8H6O 118.0418650000 CSID: 10181341 +4-Hydroxybenzoic acid pOH-Bz C7H4O2 120.0211290000 CSID: 132 +trans2.trans4.trans6-trioctaneic acid C8:3(t2.t4.t6) C8H8O 120.0575150000 CSID: 4520024 +hydroxypicolinic acid Hpa C6H3NO2 121.0163780000 CSID: 12827 +oct-7-ynoic acid/2.trans4-octenoic acid C8:0:1(7)/C8:2(2.t4) C8H10O 122.0731650000 CSID: 4472125/CSID: 4944992 +4-oxo-5-methylproline/4-oxo-homoproline/N-Formyl-Proline 4oxo-5Me-Pro/4oxo-Hpr/NFo-Pro C6H7NO2 125.0476780000 CSID: 2564339/CSID: 10739339/CSID: 87055 +octanoic acid/6-methylheptanoic acid C8:0/iC8:0 C8H14O 126.1044650000 CSID: 370/CSID: 81904 +beta-ureido-dehydroAlanine bU-dAla C4H5N3O2 127.0381760000 PDB: UAL +N-formyl-Valine/N-Acetyl-2-aminoisobutyric acid/3-Hydroxy-5-methylproline NFo-Val/Ac-Aib/3OH-5Me-Pro C6H9NO2 127.0633290000 CSID: 90479/CSID: 203779/CSID: 3823469 +N-Methyl-Leucine/D-N-methyl-Leucine/N-Methyl-Isoleucine/N-methyl-alloIsoleucine/D-N-methyl-alloIsoleucine/beta-methylisoleucine/homoisoleucine/alpha-ethylnorvaline/Dolavaline/2-methyl-3-aminohexadecanoic acid NMe-Leu/D-NMe-Leu/NMe-Ile/NMe-aIle/D-NMe-aIle/bMe-Ile/Hil/Et-Nva/Dov/C6:0-Me(2)-NH2(3) C7H13NO 127.0997140000 CSID: 493595/CSID: 493595/CSID: 487199/CCC(C)C(C(=O)O)NC in: NOR00428/CCC(C)C(C(=O)O)NC in: NOR00428/CSID: 19951406/CSID: 454232/CSID: 452678/CSID: 10731564/CSID: 21378848 +DL-Glutamine/D-Glutamine/N-methylasparagine/beta-methyl-asparagine/D-N2-methyl-asparagine/N1-acetyl-2.3-Diaminopropionic acid Gln/D-Gln/NMe-Asn/bMe-Asn/D-N2Me-Asn/NAc-Dpr C5H8N2O2 128.0585780000 PDB: GLN/PDB: DGN/CSID: 311563/CSID: 2284493/CSID: 288387/C(C(CN)NC(C)=O)(=O)O in CSID: 8570696 +3-methoxy-hexanoic acid/3-hydroxy-heptanoic acid C6:0-OMe(3)/C7:0-OH(3) C7H12O2 128.0837300000 CSID: 277923/CSID: 2340494 +DL-Lysine/D-Lysine/beta lysine/N-Hydroxy-histamine Lys/D-Lys/bLys/N-OH-Hta C6H12N2O 128.0949630000 CSID: 843/CSID: 51793/PDB: KBE/C1(CCCN1)CCNO in CSID: 4589228 +DL-Glutamic acid/D-Glutamic Acid/beta-methyl-aspartic acid/D-beta-methyl-aspartic acid/beta-methoxy-aspartic acid/O-acetyl-Serine Glu/D-Glu/bMe-Asp/D-bMe-Asp/bOMe-Asp/Ac-Ser C5H7NO3 129.0425930000 CSID: 591/PDB: DGL/PDB: 2AS/PDB: ACB/CSID: 92764/CSID: 184 +L-acosamine/3-hydroxyleucine/beta-hydroxy-N-Methyl-Valine/gamma-hydroxy-N-Methyl-Valine/L-ristosamine Aco/3OH-Leu/bOH-NMe-Val/gOH-NMe-Val/Ria C6H11NO2 129.0789790000 CSID: 370989/CSID: 244507/CSID: 9205156/CID: 12439044/CSID: 370989 +2-hydroxy-3-methyl-butanedioic acid iC5:0-OH(2)-CA(4) C5H6O4 130.0266090000 CSID: 485839 +Hydroxyasparagine/D-HydroxyAsparagine OH-Asn/D-OH-Asn C4H6N2O3 130.0378420000 CSID: 3670287/CSID: 3670287 +alpha-guanidino Serine gSer C3H6N4O2 130.0490750000 C(C(=O)O)(N)(O)NC(=N)N in: NOR00426 +2.3-dihydroxy-3-methylpentanoic acid aC6:0-OH(2.3) C6H10O3 130.0629940000 CSID: 7 +N5-hydroxy ornithine/D-N5-HydroxyOrnithine/hydroxy-beta lysine OH-Orn/D-OH-Orn/OH-bLys C5H10N2O2 130.0742280000 CSID: 148381/C(CC(C(=O)O)N)CNO in: NOR00205/C(NCC(=O)O)(CCN)O in: NOR00634 +Hydroxyaspartic acid/D-Hydroxyaspartic acid OH-Asp/D-OH-Asp C4H5NO4 131.0218580000 CSID: 5232/CSID: 5232 +Methionine/N.S-dimethylcysteine Met/diMe-Cys C5H9NOS 131.0404850000 CSID: 853/CSID: 4450935 +arabinose/lyxose Ara/Lyx C5H8O4 132.0422590000 CSID: 224/CSID: 831 +L-Olivose Oli C6H12O3 132.0786440000 CSID: 164228 +PhenylGlycine/D-PhenylGlycine Ph-Gly/D-ph-Gly C8H7NO 133.0527640000 CSID: 3732/PDB: PG9 +phenylalaninol Pheol C9H11N 133.0891490000 CSID: 69116 +4-Chloro-Threonine 4Cl-Thr C4H6ClNO2 135.0087060000 CSID: 111708 +2.3-dihydroxy-4-chloro-butanoic acid C4:0-OH(2.3)-Cl(4) C4H5ClO3 135.9927220000 CSID: 25900403 +2.3-dihydroxybenzoic acid diOH-Bz C7H4O3 136.0160440000 CSID: 18 +2-methyl-7-octynoic acid/2.trans4-7-methyl-octenoic acid C8:0:1(7)-Me(2)/iC9:2(2.t4) C9H12O 136.0888150000 CSID: 24770189/CSID: 10761068 +DL-Histidine His C6H7N3O 137.0589120000 CSID: 752 +dehydropyrrolidone dPyr C6H6N2O2 138.0429270000 C1(CC(C(=CC(=O)O)N1)N)=O in CSID: 10199318 +acetylproline/2.3-dimethylpyroglutamic acid Ac-Pro/2Me-3Me-pGlu C7H9NO2 139.0633290000 CSID: 285677/CSID: 13080150 +5.5-dimethyl-2-oxo-hexanoic acid C6:0-Me(5.5)-oxo(2) C8H12O2 140.0837300000 CID: 21197379 +argininal Argal C6H12N4 140.1061960000 CSID: 10655329 +Nonanoic acid/d-6-Methyloctanoic acid/7-Methyloctanoic acid C9:0/aC9:0/iC9:0 C9H16O 140.1201150000 CSID: 7866/CSID: 10015/CSID: 31022 +N-methylchloropyrrole MCP C6H4ClNO 140.9981420000 CSID: 7404981 +N-Acetylisovaline/N-Acetylvaline/N-Formylisoleucine/N-Formylleucin/4-Amino-2.2-dimethyl-3-oxopentanoic acid/4-oxovancosamine Ac-Ival/Ac-Val/NFo-Ile/NFo-Leu/Ibu/4oxo-Van C7H11NO2 141.0789790000 CSID: 272193/CSID: 198159/CSID: 383482/CSID: 90475/CSID: 29322188/C1(C(C(CC(O1)O)(C)N)=O)C in CSID: 10249894 +N-dimethyl-leucine/N.beta-dimethyl-leucine/O-acetyl-leucinol/N.O-dimethyl-isoleucine NdMe-Leu/NMe-bMe-Leu/OAc-Leuol/NMe-OMe-Ile C8H15NO 141.1153640000 CSID: 500040/CID: 15385160/CID: 23037829/CSID: 27194495 +beta-methylglutamine/D-beta-methylglutamine bMe-Gln/D-bMe-Gln C6H10N2O2 142.0742280000 CID: 44602399/CSID: 24604116 +3-hydroxy-octanoic acid/2.2-dimethyl-3-hydroxyhexanoic acid/3-hydroxy-2-methyl-heptanoic acid C8:0-OH(3)/C6:0-Me(2.2)-OH(3)/C7:0-Me(2)-OH(3) C8H14O2 142.0993800000 CSID: 24791/CSID: 21418738/CSID: 27143447 +3-Methyl-Glutamic acid/Glutamic Acid methyl ester/D-Glutamic Acid methyl ester/D-Glutamic Acid methyl ester/2-Aminoadipic acid 3Me-Glu/MeO-Glu/D-MeO-Glu/MeO-D-Glu/Aad C6H9NO3 143.0582430000 CSID: 207514/CSID: 66546/CSID: 66546/CSID: 66546/CSID: 456 +L-actinosamine/L-eremosamine/norstatine/Vancosamine/N-methyl-hydroxyisoleucine Act/Ere/Nst/Van/NMe-OH-Ile C7H13NO2 143.0946290000 CID: 20377364/CSID: 9542085/CSID: 151726/CSID: 164304/CSID: 24770217 +beta-hydroxyglutamine/D-beta-hydroxy-N2-methyl-asparagine/D-beta-hydroxy-N2-methyl-asparagine OH-Gln/Me-OH-Asn/D-N2Me-bOH-Asn C5H8N2O3 144.0534920000 CID: 22592766/CSID: 24604117/C(C(=O)O)(N)C(C(=O)NC)O in: NOR00669 +methoxyaspartic acid OMe-Asp C5H7NO4 145.0375080000 C(C(C(C(=O)O)N)=[O]C)(=O)O in: NOR00717 +3.5-hydroxy-4-amino-hexadecanoic acid C6:0-OH(3.5)-NH2(4) C6H11NO3 145.0738930000 C(CC(C(C(C)O)N)O)(O)=O in: NOR00444 +L-rhamnose Rha C6H10O4 146.0579090000 CSID: 190747 +Methionine-S-oxide O-Met C5H9NO2S 147.0353990000 CSID: 824 +Chloro-Isoleucine Cl-Ile C6H10ClNO 147.0450920000 C(C(O)=O)(N)C(C(C)Cl)C in CSID: 10269389 +DL-Phenylalanine/D-Phenylalanine/beta-phenylalanine/D-beta-phenylalanine/N-methyl-phenylglycine Phe/D-Phe/bPhe/D-bPhe/NMe-Ph-Gly C9H9NO 147.0684140000 CSID: 969/CSID: 64639/CSID: 62403/CSID: 598357/CSID: 198596 +2-hydroxyphenyl-2-oxo-ethanoic acid Hpoe C8H4O3 148.0160440000 CSID: 348 +Phenyl-lactate/D-Phenyl-lactate Ph-Lac/D-Ph-Lac C9H8O2 148.0524300000 CSID: 3715/CID: 643327 +HydroxyPhenylGlycine/D-HydroxyPhenylGlycine Hpg/D-Hpg C8H7NO2 149.0476780000 CSID: 83189/CID: 89853 +2.trans4-8-methyl-noneoic acid iC10:2(2.t4) C10H14O 150.1044650000 C(C=CC=CCCC(C)C)(O)=O in CSID: 16736750 +cysteic acid/D-cysteic acid CysA/D-CysA C3H5NO4S 150.9939280000 PDB: OCS/PDB: 00C +D-4-fluoroPhenylGlycin D-F-ph-Gly C8H6FNO 151.0433430000 CSID: 88776 +3-amino-2-methyloct-7-ynoic acid C8:0:1(7)-Me(2)-NH2(3) C9H13NO 151.0997140000 C(CCCC#C)(C(C(=O)O)C)N in CSID: 8230475 +2-methyl-3-hydroxy-7-octynoic acid C8:0:1(7)-Me(2)-OH(3) C9H12O2 152.0837300000 CSID: 9964309 +2-methyl-8-noneic acid C9:1(8)-Me(2) C10H16O 152.1201150000 CID: 17824924 +Hydroxyhistidine OH-His C6H7N3O2 153.0538260000 CSID: 379547 +N-methyl homo vinylogous Valine NMe-hv-Val C9H15NO 153.1153640000 C(C(NC)C(C)C)=C(C(O)=O)C in CSID: 10213622 +capreomycidine/enduracididine/D-enduracididine Cap/End/D-End C6H10N4O 154.0854610000 CSID: 3818574/CSID: 24775830/CSID: 24775830 +decanoic acid/isodecanoic acid/7-methylnonanoic acid C10:0/iC10:0/aC10:0 C10H18O 154.1357650000 CSID: 2863/CID: 111470/CSID: 4471754 +Alanine-thiazole Ala-Thz C6H7N2OS 155.0279090000 CSID: 23916434 +N-Acetylisoleucine/N-acetyl-Leucine/O-desmethyldolaproine NAc-Ile/NAc-Leu/dDap C8H13NO2 155.0946290000 CSID: 270615/CSID: 1918/C(C1CCCN1)(C(C(=O)O)C)O in CSID: 9938808 +2-Aminononanoic acid Me-AOA C9H17NO 155.1310140000 CSID: 198341 +2-carboxyquinoxaline COOH-Qui C9H4N2O 156.0323630000 CSID: 87301 +N-formyl-Glutamine NFo-Gln C6H8N2O3 156.0534920000 CSID: 2106926 +hydroxyisovalerylpropionyl Hip C8H12O3 156.0786440000 CID: 18942657 +3.4-dimethylglutamine 3Me-4Me-Gln C7H12N2O2 156.0898780000 CSID: 21376706 +DL-Arginine/D-Arginine/L-(+)-Arginine Arg/D-Arg/L-Arg C6H12N4O 156.1011110000 PDB: ARG/PDB: DAR/CSID: 6082 +3-hydroxy-4-methyloctanoic acid/3-hydroxy-nonanoic acid/3-hydroxy-isononanoic acid/3-hydroxy-6-methyloctanoic acid C8:0-Me(4)-OH(3)/C9:0-OH(3)/iC9:0-OH(3)/aC9:0-OH(3) C9H16O2 156.1150300000 CSID: 17247549/CSID: 33630/CID: 22472006/CSID: 10361823 +N-trimethyl-leucine NtMe-Leu C9H18NO 156.1388390000 C(C(=O)O)(CC(C)C)[N](C)(C)C in: NOR00695 +Citrulline/D-Citrulline Cit/D-Cit C6H11N3O2 157.0851270000 CSID: 810/CID: 637599 +isostatine/statine Ist/Sta C8H15NO2 157.1102790000 CSID: 19578058/CSID: 2632509 +N6-formyl-HydroxyOrnithine/D-formyl-hydroxyOrnithine Fo-OH-Orn/D-Fo-OH-Orn C6H10N2O3 158.0691420000 PDB: FHO/PDB: FH7 +alpha-amino-hydroxyadipic acid Ahad C6H9NO4 159.0531580000 CID: 22326384 +N-methyl-2.3-dehydrophenylalanine NMe-dPhe C10H9NO 159.0684140000 C(C(O)=O)(=CC1=CC=CC=C1)NC in CSID: 4444584 +O-methyl-L-rhamnose 2OMe-Rha C7H12O4 160.0735590000 CSID: 4352115 +N-Methyl-Phenylalanine/D-N-Methyl-Phenylalanine/3-methylphenylalanine/Homophenylalanine NMe-Phe/D-NMe-Phe/3Me-Phe/Hph C10H11NO 161.0840640000 PDB: MEA/PDB: ZAE/PDB: APD/CSID: 92605 +Hexose/L-glucose/D-Glucose Hexose/Glc/D-Glc C6H10O5 162.0528230000 CSID: 23139/CSID: 201/PDB: GLC +N-hydroxy-dehydro-HydroxyPhenylGlycine/D-N-hydroxy-dehydro-HydroxyPhenylGlycine OH-dHpg/D-OH-dHpg C8H5NO3 163.0269430000 CID: 20339127/C(C(=O)O)(C1=CC=C(C=C1)O)=NO in: NOR00822 +Methionine sulfone O2-Met C5H9NO3S 163.0303140000 CSID: 63154 +phosphinothricin PT C5H10NO3P 163.0398300000 CSID: 4630 +Tyrosine/D-Tyrosine/beta-tyrosine/Phenylserine/N-methyl-HydroxyPhenylGlycine Tyr/D-Tyr/bTyr/Ph-Ser/NMe-Hpg C9H9NO2 163.0633290000 CSID: 1121/CSID: 64252/CSID: 389285/CSID: 84951/CID: 15118056 +4-hydroxy-D-phenyl-lactate 4OH-D-Ph-Lac C9H8O3 164.0473440000 CID: 9378 +propenoyl-alanyloxazole acid PALOA C8H8N2O2 164.0585780000 C(C=CC1=COC(=N1)C(N)C)(=O)O in CSID: 10477875 +3.4-dichloro-proline Cl2-Pro C5H5Cl2NO 164.9748200000 CID: 21295133 +3.5-dihydroxyphenylglycine/D-3.5-dihydroxyphenylglycine Dhpg/D-Dhpg C8H7NO3 165.0425930000 PDB: D3P/PDB: D3P +cyclo alpha-ketoarginine ck-Arg C7H10N4O 166.0854610000 C12(C(CCCN1C(=NC2=O)-N)N)O in CSID: 9977717 +2.2-dimethyl-3-hydroxy-7-octynoic acid C8:0:1(7)-Me(2.2)-OH(3) C10H14O2 166.0993800000 CSID: 29330001 +2-carboxy-6-hydroxyoctahydroindole Choi C9H13NO2 167.0946290000 C1C(NC2C1CCC(C2)O)C(=O)O in CSID: 10480056 +3-Desoxy-Methyl-4-butenyl-4-methyl threonine 3d-NMe-Bmt C10H17NO 167.1310140000 CC=CCC(C)CC(NC)C(=O)O in CSID: 4953086 +1-methoxy-beta-alanine-thiazole OMe-bAla-Thz C7H8N2OS 168.0357340000 C(N)(CC(=O)OC)C1=NC=CS1 in CSID: 26365309 +2.2-dimethyl-3-hydroxy-7-octenoic acid C8:1(7)-Me(2.2)-OH(3) C10H16O2 168.1150300000 C(C(C(CCCC=C)O)(C)C)(O)=O in CSID: 8732670 +9-methyldecanoic acid/8-methyldecanoic acid iC11:0/aC11:0 C11H20O 168.1514150000 CSID: 4471714/CID: 21813 +4-butenyl-4-methyl threonine/Dolaproine Bmt/Dap C9H15NO2 169.1102790000 CC=CCC(C)C(C(C(=O)O)N)O in CSID: 4444325/C1C(CCN1)C(C(C(O)=O)C)OC in CSID: 7986684 +5-hydroxy-capreomycidine 5OH-Cap C6H10N4O2 170.0803760000 C1C(NC(NC1C(C(=O)O)N)=N)O in CSID: 2301596 +hydroxysecbutyl acetyl propionyl Hysp C9H14O3 170.0942940000 C(C(C(C(O)C(CC)C)=O)C)(=O)O in CSID: 10477730 +homoarginine Har C7H14N4O 170.1167610000 CSID: 8732 +3-hydroxy-decanoic acid/3-hydroxy-2-methyl-nonanoic acid/2.2-dimethyl-3-hydroxy-octanoic acid/2.4-dimethyl-3-hydroxyisooctanoic acid C10:0-OH(3)/C9:0-Me(2)-OH(3)/C8:0-Me(2.2)-OH(3)/iC8:0-Me(2.4)-OH(3) C10H18O2 170.1306800000 CSID: 24790/CSID: 9587708/CSID: 8949283/CSID: 25944197 +N-methoxyacetyl-valine NOMe-Ac-Val C8H13NO3 171.0895430000 CSID: 11856685 +N-desmethyldolaisoleuine/alpha-hydroxy-6-methyl-3-aminooctanoic acid dDil/aC9:0-OH(2)-NH2(3) C9H17NO2 171.1259290000 C(C(N)C(C)CC)(CC(O)=O)OC in CSID: 9938808/C(C(C(CCC(CC)C)N)O)(=O)O in CSID: 10475103 +N-acetyl-HydroxyOrnithine/D-N-acetyl-HydroxyOrnithine Ac-OH-Orn/D-Ac-OH-Orn C7H12N2O3 172.0847920000 PDB: AHO/CSID: 3670289 +tryptophanol Trpol C11H12N2 172.1000480000 CSID: 10234 +N-methyldichloropyrrole-2-carboxylic acid MdCP C6H3Cl2NO 174.9591700000 CSID: 21926880 +beta.beta-dimethyl-Methionine-S-oxide bbMe2-O-Met C7H13NO2S 175.0666990000 CSID: 29322228 +alpha-amino-phenyl-valeric acid Apv C11H13NO 175.0997140000 CSID: 262061 +Homotyrosine/N-methyltyrosine/beta-hydroxy-N-Methyl-Phenylalanine Hty/NMe-Tyr/bOH-NMe-Phe C10H11NO2 177.0789790000 CSID: 3365526/CSID: 453342/CSID: 14028021 +propenoyl-2-aminobutanoyloxazole acid PAOA C9H10N2O2 178.0742280000 C(C=CC1=COC(=N1)C(N)CC)(=O)O in CSID: 27026296 +2.4-dimethyl-dec-9-ynoic acid/10-methyl-2.trans4-undecanoic acid C10:0:1(9)-Me(2.4)/iC12:2(2.t4) C12H18O 178.1357650000 C(C(CC(CCCCC#C)C)C)(=O)O in CSID: 23076292/C(C=CC=CCCCCC(C)C)(O)=O in CSID: 24677772 +beta-hydroxy-tyrosine/3.4-dihydroxyphenylalanine bOH-Tyr/diOH-Phe C9H9NO3 179.0582430000 CSID: 13930867/CSID: 813 +proline-thiazole Pro-Thz C8H8N2OS 180.0357340000 C1=CSC(=N1)C2CCC(N2)C(=O)O in CSID: 8971346 +2-methyl-5-dodecenoic acid C12:1(5) C12H20O 180.1514150000 CSID: 4471802 +Anticapsin Aca C9H11NO3 181.0738930000 CSID: 2796855 +D-homoarginine D-Har C7H10N4O2 182.0803760000 CSID: 53295 +vinylogous arginine v-Arg C8H14N4O 182.1167610000 C(C(N)CCCNC(=N)N)=CC(=O)O in CSID: 8946030 +dodecanoic acid/isododecanoic acid C12:0/iC12:0 C12H22O 182.1670650000 CSID: 3756/CID: 75942 +3-chloro-4-hydroxyphenylglycine Cl-Hpg C8H6ClNO2 183.0087060000 CSID: 3817439 +N-methyl-butenylthreonine/2-amino-8-oxo-decanoic acid NMe-Bmt/C10:0-NH2(2)-oxo(8) C10H17NO2 183.1259290000 CSID: 9944222/CSID: 16281719 +2.3-Dehydro-Tryptophan dh-Trp C11H8N2O 184.0636630000 CSID: 7991355 +ureido-4-oxovancosamine U4oxo-Van C8H12N2O3 184.0847920000 C1(C2(C(CC(O1)O)(C)NC(N2)=O)O)C in: NOR00711 +alpha-ketoarginine k-Arg C7H12N4O2 184.0960260000 C(C(C(CCCNC(=N)N)N)=O)(=O)O in CSID: 10477079 +3-hydroxy-undecanoic acid/3-hydroxy-isoundecanoic acid/3-hydroxy-2-methyl-decanoic acid/3-hydroxy-4-methyl-decanoic acid C11:0-OH(3)/iC11:0-OH(3)/C10:0-Me(2)-OH(3)/C10:0-Me(4)-OH(3) C11H20O2 184.1463300000 CSID: 2340495/CC(C)CCCCCC(CC(=O)O)O in: NOR00398/CSID: 13775620/CSID: 28533406 +Dolapyrrolidone Dpy C12H11NO 185.0840640000 CSID: 8735462 +Dolaisoleucine/8-hydroxy-2-amino-decanoic acid/9-hydroxy-2-amino-decanoic acid Dil/C10:0-OH(8)-NH2(2)/C10:0-OH(9)-NH2(2) C10H19NO2 185.1415790000 C(CC(O)=O)(OC)C(C(C)CC)NC in CSID: 7986684/CSID: 26949211/C(C(N)CCCCCCC(C)O)(=O)O in CSID: 10279723 +DL-Tryptophan/D-Tryptophan Trp/D-Trp C11H10N2O 186.0793130000 CSID: 1116/CSID: 8707 +hydrated alpha-ketoarginine hk-Arg C7H14N4O2 186.1116760000 C(C(C(CCCN=C(N)N)N)O)(=O)O in CSID: 8946570 +dehydro vinylogous tyrosine dv-Tyr C11H9NO2 187.0633290000 C(C(N)=CC1=CC=C(C=C1)O)=CC(=O)O in CSID: 8185737 +3.4-dihydroxyArginine diOH-Arg C6H12N4O3 188.0909400000 C(C(C(C(O)=O)N)O)(CN=C(N)N)O in CSID: 8801410 +vinylogous tyrosine/N-acetylphenylalanine v-Tyr/Ac-Phe C11H11NO2 189.0789790000 C(C(N)CC1=CC=C(C=C1)O)=CC(=O)O in CSID: 10477079/CSID: 1923 +kynurenine/D-kynurenine Kyn/D-Kyn C10H10N2O2 190.0742280000 CSID: 823/CID: 1152206 +coronafacic acid CFA C12H14O2 190.0993800000 CSID: 13300082 +N-methyl-4-methylamino-phenylalanine/N.O-dimethyl-tyrosinecarboxamid NMe-MeA-Phe/NMe-OMe-TyrC C11H14N2O 190.1106130000 CID: 21137790/CID: 19003692 +alpha-amino-hydroxyphenyl-valeric acid/N-methyl-homotyrosine/3-methyl-homotyrosine/ethylene inserted tyrosine/N.O-dimethyl-tyrosine/D-N.O-dimethyl-tyrosine Ahv/NMe-Hty/3Me-Hty/e-Tyr/NMe-OMe-Tyr/D-NMe-OMe-Tyr C11H13NO2 191.0946290000 C(C(=O)O)(CCCC1=CC=C(C=C1)O)N in CSID: 142959/C1=CC(=CC=C1CCC(C(=O)O)NC)O in CSID: 10477716/C1=CC(=CC=C1CC(C(C(=O)O)N)C)O in: NOR00265/C(C(N)CC1=CC=C(C=C1)O)CC(=O)O in CSID: 9977717/CID: 18925327/CID: 18925327 +10-methyl-2.trans4-dodecenoic acid aC13:2(2.t4) C13H20O 192.1514150000 C(C=CC=CCCCCC(CC)C)(O)=O in CSID: 24665012 +di-chloro-N-methyl-dehydroLeucine Cl2-NMe-dhLeu C7H9Cl2NO 193.0061200000 C(C(O)=O)(NC)=CC(C)C(Cl)Cl in CSID: 8701761 +beta-methoxy-tyrosine bOMe-Tyr C10H11NO3 193.0738930000 CSID: 16174140 +O-sulfate-2-hydroxy-3-methylpentanoic acid OSu-Hmp C6H10O5S 194.0248940000 C(C(C(CC)C)O[S](=O)(=O)O)(=O)O in CSID: 10477875 +methyloxazoline-isoleucine MeOx-Ile C11H18N2O 194.1419130000 C(N)(C(C)CC)C1=NC(C(C1)C)C(=O)O in CSID: 10477991 +11-methyl-3-dodecenoic acid/10-methyl-3-dodecenoic acid iC13:1(3)/aC13:1(3) C13H22O 194.1670650000 C(CC=CCCCCCCC(C)C)(O)=O in: NOR00296/C(CC=CCCCCCC(CC)C)(O)=O in: NOR00767 +di-chloro-N-methyl-Leucine Cl2-NMe-Leu C7H11Cl2NO 195.0217700000 C(C(O)=O)(NC)CC(C)C(Cl)Cl in CSID: 8773801 +3-hydroxy-5-dodecenoic acid/9-oxo-2.4-dimethyldecanoic acid/8-hydroxy-2.4.6-trimethyl-4-nonenoic acid C12:1(5)-OH(3)/C10:0-Me(2.4)-oxo(9)/C9:1(4)-Me(2.4.6)-OH(8) C12H20O2 196.1463300000 CSID: 10761118/C(C(CC(CCCCC(C)=O)C)C)(=O)O in CSID: 8946480/C(C(CC(=CC(CC(C)O)C)C)C)(O)=O in CSID: 8007368 +11-methyldodecanoic acid/10-methyldodecanoic acid iC13:0/aC13:0 C13H24O 196.1827150000 CID: 33002/CSID: 2282934 +chloro-tyrosine Cl-Tyr C9H8ClNO2 197.0243570000 CSID: 106510 +2-amino-9.10-epoxi-8-oxodecanoic acid C10:0-NH2(2)-Ep(9)-oxo(8) C10H15NO3 197.1051930000 CSID: 11345228 +4-butenyl-4-methyl-N.4-methyl threonine Me2-Bmt C11H19NO2 197.1415790000 CSID: 4450325 +3-hydroxy-dodecanoic acid/3-hydroxy-isododecanoic acid/3-hydroxy-2-methyl-undecanoic acid C12:0-OH(3)/iC12:0-OH(3)/C11:0-Me(2)-OH(3) C12H22O2 198.1619800000 CSID: 85026/CID: 15089799/CSID: 13775586 +9-hydroxy-2-amino-8-oxo-decanoic acid C10:0-OH(9)-NH2(2)-oxo(8) C10H17NO3 199.1208430000 CSID: 25942012 +N-acetyl-N6-formyl-N6-hydroxyOrnithine NAc-Fo-OH-Orn C8H12N2O4 200.0797070000 C(C(=O)O)(NC(C)=O)CCCN(O)C=O in CSID: 3294 +N1-methyl-tryptophan 1Me-Trp C12H12N2O 200.0949630000 CSID: 88584 +5-hydroxytryptophan/phototryptophan OH-Trp/pTrp C11H10N2O2 202.0742280000 CSID: 141/CID: 10331043 +N-methyl-4-dimethylamino-phenylalanine NMe-Me2A-Phe C12H16N2O 204.1262630000 CSID: 27594543 +vinylogous hydroxy tyrosine v-OH-Tyr C11H11NO3 205.0738930000 C(C(N)CC1=CC(=C(C=C1)O)O)=CC(=O)O in CSID: 9204437 +alpha-amino-methoxyphenyl-valeric acid Amv C12H15NO2 205.1102790000 CSID: 9681632 +N-Methyl-Lanthionine NMe-Lan C6H10N2O4S 206.0361280000 C(SCC(C(=O)O)N)C(C(O)=O)NO in: NOR00149 +3-nitrotyrosine 3NO2-Tyr C9H8N2O4 208.0484070000 CSID: 205676 +7-tetradecenoic acid/12-methyl-3-tridecenoic acid C14:1(7)/iC14:1(3) C14H24O 208.1827150000 CSID: 10722652/PDB: LNG +D-PhosphateAsparagine D-PO-Asn C4H7N2O6P 210.0041720000 C(C(C(C(O)=O)N)O[P](O)(=O)O)(=O)N in: NOR00025 +propenoyl-O-methylserinylthiazole acid PMST C9H10N2O2S 210.0462980000 C(C=CC1=CSC(=N1)C(N)COC)(=O)O in CSID: 8503913 +5-oxo-8-hydroxy-2.4.6-trimethyl-4-nonaneic acid C9:1(Me4)-Me(2.4.6)-OH(8)-Oxo(5) C12H18O3 210.1255940000 C(C(CC(C(C(CC(C)O)C)=O)=C)C)(O)=O in CSID: 8434247 +tetradecanoic acid/12-methyl-tridecanoic acid C14:0/iC14:0 C14H26O 210.1983650000 PDB: MYR/CID: 520298 +Chloro-N-methyl-tyrosine/D-3-chloro-N-methyl-Tyrosine Cl-NMe-Tyr/D-Cl-NMe-Tyr C10H10ClNO2 211.0400070000 PDB: CNT/C(C(=O)O)(NC)CC1=CC(=C(C=C1)O)Cl in: NOR00614 +3-amino-tridecanoic acid C13:0-NH2(3) C13H25NO 211.1936140000 CSID: 26283438 +3-hydroxy-tridecanoic acid/3-hydroxy-isotridecanoic acid/3-hydroxy-10-methyl-dodecanoic acid C13:0-OH(3)/iC13:0-OH(3)/aC13:0-OH(3) C13H24O2 212.1776300000 CSID: 4472174/CID: 15089800/C(CC(CCCCCCC(CC)C)O)(O)=O in: NOR00857 +beta-hydroxy-chloro-tyrosine bOH-Cl-Tyr C9H8ClNO3 213.0192710000 CSID: 25938524 +3-amino-6-hydroxy-2-piperidone Ahp C9H14N2O4 214.0953570000 CSID: 25058696 +N-methyl-5-hydroxytryptophan/methoxytryptophan NMe-OH-Trp/OMe-Trp C12H12N2O2 216.0898780000 C(C(=O)O)(NC)CC1=C[N]C2=C1C=C(C=C2)O in CSID: 10476796/O(C(=O)[C@@H](N([H])[H])CC1=C[N](C2=CC=CC=C12)OC)[H] in CSID: 5293532 +2.6-diamino-7-hydroxyazelaic acid Daz C9H16N2O4 216.1110070000 CSID: 391749 +4-amino-7-guanidino-2.3-dihydroxyheptanoic acid Agdha C8H16N4O3 216.1222400000 CSID: 21377788 +3.5-dichloro-4-hydroxyphenylglycine Cl2-Hpg C8H5Cl2NO2 216.9697340000 CSID: 9804791 +DHP-methyloxazolinyl group DMOG C11H9NO4 219.0531580000 CSID: 12721 +N-methoxyacetyl-D-phenylalanine NOMe-Ac-D-Phe C12H13NO3 219.0895430000 CSID: 11859621 +D-6'-chloro-tryptophan D-Cl-Trp C11H9ClN2O 220.0403410000 C(C(=O)O)(N)CC1=NC2=C(C1)C=CC(=C2)Cl in CSID: 8094776 +dihydroxyphenylthiazol group DHPT C10H7NO3S 221.0146640000 CSID: 23110909 +12-methyl-3-tetradecenoic acid aC15:1(3) C15H26O 222.1983650000 C(CC=CCCCCCCCC(CC)C)(O)=O in: NOR00768 +2.3-dihydroxy-2.6.8-trimethyldeca-(4Z.6E)-dienoic acid/2.3-dihydroxy-trans4.trans6-tridecenoic acid aC11:2(4.6)-Me(2.6)-OH(2.3)/C13:2(t4.t6)-OH(2.3) C13H20O3 224.1412450000 C(C(C(C=CC(=CC(CC)C)C)O)(O)C)(O)=O in CSID: 4977118/C(C(C(C=CC=CCCCCCC)O)O)(O)=O in CSID: 4976886 +12-methyltetradecanoic acid aC15:0 C15H28O 224.2140160000 CSID: 20368 +bromophenylalanine Br-Phe C9H8BrNO 224.9789160000 CSID: 77275 +3-amino-tetradecanoic acid/3-amino-isotetradecanoic acid C14:0-NH2(3)/iC14:0-NH2(3) C14H27NO 225.2092640000 CSID: 15571256/CID: 22471993 +3-hydroxy-tetradecanoic acid/3-hydroxy-12-methyl-tridecanoic acid C14:0-OH(3)/iC14:0-OH(3) C14H26O2 226.1932800000 CSID: 15252/CID: 22471995 +tri-chloro-N-methyl-dehydroLeucine Cl3-NMe-dhLeu C7H8Cl3NO 226.9671480000 C(C(O)=O)(NC)=CC(C)C(Cl)(Cl)Cl in CSID: 10477276 +N-acetyltryptophan Ac-Trp C13H12N2O2 228.0898780000 CSID: 1925 +beta.beta.N-trimethyltryptophan bbMe-NMe-Trp C14H16N2O 228.1262630000 C1=CC=CC2=C1C(=C[N]2)C(C(C(O)=O)NC)(C)C in CSID: 8158974 +3-hydroxy-2.2.4-trimethyl-7-hydroxydecanoic acid C10:0-Me(2.2.4)-OH(3.7) C13H24O3 228.1725450000 C(C(C(C(=O)O)(C)C)O)(CCC(CCC)O)C in CSID: 8184030 +tri-chloro-N-methyl-Leucine Cl3-NMe-Leu C7H10Cl3NO 228.9827980000 C(C(O)=O)(NC)CC(C)C(Cl)(Cl)Cl in CSID: 10477275 +thiazolylphenylalanine Phe-Thz C12H10N2OS 230.0513840000 C(N)(CC1=CC=CC=C1)C2=NC(=CS2)C(O)=O in CSID: 8593238 +D-2-carboxy-tryptophan D-COOH-Trp C12H10N2O3 230.0691420000 C(C(O)=O)(N)CC1=C([N]C2=C1C=CC=C2)C(=O)O in CSID: 7987591 +N-methyl-6-chloro-tryptophan NMe-Cl-Trp C12H11ClN2O 234.0559910000 C(C(=O)O)(NC)CC1=C[N]C2=C1C=CC(=C2)Cl in CSID: 8805002 +7-hexadecenoic acid/9-hexadecenoic acid C16:1(7)/C16:1(9) C16H28O 236.2140160000 CSID: 4895966/CSID: 4445872 +2.3-dihydroxy-trans4.trans6-tetradecenoic acid/2.6.8-trimethyl-5.7-dihydroxy-trans2.trans8-undecenoic acid C14:2(t4.t6)-OH(2.3)/C11:2(t2.t8)-Me(2.6.8)-OH(5.7) C14H22O3 238.1568950000 C(C(C(C=CC=CCCCCCCC)O)O)(O)=O in CSID: 8924310/C(C(=CCC(C(C(C(=CCC)C)O)C)O)C)(O)=O in CSID: 10481263 +hexadecanoic acid C16:0 C16H30O 238.2296660000 CSID: 960 +beta-methyl-bromophenylalanine bMe-Br-Phe C10H10BrNO 238.9945660000 C(C(=O)O)(C(C1=CC=C(C=C1)Br)C)N in CSID: 10475327 +3-amino-pentadecanoic acid/3-amino-isopentadecanoic acid/3-amino-12-methyl-tetradecanoic acid C15:0-NH2(3)/iC15:0-NH2(3)/aC15:0-NH2(3) C15H29NO 239.2249150000 CSID: 26283439/C(CC(CCCCCCCCCC(C)C)N)(O)=O in: NOR00784/C(CC(CCCCCCCCC(CC)C)N)(O)=O in: NOR00785 +3-hydroxy-13-methyltetradecanoic acid/3-hydroxy-pentadecanoic acid/3-hydroxy-isopentadecanoic acid/3-hydroxy-12-methyl-tetradecanoic acid C14:0-Me(13)-OH(3)/C15:0-OH(3)/iC15:0-OH(3)/aC15:0-OH(3) C15H28O2 240.2089300000 CSID: 9218624/CSID: 158374/CSID: 9218624/C(CC(CCCCCCCCC(CC)C)O)(O)=O in: NOR00211 +bromotyrosine/beta-hydroxy-bromophenylalanine Br-Tyr/bOH-Br-Phe C9H8BrNO2 240.9738310000 CSID: 131083/CSID: 19757850 +beta.beta.N1.N-tetramethyltryptophan bbNMe-NMe-Trp C15H18N2O 242.1419130000 C1=CC=CC2=C1C(=C[N]2C)C(C(C(O)=O)NC)(C)C in CSID: 8570259 +3.4-dihydroxy-tetradecanoic acid/ 3-hydroxy-2.2.4-trimethyl-7-methoxydecanoic acid C14:0-OH(3.4)/C10:0-Me(2.2.4)-OH(3)-OMe(7) C14H26O3 242.1881950000 CID: 22667431/CSID: 28587148 +3-amino-4-hydroxy-6-methyl-8-phenyl-5.7-octadienoic acid C8:2(5.7)-Me(6)-OH(4)-NH2(3)-Ph(8) C15H17NO2 243.1259290000 C(CC(C(C=C(C=CC1=CC=CC=C1)C)O)N)(=O)O in CSID: 10475327 +tri-chloro-2-hydroxy-N-methyl-Leucine/tri-chloro-5-hydroxy-N-methyl-Leucine Cl3-2OH-NMe-Leu/Cl3-5OH-NMe-Leu C7H10Cl3NO2 244.9777130000 C(C(O)=O)(NC)(CC(C)C(Cl)(Cl)Cl)O in CSID: 10477276/C(C(O)=O)(NC)CC(CO)C(Cl)(Cl)Cl in: NOR00511 +N-methyl-6-chloro-5-hydroxytryptophan NMe-Cl-OH-Trp C12H11ClN2O2 250.0509060000 C(C(=O)O)(NC)CC1=C[N]C2=C1C=C(C(=C2)Cl)O in CSID: 10473575 +2.3-dihydroxy-trans4.trans6-pentadecenoic acid C15:2(t4.t6)-OH(2.3) C15H24O3 252.1725450000 C(C(C(C=CC=CCCCCCCCC)O)O)(O)=O in CSID: 4976888 +3-hydroxy-9-hexadecenoic acid C16:1(9)-OH(3) C16H28O2 252.2089300000 C(CC(CCCCCC=CCCCCCC)O)(O)=O in: NOR00720 +3-amino-hexadecanoic acid/3-amino-isohexadecanoic acid C16:0-NH2(3)/iC16:0-NH2(3) C16H31NO 253.2405650000 CSID: 24597602/C(CC(CCCCCCCCCCC(C)C)N)(O)=O in: NOR00793 +3-hydroxy-hexadecanoic acid/3-hydroxy-isohexadecanoic acid C16:0-OH(3)/iC16:0-OH(3) C16H30O2 254.2245800000 CSID: 266538/C(CC(CCCCCCCCCCC(C)C)O)(O)=O in: NOR00897 +D-3-bromo-N-methyl-Tyrosine D-Br-NMe-Tyr C10H10BrNO2 254.9894810000 CSID: 2128826 +pyoverdin Pa A chromophore ChrPaA C13H11N3O3 257.0800410000 C1=C(C(=CC2=C1N3C(C(=C2)N)=NC(CC3)C(O)=O)O)O in CSID: 0 +N1-carboxy-bichomotryptophan N1-COOH-bhTrp C14H14N2O3 258.1004420000 C(CC1=C[N](C2=C1C=CC=C2)C(=O)O)CC(C(=O)O)N in CSID: 9968260 +isopyoverdin chromophore/pyoverdin chromophore ChrI/ChrP C13H13N3O3 259.0956910000 C1=C(C(=CC2=C1N3C(C(=C2)N)NC(CC3)C(O)=O)O)O in: NOR00163/C1=C(C(=CC2=C1N3C(C(=C2)N)NC(CC3)C(O)=O)O)O in CID: 5289234 +5.6-dihydropyoverdin chromophore ChrD C13H15N3O3 261.1113410000 C1=C(C(=CC2=C1N3C(C(N)C2)NCCC3C(O)=O)O)O in: NOR00903 +D-6-chloro-N2-formamidotryptophan D-Cl-CONH2-Trp C12H10ClN3O2 263.0461550000 C(C(O)=O)(N)CC1=C[N](C2=C1C=CC(=C2)Cl)C(=O)N in CSID: 8138519 +3-amino-8-phenyl-2.4.5-trihydroxyoct-7-enoic acid C8:1(7)-OH(2.4.5)-NH2(3)-Ph(8) C14H17NO4 263.1157580000 CSID: 29330841 +5-bromo-tryptophan Br-Trp C11H9BrN2O 263.9898150000 CSID: 87339 +9-octadecenoic acid C18:1(9) C18H32O 264.2453160000 CSID: 553123 +8.10-Dimethyl-9-hydroxy-7-methoxytridecadienoic acid DHMDA C16H26O3 266.1881950000 C(C(C(CCC)C)O)(C(C=CC=CCC(=O)O)OC)C in CSID: 10479168 +3-amino-14-methyl-hexadecanoic acid/3-amino-15-methyl-hexadecanoic acid aC17:0-NH2(3)/iC17:0-NH2(3) C17H33NO 267.2562150000 C(CC(CCCCCCCCCCC(CC)C)N)(O)=O in CSID: 2340866/C(CC(CCCCCCCCCCCC(C)C)N)(O)=O in: NOR00801 +3-hydroxy-14-methyl-hexadecanoic acid/3-hydroxy-15-methyl-hexadecanoic acid aC17:0-OH(3)/iC17:0-OH(3) C17H32O2 268.2402300000 C(CC(CCCCCCCCCCC(CC)C)O)(O)=O in: NOR00900/CSID: 141849 +3.4-dihydroxy-hexadecanoic acid C16:0-OH(3.4) C16H30O3 270.2194950000 CID: 22348653 +4-propenoyl-2-tyrosylthiazole acid PTTA C14H12N2O2S 272.0619480000 C(O)(=O)C=CC1=CSC(=N1)C(N)CC2=CC=C(C=C2)O in CSID: 16738243 +N-methyl-2-Bromo-tryptophan NMe-Br-Trp C12H11BrN2O 278.0054650000 C(C(=O)O)(NC)CC1=C([N]C2=C1C=CC=C2)Br in CSID: 8007368 +2-bromo-5-hydroxytryptophan Br-OH-Trp C11H9BrN2O2 279.9847300000 CSID: 643874 +3-hydroxy-9-octadecenoic acid C18:1(9)-OH(3) C18H32O2 280.2402300000 C(CC(CCCCCC=CCCCCCCCC)O)(O)=O in: NOR00724 +azotobactins chromophore ChrA C14H11N3O4 285.0749560000 C1=C(C(=CC2=C1N4C3C(=C2)NC(N3CCC4C(O)=O)=O)O)O in: NOR00208 +O-demethyl-Adda DMAdda C19H25NO2 299.1885290000 C(C(C(C=CC(=CC(C(CC1=CC=CC=C1)O)C)C)N)C)(O)=O in: NOR00129 +D-3-iodo-N-methyl-Tyrosine D-I-NMe-Tyr C10H10INO2 302.9756110000 C(C(=O)O)(NC)CC1=CC(=C(C=C1)O)I in CSID: 9017332 +actinomycin chromophore ChrAct C16H10N2O5 310.0589710000 CSID: 86817 +3-amino-9-methoxy-2.6.8-trimethyl-10-phenyldeca-4.6-dienoic acid Adda C20H27NO2 313.2041790000 CSID: 10471100 +3-amino-4-hydroxy-6-methyl-8-(p-bromophenyl)-5.7-octadienoic acid C8:2(5.7)-Me(6)-OH(4)-NH2(3)-brPh(8) C15H16BrNO2 321.0364310000 C(CC(C(C=C(C=CC1=CC=C(C=C1)Br)C)O)N)(=O)O in CSID: 10476834 +3-amino-6-methyl-12-phenyl-2.4.5-trihydroxydodeca-7.9.11-trienoic acid C12:3(7.9.11)-Me(6)-OH(2.4.5)-NH2(3)-Ph(12) C19H23NO4 329.1627080000 C(C(C(C(C(C(C=CC=CC=CC1=CC=CC=C1)C)O)O)N)O)(O)=O in CSID: 8923613 +3-amino-10-(p-ethoxyphenyl)-2.4.5-trihydroxydeca-7.9-dienoic acid C10:2(7.9)-OH(2.4.5)-NH2(3)-ePh(10) C18H23NO5 333.1576230000 CSID: 29330839 +O-Acetyl-O-demethylAdda ADMAdda C21H27NO3 341.1990940000 C(C(C(C=CC(=CC(C(CC1=CC=CC=C1)OC(C)=O)C)C)N)C)(O)=O in: NOR00144 +3-amino-6.10-dimethyl-12-phenyl-2.4.5-trihydroxydodeca-7.9.11-trienoic acid C12:3(7.9.11)-Me(6.10)-OH(2.4.5)-NH2(3)-Ph(12) C20H25NO4 343.1783580000 C(C(C(C(C(C(C=CC=C(C=CC1=CC=CC=C1)C)C)O)O)N)O)(O)=O in CSID: 10187168 +3-amino-6-methyl-12-(p-methoxyphenyl)-2.4.5-trihydroxydodec-11-enoic acid C12:1(11)-Me(6)-OH(2.4.5)-NH2(3)-mPhe(11) C20H29NO5 363.2045730000 CSID: 29330842 diff --git a/CycloBranch/BrickDatabases/db287_v3.txt b/CycloBranch/BrickDatabases/db287_v3.txt index d020a03..80dfacd 100644 --- a/CycloBranch/BrickDatabases/db287_v3.txt +++ b/CycloBranch/BrickDatabases/db287_v3.txt @@ -1,287 +1,287 @@ -Ethanolamine Eta C2H5N 43.0421990000 CSID: 13835336 -Glycine Gly C2H3NO 57.0214640000 CSID: 730 -pyrrolidone Pyr C4H5N 67.0421990000 CSID: 11530 -dehydroalanine dh-Ala C3H3NO 69.0214640000 CSID: 110510 -pyruvic acid Pya C3H2O2 70.0054790000 CSID: 1031 -butanoic acid C4:0 C4H6O 70.0418650000 CSID: 259 -DL-Alanine/D-Alanine/beta-Alanine/N-Methyl-Glycine Ala/D-Ala/bAla/NMe-Gly C3H5NO 71.0371140000 CSID: 582/CSID: 64234/CSID: 234/CSID: 1057 -Lactic acid/D-lactic acid Lac/D-Lac C3H4O2 72.0211290000 CSID: 592/CSID: 55423 -Serinol Serol C3H7NO 73.0527640000 CSID: 61591 -2.3-dehydro-2-aminobutyric acid/homoserine lactone/N-Methyl-dehydroalanine/hydroxy pyrrolidone dhAbu/HseL/NMe-Dha/OH-Pyr C4H5NO 83.0371140000 CSID: 4952645/CSID: 66194/CSID: 118845/CSID: 134682 -2-hydroxy-3-butenoic acid C4:1(3)-OH(2) C4H4O2 84.0211290000 CSID: 141066 -2-methyl-butanoic acid C4:0-Me(2) C5H8O 84.0575150000 CSID: 8012 -alpha-formylGlycine aFo-Gly C3H3NO2 85.0163780000 CSID: 28 -N-Methyl-L-alanine/N-methyl-beta-alanine/alpha-aminobutyric acid/D-alpha-aminobutyric acid/2-Methylalanine/methyl alaninate NMe-Ala/NMe-bAla/Abu/D-Abu/Aib/D-3OMe-Ala C4H7NO 85.0527640000 CSID: 4450824/CSID: 68396/PDB: ABA/PDB: DBB/CSID: 5891/CSID: 99878 -isovalinol/valinol Ivalol/Valol C5H11N 85.0891490000 CSID: 8329525/CSID: 71352 -3-hydroxybutanoic acid C4:0-OH(3) C4H6O2 86.0367790000 CSID: 428 -2.3-Diaminopropionic acid Dpr C3H6N2O 86.0480130000 CSID: 357 -DL-Serine/D-Serine/isoserine Ser/D-Ser/Iser C3H5NO2 87.0320280000 CSID: 597/CSID: 64231/CSID: 10793 -Sorbic acid C6:2(t2.t4) C6H6O 94.0418650000 CSID: 558605 -methyl-succinimide Me-Suc C5H5NO 95.0371140000 CSID: 122158 -proline carboxamid ProC C5H8N2 96.0687480000 CSID: 479142 -DL-Proline/D-Proline/2-methylamino-2-dehydrobutyric acid/norcoronamic acid Pro/D-Pro/2Dh-Mabu/norCMA C5H7NO 97.0527640000 CSID: 594/CSID: 8640/CSID: 16743754/CSID: 28708240 -3-methylvaleric acid/hexanoic acid Me-Vaa/C6:0 C6H10O 98.0731650000 CSID: 7469/CSID: 8552 -N-formyl-Alanine/D-N-formyl-Alanine NFo-Ala/D-NFo-Ala C4H5NO2 99.0320280000 CSID: 72251/CSID: 72251 -DL-Valine/D-Valine/Isovaline/D-Isovaline/Norvaline/D-Norvaline/2-methyl-3-aminobutanoic acid/N-dimethyl-Alanine/3-amino-pentanoic acid Val/D-Val/Ival/D-Ival/Nva/D-Nva/Mab/NdMe-Ala/C5:0-NH2(3) C5H9NO 99.0684140000 CSID: 1148/CSID: 64635/CSID: 85483/PDB: DIV/CSID: 801/CSID: 388660/CSID: 471786/CSID: 9962964/CSID: 11271826 -Leucinol/Isoleucinol Leuol/Ileol C6H13N 99.1047990000 CSID: 71362/CSID: 82355 -2-hydroxy-3-epoxy-butanoic acid C4:0-OH(2)-Ep(3) C4H4O3 100.0160440000 CSID: 15475591 -Succinic acid Suc C4H4O3 100.0160440000 CSID: 7634 -2-hydroxyisovaleric acid/D-2-hydroxyisovalerate Hiv/D-Hiv C5H8O2 100.0524300000 CSID: 90190/CID: 5289545 -2.4-diaminobutyric acid/D-2.4-diaminobutyric acid/2.3-diaminobutyric acid/(2S.3S)-2.3-diaminobutyric acid/(2R.3R)-2.3-diaminobutyric acid Dab/D-Dab/Dbu/L-Dbu/D-Dbu C4H8N2O 100.0636630000 CSID: 457/CID: 638153/CSID: 4475641/CID: 11768553/PDB: VDL -dehydro-cysteine dhCys C3H3NOS 100.9935340000 CSID: 24784832 -Threonine/D-Threonine/allo-Threonine/D-allo-Threonine/Homoserine/D-Homoserine/N-Methyl-Serine/N-Methyl-D-Serine/4-amino-3-hydroxybutyric acid Thr/D-Thr/aThr/D-aThr/Hse/D-Hse/NMe-Ser/D-NMe-Ser/OH-4Abu C4H7NO2 101.0476780000 PDB: THR/PDB: DTH/PDB: ALO/CSID: 81824/CSID: 758/CSID: 2006329/CSID: 481791/PDB: DSE/CSID: 2064 -2.3-dihydroxy-butanoic acid C4:0-OH(2.3) C4H6O3 102.0316940000 CSID: 219301 -DL-Cysteine Cys C3H5NOS 103.0091840000 CSID: 574 -benzoic acid Bz C7H4O 104.0262150000 CSID: 238 -N-methylglutamine NMe-Gln C6H10N2 110.0843980000 CSID: 10652941 -4-oxo-proline/pyroglutamic acid 4oxo-Pro/pGlu C5H5NO2 111.0320280000 CSID: 366185/CSID: 485 -3-Methylproline/4-Methylproline/homoproline/D-homoproline/coronamic acid 3Me-Pro/4Me-Pro/Hpr/D-Hpr/CMA C6H9NO 111.0684140000 CSID: 10610754/CSID: 312597/CSID: 826/CSID: 643442/CSID: 117751 -keto-Leucine/2-epoxy-hexanoic acid/(2E)-5-Hydroxy-3-methyl-2-pentenoic acid k-Leu/C6:0-Ep(2)/OH-MP C6H8O2 112.0524300000 CSID: 69/CSID: 14066572/CSID: 32988805 -Hydroxy-cycloOrnithine/D-Hydroxy-cycloOrnithine OH-cOrn/D-OH-cOrn C5H8N2O 112.0636630000 CSID: 13539649/CSID: 13539649 -heptanoic acid/5-methyl-hexanoic acid C7:0/iC7:0 C7H12O 112.0888150000 CSID: 7803/CID: 12344 -aziridine dicarboxylic acid Azd C4H3NO3 113.0112930000 CSID: 11582505 -3-Hydroxyproline/4-Hydroxyproline/D-Hydroxyproline/2-formamidobutanoic acid 3OH-Pro/4OH-Pro/D-4OH-Pro/NFo-D-Abu C5H7NO2 113.0476780000 CSID: 486216/PDB: HYP/CID: 440014/CSID: 486348 -Leucine/D-Leucine/Isoleucine/D-Isoleucine/allo-Isoleucine/D-allo-Isoleucine/N-Methyl-L-valine/D-N-Methylvaline/3-Methylvaline/D-tert-Leu/2-methyl-3-aminopentanoic acid/D-N-methyl-norvaline Leu/D-Leu/Ile/D-Ile/aIle/D-aIle/NMe-Val/D-NMe-Val/t-Leu/D-t-Leu/Map/D-NMe-Nva C6H11NO 113.0840640000 CSID: 834/CSID: 388617/CSID: 769/CSID: 69017/CSID: 89698/CSID: 85019/CSID: 4225/CSID: 4225/CSID: 270637/CID: 6950340/CSID: 11643060/CSID: 10652938 -hydroxyacetyl propionyl/pentanedioic acid Hap/Pda C5H6O3 114.0316940000 C(C(C(CO)=O)C)(=O)O in CSID: 10477731/CSID: 723 -DL-Asparagine/D-Asparagine/N1-formyl-2.3-Diaminopropionic acid Asn/D-Asn/NFo-Dpr C4H6N2O2 114.0429270000 PDB: ASN/PDB: DSG/C(C(CN)NC=O)(=O)O in CSID: 8873525 -D-Leucic acid (2-hydroxy-4-methylpentanoic acid)/(R)-Leucic acid/3-hydroxyhexanoic acid/2-hydroxy-3-methyl-pentanoic acid/D-2-hydroxy-3-methyl-pentanoic acid C5:0-Me(4)-OH(2)/4Me-D-Hva/C6:0-OH(3)/Hmp/D-Hmp C6H10O2 114.0680800000 CSID: 83753/CSID: 388986/CSID: 133518/CSID: 144317/CSID: 144317 -DL-Ornithine/D-Ornithine Orn/D-Orn C5H10N2O 114.0793130000 CSID: 380/CSID: 64236 -DL-Aspartic acid/D-Aspartic acid/N-formyl-isoserine Asp/D-Asp/NFo-Iser C4H5NO3 115.0269430000 CSID: 411/CSID: 75697/C(C(C(=O)O)O)NC=O in CSID: 8503913 -beta-hydroxyvaline/D-beta-hydroxyvaline/N-Methylthreonine/O-Methylthreonine bOH-Val/D-bOH-Val/NMe-Thr/OMe-Thr C5H9NO2 115.0633290000 CSID: 244525/CID: 192763/CSID: 5373925/CSID: 193545 -2.3-dihydroxy-3-methylbutanoic acid/2.4-dihydroxy-3-methylbutanoic acid iC5:0-OH(2.3)/iC5:0-OH(2.4) C5H8O3 116.0473440000 CSID: 657/C(C(C(CO)C)O)(=O)O in: NOR00082 -2-Methylcysteine/Methylcysteine aMe-Cys/NMe-Cys C4H7NOS 117.0248350000 CSID: 8233116/CSID: 2074082 -4-Hydroxythreonine 4OH-Thr C4H7NO3 117.0425930000 CSID: 3137512 -2.3.4-trihydroxy-butanoic acid C4:0-OH(2.3.4) C4H6O4 118.0266090000 CSID: 388628 -phenylacetic acid Pha C8H6O 118.0418650000 CSID: 10181341 -4-Hydroxybenzoic acid pOH-Bz C7H4O2 120.0211290000 CSID: 132 -trans2.trans4.trans6-trioctaneic acid C8:3(t2.t4.t6) C8H8O 120.0575150000 CSID: 4520024 -hydroxypicolinic acid Hpa C6H3NO2 121.0163780000 CSID: 12827 -oct-7-ynoic acid/2.trans4-octenoic acid C8:0:1(7)/C8:2(2.t4) C8H10O 122.0731650000 CSID: 4472125/CSID: 4944992 -4-oxo-5-methylproline/4-oxo-homoproline/N-Formyl-Proline 4oxo-5Me-Pro/4oxo-Hpr/NFo-Pro C6H7NO2 125.0476780000 CSID: 2564339/CSID: 10739339/CSID: 87055 -octanoic acid/6-methylheptanoic acid C8:0/iC8:0 C8H14O 126.1044650000 CSID: 370/CSID: 81904 -beta-ureido-dehydroAlanine bU-dAla C4H5N3O2 127.0381760000 PDB: UAL -N-formyl-Valine/N-Acetyl-2-aminoisobutyric acid/3-Hydroxy-5-methylproline NFo-Val/Ac-Aib/3OH-5Me-Pro C6H9NO2 127.0633290000 CSID: 90479/CSID: 203779/CSID: 3823469 -N-Methyl-Leucine/D-N-methyl-Leucine/N-Methyl-Isoleucine/N-methyl-alloIsoleucine/D-N-methyl-alloIsoleucine/beta-methylisoleucine/homoisoleucine/alpha-ethylnorvaline/Dolavaline/2-methyl-3-aminohexadecanoic acid NMe-Leu/D-NMe-Leu/NMe-Ile/NMe-aIle/D-NMe-aIle/bMe-Ile/Hil/Et-Nva/Dov/C6:0-Me(2)-NH2(3) C7H13NO 127.0997140000 CSID: 493595/CSID: 493595/CSID: 487199/CCC(C)C(C(=O)O)NC in: NOR00428/CCC(C)C(C(=O)O)NC in: NOR00428/CSID: 19951406/CSID: 454232/CSID: 452678/CSID: 10731564/CSID: 21378848 -DL-Glutamine/D-Glutamine/N-methylasparagine/beta-methyl-asparagine/D-N2-methyl-asparagine/N1-acetyl-2.3-Diaminopropionic acid Gln/D-Gln/NMe-Asn/bMe-Asn/D-N2Me-Asn/NAc-Dpr C5H8N2O2 128.0585780000 PDB: GLN/PDB: DGN/CSID: 311563/CSID: 2284493/CSID: 288387/C(C(CN)NC(C)=O)(=O)O in CSID: 8570696 -3-methoxy-hexanoic acid/3-hydroxy-heptanoic acid C6:0-OMe(3)/C7:0-OH(3) C7H12O2 128.0837300000 CSID: 277923/CSID: 2340494 -DL-Lysine/D-Lysine/beta lysine/N-Hydroxy-histamine Lys/D-Lys/bLys/N-OH-Hta C6H12N2O 128.0949630000 CSID: 843/CSID: 51793/PDB: KBE/C1(CCCN1)CCNO in CSID: 4589228 -DL-Glutamic acid/D-Glutamic Acid/beta-methyl-aspartic acid/D-beta-methyl-aspartic acid/beta-methoxy-aspartic acid/O-acetyl-Serine Glu/D-Glu/bMe-Asp/D-bMe-Asp/bOMe-Asp/Ac-Ser C5H7NO3 129.0425930000 CSID: 591/PDB: DGL/PDB: 2AS/PDB: ACB/CSID: 92764/CSID: 184 -L-acosamine/3-hydroxyleucine/beta-hydroxy-N-Methyl-Valine/gamma-hydroxy-N-Methyl-Valine/L-ristosamine Aco/3OH-Leu/bOH-NMe-Val/gOH-NMe-Val/Ria C6H11NO2 129.0789790000 CSID: 370989/CSID: 244507/CSID: 9205156/CID: 12439044/CSID: 370989 -2-hydroxy-3-methyl-butanedioic acid iC5:0-OH(2)-CA(4) C5H6O4 130.0266090000 CSID: 485839 -Hydroxyasparagine/D-HydroxyAsparagine OH-Asn/D-OH-Asn C4H6N2O3 130.0378420000 CSID: 3670287/CSID: 3670287 -alpha-guanidino Serine gSer C3H6N4O2 130.0490750000 C(C(=O)O)(N)(O)NC(=N)N in: NOR00426 -2.3-dihydroxy-3-methylpentanoic acid aC6:0-OH(2.3) C6H10O3 130.0629940000 CSID: 7 -N5-hydroxy ornithine/D-N5-HydroxyOrnithine/hydroxy-beta lysine OH-Orn/D-OH-Orn/OH-bLys C5H10N2O2 130.0742280000 CSID: 148381/C(CC(C(=O)O)N)CNO in: NOR00205/C(NCC(=O)O)(CCN)O in: NOR00634 -Hydroxyaspartic acid/D-Hydroxyaspartic acid OH-Asp/D-OH-Asp C4H5NO4 131.0218580000 CSID: 5232/CSID: 5232 -Methionine/N.S-dimethylcysteine Met/diMe-Cys C5H9NOS 131.0404850000 CSID: 853/CSID: 4450935 -arabinose/lyxose Ara/Lyx C5H8O4 132.0422590000 CSID: 224/CSID: 831 -L-Olivose Oli C6H12O3 132.0786440000 CSID: 164228 -PhenylGlycine/D-PhenylGlycine Ph-Gly/D-ph-Gly C8H7NO 133.0527640000 CSID: 3732/PDB: PG9 -phenylalaninol Pheol C9H11N 133.0891490000 CSID: 69116 -4-Chloro-Threonine 4Cl-Thr C4H6ClNO2 135.0087060000 CSID: 111708 -2.3-dihydroxy-4-chloro-butanoic acid C4:0-OH(2.3)-Cl(4) C4H5ClO3 135.9927220000 CSID: 25900403 -2.3-dihydroxybenzoic acid diOH-Bz C7H4O3 136.0160440000 CSID: 18 -2-methyl-7-octynoic acid/2.trans4-7-methyl-octenoic acid C8:0:1(7)-Me(2)/iC9:2(2.t4) C9H12O 136.0888150000 CSID: 24770189/CSID: 10761068 -DL-Histidine His C6H7N3O 137.0589120000 CSID: 752 -dehydropyrrolidone dPyr C6H6N2O2 138.0429270000 C1(CC(C(=CC(=O)O)N1)N)=O in CSID: 10199318 -acetylproline/2.3-dimethylpyroglutamic acid Ac-Pro/2Me-3Me-pGlu C7H9NO2 139.0633290000 CSID: 285677/CSID: 13080150 -5.5-dimethyl-2-oxo-hexanoic acid C6:0-Me(5.5)-oxo(2) C8H12O2 140.0837300000 CID: 21197379 -argininal Argal C6H12N4 140.1061960000 CSID: 10655329 -Nonanoic acid/d-6-Methyloctanoic acid/7-Methyloctanoic acid C9:0/aC9:0/iC9:0 C9H16O 140.1201150000 CSID: 7866/CSID: 10015/CSID: 31022 -N-methylchloropyrrole MCP C6H4ClNO 140.9981420000 CSID: 7404981 -N-Acetylisovaline/N-Acetylvaline/N-Formylisoleucine/N-Formylleucin/4-Amino-2.2-dimethyl-3-oxopentanoic acid/4-oxovancosamine Ac-Ival/Ac-Val/NFo-Ile/NFo-Leu/Ibu/4oxo-Van C7H11NO2 141.0789790000 CSID: 272193/CSID: 198159/CSID: 383482/CSID: 90475/CSID: 29322188/C1(C(C(CC(O1)O)(C)N)=O)C in CSID: 10249894 -N-dimethyl-leucine/N.beta-dimethyl-leucine/O-acetyl-leucinol/N.O-dimethyl-isoleucine NdMe-Leu/NMe-bMe-Leu/OAc-Leuol/NMe-OMe-Ile C8H15NO 141.1153640000 CSID: 500040/CID: 15385160/CID: 23037829/CSID: 27194495 -beta-methylglutamine/D-beta-methylglutamine bMe-Gln/D-bMe-Gln C6H10N2O2 142.0742280000 CID: 44602399/CSID: 24604116 -3-hydroxy-octanoic acid/2.2-dimethyl-3-hydroxyhexanoic acid/3-hydroxy-2-methyl-heptanoic acid C8:0-OH(3)/C6:0-Me(2.2)-OH(3)/C7:0-Me(2)-OH(3) C8H14O2 142.0993800000 CSID: 24791/CSID: 21418738/CSID: 27143447 -3-Methyl-Glutamic acid/Glutamic Acid methyl ester/D-Glutamic Acid methyl ester/D-Glutamic Acid methyl ester/2-Aminoadipic acid 3Me-Glu/MeO-Glu/D-MeO-Glu/MeO-D-Glu/Aad C6H9NO3 143.0582430000 CSID: 207514/CSID: 66546/CSID: 66546/CSID: 66546/CSID: 456 -L-actinosamine/L-eremosamine/norstatine/Vancosamine/N-methyl-hydroxyisoleucine Act/Ere/Nst/Van/NMe-OH-Ile C7H13NO2 143.0946290000 CID: 20377364/CSID: 9542085/CSID: 151726/CSID: 164304/CSID: 24770217 -beta-hydroxyglutamine/D-beta-hydroxy-N2-methyl-asparagine/D-beta-hydroxy-N2-methyl-asparagine OH-Gln/Me-OH-Asn/D-N2Me-bOH-Asn C5H8N2O3 144.0534920000 CID: 22592766/CSID: 24604117/C(C(=O)O)(N)C(C(=O)NC)O in: NOR00669 -methoxyaspartic acid OMe-Asp C5H7NO4 145.0375080000 C(C(C(C(=O)O)N)=[O]C)(=O)O in: NOR00717 -3.5-hydroxy-4-amino-hexadecanoic acid C6:0-OH(3.5)-NH2(4) C6H11NO3 145.0738930000 C(CC(C(C(C)O)N)O)(O)=O in: NOR00444 -L-rhamnose Rha C6H10O4 146.0579090000 CSID: 190747 -Methionine-S-oxide O-Met C5H9NO2S 147.0353990000 CSID: 824 -Chloro-Isoleucine Cl-Ile C6H10ClNO 147.0450920000 C(C(O)=O)(N)C(C(C)Cl)C in CSID: 10269389 -DL-Phenylalanine/D-Phenylalanine/beta-phenylalanine/D-beta-phenylalanine/N-methyl-phenylglycine Phe/D-Phe/bPhe/D-bPhe/NMe-Ph-Gly C9H9NO 147.0684140000 CSID: 969/CSID: 64639/CSID: 62403/CSID: 598357/CSID: 198596 -2-hydroxyphenyl-2-oxo-ethanoic acid Hpoe C8H4O3 148.0160440000 CSID: 348 -Phenyl-lactate/D-Phenyl-lactate Ph-Lac/D-Ph-Lac C9H8O2 148.0524300000 CSID: 3715/CID: 643327 -HydroxyPhenylGlycine/D-HydroxyPhenylGlycine Hpg/D-Hpg C8H7NO2 149.0476780000 CSID: 83189/CID: 89853 -2.trans4-8-methyl-noneoic acid iC10:2(2.t4) C10H14O 150.1044650000 C(C=CC=CCCC(C)C)(O)=O in CSID: 16736750 -cysteic acid/D-cysteic acid CysA/D-CysA C3H5NO4S 150.9939280000 PDB: OCS/PDB: 00C -D-4-fluoroPhenylGlycin D-F-ph-Gly C8H6FNO 151.0433430000 CSID: 88776 -3-amino-2-methyloct-7-ynoic acid C8:0:1(7)-Me(2)-NH2(3) C9H13NO 151.0997140000 C(CCCC#C)(C(C(=O)O)C)N in CSID: 8230475 -2-methyl-3-hydroxy-7-octynoic acid C8:0:1(7)-Me(2)-OH(3) C9H12O2 152.0837300000 CSID: 9964309 -2-methyl-8-noneic acid C9:1(8)-Me(2) C10H16O 152.1201150000 CID: 17824924 -Hydroxyhistidine OH-His C6H7N3O2 153.0538260000 CSID: 379547 -N-methyl homo vinylogous Valine NMe-hv-Val C9H15NO 153.1153640000 C(C(NC)C(C)C)=C(C(O)=O)C in CSID: 10213622 -capreomycidine/enduracididine/D-enduracididine Cap/End/D-End C6H10N4O 154.0854610000 CSID: 3818574/CSID: 24775830/CSID: 24775830 -decanoic acid/isodecanoic acid/7-methylnonanoic acid C10:0/iC10:0/aC10:0 C10H18O 154.1357650000 CSID: 2863/CID: 111470/CSID: 4471754 -Alanine-thiazole Ala-Thz C6H7N2OS 155.0279090000 CSID: 23916434 -N-Acetylisoleucine/N-acetyl-Leucine/O-desmethyldolaproine NAc-Ile/NAc-Leu/dDap C8H13NO2 155.0946290000 CSID: 270615/CSID: 1918/C(C1CCCN1)(C(C(=O)O)C)O in CSID: 9938808 -2-Aminononanoic acid Me-AOA C9H17NO 155.1310140000 CSID: 198341 -2-carboxyquinoxaline COOH-Qui C9H4N2O 156.0323630000 CSID: 87301 -N-formyl-Glutamine NFo-Gln C6H8N2O3 156.0534920000 CSID: 2106926 -hydroxyisovalerylpropionyl Hip C8H12O3 156.0786440000 CID: 18942657 -3.4-dimethylglutamine 3Me-4Me-Gln C7H12N2O2 156.0898780000 CSID: 21376706 -DL-Arginine/D-Arginine/L-(+)-Arginine Arg/D-Arg/L-Arg C6H12N4O 156.1011110000 PDB: ARG/PDB: DAR/CSID: 6082 -3-hydroxy-4-methyloctanoic acid/3-hydroxy-nonanoic acid/3-hydroxy-isononanoic acid/3-hydroxy-6-methyloctanoic acid C8:0-Me(4)-OH(3)/C9:0-OH(3)/iC9:0-OH(3)/aC9:0-OH(3) C9H16O2 156.1150300000 CSID: 17247549/CSID: 33630/CID: 22472006/CSID: 10361823 -N-trimethyl-leucine NtMe-Leu C9H18NO 156.1388390000 C(C(=O)O)(CC(C)C)[N](C)(C)C in: NOR00695 -Citrulline/D-Citrulline Cit/D-Cit C6H11N3O2 157.0851270000 CSID: 810/CID: 637599 -isostatine/statine Ist/Sta C8H15NO2 157.1102790000 CSID: 19578058/CSID: 2632509 -N6-formyl-HydroxyOrnithine/D-formyl-hydroxyOrnithine Fo-OH-Orn/D-Fo-OH-Orn C6H10N2O3 158.0691420000 PDB: FHO/PDB: FH7 -alpha-amino-hydroxyadipic acid Ahad C6H9NO4 159.0531580000 CID: 22326384 -N-methyl-2.3-dehydrophenylalanine NMe-dPhe C10H9NO 159.0684140000 C(C(O)=O)(=CC1=CC=CC=C1)NC in CSID: 4444584 -O-methyl-L-rhamnose 2OMe-Rha C7H12O4 160.0735590000 CSID: 4352115 -N-Methyl-Phenylalanine/D-N-Methyl-Phenylalanine/3-methylphenylalanine/Homophenylalanine NMe-Phe/D-NMe-Phe/3Me-Phe/Hph C10H11NO 161.0840640000 PDB: MEA/PDB: ZAE/PDB: APD/CSID: 92605 -Hexose/L-glucose/D-Glucose Hexose/Glc/D-Glc C6H10O5 162.0528230000 CSID: 23139/CSID: 201/PDB: GLC -N-hydroxy-dehydro-HydroxyPhenylGlycine/D-N-hydroxy-dehydro-HydroxyPhenylGlycine OH-dHpg/D-OH-dHpg C8H5NO3 163.0269430000 CID: 20339127/C(C(=O)O)(C1=CC=C(C=C1)O)=NO in: NOR00822 -Methionine sulfone O2-Met C5H9NO3S 163.0303140000 CSID: 63154 -phosphinothricin PT C5H10NO3P 163.0398300000 CSID: 4630 -Tyrosine/D-Tyrosine/beta-tyrosine/Phenylserine/N-methyl-HydroxyPhenylGlycine Tyr/D-Tyr/bTyr/Ph-Ser/NMe-Hpg C9H9NO2 163.0633290000 CSID: 1121/CSID: 64252/CSID: 389285/CSID: 84951/CID: 15118056 -4-hydroxy-D-phenyl-lactate 4OH-D-Ph-Lac C9H8O3 164.0473440000 CID: 9378 -propenoyl-alanyloxazole acid PALOA C8H8N2O2 164.0585780000 C(C=CC1=COC(=N1)C(N)C)(=O)O in CSID: 10477875 -3.4-dichloro-proline Cl2-Pro C5H5Cl2NO 164.9748200000 CID: 21295133 -3.5-dihydroxyphenylglycine/D-3.5-dihydroxyphenylglycine Dhpg/D-Dhpg C8H7NO3 165.0425930000 PDB: D3P/PDB: D3P -cyclo alpha-ketoarginine ck-Arg C7H10N4O 166.0854610000 C12(C(CCCN1C(=NC2=O)-N)N)O in CSID: 9977717 -2.2-dimethyl-3-hydroxy-7-octynoic acid C8:0:1(7)-Me(2.2)-OH(3) C10H14O2 166.0993800000 CSID: 29330001 -2-carboxy-6-hydroxyoctahydroindole Choi C9H13NO2 167.0946290000 C1C(NC2C1CCC(C2)O)C(=O)O in CSID: 10480056 -3-Desoxy-Methyl-4-butenyl-4-methyl threonine 3d-NMe-Bmt C10H17NO 167.1310140000 CC=CCC(C)CC(NC)C(=O)O in CSID: 4953086 -1-methoxy-beta-alanine-thiazole OMe-bAla-Thz C7H8N2OS 168.0357340000 C(N)(CC(=O)OC)C1=NC=CS1 in CSID: 26365309 -2.2-dimethyl-3-hydroxy-7-octenoic acid C8:1(7)-Me(2.2)-OH(3) C10H16O2 168.1150300000 C(C(C(CCCC=C)O)(C)C)(O)=O in CSID: 8732670 -9-methyldecanoic acid/8-methyldecanoic acid iC11:0/aC11:0 C11H20O 168.1514150000 CSID: 4471714/CID: 21813 -4-butenyl-4-methyl threonine/Dolaproine Bmt/Dap C9H15NO2 169.1102790000 CC=CCC(C)C(C(C(=O)O)N)O in CSID: 4444325/C1C(CCN1)C(C(C(O)=O)C)OC in CSID: 7986684 -5-hydroxy-capreomycidine 5OH-Cap C6H10N4O2 170.0803760000 C1C(NC(NC1C(C(=O)O)N)=N)O in CSID: 2301596 -hydroxysecbutyl acetyl propionyl Hysp C9H14O3 170.0942940000 C(C(C(C(O)C(CC)C)=O)C)(=O)O in CSID: 10477730 -homoarginine Har C7H14N4O 170.1167610000 CSID: 8732 -3-hydroxy-decanoic acid/3-hydroxy-2-methyl-nonanoic acid/2.2-dimethyl-3-hydroxy-octanoic acid/2.4-dimethyl-3-hydroxyisooctanoic acid C10:0-OH(3)/C9:0-Me(2)-OH(3)/C8:0-Me(2.2)-OH(3)/iC8:0-Me(2.4)-OH(3) C10H18O2 170.1306800000 CSID: 24790/CSID: 9587708/CSID: 8949283/CSID: 25944197 -N-methoxyacetyl-valine NOMe-Ac-Val C8H13NO3 171.0895430000 CSID: 11856685 -N-desmethyldolaisoleuine/alpha-hydroxy-6-methyl-3-aminooctanoic acid dDil/aC9:0-OH(2)-NH2(3) C9H17NO2 171.1259290000 C(C(N)C(C)CC)(CC(O)=O)OC in CSID: 9938808/C(C(C(CCC(CC)C)N)O)(=O)O in CSID: 10475103 -N-acetyl-HydroxyOrnithine/D-N-acetyl-HydroxyOrnithine/N2-acetyl-N5-hydroxy-L-ornithine Ac-OH-Orn/D-Ac-OH-Orn/N2Ac-OH-Orn C7H12N2O3 172.0847920000 PDB: AHO/CSID: 3670289/CSID: 0 -tryptophanol Trpol C11H12N2 172.1000480000 CSID: 10234 -N-methyldichloropyrrole-2-carboxylic acid MdCP C6H3Cl2NO 174.9591700000 CSID: 21926880 -beta.beta-dimethyl-Methionine-S-oxide bbMe2-O-Met C7H13NO2S 175.0666990000 CSID: 29322228 -alpha-amino-phenyl-valeric acid Apv C11H13NO 175.0997140000 CSID: 262061 -Homotyrosine/N-methyltyrosine/beta-hydroxy-N-Methyl-Phenylalanine Hty/NMe-Tyr/bOH-NMe-Phe C10H11NO2 177.0789790000 CSID: 3365526/CSID: 453342/CSID: 14028021 -propenoyl-2-aminobutanoyloxazole acid PAOA C9H10N2O2 178.0742280000 C(C=CC1=COC(=N1)C(N)CC)(=O)O in CSID: 27026296 -2.4-dimethyl-dec-9-ynoic acid/10-methyl-2.trans4-undecanoic acid C10:0:1(9)-Me(2.4)/iC12:2(2.t4) C12H18O 178.1357650000 C(C(CC(CCCCC#C)C)C)(=O)O in CSID: 23076292/C(C=CC=CCCCCC(C)C)(O)=O in CSID: 24677772 -beta-hydroxy-tyrosine/3.4-dihydroxyphenylalanine bOH-Tyr/diOH-Phe C9H9NO3 179.0582430000 CSID: 13930867/CSID: 813 -proline-thiazole Pro-Thz C8H8N2OS 180.0357340000 C1=CSC(=N1)C2CCC(N2)C(=O)O in CSID: 8971346 -2-methyl-5-dodecenoic acid C12:1(5) C12H20O 180.1514150000 CSID: 4471802 -Anticapsin Aca C9H11NO3 181.0738930000 CSID: 2796855 -D-homoarginine D-Har C7H10N4O2 182.0803760000 CSID: 53295 -vinylogous arginine v-Arg C8H14N4O 182.1167610000 C(C(N)CCCNC(=N)N)=CC(=O)O in CSID: 8946030 -dodecanoic acid/isododecanoic acid C12:0/iC12:0 C12H22O 182.1670650000 CSID: 3756/CID: 75942 -3-chloro-4-hydroxyphenylglycine Cl-Hpg C8H6ClNO2 183.0087060000 CSID: 3817439 -N-methyl-butenylthreonine/2-amino-8-oxo-decanoic acid NMe-Bmt/C10:0-NH2(2)-oxo(8) C10H17NO2 183.1259290000 CSID: 9944222/CSID: 16281719 -2.3-Dehydro-Tryptophan dh-Trp C11H8N2O 184.0636630000 CSID: 7991355 -ureido-4-oxovancosamine U4oxo-Van C8H12N2O3 184.0847920000 C1(C2(C(CC(O1)O)(C)NC(N2)=O)O)C in: NOR00711 -alpha-ketoarginine k-Arg C7H12N4O2 184.0960260000 C(C(C(CCCNC(=N)N)N)=O)(=O)O in CSID: 10477079 -3-hydroxy-undecanoic acid/3-hydroxy-isoundecanoic acid/3-hydroxy-2-methyl-decanoic acid/3-hydroxy-4-methyl-decanoic acid C11:0-OH(3)/iC11:0-OH(3)/C10:0-Me(2)-OH(3)/C10:0-Me(4)-OH(3) C11H20O2 184.1463300000 CSID: 2340495/CC(C)CCCCCC(CC(=O)O)O in: NOR00398/CSID: 13775620/CSID: 28533406 -Dolapyrrolidone Dpy C12H11NO 185.0840640000 CSID: 8735462 -Dolaisoleucine/8-hydroxy-2-amino-decanoic acid/9-hydroxy-2-amino-decanoic acid Dil/C10:0-OH(8)-NH2(2)/C10:0-OH(9)-NH2(2) C10H19NO2 185.1415790000 C(CC(O)=O)(OC)C(C(C)CC)NC in CSID: 7986684/CSID: 26949211/C(C(N)CCCCCCC(C)O)(=O)O in CSID: 10279723 -DL-Tryptophan/D-Tryptophan Trp/D-Trp C11H10N2O 186.0793130000 CSID: 1116/CSID: 8707 -hydrated alpha-ketoarginine hk-Arg C7H14N4O2 186.1116760000 C(C(C(CCCN=C(N)N)N)O)(=O)O in CSID: 8946570 -dehydro vinylogous tyrosine dv-Tyr C11H9NO2 187.0633290000 C(C(N)=CC1=CC=C(C=C1)O)=CC(=O)O in CSID: 8185737 -3.4-dihydroxyArginine diOH-Arg C6H12N4O3 188.0909400000 C(C(C(C(O)=O)N)O)(CN=C(N)N)O in CSID: 8801410 -vinylogous tyrosine/N-acetylphenylalanine v-Tyr/Ac-Phe C11H11NO2 189.0789790000 C(C(N)CC1=CC=C(C=C1)O)=CC(=O)O in CSID: 10477079/CSID: 1923 -kynurenine/D-kynurenine Kyn/D-Kyn C10H10N2O2 190.0742280000 CSID: 823/CID: 1152206 -coronafacic acid CFA C12H14O2 190.0993800000 CSID: 13300082 -N-methyl-4-methylamino-phenylalanine/N.O-dimethyl-tyrosinecarboxamid NMe-MeA-Phe/NMe-OMe-TyrC C11H14N2O 190.1106130000 CID: 21137790/CID: 19003692 -alpha-amino-hydroxyphenyl-valeric acid/N-methyl-homotyrosine/3-methyl-homotyrosine/ethylene inserted tyrosine/N.O-dimethyl-tyrosine/D-N.O-dimethyl-tyrosine Ahv/NMe-Hty/3Me-Hty/e-Tyr/NMe-OMe-Tyr/D-NMe-OMe-Tyr C11H13NO2 191.0946290000 C(C(=O)O)(CCCC1=CC=C(C=C1)O)N in CSID: 142959/C1=CC(=CC=C1CCC(C(=O)O)NC)O in CSID: 10477716/C1=CC(=CC=C1CC(C(C(=O)O)N)C)O in: NOR00265/C(C(N)CC1=CC=C(C=C1)O)CC(=O)O in CSID: 9977717/CID: 18925327/CID: 18925327 -10-methyl-2.trans4-dodecenoic acid aC13:2(2.t4) C13H20O 192.1514150000 C(C=CC=CCCCCC(CC)C)(O)=O in CSID: 24665012 -di-chloro-N-methyl-dehydroLeucine Cl2-NMe-dhLeu C7H9Cl2NO 193.0061200000 C(C(O)=O)(NC)=CC(C)C(Cl)Cl in CSID: 8701761 -beta-methoxy-tyrosine bOMe-Tyr C10H11NO3 193.0738930000 CSID: 16174140 -O-sulfate-2-hydroxy-3-methylpentanoic acid OSu-Hmp C6H10O5S 194.0248940000 C(C(C(CC)C)O[S](=O)(=O)O)(=O)O in CSID: 10477875 -methyloxazoline-isoleucine MeOx-Ile C11H18N2O 194.1419130000 C(N)(C(C)CC)C1=NC(C(C1)C)C(=O)O in CSID: 10477991 -11-methyl-3-dodecenoic acid/10-methyl-3-dodecenoic acid iC13:1(3)/aC13:1(3) C13H22O 194.1670650000 C(CC=CCCCCCCC(C)C)(O)=O in: NOR00296/C(CC=CCCCCCC(CC)C)(O)=O in: NOR00767 -di-chloro-N-methyl-Leucine Cl2-NMe-Leu C7H11Cl2NO 195.0217700000 C(C(O)=O)(NC)CC(C)C(Cl)Cl in CSID: 8773801 -3-hydroxy-5-dodecenoic acid/9-oxo-2.4-dimethyldecanoic acid/8-hydroxy-2.4.6-trimethyl-4-nonenoic acid C12:1(5)-OH(3)/C10:0-Me(2.4)-oxo(9)/C9:1(4)-Me(2.4.6)-OH(8) C12H20O2 196.1463300000 CSID: 10761118/C(C(CC(CCCCC(C)=O)C)C)(=O)O in CSID: 8946480/C(C(CC(=CC(CC(C)O)C)C)C)(O)=O in CSID: 8007368 -11-methyldodecanoic acid/10-methyldodecanoic acid iC13:0/aC13:0 C13H24O 196.1827150000 CID: 33002/CSID: 2282934 -chloro-tyrosine Cl-Tyr C9H8ClNO2 197.0243570000 CSID: 106510 -2-amino-9.10-epoxi-8-oxodecanoic acid C10:0-NH2(2)-Ep(9)-oxo(8) C10H15NO3 197.1051930000 CSID: 11345228 -4-butenyl-4-methyl-N.4-methyl threonine Me2-Bmt C11H19NO2 197.1415790000 CSID: 4450325 -3-hydroxy-dodecanoic acid/3-hydroxy-isododecanoic acid/3-hydroxy-2-methyl-undecanoic acid C12:0-OH(3)/iC12:0-OH(3)/C11:0-Me(2)-OH(3) C12H22O2 198.1619800000 CSID: 85026/CID: 15089799/CSID: 13775586 -9-hydroxy-2-amino-8-oxo-decanoic acid C10:0-OH(9)-NH2(2)-oxo(8) C10H17NO3 199.1208430000 CSID: 25942012 -N-acetyl-N6-formyl-N6-hydroxyOrnithine NAc-Fo-OH-Orn C8H12N2O4 200.0797070000 C(C(=O)O)(NC(C)=O)CCCN(O)C=O in CSID: 3294 -N1-methyl-tryptophan 1Me-Trp C12H12N2O 200.0949630000 CSID: 88584 -5-hydroxytryptophan/phototryptophan OH-Trp/pTrp C11H10N2O2 202.0742280000 CSID: 141/CID: 10331043 -N-methyl-4-dimethylamino-phenylalanine NMe-Me2A-Phe C12H16N2O 204.1262630000 CSID: 27594543 -vinylogous hydroxy tyrosine v-OH-Tyr C11H11NO3 205.0738930000 C(C(N)CC1=CC(=C(C=C1)O)O)=CC(=O)O in CSID: 9204437 -alpha-amino-methoxyphenyl-valeric acid Amv C12H15NO2 205.1102790000 CSID: 9681632 -N-Methyl-Lanthionine NMe-Lan C6H10N2O4S 206.0361280000 C(SCC(C(=O)O)N)C(C(O)=O)NO in: NOR00149 -3-nitrotyrosine 3NO2-Tyr C9H8N2O4 208.0484070000 CSID: 205676 -7-tetradecenoic acid/12-methyl-3-tridecenoic acid C14:1(7)/iC14:1(3) C14H24O 208.1827150000 CSID: 10722652/PDB: LNG -D-PhosphateAsparagine D-PO-Asn C4H7N2O6P 210.0041720000 C(C(C(C(O)=O)N)O[P](O)(=O)O)(=O)N in: NOR00025 -propenoyl-O-methylserinylthiazole acid PMST C9H10N2O2S 210.0462980000 C(C=CC1=CSC(=N1)C(N)COC)(=O)O in CSID: 8503913 -5-oxo-8-hydroxy-2.4.6-trimethyl-4-nonaneic acid C9:1(Me4)-Me(2.4.6)-OH(8)-Oxo(5) C12H18O3 210.1255940000 C(C(CC(C(C(CC(C)O)C)=O)=C)C)(O)=O in CSID: 8434247 -tetradecanoic acid/12-methyl-tridecanoic acid C14:0/iC14:0 C14H26O 210.1983650000 PDB: MYR/CID: 520298 -Chloro-N-methyl-tyrosine/D-3-chloro-N-methyl-Tyrosine Cl-NMe-Tyr/D-Cl-NMe-Tyr C10H10ClNO2 211.0400070000 PDB: CNT/C(C(=O)O)(NC)CC1=CC(=C(C=C1)O)Cl in: NOR00614 -3-amino-tridecanoic acid C13:0-NH2(3) C13H25NO 211.1936140000 CSID: 26283438 -3-hydroxy-tridecanoic acid/3-hydroxy-isotridecanoic acid/3-hydroxy-10-methyl-dodecanoic acid C13:0-OH(3)/iC13:0-OH(3)/aC13:0-OH(3) C13H24O2 212.1776300000 CSID: 4472174/CID: 15089800/C(CC(CCCCCCC(CC)C)O)(O)=O in: NOR00857 -beta-hydroxy-chloro-tyrosine bOH-Cl-Tyr C9H8ClNO3 213.0192710000 CSID: 25938524 -3-amino-6-hydroxy-2-piperidone Ahp C9H14N2O4 214.0953570000 CSID: 25058696 -N-methyl-5-hydroxytryptophan/methoxytryptophan NMe-OH-Trp/OMe-Trp C12H12N2O2 216.0898780000 C(C(=O)O)(NC)CC1=C[N]C2=C1C=C(C=C2)O in CSID: 10476796/O(C(=O)[C@@H](N([H])[H])CC1=C[N](C2=CC=CC=C12)OC)[H] in CSID: 5293532 -2.6-diamino-7-hydroxyazelaic acid Daz C9H16N2O4 216.1110070000 CSID: 391749 -4-amino-7-guanidino-2.3-dihydroxyheptanoic acid Agdha C8H16N4O3 216.1222400000 CSID: 21377788 -3.5-dichloro-4-hydroxyphenylglycine Cl2-Hpg C8H5Cl2NO2 216.9697340000 CSID: 9804791 -DHP-methyloxazolinyl group DMOG C11H9NO4 219.0531580000 CSID: 12721 -N-methoxyacetyl-D-phenylalanine NOMe-Ac-D-Phe C12H13NO3 219.0895430000 CSID: 11859621 -D-6'-chloro-tryptophan D-Cl-Trp C11H9ClN2O 220.0403410000 C(C(=O)O)(N)CC1=NC2=C(C1)C=CC(=C2)Cl in CSID: 8094776 -dihydroxyphenylthiazol group DHPT C10H7NO3S 221.0146640000 CSID: 23110909 -12-methyl-3-tetradecenoic acid aC15:1(3) C15H26O 222.1983650000 C(CC=CCCCCCCCC(CC)C)(O)=O in: NOR00768 -2.3-dihydroxy-2.6.8-trimethyldeca-(4Z.6E)-dienoic acid/2.3-dihydroxy-trans4.trans6-tridecenoic acid aC11:2(4.6)-Me(2.6)-OH(2.3)/C13:2(t4.t6)-OH(2.3) C13H20O3 224.1412450000 C(C(C(C=CC(=CC(CC)C)C)O)(O)C)(O)=O in CSID: 4977118/C(C(C(C=CC=CCCCCCC)O)O)(O)=O in CSID: 4976886 -12-methyltetradecanoic acid aC15:0 C15H28O 224.2140160000 CSID: 20368 -bromophenylalanine Br-Phe C9H8BrNO 224.9789160000 CSID: 77275 -3-amino-tetradecanoic acid/3-amino-isotetradecanoic acid C14:0-NH2(3)/iC14:0-NH2(3) C14H27NO 225.2092640000 CSID: 15571256/CID: 22471993 -3-hydroxy-tetradecanoic acid/3-hydroxy-12-methyl-tridecanoic acid C14:0-OH(3)/iC14:0-OH(3) C14H26O2 226.1932800000 CSID: 15252/CID: 22471995 -tri-chloro-N-methyl-dehydroLeucine Cl3-NMe-dhLeu C7H8Cl3NO 226.9671480000 C(C(O)=O)(NC)=CC(C)C(Cl)(Cl)Cl in CSID: 10477276 -N-acetyltryptophan Ac-Trp C13H12N2O2 228.0898780000 CSID: 1925 -beta.beta.N-trimethyltryptophan bbMe-NMe-Trp C14H16N2O 228.1262630000 C1=CC=CC2=C1C(=C[N]2)C(C(C(O)=O)NC)(C)C in CSID: 8158974 -3-hydroxy-2.2.4-trimethyl-7-hydroxydecanoic acid C10:0-Me(2.2.4)-OH(3.7) C13H24O3 228.1725450000 C(C(C(C(=O)O)(C)C)O)(CCC(CCC)O)C in CSID: 8184030 -tri-chloro-N-methyl-Leucine Cl3-NMe-Leu C7H10Cl3NO 228.9827980000 C(C(O)=O)(NC)CC(C)C(Cl)(Cl)Cl in CSID: 10477275 -thiazolylphenylalanine Phe-Thz C12H10N2OS 230.0513840000 C(N)(CC1=CC=CC=C1)C2=NC(=CS2)C(O)=O in CSID: 8593238 -D-2-carboxy-tryptophan D-COOH-Trp C12H10N2O3 230.0691420000 C(C(O)=O)(N)CC1=C([N]C2=C1C=CC=C2)C(=O)O in CSID: 7987591 -N-methyl-6-chloro-tryptophan NMe-Cl-Trp C12H11ClN2O 234.0559910000 C(C(=O)O)(NC)CC1=C[N]C2=C1C=CC(=C2)Cl in CSID: 8805002 -7-hexadecenoic acid/9-hexadecenoic acid C16:1(7)/C16:1(9) C16H28O 236.2140160000 CSID: 4895966/CSID: 4445872 -2.3-dihydroxy-trans4.trans6-tetradecenoic acid/2.6.8-trimethyl-5.7-dihydroxy-trans2.trans8-undecenoic acid C14:2(t4.t6)-OH(2.3)/C11:2(t2.t8)-Me(2.6.8)-OH(5.7) C14H22O3 238.1568950000 C(C(C(C=CC=CCCCCCCC)O)O)(O)=O in CSID: 8924310/C(C(=CCC(C(C(C(=CCC)C)O)C)O)C)(O)=O in CSID: 10481263 -hexadecanoic acid C16:0 C16H30O 238.2296660000 CSID: 960 -beta-methyl-bromophenylalanine bMe-Br-Phe C10H10BrNO 238.9945660000 C(C(=O)O)(C(C1=CC=C(C=C1)Br)C)N in CSID: 10475327 -3-amino-pentadecanoic acid/3-amino-isopentadecanoic acid/3-amino-12-methyl-tetradecanoic acid C15:0-NH2(3)/iC15:0-NH2(3)/aC15:0-NH2(3) C15H29NO 239.2249150000 CSID: 26283439/C(CC(CCCCCCCCCC(C)C)N)(O)=O in: NOR00784/C(CC(CCCCCCCCC(CC)C)N)(O)=O in: NOR00785 -3-hydroxy-13-methyltetradecanoic acid/3-hydroxy-pentadecanoic acid/3-hydroxy-isopentadecanoic acid/3-hydroxy-12-methyl-tetradecanoic acid C14:0-Me(13)-OH(3)/C15:0-OH(3)/iC15:0-OH(3)/aC15:0-OH(3) C15H28O2 240.2089300000 CSID: 9218624/CSID: 158374/CSID: 9218624/C(CC(CCCCCCCCC(CC)C)O)(O)=O in: NOR00211 -bromotyrosine/beta-hydroxy-bromophenylalanine Br-Tyr/bOH-Br-Phe C9H8BrNO2 240.9738310000 CSID: 131083/CSID: 19757850 -beta.beta.N1.N-tetramethyltryptophan bbNMe-NMe-Trp C15H18N2O 242.1419130000 C1=CC=CC2=C1C(=C[N]2C)C(C(C(O)=O)NC)(C)C in CSID: 8570259 -3.4-dihydroxy-tetradecanoic acid/ 3-hydroxy-2.2.4-trimethyl-7-methoxydecanoic acid C14:0-OH(3.4)/C10:0-Me(2.2.4)-OH(3)-OMe(7) C14H26O3 242.1881950000 CID: 22667431/CSID: 28587148 -3-amino-4-hydroxy-6-methyl-8-phenyl-5.7-octadienoic acid C8:2(5.7)-Me(6)-OH(4)-NH2(3)-Ph(8) C15H17NO2 243.1259290000 C(CC(C(C=C(C=CC1=CC=CC=C1)C)O)N)(=O)O in CSID: 10475327 -tri-chloro-2-hydroxy-N-methyl-Leucine/tri-chloro-5-hydroxy-N-methyl-Leucine Cl3-2OH-NMe-Leu/Cl3-5OH-NMe-Leu C7H10Cl3NO2 244.9777130000 C(C(O)=O)(NC)(CC(C)C(Cl)(Cl)Cl)O in CSID: 10477276/C(C(O)=O)(NC)CC(CO)C(Cl)(Cl)Cl in: NOR00511 -N-methyl-6-chloro-5-hydroxytryptophan NMe-Cl-OH-Trp C12H11ClN2O2 250.0509060000 C(C(=O)O)(NC)CC1=C[N]C2=C1C=C(C(=C2)Cl)O in CSID: 10473575 -2.3-dihydroxy-trans4.trans6-pentadecenoic acid C15:2(t4.t6)-OH(2.3) C15H24O3 252.1725450000 C(C(C(C=CC=CCCCCCCCC)O)O)(O)=O in CSID: 4976888 -3-hydroxy-9-hexadecenoic acid C16:1(9)-OH(3) C16H28O2 252.2089300000 C(CC(CCCCCC=CCCCCCC)O)(O)=O in: NOR00720 -3-amino-hexadecanoic acid/3-amino-isohexadecanoic acid C16:0-NH2(3)/iC16:0-NH2(3) C16H31NO 253.2405650000 CSID: 24597602/C(CC(CCCCCCCCCCC(C)C)N)(O)=O in: NOR00793 -3-hydroxy-hexadecanoic acid/3-hydroxy-isohexadecanoic acid C16:0-OH(3)/iC16:0-OH(3) C16H30O2 254.2245800000 CSID: 266538/C(CC(CCCCCCCCCCC(C)C)O)(O)=O in: NOR00897 -D-3-bromo-N-methyl-Tyrosine D-Br-NMe-Tyr C10H10BrNO2 254.9894810000 CSID: 2128826 -pyoverdin Pa A chromophore ChrPaA C13H11N3O3 257.0800410000 C1=C(C(=CC2=C1N3C(C(=C2)N)=NC(CC3)C(O)=O)O)O in CSID: 0 -N1-carboxy-bichomotryptophan N1-COOH-bhTrp C14H14N2O3 258.1004420000 C(CC1=C[N](C2=C1C=CC=C2)C(=O)O)CC(C(=O)O)N in CSID: 9968260 -isopyoverdin chromophore/pyoverdin chromophore ChrI/ChrP C13H13N3O3 259.0956910000 C1=C(C(=CC2=C1N3C(C(=C2)N)NC(CC3)C(O)=O)O)O in: NOR00163/C1=C(C(=CC2=C1N3C(C(=C2)N)NC(CC3)C(O)=O)O)O in CID: 5289234 -5.6-dihydropyoverdin chromophore ChrD C13H15N3O3 261.1113410000 C1=C(C(=CC2=C1N3C(C(N)C2)NCCC3C(O)=O)O)O in: NOR00903 -D-6-chloro-N2-formamidotryptophan D-Cl-CONH2-Trp C12H10ClN3O2 263.0461550000 C(C(O)=O)(N)CC1=C[N](C2=C1C=CC(=C2)Cl)C(=O)N in CSID: 8138519 -3-amino-8-phenyl-2.4.5-trihydroxyoct-7-enoic acid C8:1(7)-OH(2.4.5)-NH2(3)-Ph(8) C14H17NO4 263.1157580000 CSID: 29330841 -5-bromo-tryptophan Br-Trp C11H9BrN2O 263.9898150000 CSID: 87339 -9-octadecenoic acid C18:1(9) C18H32O 264.2453160000 CSID: 553123 -8.10-Dimethyl-9-hydroxy-7-methoxytridecadienoic acid DHMDA C16H26O3 266.1881950000 C(C(C(CCC)C)O)(C(C=CC=CCC(=O)O)OC)C in CSID: 10479168 -3-amino-14-methyl-hexadecanoic acid/3-amino-15-methyl-hexadecanoic acid aC17:0-NH2(3)/iC17:0-NH2(3) C17H33NO 267.2562150000 C(CC(CCCCCCCCCCC(CC)C)N)(O)=O in CSID: 2340866/C(CC(CCCCCCCCCCCC(C)C)N)(O)=O in: NOR00801 -3-hydroxy-14-methyl-hexadecanoic acid/3-hydroxy-15-methyl-hexadecanoic acid aC17:0-OH(3)/iC17:0-OH(3) C17H32O2 268.2402300000 C(CC(CCCCCCCCCCC(CC)C)O)(O)=O in: NOR00900/CSID: 141849 -3.4-dihydroxy-hexadecanoic acid C16:0-OH(3.4) C16H30O3 270.2194950000 CID: 22348653 -4-propenoyl-2-tyrosylthiazole acid PTTA C14H12N2O2S 272.0619480000 C(O)(=O)C=CC1=CSC(=N1)C(N)CC2=CC=C(C=C2)O in CSID: 16738243 -N-methyl-2-Bromo-tryptophan NMe-Br-Trp C12H11BrN2O 278.0054650000 C(C(=O)O)(NC)CC1=C([N]C2=C1C=CC=C2)Br in CSID: 8007368 -2-bromo-5-hydroxytryptophan Br-OH-Trp C11H9BrN2O2 279.9847300000 CSID: 643874 -3-hydroxy-9-octadecenoic acid C18:1(9)-OH(3) C18H32O2 280.2402300000 C(CC(CCCCCC=CCCCCCCCC)O)(O)=O in: NOR00724 -azotobactins chromophore ChrA C14H11N3O4 285.0749560000 C1=C(C(=CC2=C1N4C3C(=C2)NC(N3CCC4C(O)=O)=O)O)O in: NOR00208 -O-demethyl-Adda DMAdda C19H25NO2 299.1885290000 C(C(C(C=CC(=CC(C(CC1=CC=CC=C1)O)C)C)N)C)(O)=O in: NOR00129 -D-3-iodo-N-methyl-Tyrosine D-I-NMe-Tyr C10H10INO2 302.9756110000 C(C(=O)O)(NC)CC1=CC(=C(C=C1)O)I in CSID: 9017332 -actinomycin chromophore ChrAct C16H10N2O5 310.0589710000 CSID: 86817 -3-amino-9-methoxy-2.6.8-trimethyl-10-phenyldeca-4.6-dienoic acid Adda C20H27NO2 313.2041790000 CSID: 10471100 -3-amino-4-hydroxy-6-methyl-8-(p-bromophenyl)-5.7-octadienoic acid C8:2(5.7)-Me(6)-OH(4)-NH2(3)-brPh(8) C15H16BrNO2 321.0364310000 C(CC(C(C=C(C=CC1=CC=C(C=C1)Br)C)O)N)(=O)O in CSID: 10476834 -3-amino-6-methyl-12-phenyl-2.4.5-trihydroxydodeca-7.9.11-trienoic acid C12:3(7.9.11)-Me(6)-OH(2.4.5)-NH2(3)-Ph(12) C19H23NO4 329.1627080000 C(C(C(C(C(C(C=CC=CC=CC1=CC=CC=C1)C)O)O)N)O)(O)=O in CSID: 8923613 -3-amino-10-(p-ethoxyphenyl)-2.4.5-trihydroxydeca-7.9-dienoic acid C10:2(7.9)-OH(2.4.5)-NH2(3)-ePh(10) C18H23NO5 333.1576230000 CSID: 29330839 -O-Acetyl-O-demethylAdda ADMAdda C21H27NO3 341.1990940000 C(C(C(C=CC(=CC(C(CC1=CC=CC=C1)OC(C)=O)C)C)N)C)(O)=O in: NOR00144 -3-amino-6.10-dimethyl-12-phenyl-2.4.5-trihydroxydodeca-7.9.11-trienoic acid C12:3(7.9.11)-Me(6.10)-OH(2.4.5)-NH2(3)-Ph(12) C20H25NO4 343.1783580000 C(C(C(C(C(C(C=CC=C(C=CC1=CC=CC=C1)C)C)O)O)N)O)(O)=O in CSID: 10187168 -3-amino-6-methyl-12-(p-methoxyphenyl)-2.4.5-trihydroxydodec-11-enoic acid C12:1(11)-Me(6)-OH(2.4.5)-NH2(3)-mPhe(11) C20H29NO5 363.2045730000 CSID: 29330842 +Ethanolamine Eta C2H5N 43.0421990000 CSID: 13835336 +Glycine Gly C2H3NO 57.0214640000 CSID: 730 +pyrrolidone Pyr C4H5N 67.0421990000 CSID: 11530 +dehydroalanine dh-Ala C3H3NO 69.0214640000 CSID: 110510 +pyruvic acid Pya C3H2O2 70.0054790000 CSID: 1031 +butanoic acid C4:0 C4H6O 70.0418650000 CSID: 259 +DL-Alanine/D-Alanine/beta-Alanine/N-Methyl-Glycine Ala/D-Ala/bAla/NMe-Gly C3H5NO 71.0371140000 CSID: 582/CSID: 64234/CSID: 234/CSID: 1057 +Lactic acid/D-lactic acid Lac/D-Lac C3H4O2 72.0211290000 CSID: 592/CSID: 55423 +Serinol Serol C3H7NO 73.0527640000 CSID: 61591 +2.3-dehydro-2-aminobutyric acid/homoserine lactone/N-Methyl-dehydroalanine/hydroxy pyrrolidone dhAbu/HseL/NMe-Dha/OH-Pyr C4H5NO 83.0371140000 CSID: 4952645/CSID: 66194/CSID: 118845/CSID: 134682 +2-hydroxy-3-butenoic acid C4:1(3)-OH(2) C4H4O2 84.0211290000 CSID: 141066 +2-methyl-butanoic acid C4:0-Me(2) C5H8O 84.0575150000 CSID: 8012 +alpha-formylGlycine aFo-Gly C3H3NO2 85.0163780000 CSID: 28 +N-Methyl-L-alanine/N-methyl-beta-alanine/alpha-aminobutyric acid/D-alpha-aminobutyric acid/2-Methylalanine/methyl alaninate NMe-Ala/NMe-bAla/Abu/D-Abu/Aib/D-3OMe-Ala C4H7NO 85.0527640000 CSID: 4450824/CSID: 68396/PDB: ABA/PDB: DBB/CSID: 5891/CSID: 99878 +isovalinol/valinol Ivalol/Valol C5H11N 85.0891490000 CSID: 8329525/CSID: 71352 +3-hydroxybutanoic acid C4:0-OH(3) C4H6O2 86.0367790000 CSID: 428 +2.3-Diaminopropionic acid Dpr C3H6N2O 86.0480130000 CSID: 357 +DL-Serine/D-Serine/isoserine Ser/D-Ser/Iser C3H5NO2 87.0320280000 CSID: 597/CSID: 64231/CSID: 10793 +Sorbic acid C6:2(t2.t4) C6H6O 94.0418650000 CSID: 558605 +methyl-succinimide Me-Suc C5H5NO 95.0371140000 CSID: 122158 +proline carboxamid ProC C5H8N2 96.0687480000 CSID: 479142 +DL-Proline/D-Proline/2-methylamino-2-dehydrobutyric acid/norcoronamic acid Pro/D-Pro/2Dh-Mabu/norCMA C5H7NO 97.0527640000 CSID: 594/CSID: 8640/CSID: 16743754/CSID: 28708240 +3-methylvaleric acid/hexanoic acid Me-Vaa/C6:0 C6H10O 98.0731650000 CSID: 7469/CSID: 8552 +N-formyl-Alanine/D-N-formyl-Alanine NFo-Ala/D-NFo-Ala C4H5NO2 99.0320280000 CSID: 72251/CSID: 72251 +DL-Valine/D-Valine/Isovaline/D-Isovaline/Norvaline/D-Norvaline/2-methyl-3-aminobutanoic acid/N-dimethyl-Alanine/3-amino-pentanoic acid Val/D-Val/Ival/D-Ival/Nva/D-Nva/Mab/NdMe-Ala/C5:0-NH2(3) C5H9NO 99.0684140000 CSID: 1148/CSID: 64635/CSID: 85483/PDB: DIV/CSID: 801/CSID: 388660/CSID: 471786/CSID: 9962964/CSID: 11271826 +Leucinol/Isoleucinol Leuol/Ileol C6H13N 99.1047990000 CSID: 71362/CSID: 82355 +2-hydroxy-3-epoxy-butanoic acid C4:0-OH(2)-Ep(3) C4H4O3 100.0160440000 CSID: 15475591 +Succinic acid Suc C4H4O3 100.0160440000 CSID: 7634 +2-hydroxyisovaleric acid/D-2-hydroxyisovalerate Hiv/D-Hiv C5H8O2 100.0524300000 CSID: 90190/CID: 5289545 +2.4-diaminobutyric acid/D-2.4-diaminobutyric acid/2.3-diaminobutyric acid/(2S.3S)-2.3-diaminobutyric acid/(2R.3R)-2.3-diaminobutyric acid Dab/D-Dab/Dbu/L-Dbu/D-Dbu C4H8N2O 100.0636630000 CSID: 457/CID: 638153/CSID: 4475641/CID: 11768553/PDB: VDL +dehydro-cysteine dhCys C3H3NOS 100.9935340000 CSID: 24784832 +Threonine/D-Threonine/allo-Threonine/D-allo-Threonine/Homoserine/D-Homoserine/N-Methyl-Serine/N-Methyl-D-Serine/4-amino-3-hydroxybutyric acid Thr/D-Thr/aThr/D-aThr/Hse/D-Hse/NMe-Ser/D-NMe-Ser/OH-4Abu C4H7NO2 101.0476780000 PDB: THR/PDB: DTH/PDB: ALO/CSID: 81824/CSID: 758/CSID: 2006329/CSID: 481791/PDB: DSE/CSID: 2064 +2.3-dihydroxy-butanoic acid C4:0-OH(2.3) C4H6O3 102.0316940000 CSID: 219301 +DL-Cysteine Cys C3H5NOS 103.0091840000 CSID: 574 +benzoic acid Bz C7H4O 104.0262150000 CSID: 238 +N-methylglutamine NMe-Gln C6H10N2 110.0843980000 CSID: 10652941 +4-oxo-proline/pyroglutamic acid 4oxo-Pro/pGlu C5H5NO2 111.0320280000 CSID: 366185/CSID: 485 +3-Methylproline/4-Methylproline/homoproline/D-homoproline/coronamic acid 3Me-Pro/4Me-Pro/Hpr/D-Hpr/CMA C6H9NO 111.0684140000 CSID: 10610754/CSID: 312597/CSID: 826/CSID: 643442/CSID: 117751 +keto-Leucine/2-epoxy-hexanoic acid/(2E)-5-Hydroxy-3-methyl-2-pentenoic acid k-Leu/C6:0-Ep(2)/OH-MP C6H8O2 112.0524300000 CSID: 69/CSID: 14066572/CSID: 32988805 +Hydroxy-cycloOrnithine/D-Hydroxy-cycloOrnithine OH-cOrn/D-OH-cOrn C5H8N2O 112.0636630000 CSID: 13539649/CSID: 13539649 +heptanoic acid/5-methyl-hexanoic acid C7:0/iC7:0 C7H12O 112.0888150000 CSID: 7803/CID: 12344 +aziridine dicarboxylic acid Azd C4H3NO3 113.0112930000 CSID: 11582505 +3-Hydroxyproline/4-Hydroxyproline/D-Hydroxyproline/2-formamidobutanoic acid 3OH-Pro/4OH-Pro/D-4OH-Pro/NFo-D-Abu C5H7NO2 113.0476780000 CSID: 486216/PDB: HYP/CID: 440014/CSID: 486348 +Leucine/D-Leucine/Isoleucine/D-Isoleucine/allo-Isoleucine/D-allo-Isoleucine/N-Methyl-L-valine/D-N-Methylvaline/3-Methylvaline/D-tert-Leu/2-methyl-3-aminopentanoic acid/D-N-methyl-norvaline Leu/D-Leu/Ile/D-Ile/aIle/D-aIle/NMe-Val/D-NMe-Val/t-Leu/D-t-Leu/Map/D-NMe-Nva C6H11NO 113.0840640000 CSID: 834/CSID: 388617/CSID: 769/CSID: 69017/CSID: 89698/CSID: 85019/CSID: 4225/CSID: 4225/CSID: 270637/CID: 6950340/CSID: 11643060/CSID: 10652938 +hydroxyacetyl propionyl/pentanedioic acid Hap/Pda C5H6O3 114.0316940000 C(C(C(CO)=O)C)(=O)O in CSID: 10477731/CSID: 723 +DL-Asparagine/D-Asparagine/N1-formyl-2.3-Diaminopropionic acid Asn/D-Asn/NFo-Dpr C4H6N2O2 114.0429270000 PDB: ASN/PDB: DSG/C(C(CN)NC=O)(=O)O in CSID: 8873525 +D-Leucic acid (2-hydroxy-4-methylpentanoic acid)/(R)-Leucic acid/3-hydroxyhexanoic acid/2-hydroxy-3-methyl-pentanoic acid/D-2-hydroxy-3-methyl-pentanoic acid C5:0-Me(4)-OH(2)/4Me-D-Hva/C6:0-OH(3)/Hmp/D-Hmp C6H10O2 114.0680800000 CSID: 83753/CSID: 388986/CSID: 133518/CSID: 144317/CSID: 144317 +DL-Ornithine/D-Ornithine Orn/D-Orn C5H10N2O 114.0793130000 CSID: 380/CSID: 64236 +DL-Aspartic acid/D-Aspartic acid/N-formyl-isoserine Asp/D-Asp/NFo-Iser C4H5NO3 115.0269430000 CSID: 411/CSID: 75697/C(C(C(=O)O)O)NC=O in CSID: 8503913 +beta-hydroxyvaline/D-beta-hydroxyvaline/N-Methylthreonine/O-Methylthreonine bOH-Val/D-bOH-Val/NMe-Thr/OMe-Thr C5H9NO2 115.0633290000 CSID: 244525/CID: 192763/CSID: 5373925/CSID: 193545 +2.3-dihydroxy-3-methylbutanoic acid/2.4-dihydroxy-3-methylbutanoic acid iC5:0-OH(2.3)/iC5:0-OH(2.4) C5H8O3 116.0473440000 CSID: 657/C(C(C(CO)C)O)(=O)O in: NOR00082 +2-Methylcysteine/Methylcysteine aMe-Cys/NMe-Cys C4H7NOS 117.0248350000 CSID: 8233116/CSID: 2074082 +4-Hydroxythreonine 4OH-Thr C4H7NO3 117.0425930000 CSID: 3137512 +2.3.4-trihydroxy-butanoic acid C4:0-OH(2.3.4) C4H6O4 118.0266090000 CSID: 388628 +phenylacetic acid Pha C8H6O 118.0418650000 CSID: 10181341 +4-Hydroxybenzoic acid pOH-Bz C7H4O2 120.0211290000 CSID: 132 +trans2.trans4.trans6-trioctaneic acid C8:3(t2.t4.t6) C8H8O 120.0575150000 CSID: 4520024 +hydroxypicolinic acid Hpa C6H3NO2 121.0163780000 CSID: 12827 +oct-7-ynoic acid/2.trans4-octenoic acid C8:0:1(7)/C8:2(2.t4) C8H10O 122.0731650000 CSID: 4472125/CSID: 4944992 +4-oxo-5-methylproline/4-oxo-homoproline/N-Formyl-Proline 4oxo-5Me-Pro/4oxo-Hpr/NFo-Pro C6H7NO2 125.0476780000 CSID: 2564339/CSID: 10739339/CSID: 87055 +octanoic acid/6-methylheptanoic acid C8:0/iC8:0 C8H14O 126.1044650000 CSID: 370/CSID: 81904 +beta-ureido-dehydroAlanine bU-dAla C4H5N3O2 127.0381760000 PDB: UAL +N-formyl-Valine/N-Acetyl-2-aminoisobutyric acid/3-Hydroxy-5-methylproline NFo-Val/Ac-Aib/3OH-5Me-Pro C6H9NO2 127.0633290000 CSID: 90479/CSID: 203779/CSID: 3823469 +N-Methyl-Leucine/D-N-methyl-Leucine/N-Methyl-Isoleucine/N-methyl-alloIsoleucine/D-N-methyl-alloIsoleucine/beta-methylisoleucine/homoisoleucine/alpha-ethylnorvaline/Dolavaline/2-methyl-3-aminohexadecanoic acid NMe-Leu/D-NMe-Leu/NMe-Ile/NMe-aIle/D-NMe-aIle/bMe-Ile/Hil/Et-Nva/Dov/C6:0-Me(2)-NH2(3) C7H13NO 127.0997140000 CSID: 493595/CSID: 493595/CSID: 487199/CCC(C)C(C(=O)O)NC in: NOR00428/CCC(C)C(C(=O)O)NC in: NOR00428/CSID: 19951406/CSID: 454232/CSID: 452678/CSID: 10731564/CSID: 21378848 +DL-Glutamine/D-Glutamine/N-methylasparagine/beta-methyl-asparagine/D-N2-methyl-asparagine/N1-acetyl-2.3-Diaminopropionic acid Gln/D-Gln/NMe-Asn/bMe-Asn/D-N2Me-Asn/NAc-Dpr C5H8N2O2 128.0585780000 PDB: GLN/PDB: DGN/CSID: 311563/CSID: 2284493/CSID: 288387/C(C(CN)NC(C)=O)(=O)O in CSID: 8570696 +3-methoxy-hexanoic acid/3-hydroxy-heptanoic acid C6:0-OMe(3)/C7:0-OH(3) C7H12O2 128.0837300000 CSID: 277923/CSID: 2340494 +DL-Lysine/D-Lysine/beta lysine/N-Hydroxy-histamine Lys/D-Lys/bLys/N-OH-Hta C6H12N2O 128.0949630000 CSID: 843/CSID: 51793/PDB: KBE/C1(CCCN1)CCNO in CSID: 4589228 +DL-Glutamic acid/D-Glutamic Acid/beta-methyl-aspartic acid/D-beta-methyl-aspartic acid/beta-methoxy-aspartic acid/O-acetyl-Serine Glu/D-Glu/bMe-Asp/D-bMe-Asp/bOMe-Asp/Ac-Ser C5H7NO3 129.0425930000 CSID: 591/PDB: DGL/PDB: 2AS/PDB: ACB/CSID: 92764/CSID: 184 +L-acosamine/3-hydroxyleucine/beta-hydroxy-N-Methyl-Valine/gamma-hydroxy-N-Methyl-Valine/L-ristosamine Aco/3OH-Leu/bOH-NMe-Val/gOH-NMe-Val/Ria C6H11NO2 129.0789790000 CSID: 370989/CSID: 244507/CSID: 9205156/CID: 12439044/CSID: 370989 +2-hydroxy-3-methyl-butanedioic acid iC5:0-OH(2)-CA(4) C5H6O4 130.0266090000 CSID: 485839 +Hydroxyasparagine/D-HydroxyAsparagine OH-Asn/D-OH-Asn C4H6N2O3 130.0378420000 CSID: 3670287/CSID: 3670287 +alpha-guanidino Serine gSer C3H6N4O2 130.0490750000 C(C(=O)O)(N)(O)NC(=N)N in: NOR00426 +2.3-dihydroxy-3-methylpentanoic acid aC6:0-OH(2.3) C6H10O3 130.0629940000 CSID: 7 +N5-hydroxy ornithine/D-N5-HydroxyOrnithine/hydroxy-beta lysine OH-Orn/D-OH-Orn/OH-bLys C5H10N2O2 130.0742280000 CSID: 148381/C(CC(C(=O)O)N)CNO in: NOR00205/C(NCC(=O)O)(CCN)O in: NOR00634 +Hydroxyaspartic acid/D-Hydroxyaspartic acid OH-Asp/D-OH-Asp C4H5NO4 131.0218580000 CSID: 5232/CSID: 5232 +Methionine/N.S-dimethylcysteine Met/diMe-Cys C5H9NOS 131.0404850000 CSID: 853/CSID: 4450935 +arabinose/lyxose Ara/Lyx C5H8O4 132.0422590000 CSID: 224/CSID: 831 +L-Olivose Oli C6H12O3 132.0786440000 CSID: 164228 +PhenylGlycine/D-PhenylGlycine Ph-Gly/D-ph-Gly C8H7NO 133.0527640000 CSID: 3732/PDB: PG9 +phenylalaninol Pheol C9H11N 133.0891490000 CSID: 69116 +4-Chloro-Threonine 4Cl-Thr C4H6ClNO2 135.0087060000 CSID: 111708 +2.3-dihydroxy-4-chloro-butanoic acid C4:0-OH(2.3)-Cl(4) C4H5ClO3 135.9927220000 CSID: 25900403 +2.3-dihydroxybenzoic acid diOH-Bz C7H4O3 136.0160440000 CSID: 18 +2-methyl-7-octynoic acid/2.trans4-7-methyl-octenoic acid C8:0:1(7)-Me(2)/iC9:2(2.t4) C9H12O 136.0888150000 CSID: 24770189/CSID: 10761068 +DL-Histidine His C6H7N3O 137.0589120000 CSID: 752 +dehydropyrrolidone dPyr C6H6N2O2 138.0429270000 C1(CC(C(=CC(=O)O)N1)N)=O in CSID: 10199318 +acetylproline/2.3-dimethylpyroglutamic acid Ac-Pro/2Me-3Me-pGlu C7H9NO2 139.0633290000 CSID: 285677/CSID: 13080150 +5.5-dimethyl-2-oxo-hexanoic acid C6:0-Me(5.5)-oxo(2) C8H12O2 140.0837300000 CID: 21197379 +argininal Argal C6H12N4 140.1061960000 CSID: 10655329 +Nonanoic acid/d-6-Methyloctanoic acid/7-Methyloctanoic acid C9:0/aC9:0/iC9:0 C9H16O 140.1201150000 CSID: 7866/CSID: 10015/CSID: 31022 +N-methylchloropyrrole MCP C6H4ClNO 140.9981420000 CSID: 7404981 +N-Acetylisovaline/N-Acetylvaline/N-Formylisoleucine/N-Formylleucin/4-Amino-2.2-dimethyl-3-oxopentanoic acid/4-oxovancosamine Ac-Ival/Ac-Val/NFo-Ile/NFo-Leu/Ibu/4oxo-Van C7H11NO2 141.0789790000 CSID: 272193/CSID: 198159/CSID: 383482/CSID: 90475/CSID: 29322188/C1(C(C(CC(O1)O)(C)N)=O)C in CSID: 10249894 +N-dimethyl-leucine/N.beta-dimethyl-leucine/O-acetyl-leucinol/N.O-dimethyl-isoleucine NdMe-Leu/NMe-bMe-Leu/OAc-Leuol/NMe-OMe-Ile C8H15NO 141.1153640000 CSID: 500040/CID: 15385160/CID: 23037829/CSID: 27194495 +beta-methylglutamine/D-beta-methylglutamine bMe-Gln/D-bMe-Gln C6H10N2O2 142.0742280000 CID: 44602399/CSID: 24604116 +3-hydroxy-octanoic acid/2.2-dimethyl-3-hydroxyhexanoic acid/3-hydroxy-2-methyl-heptanoic acid C8:0-OH(3)/C6:0-Me(2.2)-OH(3)/C7:0-Me(2)-OH(3) C8H14O2 142.0993800000 CSID: 24791/CSID: 21418738/CSID: 27143447 +3-Methyl-Glutamic acid/Glutamic Acid methyl ester/D-Glutamic Acid methyl ester/D-Glutamic Acid methyl ester/2-Aminoadipic acid 3Me-Glu/MeO-Glu/D-MeO-Glu/MeO-D-Glu/Aad C6H9NO3 143.0582430000 CSID: 207514/CSID: 66546/CSID: 66546/CSID: 66546/CSID: 456 +L-actinosamine/L-eremosamine/norstatine/Vancosamine/N-methyl-hydroxyisoleucine Act/Ere/Nst/Van/NMe-OH-Ile C7H13NO2 143.0946290000 CID: 20377364/CSID: 9542085/CSID: 151726/CSID: 164304/CSID: 24770217 +beta-hydroxyglutamine/D-beta-hydroxy-N2-methyl-asparagine/D-beta-hydroxy-N2-methyl-asparagine OH-Gln/Me-OH-Asn/D-N2Me-bOH-Asn C5H8N2O3 144.0534920000 CID: 22592766/CSID: 24604117/C(C(=O)O)(N)C(C(=O)NC)O in: NOR00669 +methoxyaspartic acid OMe-Asp C5H7NO4 145.0375080000 C(C(C(C(=O)O)N)=[O]C)(=O)O in: NOR00717 +3.5-hydroxy-4-amino-hexadecanoic acid C6:0-OH(3.5)-NH2(4) C6H11NO3 145.0738930000 C(CC(C(C(C)O)N)O)(O)=O in: NOR00444 +L-rhamnose Rha C6H10O4 146.0579090000 CSID: 190747 +Methionine-S-oxide O-Met C5H9NO2S 147.0353990000 CSID: 824 +Chloro-Isoleucine Cl-Ile C6H10ClNO 147.0450920000 C(C(O)=O)(N)C(C(C)Cl)C in CSID: 10269389 +DL-Phenylalanine/D-Phenylalanine/beta-phenylalanine/D-beta-phenylalanine/N-methyl-phenylglycine Phe/D-Phe/bPhe/D-bPhe/NMe-Ph-Gly C9H9NO 147.0684140000 CSID: 969/CSID: 64639/CSID: 62403/CSID: 598357/CSID: 198596 +2-hydroxyphenyl-2-oxo-ethanoic acid Hpoe C8H4O3 148.0160440000 CSID: 348 +Phenyl-lactate/D-Phenyl-lactate Ph-Lac/D-Ph-Lac C9H8O2 148.0524300000 CSID: 3715/CID: 643327 +HydroxyPhenylGlycine/D-HydroxyPhenylGlycine Hpg/D-Hpg C8H7NO2 149.0476780000 CSID: 83189/CID: 89853 +2.trans4-8-methyl-noneoic acid iC10:2(2.t4) C10H14O 150.1044650000 C(C=CC=CCCC(C)C)(O)=O in CSID: 16736750 +cysteic acid/D-cysteic acid CysA/D-CysA C3H5NO4S 150.9939280000 PDB: OCS/PDB: 00C +D-4-fluoroPhenylGlycin D-F-ph-Gly C8H6FNO 151.0433430000 CSID: 88776 +3-amino-2-methyloct-7-ynoic acid C8:0:1(7)-Me(2)-NH2(3) C9H13NO 151.0997140000 C(CCCC#C)(C(C(=O)O)C)N in CSID: 8230475 +2-methyl-3-hydroxy-7-octynoic acid C8:0:1(7)-Me(2)-OH(3) C9H12O2 152.0837300000 CSID: 9964309 +2-methyl-8-noneic acid C9:1(8)-Me(2) C10H16O 152.1201150000 CID: 17824924 +Hydroxyhistidine OH-His C6H7N3O2 153.0538260000 CSID: 379547 +N-methyl homo vinylogous Valine NMe-hv-Val C9H15NO 153.1153640000 C(C(NC)C(C)C)=C(C(O)=O)C in CSID: 10213622 +capreomycidine/enduracididine/D-enduracididine Cap/End/D-End C6H10N4O 154.0854610000 CSID: 3818574/CSID: 24775830/CSID: 24775830 +decanoic acid/isodecanoic acid/7-methylnonanoic acid C10:0/iC10:0/aC10:0 C10H18O 154.1357650000 CSID: 2863/CID: 111470/CSID: 4471754 +Alanine-thiazole Ala-Thz C6H7N2OS 155.0279090000 CSID: 23916434 +N-Acetylisoleucine/N-acetyl-Leucine/O-desmethyldolaproine NAc-Ile/NAc-Leu/dDap C8H13NO2 155.0946290000 CSID: 270615/CSID: 1918/C(C1CCCN1)(C(C(=O)O)C)O in CSID: 9938808 +2-Aminononanoic acid Me-AOA C9H17NO 155.1310140000 CSID: 198341 +2-carboxyquinoxaline COOH-Qui C9H4N2O 156.0323630000 CSID: 87301 +N-formyl-Glutamine NFo-Gln C6H8N2O3 156.0534920000 CSID: 2106926 +hydroxyisovalerylpropionyl Hip C8H12O3 156.0786440000 CID: 18942657 +3.4-dimethylglutamine 3Me-4Me-Gln C7H12N2O2 156.0898780000 CSID: 21376706 +DL-Arginine/D-Arginine/L-(+)-Arginine Arg/D-Arg/L-Arg C6H12N4O 156.1011110000 PDB: ARG/PDB: DAR/CSID: 6082 +3-hydroxy-4-methyloctanoic acid/3-hydroxy-nonanoic acid/3-hydroxy-isononanoic acid/3-hydroxy-6-methyloctanoic acid C8:0-Me(4)-OH(3)/C9:0-OH(3)/iC9:0-OH(3)/aC9:0-OH(3) C9H16O2 156.1150300000 CSID: 17247549/CSID: 33630/CID: 22472006/CSID: 10361823 +N-trimethyl-leucine NtMe-Leu C9H18NO 156.1388390000 C(C(=O)O)(CC(C)C)[N](C)(C)C in: NOR00695 +Citrulline/D-Citrulline Cit/D-Cit C6H11N3O2 157.0851270000 CSID: 810/CID: 637599 +isostatine/statine Ist/Sta C8H15NO2 157.1102790000 CSID: 19578058/CSID: 2632509 +N6-formyl-HydroxyOrnithine/D-formyl-hydroxyOrnithine Fo-OH-Orn/D-Fo-OH-Orn C6H10N2O3 158.0691420000 PDB: FHO/PDB: FH7 +alpha-amino-hydroxyadipic acid Ahad C6H9NO4 159.0531580000 CID: 22326384 +N-methyl-2.3-dehydrophenylalanine NMe-dPhe C10H9NO 159.0684140000 C(C(O)=O)(=CC1=CC=CC=C1)NC in CSID: 4444584 +O-methyl-L-rhamnose 2OMe-Rha C7H12O4 160.0735590000 CSID: 4352115 +N-Methyl-Phenylalanine/D-N-Methyl-Phenylalanine/3-methylphenylalanine/Homophenylalanine NMe-Phe/D-NMe-Phe/3Me-Phe/Hph C10H11NO 161.0840640000 PDB: MEA/PDB: ZAE/PDB: APD/CSID: 92605 +Hexose/L-glucose/D-Glucose Hexose/Glc/D-Glc C6H10O5 162.0528230000 CSID: 23139/CSID: 201/PDB: GLC +N-hydroxy-dehydro-HydroxyPhenylGlycine/D-N-hydroxy-dehydro-HydroxyPhenylGlycine OH-dHpg/D-OH-dHpg C8H5NO3 163.0269430000 CID: 20339127/C(C(=O)O)(C1=CC=C(C=C1)O)=NO in: NOR00822 +Methionine sulfone O2-Met C5H9NO3S 163.0303140000 CSID: 63154 +phosphinothricin PT C5H10NO3P 163.0398300000 CSID: 4630 +Tyrosine/D-Tyrosine/beta-tyrosine/Phenylserine/N-methyl-HydroxyPhenylGlycine Tyr/D-Tyr/bTyr/Ph-Ser/NMe-Hpg C9H9NO2 163.0633290000 CSID: 1121/CSID: 64252/CSID: 389285/CSID: 84951/CID: 15118056 +4-hydroxy-D-phenyl-lactate 4OH-D-Ph-Lac C9H8O3 164.0473440000 CID: 9378 +propenoyl-alanyloxazole acid PALOA C8H8N2O2 164.0585780000 C(C=CC1=COC(=N1)C(N)C)(=O)O in CSID: 10477875 +3.4-dichloro-proline Cl2-Pro C5H5Cl2NO 164.9748200000 CID: 21295133 +3.5-dihydroxyphenylglycine/D-3.5-dihydroxyphenylglycine Dhpg/D-Dhpg C8H7NO3 165.0425930000 PDB: D3P/PDB: D3P +cyclo alpha-ketoarginine ck-Arg C7H10N4O 166.0854610000 C12(C(CCCN1C(=NC2=O)-N)N)O in CSID: 9977717 +2.2-dimethyl-3-hydroxy-7-octynoic acid C8:0:1(7)-Me(2.2)-OH(3) C10H14O2 166.0993800000 CSID: 29330001 +2-carboxy-6-hydroxyoctahydroindole Choi C9H13NO2 167.0946290000 C1C(NC2C1CCC(C2)O)C(=O)O in CSID: 10480056 +3-Desoxy-Methyl-4-butenyl-4-methyl threonine 3d-NMe-Bmt C10H17NO 167.1310140000 CC=CCC(C)CC(NC)C(=O)O in CSID: 4953086 +1-methoxy-beta-alanine-thiazole OMe-bAla-Thz C7H8N2OS 168.0357340000 C(N)(CC(=O)OC)C1=NC=CS1 in CSID: 26365309 +2.2-dimethyl-3-hydroxy-7-octenoic acid C8:1(7)-Me(2.2)-OH(3) C10H16O2 168.1150300000 C(C(C(CCCC=C)O)(C)C)(O)=O in CSID: 8732670 +9-methyldecanoic acid/8-methyldecanoic acid iC11:0/aC11:0 C11H20O 168.1514150000 CSID: 4471714/CID: 21813 +4-butenyl-4-methyl threonine/Dolaproine Bmt/Dap C9H15NO2 169.1102790000 CC=CCC(C)C(C(C(=O)O)N)O in CSID: 4444325/C1C(CCN1)C(C(C(O)=O)C)OC in CSID: 7986684 +5-hydroxy-capreomycidine 5OH-Cap C6H10N4O2 170.0803760000 C1C(NC(NC1C(C(=O)O)N)=N)O in CSID: 2301596 +hydroxysecbutyl acetyl propionyl Hysp C9H14O3 170.0942940000 C(C(C(C(O)C(CC)C)=O)C)(=O)O in CSID: 10477730 +homoarginine Har C7H14N4O 170.1167610000 CSID: 8732 +3-hydroxy-decanoic acid/3-hydroxy-2-methyl-nonanoic acid/2.2-dimethyl-3-hydroxy-octanoic acid/2.4-dimethyl-3-hydroxyisooctanoic acid C10:0-OH(3)/C9:0-Me(2)-OH(3)/C8:0-Me(2.2)-OH(3)/iC8:0-Me(2.4)-OH(3) C10H18O2 170.1306800000 CSID: 24790/CSID: 9587708/CSID: 8949283/CSID: 25944197 +N-methoxyacetyl-valine NOMe-Ac-Val C8H13NO3 171.0895430000 CSID: 11856685 +N-desmethyldolaisoleuine/alpha-hydroxy-6-methyl-3-aminooctanoic acid dDil/aC9:0-OH(2)-NH2(3) C9H17NO2 171.1259290000 C(C(N)C(C)CC)(CC(O)=O)OC in CSID: 9938808/C(C(C(CCC(CC)C)N)O)(=O)O in CSID: 10475103 +N-acetyl-HydroxyOrnithine/D-N-acetyl-HydroxyOrnithine/N2-acetyl-N5-hydroxy-L-ornithine Ac-OH-Orn/D-Ac-OH-Orn/N2Ac-OH-Orn C7H12N2O3 172.0847920000 PDB: AHO/CSID: 3670289/CSID: 0 +tryptophanol Trpol C11H12N2 172.1000480000 CSID: 10234 +N-methyldichloropyrrole-2-carboxylic acid MdCP C6H3Cl2NO 174.9591700000 CSID: 21926880 +beta.beta-dimethyl-Methionine-S-oxide bbMe2-O-Met C7H13NO2S 175.0666990000 CSID: 29322228 +alpha-amino-phenyl-valeric acid Apv C11H13NO 175.0997140000 CSID: 262061 +Homotyrosine/N-methyltyrosine/beta-hydroxy-N-Methyl-Phenylalanine Hty/NMe-Tyr/bOH-NMe-Phe C10H11NO2 177.0789790000 CSID: 3365526/CSID: 453342/CSID: 14028021 +propenoyl-2-aminobutanoyloxazole acid PAOA C9H10N2O2 178.0742280000 C(C=CC1=COC(=N1)C(N)CC)(=O)O in CSID: 27026296 +2.4-dimethyl-dec-9-ynoic acid/10-methyl-2.trans4-undecanoic acid C10:0:1(9)-Me(2.4)/iC12:2(2.t4) C12H18O 178.1357650000 C(C(CC(CCCCC#C)C)C)(=O)O in CSID: 23076292/C(C=CC=CCCCCC(C)C)(O)=O in CSID: 24677772 +beta-hydroxy-tyrosine/3.4-dihydroxyphenylalanine bOH-Tyr/diOH-Phe C9H9NO3 179.0582430000 CSID: 13930867/CSID: 813 +proline-thiazole Pro-Thz C8H8N2OS 180.0357340000 C1=CSC(=N1)C2CCC(N2)C(=O)O in CSID: 8971346 +2-methyl-5-dodecenoic acid C12:1(5) C12H20O 180.1514150000 CSID: 4471802 +Anticapsin Aca C9H11NO3 181.0738930000 CSID: 2796855 +D-homoarginine D-Har C7H10N4O2 182.0803760000 CSID: 53295 +vinylogous arginine v-Arg C8H14N4O 182.1167610000 C(C(N)CCCNC(=N)N)=CC(=O)O in CSID: 8946030 +dodecanoic acid/isododecanoic acid C12:0/iC12:0 C12H22O 182.1670650000 CSID: 3756/CID: 75942 +3-chloro-4-hydroxyphenylglycine Cl-Hpg C8H6ClNO2 183.0087060000 CSID: 3817439 +N-methyl-butenylthreonine/2-amino-8-oxo-decanoic acid NMe-Bmt/C10:0-NH2(2)-oxo(8) C10H17NO2 183.1259290000 CSID: 9944222/CSID: 16281719 +2.3-Dehydro-Tryptophan dh-Trp C11H8N2O 184.0636630000 CSID: 7991355 +ureido-4-oxovancosamine U4oxo-Van C8H12N2O3 184.0847920000 C1(C2(C(CC(O1)O)(C)NC(N2)=O)O)C in: NOR00711 +alpha-ketoarginine k-Arg C7H12N4O2 184.0960260000 C(C(C(CCCNC(=N)N)N)=O)(=O)O in CSID: 10477079 +3-hydroxy-undecanoic acid/3-hydroxy-isoundecanoic acid/3-hydroxy-2-methyl-decanoic acid/3-hydroxy-4-methyl-decanoic acid C11:0-OH(3)/iC11:0-OH(3)/C10:0-Me(2)-OH(3)/C10:0-Me(4)-OH(3) C11H20O2 184.1463300000 CSID: 2340495/CC(C)CCCCCC(CC(=O)O)O in: NOR00398/CSID: 13775620/CSID: 28533406 +Dolapyrrolidone Dpy C12H11NO 185.0840640000 CSID: 8735462 +Dolaisoleucine/8-hydroxy-2-amino-decanoic acid/9-hydroxy-2-amino-decanoic acid Dil/C10:0-OH(8)-NH2(2)/C10:0-OH(9)-NH2(2) C10H19NO2 185.1415790000 C(CC(O)=O)(OC)C(C(C)CC)NC in CSID: 7986684/CSID: 26949211/C(C(N)CCCCCCC(C)O)(=O)O in CSID: 10279723 +DL-Tryptophan/D-Tryptophan Trp/D-Trp C11H10N2O 186.0793130000 CSID: 1116/CSID: 8707 +hydrated alpha-ketoarginine hk-Arg C7H14N4O2 186.1116760000 C(C(C(CCCN=C(N)N)N)O)(=O)O in CSID: 8946570 +dehydro vinylogous tyrosine dv-Tyr C11H9NO2 187.0633290000 C(C(N)=CC1=CC=C(C=C1)O)=CC(=O)O in CSID: 8185737 +3.4-dihydroxyArginine diOH-Arg C6H12N4O3 188.0909400000 C(C(C(C(O)=O)N)O)(CN=C(N)N)O in CSID: 8801410 +vinylogous tyrosine/N-acetylphenylalanine v-Tyr/Ac-Phe C11H11NO2 189.0789790000 C(C(N)CC1=CC=C(C=C1)O)=CC(=O)O in CSID: 10477079/CSID: 1923 +kynurenine/D-kynurenine Kyn/D-Kyn C10H10N2O2 190.0742280000 CSID: 823/CID: 1152206 +coronafacic acid CFA C12H14O2 190.0993800000 CSID: 13300082 +N-methyl-4-methylamino-phenylalanine/N.O-dimethyl-tyrosinecarboxamid NMe-MeA-Phe/NMe-OMe-TyrC C11H14N2O 190.1106130000 CID: 21137790/CID: 19003692 +alpha-amino-hydroxyphenyl-valeric acid/N-methyl-homotyrosine/3-methyl-homotyrosine/ethylene inserted tyrosine/N.O-dimethyl-tyrosine/D-N.O-dimethyl-tyrosine Ahv/NMe-Hty/3Me-Hty/e-Tyr/NMe-OMe-Tyr/D-NMe-OMe-Tyr C11H13NO2 191.0946290000 C(C(=O)O)(CCCC1=CC=C(C=C1)O)N in CSID: 142959/C1=CC(=CC=C1CCC(C(=O)O)NC)O in CSID: 10477716/C1=CC(=CC=C1CC(C(C(=O)O)N)C)O in: NOR00265/C(C(N)CC1=CC=C(C=C1)O)CC(=O)O in CSID: 9977717/CID: 18925327/CID: 18925327 +10-methyl-2.trans4-dodecenoic acid aC13:2(2.t4) C13H20O 192.1514150000 C(C=CC=CCCCCC(CC)C)(O)=O in CSID: 24665012 +di-chloro-N-methyl-dehydroLeucine Cl2-NMe-dhLeu C7H9Cl2NO 193.0061200000 C(C(O)=O)(NC)=CC(C)C(Cl)Cl in CSID: 8701761 +beta-methoxy-tyrosine bOMe-Tyr C10H11NO3 193.0738930000 CSID: 16174140 +O-sulfate-2-hydroxy-3-methylpentanoic acid OSu-Hmp C6H10O5S 194.0248940000 C(C(C(CC)C)O[S](=O)(=O)O)(=O)O in CSID: 10477875 +methyloxazoline-isoleucine MeOx-Ile C11H18N2O 194.1419130000 C(N)(C(C)CC)C1=NC(C(C1)C)C(=O)O in CSID: 10477991 +11-methyl-3-dodecenoic acid/10-methyl-3-dodecenoic acid iC13:1(3)/aC13:1(3) C13H22O 194.1670650000 C(CC=CCCCCCCC(C)C)(O)=O in: NOR00296/C(CC=CCCCCCC(CC)C)(O)=O in: NOR00767 +di-chloro-N-methyl-Leucine Cl2-NMe-Leu C7H11Cl2NO 195.0217700000 C(C(O)=O)(NC)CC(C)C(Cl)Cl in CSID: 8773801 +3-hydroxy-5-dodecenoic acid/9-oxo-2.4-dimethyldecanoic acid/8-hydroxy-2.4.6-trimethyl-4-nonenoic acid C12:1(5)-OH(3)/C10:0-Me(2.4)-oxo(9)/C9:1(4)-Me(2.4.6)-OH(8) C12H20O2 196.1463300000 CSID: 10761118/C(C(CC(CCCCC(C)=O)C)C)(=O)O in CSID: 8946480/C(C(CC(=CC(CC(C)O)C)C)C)(O)=O in CSID: 8007368 +11-methyldodecanoic acid/10-methyldodecanoic acid iC13:0/aC13:0 C13H24O 196.1827150000 CID: 33002/CSID: 2282934 +chloro-tyrosine Cl-Tyr C9H8ClNO2 197.0243570000 CSID: 106510 +2-amino-9.10-epoxi-8-oxodecanoic acid C10:0-NH2(2)-Ep(9)-oxo(8) C10H15NO3 197.1051930000 CSID: 11345228 +4-butenyl-4-methyl-N.4-methyl threonine Me2-Bmt C11H19NO2 197.1415790000 CSID: 4450325 +3-hydroxy-dodecanoic acid/3-hydroxy-isododecanoic acid/3-hydroxy-2-methyl-undecanoic acid C12:0-OH(3)/iC12:0-OH(3)/C11:0-Me(2)-OH(3) C12H22O2 198.1619800000 CSID: 85026/CID: 15089799/CSID: 13775586 +9-hydroxy-2-amino-8-oxo-decanoic acid C10:0-OH(9)-NH2(2)-oxo(8) C10H17NO3 199.1208430000 CSID: 25942012 +N-acetyl-N6-formyl-N6-hydroxyOrnithine NAc-Fo-OH-Orn C8H12N2O4 200.0797070000 C(C(=O)O)(NC(C)=O)CCCN(O)C=O in CSID: 3294 +N1-methyl-tryptophan 1Me-Trp C12H12N2O 200.0949630000 CSID: 88584 +5-hydroxytryptophan/phototryptophan OH-Trp/pTrp C11H10N2O2 202.0742280000 CSID: 141/CID: 10331043 +N-methyl-4-dimethylamino-phenylalanine NMe-Me2A-Phe C12H16N2O 204.1262630000 CSID: 27594543 +vinylogous hydroxy tyrosine v-OH-Tyr C11H11NO3 205.0738930000 C(C(N)CC1=CC(=C(C=C1)O)O)=CC(=O)O in CSID: 9204437 +alpha-amino-methoxyphenyl-valeric acid Amv C12H15NO2 205.1102790000 CSID: 9681632 +N-Methyl-Lanthionine NMe-Lan C6H10N2O4S 206.0361280000 C(SCC(C(=O)O)N)C(C(O)=O)NO in: NOR00149 +3-nitrotyrosine 3NO2-Tyr C9H8N2O4 208.0484070000 CSID: 205676 +7-tetradecenoic acid/12-methyl-3-tridecenoic acid C14:1(7)/iC14:1(3) C14H24O 208.1827150000 CSID: 10722652/PDB: LNG +D-PhosphateAsparagine D-PO-Asn C4H7N2O6P 210.0041720000 C(C(C(C(O)=O)N)O[P](O)(=O)O)(=O)N in: NOR00025 +propenoyl-O-methylserinylthiazole acid PMST C9H10N2O2S 210.0462980000 C(C=CC1=CSC(=N1)C(N)COC)(=O)O in CSID: 8503913 +5-oxo-8-hydroxy-2.4.6-trimethyl-4-nonaneic acid C9:1(Me4)-Me(2.4.6)-OH(8)-Oxo(5) C12H18O3 210.1255940000 C(C(CC(C(C(CC(C)O)C)=O)=C)C)(O)=O in CSID: 8434247 +tetradecanoic acid/12-methyl-tridecanoic acid C14:0/iC14:0 C14H26O 210.1983650000 PDB: MYR/CID: 520298 +Chloro-N-methyl-tyrosine/D-3-chloro-N-methyl-Tyrosine Cl-NMe-Tyr/D-Cl-NMe-Tyr C10H10ClNO2 211.0400070000 PDB: CNT/C(C(=O)O)(NC)CC1=CC(=C(C=C1)O)Cl in: NOR00614 +3-amino-tridecanoic acid C13:0-NH2(3) C13H25NO 211.1936140000 CSID: 26283438 +3-hydroxy-tridecanoic acid/3-hydroxy-isotridecanoic acid/3-hydroxy-10-methyl-dodecanoic acid C13:0-OH(3)/iC13:0-OH(3)/aC13:0-OH(3) C13H24O2 212.1776300000 CSID: 4472174/CID: 15089800/C(CC(CCCCCCC(CC)C)O)(O)=O in: NOR00857 +beta-hydroxy-chloro-tyrosine bOH-Cl-Tyr C9H8ClNO3 213.0192710000 CSID: 25938524 +3-amino-6-hydroxy-2-piperidone Ahp C9H14N2O4 214.0953570000 CSID: 25058696 +N-methyl-5-hydroxytryptophan/methoxytryptophan NMe-OH-Trp/OMe-Trp C12H12N2O2 216.0898780000 C(C(=O)O)(NC)CC1=C[N]C2=C1C=C(C=C2)O in CSID: 10476796/O(C(=O)[C@@H](N([H])[H])CC1=C[N](C2=CC=CC=C12)OC)[H] in CSID: 5293532 +2.6-diamino-7-hydroxyazelaic acid Daz C9H16N2O4 216.1110070000 CSID: 391749 +4-amino-7-guanidino-2.3-dihydroxyheptanoic acid Agdha C8H16N4O3 216.1222400000 CSID: 21377788 +3.5-dichloro-4-hydroxyphenylglycine Cl2-Hpg C8H5Cl2NO2 216.9697340000 CSID: 9804791 +DHP-methyloxazolinyl group DMOG C11H9NO4 219.0531580000 CSID: 12721 +N-methoxyacetyl-D-phenylalanine NOMe-Ac-D-Phe C12H13NO3 219.0895430000 CSID: 11859621 +D-6'-chloro-tryptophan D-Cl-Trp C11H9ClN2O 220.0403410000 C(C(=O)O)(N)CC1=NC2=C(C1)C=CC(=C2)Cl in CSID: 8094776 +dihydroxyphenylthiazol group DHPT C10H7NO3S 221.0146640000 CSID: 23110909 +12-methyl-3-tetradecenoic acid aC15:1(3) C15H26O 222.1983650000 C(CC=CCCCCCCCC(CC)C)(O)=O in: NOR00768 +2.3-dihydroxy-2.6.8-trimethyldeca-(4Z.6E)-dienoic acid/2.3-dihydroxy-trans4.trans6-tridecenoic acid aC11:2(4.6)-Me(2.6)-OH(2.3)/C13:2(t4.t6)-OH(2.3) C13H20O3 224.1412450000 C(C(C(C=CC(=CC(CC)C)C)O)(O)C)(O)=O in CSID: 4977118/C(C(C(C=CC=CCCCCCC)O)O)(O)=O in CSID: 4976886 +12-methyltetradecanoic acid aC15:0 C15H28O 224.2140160000 CSID: 20368 +bromophenylalanine Br-Phe C9H8BrNO 224.9789160000 CSID: 77275 +3-amino-tetradecanoic acid/3-amino-isotetradecanoic acid C14:0-NH2(3)/iC14:0-NH2(3) C14H27NO 225.2092640000 CSID: 15571256/CID: 22471993 +3-hydroxy-tetradecanoic acid/3-hydroxy-12-methyl-tridecanoic acid C14:0-OH(3)/iC14:0-OH(3) C14H26O2 226.1932800000 CSID: 15252/CID: 22471995 +tri-chloro-N-methyl-dehydroLeucine Cl3-NMe-dhLeu C7H8Cl3NO 226.9671480000 C(C(O)=O)(NC)=CC(C)C(Cl)(Cl)Cl in CSID: 10477276 +N-acetyltryptophan Ac-Trp C13H12N2O2 228.0898780000 CSID: 1925 +beta.beta.N-trimethyltryptophan bbMe-NMe-Trp C14H16N2O 228.1262630000 C1=CC=CC2=C1C(=C[N]2)C(C(C(O)=O)NC)(C)C in CSID: 8158974 +3-hydroxy-2.2.4-trimethyl-7-hydroxydecanoic acid C10:0-Me(2.2.4)-OH(3.7) C13H24O3 228.1725450000 C(C(C(C(=O)O)(C)C)O)(CCC(CCC)O)C in CSID: 8184030 +tri-chloro-N-methyl-Leucine Cl3-NMe-Leu C7H10Cl3NO 228.9827980000 C(C(O)=O)(NC)CC(C)C(Cl)(Cl)Cl in CSID: 10477275 +thiazolylphenylalanine Phe-Thz C12H10N2OS 230.0513840000 C(N)(CC1=CC=CC=C1)C2=NC(=CS2)C(O)=O in CSID: 8593238 +D-2-carboxy-tryptophan D-COOH-Trp C12H10N2O3 230.0691420000 C(C(O)=O)(N)CC1=C([N]C2=C1C=CC=C2)C(=O)O in CSID: 7987591 +N-methyl-6-chloro-tryptophan NMe-Cl-Trp C12H11ClN2O 234.0559910000 C(C(=O)O)(NC)CC1=C[N]C2=C1C=CC(=C2)Cl in CSID: 8805002 +7-hexadecenoic acid/9-hexadecenoic acid C16:1(7)/C16:1(9) C16H28O 236.2140160000 CSID: 4895966/CSID: 4445872 +2.3-dihydroxy-trans4.trans6-tetradecenoic acid/2.6.8-trimethyl-5.7-dihydroxy-trans2.trans8-undecenoic acid C14:2(t4.t6)-OH(2.3)/C11:2(t2.t8)-Me(2.6.8)-OH(5.7) C14H22O3 238.1568950000 C(C(C(C=CC=CCCCCCCC)O)O)(O)=O in CSID: 8924310/C(C(=CCC(C(C(C(=CCC)C)O)C)O)C)(O)=O in CSID: 10481263 +hexadecanoic acid C16:0 C16H30O 238.2296660000 CSID: 960 +beta-methyl-bromophenylalanine bMe-Br-Phe C10H10BrNO 238.9945660000 C(C(=O)O)(C(C1=CC=C(C=C1)Br)C)N in CSID: 10475327 +3-amino-pentadecanoic acid/3-amino-isopentadecanoic acid/3-amino-12-methyl-tetradecanoic acid C15:0-NH2(3)/iC15:0-NH2(3)/aC15:0-NH2(3) C15H29NO 239.2249150000 CSID: 26283439/C(CC(CCCCCCCCCC(C)C)N)(O)=O in: NOR00784/C(CC(CCCCCCCCC(CC)C)N)(O)=O in: NOR00785 +3-hydroxy-13-methyltetradecanoic acid/3-hydroxy-pentadecanoic acid/3-hydroxy-isopentadecanoic acid/3-hydroxy-12-methyl-tetradecanoic acid C14:0-Me(13)-OH(3)/C15:0-OH(3)/iC15:0-OH(3)/aC15:0-OH(3) C15H28O2 240.2089300000 CSID: 9218624/CSID: 158374/CSID: 9218624/C(CC(CCCCCCCCC(CC)C)O)(O)=O in: NOR00211 +bromotyrosine/beta-hydroxy-bromophenylalanine Br-Tyr/bOH-Br-Phe C9H8BrNO2 240.9738310000 CSID: 131083/CSID: 19757850 +beta.beta.N1.N-tetramethyltryptophan bbNMe-NMe-Trp C15H18N2O 242.1419130000 C1=CC=CC2=C1C(=C[N]2C)C(C(C(O)=O)NC)(C)C in CSID: 8570259 +3.4-dihydroxy-tetradecanoic acid/ 3-hydroxy-2.2.4-trimethyl-7-methoxydecanoic acid C14:0-OH(3.4)/C10:0-Me(2.2.4)-OH(3)-OMe(7) C14H26O3 242.1881950000 CID: 22667431/CSID: 28587148 +3-amino-4-hydroxy-6-methyl-8-phenyl-5.7-octadienoic acid C8:2(5.7)-Me(6)-OH(4)-NH2(3)-Ph(8) C15H17NO2 243.1259290000 C(CC(C(C=C(C=CC1=CC=CC=C1)C)O)N)(=O)O in CSID: 10475327 +tri-chloro-2-hydroxy-N-methyl-Leucine/tri-chloro-5-hydroxy-N-methyl-Leucine Cl3-2OH-NMe-Leu/Cl3-5OH-NMe-Leu C7H10Cl3NO2 244.9777130000 C(C(O)=O)(NC)(CC(C)C(Cl)(Cl)Cl)O in CSID: 10477276/C(C(O)=O)(NC)CC(CO)C(Cl)(Cl)Cl in: NOR00511 +N-methyl-6-chloro-5-hydroxytryptophan NMe-Cl-OH-Trp C12H11ClN2O2 250.0509060000 C(C(=O)O)(NC)CC1=C[N]C2=C1C=C(C(=C2)Cl)O in CSID: 10473575 +2.3-dihydroxy-trans4.trans6-pentadecenoic acid C15:2(t4.t6)-OH(2.3) C15H24O3 252.1725450000 C(C(C(C=CC=CCCCCCCCC)O)O)(O)=O in CSID: 4976888 +3-hydroxy-9-hexadecenoic acid C16:1(9)-OH(3) C16H28O2 252.2089300000 C(CC(CCCCCC=CCCCCCC)O)(O)=O in: NOR00720 +3-amino-hexadecanoic acid/3-amino-isohexadecanoic acid C16:0-NH2(3)/iC16:0-NH2(3) C16H31NO 253.2405650000 CSID: 24597602/C(CC(CCCCCCCCCCC(C)C)N)(O)=O in: NOR00793 +3-hydroxy-hexadecanoic acid/3-hydroxy-isohexadecanoic acid C16:0-OH(3)/iC16:0-OH(3) C16H30O2 254.2245800000 CSID: 266538/C(CC(CCCCCCCCCCC(C)C)O)(O)=O in: NOR00897 +D-3-bromo-N-methyl-Tyrosine D-Br-NMe-Tyr C10H10BrNO2 254.9894810000 CSID: 2128826 +pyoverdin Pa A chromophore ChrPaA C13H11N3O3 257.0800410000 C1=C(C(=CC2=C1N3C(C(=C2)N)=NC(CC3)C(O)=O)O)O in CSID: 0 +N1-carboxy-bichomotryptophan N1-COOH-bhTrp C14H14N2O3 258.1004420000 C(CC1=C[N](C2=C1C=CC=C2)C(=O)O)CC(C(=O)O)N in CSID: 9968260 +isopyoverdin chromophore/pyoverdin chromophore ChrI/ChrP C13H13N3O3 259.0956910000 C1=C(C(=CC2=C1N3C(C(=C2)N)NC(CC3)C(O)=O)O)O in: NOR00163/C1=C(C(=CC2=C1N3C(C(=C2)N)NC(CC3)C(O)=O)O)O in CID: 5289234 +5.6-dihydropyoverdin chromophore ChrD C13H15N3O3 261.1113410000 C1=C(C(=CC2=C1N3C(C(N)C2)NCCC3C(O)=O)O)O in: NOR00903 +D-6-chloro-N2-formamidotryptophan D-Cl-CONH2-Trp C12H10ClN3O2 263.0461550000 C(C(O)=O)(N)CC1=C[N](C2=C1C=CC(=C2)Cl)C(=O)N in CSID: 8138519 +3-amino-8-phenyl-2.4.5-trihydroxyoct-7-enoic acid C8:1(7)-OH(2.4.5)-NH2(3)-Ph(8) C14H17NO4 263.1157580000 CSID: 29330841 +5-bromo-tryptophan Br-Trp C11H9BrN2O 263.9898150000 CSID: 87339 +9-octadecenoic acid C18:1(9) C18H32O 264.2453160000 CSID: 553123 +8.10-Dimethyl-9-hydroxy-7-methoxytridecadienoic acid DHMDA C16H26O3 266.1881950000 C(C(C(CCC)C)O)(C(C=CC=CCC(=O)O)OC)C in CSID: 10479168 +3-amino-14-methyl-hexadecanoic acid/3-amino-15-methyl-hexadecanoic acid aC17:0-NH2(3)/iC17:0-NH2(3) C17H33NO 267.2562150000 C(CC(CCCCCCCCCCC(CC)C)N)(O)=O in CSID: 2340866/C(CC(CCCCCCCCCCCC(C)C)N)(O)=O in: NOR00801 +3-hydroxy-14-methyl-hexadecanoic acid/3-hydroxy-15-methyl-hexadecanoic acid aC17:0-OH(3)/iC17:0-OH(3) C17H32O2 268.2402300000 C(CC(CCCCCCCCCCC(CC)C)O)(O)=O in: NOR00900/CSID: 141849 +3.4-dihydroxy-hexadecanoic acid C16:0-OH(3.4) C16H30O3 270.2194950000 CID: 22348653 +4-propenoyl-2-tyrosylthiazole acid PTTA C14H12N2O2S 272.0619480000 C(O)(=O)C=CC1=CSC(=N1)C(N)CC2=CC=C(C=C2)O in CSID: 16738243 +N-methyl-2-Bromo-tryptophan NMe-Br-Trp C12H11BrN2O 278.0054650000 C(C(=O)O)(NC)CC1=C([N]C2=C1C=CC=C2)Br in CSID: 8007368 +2-bromo-5-hydroxytryptophan Br-OH-Trp C11H9BrN2O2 279.9847300000 CSID: 643874 +3-hydroxy-9-octadecenoic acid C18:1(9)-OH(3) C18H32O2 280.2402300000 C(CC(CCCCCC=CCCCCCCCC)O)(O)=O in: NOR00724 +azotobactins chromophore ChrA C14H11N3O4 285.0749560000 C1=C(C(=CC2=C1N4C3C(=C2)NC(N3CCC4C(O)=O)=O)O)O in: NOR00208 +O-demethyl-Adda DMAdda C19H25NO2 299.1885290000 C(C(C(C=CC(=CC(C(CC1=CC=CC=C1)O)C)C)N)C)(O)=O in: NOR00129 +D-3-iodo-N-methyl-Tyrosine D-I-NMe-Tyr C10H10INO2 302.9756110000 C(C(=O)O)(NC)CC1=CC(=C(C=C1)O)I in CSID: 9017332 +actinomycin chromophore ChrAct C16H10N2O5 310.0589710000 CSID: 86817 +3-amino-9-methoxy-2.6.8-trimethyl-10-phenyldeca-4.6-dienoic acid Adda C20H27NO2 313.2041790000 CSID: 10471100 +3-amino-4-hydroxy-6-methyl-8-(p-bromophenyl)-5.7-octadienoic acid C8:2(5.7)-Me(6)-OH(4)-NH2(3)-brPh(8) C15H16BrNO2 321.0364310000 C(CC(C(C=C(C=CC1=CC=C(C=C1)Br)C)O)N)(=O)O in CSID: 10476834 +3-amino-6-methyl-12-phenyl-2.4.5-trihydroxydodeca-7.9.11-trienoic acid C12:3(7.9.11)-Me(6)-OH(2.4.5)-NH2(3)-Ph(12) C19H23NO4 329.1627080000 C(C(C(C(C(C(C=CC=CC=CC1=CC=CC=C1)C)O)O)N)O)(O)=O in CSID: 8923613 +3-amino-10-(p-ethoxyphenyl)-2.4.5-trihydroxydeca-7.9-dienoic acid C10:2(7.9)-OH(2.4.5)-NH2(3)-ePh(10) C18H23NO5 333.1576230000 CSID: 29330839 +O-Acetyl-O-demethylAdda ADMAdda C21H27NO3 341.1990940000 C(C(C(C=CC(=CC(C(CC1=CC=CC=C1)OC(C)=O)C)C)N)C)(O)=O in: NOR00144 +3-amino-6.10-dimethyl-12-phenyl-2.4.5-trihydroxydodeca-7.9.11-trienoic acid C12:3(7.9.11)-Me(6.10)-OH(2.4.5)-NH2(3)-Ph(12) C20H25NO4 343.1783580000 C(C(C(C(C(C(C=CC=C(C=CC1=CC=CC=C1)C)C)O)O)N)O)(O)=O in CSID: 10187168 +3-amino-6-methyl-12-(p-methoxyphenyl)-2.4.5-trihydroxydodec-11-enoic acid C12:1(11)-Me(6)-OH(2.4.5)-NH2(3)-mPhe(11) C20H29NO5 363.2045730000 CSID: 29330842 diff --git a/CycloBranch/BrickDatabases/db291.txt b/CycloBranch/BrickDatabases/db291.txt index 36ef16b..d529a12 100644 --- a/CycloBranch/BrickDatabases/db291.txt +++ b/CycloBranch/BrickDatabases/db291.txt @@ -1,291 +1,291 @@ -Ethanolamine Eta C2H5N 43.0421991657 CSID: 13835336 -Glycine Gly C2H3NO 57.0214637236 CSID: 730 -pyrrolidone Pyr C4H5N 67.0421991657 CSID: 11530 -dehydroalanine dh-Ala C3H3NO 69.0214637236 CSID: 110510 -pyruvic acid Pya C3H2O2 70.0054793084 CSID: 1031 -butanoic acid C4:0 C4H6O 70.0418648147 CSID: 259 -DL-Alanine/D-Alanine/beta-Alanine/N-Methyl-Glycine Ala/D-Ala/bAla/NMe-Gly C3H5NO 71.0371137878 CSID: 582/CSID: 64234/CSID: 234/CSID: 1057 -Lactic acid/D-lactic acid Lac/D-Lac C3H4O2 72.0211293726 CSID: 592/CSID: 55423 -Serinol Serol C3H7NO 73.0527638520 CSID: 61591 -2.3-dehydro-2-aminobutyric acid/homoserine lactone/N-Methyl-dehydroalanine/hydroxy pyrrolidone dhAbu/HseL/NMe-Dha/OH-Pyr C4H5NO 83.0371137878 CSID: 4952645/CSID: 66194/CSID: 118845/CSID: 134682 -2-hydroxy-3-butenoic acid C4:1(3)-OH(2) C4H4O2 84.0211293726 CSID: 141066 -2-methyl-butanoic acid C4:0-Me(2) C5H8O 84.0575148789 CSID: 8012 -alpha-formylGlycine aFo-Gly C3H3NO2 85.0163783457 CSID: 28 -N-Methyl-L-alanine/N-methyl-beta-alanine/alpha-aminobutyric acid/D-alpha-aminobutyric acid/2-Methylalanine/methyl alaninate NMe-Ala/NMe-bAla/Abu/D-Abu/Aib/D-3OMe-Ala C4H7NO 85.0527638520 CSID: 4450824/CSID: 68396/PDB: ABA/PDB: DBB/CSID: 5891/CSID: 99878 -isovalinol/valinol Ivalol/Valol C5H11N 85.0891493583 CSID: 8329525/CSID: 71352 -3-hydroxybutanoic acid C4:0-OH(3) C4H6O2 86.0367794368 CSID: 428 -2.3-Diaminopropionic acid Dpr C3H6N2O 86.0480128251 CSID: 357 -DL-Serine/D-Serine/isoserine Ser/D-Ser/Iser C3H5NO2 87.0320284099 CSID: 597/CSID: 64231/CSID: 10793 -Sorbic acid C6:2(t2.t4) C6H6O 94.0418648147 CSID: 558605 -methyl-succinimide Me-Suc C5H5NO 95.0371137878 CSID: 122158 -proline carboxamid ProC C5H8N2 96.0687482672 CSID: 479142 -DL-Proline/D-Proline/2-methylamino-2-dehydrobutyric acid/norcoronamic acid Pro/D-Pro/2Dh-Mabu/norCMA C5H7NO 97.0527638520 CSID: 594/CSID: 8640/CSID: 16743754/CSID: 28708240 -3-methylvaleric acid/hexanoic acid Me-Vaa/C6:0 C6H10O 98.0731649431 CSID: 7469/CSID: 8552 -N-formyl-Alanine/D-N-formyl-Alanine NFo-Ala/D-NFo-Ala C4H5NO2 99.0320284099 CSID: 72251/CSID: 72251 -DL-Valine/D-Valine/Isovaline/D-Isovaline/Norvaline/D-Norvaline/2-methyl-3-aminobutanoic acid/N-dimethyl-Alanine/3-amino-pentanoic acid Val/D-Val/Ival/D-Ival/Nva/D-Nva/Mab/NdMe-Ala/C5:0-NH2(3) C5H9NO 99.0684139162 CSID: 1148/CSID: 64635/CSID: 85483/PDB: DIV/CSID: 801/CSID: 388660/CSID: 471786/CSID: 9962964/CSID: 11271826 -Leucinol/Isoleucinol Leuol/Ileol C6H13N 99.1047994225 CSID: 71362/CSID: 82355 -2-hydroxy-3-epoxy-butanoic acid C4:0-OH(2)-Ep(3) C4H4O3 100.0160439947 CSID: 15475591 -Succinic acid Suc C4H4O3 100.0160439947 CSID: 7634 -2-hydroxyisovaleric acid/D-2-hydroxyisovalerate Hiv/D-Hiv C5H8O2 100.0524295010 CSID: 90190/CID: 5289545 -2.4-diaminobutyric acid/D-2.4-diaminobutyric acid/2.3-diaminobutyric acid/(2S.3S)-2.3-diaminobutyric acid/(2R.3R)-2.3-diaminobutyric acid Dab/D-Dab/Dbu/L-Dbu/D-Dbu C4H8N2O 100.0636628893 CSID: 457/CID: 638153/CSID: 4475641/CID: 11768553/PDB: VDL -dehydro-cysteine dhCys C3H3NOS 100.9935344136 CSID: 24784832 -Threonine/D-Threonine/allo-Threonine/D-allo-Threonine/Homoserine/D-Homoserine/N-Methyl-Serine/N-Methyl-D-Serine/4-amino-3-hydroxybutyric acid Thr/D-Thr/aThr/D-aThr/Hse/D-Hse/NMe-Ser/D-NMe-Ser/OH-4Abu C4H7NO2 101.0476784741 PDB: THR/PDB: DTH/PDB: ALO/CSID: 81824/CSID: 758/CSID: 2006329/CSID: 481791/PDB: DSE/CSID: 2064 -2.3-dihydroxy-butanoic acid C4:0-OH(2.3) C4H6O3 102.0316940589 CSID: 219301 -DL-Cysteine Cys C3H5NOS 103.0091844778 CSID: 574 -benzoic acid Bz C7H4O 104.0262147505 CSID: 238 -N-methylglutamine NMe-Gln C6H10N2 110.0843983314 CSID: 10652941 -4-oxo-proline/pyroglutamic acid 4oxo-Pro/pGlu C5H5NO2 111.0320284099 CSID: 366185/CSID: 485 -3-Methylproline/4-Methylproline/homoproline/D-homoproline/coronamic acid 3Me-Pro/4Me-Pro/Hpr/D-Hpr/CMA C6H9NO 111.0684139162 CSID: 10610754/CSID: 312597/CSID: 826/CSID: 643442/CSID: 117751 -keto-Leucine/2-epoxy-hexanoic acid k-Leu/C6:0-Ep(2) C6H8O2 112.0524295010 CSID: 69/CSID: 14066572 -Hydroxy-cycloOrnithine/D-Hydroxy-cycloOrnithine OH-cOrn/D-OH-cOrn C5H8N2O 112.0636628893 CSID: 13539649/CSID: 13539649 -heptanoic acid/5-methyl-hexanoic acid C7:0/iC7:0 C7H12O 112.0888150073 CSID: 7803/CID: 12344 -aziridine dicarboxylic acid Azd C4H3NO3 113.0112929678 CSID: 11582505 -3-Hydroxyproline/4-Hydroxyproline/D-Hydroxyproline/2-formamidobutanoic acid 3OH-Pro/4OH-Pro/D-4OH-Pro/NFo-D-Abu C5H7NO2 113.0476784741 CSID: 486216/PDB: HYP/CID: 440014/CSID: 486348 -Leucine/D-Leucine/Isoleucine/D-Isoleucine/allo-Isoleucine/D-allo-Isoleucine/N-Methyl-L-valine/D-N-Methylvaline/3-Methylvaline/D-tert-Leu/2-methyl-3-aminopentanoic acid/D-N-methyl-norvaline Leu/D-Leu/Ile/D-Ile/aIle/D-aIle/NMe-Val/D-NMe-Val/t-Leu/D-t-Leu/Map/D-NMe-Nva C6H11NO 113.0840639804 CSID: 834/CSID: 388617/CSID: 769/CSID: 69017/CSID: 89698/CSID: 85019/CSID: 4225/CSID: 4225/CSID: 270637/CID: 6950340/CSID: 11643060/CSID: 10652938 -hydroxyacetyl propionyl/pentanedioic acid Hap/Pda C5H6O3 114.0316940589 C(C(C(CO)=O)C)(=O)O in CSID: 10477731/CSID: 723 -DL-Asparagine/D-Asparagine/N1-formyl-2.3-Diaminopropionic acid Asn/D-Asn/NFo-Dpr C4H6N2O2 114.0429274472 PDB: ASN/PDB: DSG/C(C(CN)NC=O)(=O)O in CSID: 8873525 -D-Leucic acid (2-hydroxy-4-methylpentanoic acid)/(R)-Leucic acid/3-hydroxyhexanoic acid/2-hydroxy-3-methyl-pentanoic acid/D-2-hydroxy-3-methyl-pentanoic acid C5:0-Me(4)-OH(2)/4Me-D-Hva/C6:0-OH(3)/Hmp/D-Hmp C6H10O2 114.0680795652 CSID: 83753/CSID: 388986/CSID: 133518/CSID: 144317/CSID: 144317 -DL-Ornithine/D-Ornithine Orn/D-Orn C5H10N2O 114.0793129535 CSID: 380/CSID: 64236 -DL-Aspartic acid/D-Aspartic acid/N-formyl-isoserine Asp/D-Asp/NFo-Iser C4H5NO3 115.0269430320 CSID: 411/CSID: 75697/C(C(C(=O)O)O)NC=O in CSID: 8503913 -beta-hydroxyvaline/D-beta-hydroxyvaline/N-Methylthreonine/O-Methylthreonine bOH-Val/D-bOH-Val/NMe-Thr/OMe-Thr C5H9NO2 115.0633285383 CSID: 244525/CID: 192763/CSID: 5373925/CSID: 193545 -2.3-dihydroxy-3-methylbutanoic acid/2.4-dihydroxy-3-methylbutanoic acid iC5:0-OH(2.3)/iC5:0-OH(2.4) C5H8O3 116.0473441231 CSID: 657/C(C(C(CO)C)O)(=O)O in: NOR00082 -2-Methylcysteine/Methylcysteine aMe-Cys/NMe-Cys C4H7NOS 117.0248345420 CSID: 8233116/CSID: 2074082 -4-Hydroxythreonine 4OH-Thr C4H7NO3 117.0425930962 CSID: 3137512 -2.3.4-trihydroxy-butanoic acid C4:0-OH(2.3.4) C4H6O4 118.0266086810 CSID: 388628 -phenylacetic acid Pha C8H6O 118.0418648147 CSID: 10181341 -4-Hydroxybenzoic acid pOH-Bz C7H4O2 120.0211293726 CSID: 132 -trans2.trans4.trans6-trioctaneic acid C8:3(t2.t4.t6) C8H8O 120.0575148789 CSID: 4520024 -hydroxypicolinic acid Hpa C6H3NO2 121.0163783457 CSID: 12827 -oct-7-ynoic acid/2.trans4-octenoic acid C8:0:1(7)/C8:2(2.t4) C8H10O 122.0731649431 CSID: 4472125/CSID: 4944992 -4-oxo-5-methylproline/4-oxo-homoproline/N-Formyl-Proline 4oxo-5Me-Pro/4oxo-Hpr/NFo-Pro C6H7NO2 125.0476784741 CSID: 2564339/CSID: 10739339/CSID: 87055 -octanoic acid/6-methylheptanoic acid C8:0/iC8:0 C8H14O 126.1044650715 CSID: 370/CSID: 81904 -beta-ureido-dehydroAlanine bU-dAla C4H5N3O2 127.0381764203 PDB: UAL -N-formyl-Valine/N-Acetyl-2-aminoisobutyric acid/3-Hydroxy-5-methylproline NFo-Val/Ac-Aib/3OH-5Me-Pro C6H9NO2 127.0633285383 CSID: 90479/CSID: 203779/CSID: 3823469 -N-Methyl-Leucine/D-N-methyl-Leucine/N-Methyl-Isoleucine/N-methyl-alloIsoleucine/D-N-methyl-alloIsoleucine/beta-methylisoleucine/homoisoleucine/alpha-ethylnorvaline/Dolavaline/2-methyl-3-aminohexadecanoic acid NMe-Leu/D-NMe-Leu/NMe-Ile/NMe-aIle/D-NMe-aIle/bMe-Ile/Hil/Et-Nva/Dov/C6:0-Me(2)-NH2(3) C7H13NO 127.0997140446 CSID: 493595/CSID: 493595/CSID: 487199/CCC(C)C(C(=O)O)NC in: NOR00428/CCC(C)C(C(=O)O)NC in: NOR00428/CSID: 19951406/CSID: 454232/CSID: 452678/CSID: 10731564/CSID: 21378848 -DL-Glutamine/D-Glutamine/N-methylasparagine/beta-methyl-asparagine/D-N2-methyl-asparagine/N1-acetyl-2.3-Diaminopropionic acid Gln/D-Gln/NMe-Asn/bMe-Asn/D-N2Me-Asn/NAc-Dpr C5H8N2O2 128.0585775114 PDB: GLN/PDB: DGN/CSID: 311563/CSID: 2284493/CSID: 288387/C(C(CN)NC(C)=O)(=O)O in CSID: 8570696 -3-methoxy-hexanoic acid/3-hydroxy-heptanoic acid C6:0-OMe(3)/C7:0-OH(3) C7H12O2 128.0837296294 CSID: 277923/CSID: 2340494 -DL-Lysine/D-Lysine/beta lysine/N-Hydroxy-histamine Lys/D-Lys/bLys/N-OH-Hta C6H12N2O 128.0949630177 CSID: 843/CSID: 51793/PDB: KBE/C1(CCCN1)CCNO in CSID: 4589228 -DL-Glutamic acid/D-Glutamic Acid/beta-methyl-aspartic acid/D-beta-methyl-aspartic acid/beta-methoxy-aspartic acid/O-acetyl-Serine Glu/D-Glu/bMe-Asp/D-bMe-Asp/bOMe-Asp/Ac-Ser C5H7NO3 129.0425930962 CSID: 591/PDB: DGL/PDB: 2AS/PDB: ACB/CSID: 92764/CSID: 184 -L-acosamine/3-hydroxyleucine/beta-hydroxy-N-Methyl-Valine/gamma-hydroxy-N-Methyl-Valine/L-ristosamine Aco/3OH-Leu/bOH-NMe-Val/gOH-NMe-Val/Ria C6H11NO2 129.0789786025 CSID: 370989/CSID: 244507/CSID: 9205156/CID: 12439044/CSID: 370989 -2-hydroxy-3-methyl-butanedioic acid iC5:0-OH(2)-CA(4) C5H6O4 130.0266086810 CSID: 485839 -Hydroxyasparagine/D-HydroxyAsparagine OH-Asn/D-OH-Asn C4H6N2O3 130.0378420693 CSID: 3670287/CSID: 3670287 -alpha-guanidino Serine gSer C3H6N4O2 130.0490754576 C(C(=O)O)(N)(O)NC(=N)N in: NOR00426 -2.3-dihydroxy-3-methylpentanoic acid aC6:0-OH(2.3) C6H10O3 130.0629941873 CSID: 7 -N5-hydroxy ornithine/D-N5-HydroxyOrnithine/hydroxy-beta lysine OH-Orn/D-OH-Orn/OH-bLys C5H10N2O2 130.0742275756 CSID: 148381/C(CC(C(=O)O)N)CNO in: NOR00205/C(NCC(=O)O)(CCN)O in: NOR00634 -Hydroxyaspartic acid/D-Hydroxyaspartic acid OH-Asp/D-OH-Asp C4H5NO4 131.0218576541 CSID: 5232/CSID: 5232 -Methionine/N.S-dimethylcysteine Met/diMe-Cys C5H9NOS 131.0404846062 CSID: 853/CSID: 4450935 -arabinose/lyxose Ara/Lyx C5H8O4 132.0422587452 CSID: 224/CSID: 831 -L-Olivose Oli C6H12O3 132.0786442515 CSID: 164228 -PhenylGlycine/D-PhenylGlycine Ph-Gly/D-ph-Gly C8H7NO 133.0527638520 CSID: 3732/PDB: PG9 -phenylalaninol Pheol C9H11N 133.0891493583 CSID: 69116 -4-Chloro-Threonine 4Cl-Thr C4H6ClNO2 135.0087064420 CSID: 111708 -2.3-dihydroxy-4-chloro-butanoic acid C4:0-OH(2.3)-Cl(4) C4H5ClO3 135.9927220268 CSID: 25900403 -2.3-dihydroxybenzoic acid diOH-Bz C7H4O3 136.0160439947 CSID: 18 -2-methyl-7-octynoic acid/2.trans4-7-methyl-octenoic acid C8:0:1(7)-Me(2)/iC9:2(2.t4) C9H12O 136.0888150073 CSID: 24770189/CSID: 10761068 -DL-Histidine His C6H7N3O 137.0589118624 CSID: 752 -dehydropyrrolidone dPyr C6H6N2O2 138.0429274472 C1(CC(C(=CC(=O)O)N1)N)=O in CSID: 10199318 -acetylproline/2.3-dimethylpyroglutamic acid Ac-Pro/2Me-3Me-pGlu C7H9NO2 139.0633285383 CSID: 285677/CSID: 13080150 -5.5-dimethyl-2-oxo-hexanoic acid C6:0-Me(5.5)-oxo(2) C8H12O2 140.0837296294 CID: 21197379 -argininal Argal C6H12N4 140.1061964060 CSID: 10655329 -Nonanoic acid/d-6-Methyloctanoic acid/7-Methyloctanoic acid C9:0/aC9:0/iC9:0 C9H16O 140.1201151357 CSID: 7866/CSID: 10015/CSID: 31022 -N-methylchloropyrrole MCP C6H4ClNO 140.9981417557 CSID: 7404981 -N-Acetylisovaline/N-Acetylvaline/N-Formylisoleucine/N-Formylleucin/4-Amino-2.2-dimethyl-3-oxopentanoic acid/4-oxovancosamine Ac-Ival/Ac-Val/NFo-Ile/NFo-Leu/Ibu/4oxo-Van C7H11NO2 141.0789786025 CSID: 272193/CSID: 198159/CSID: 383482/CSID: 90475/CSID: 29322188/C1(C(C(CC(O1)O)(C)N)=O)C in CSID: 10249894 -N-dimethyl-leucine/N.beta-dimethyl-leucine/O-acetyl-leucinol/N.O-dimethyl-isoleucine NdMe-Leu/NMe-bMe-Leu/OAc-Leuol/NMe-OMe-Ile C8H15NO 141.1153641088 CSID: 500040/CID: 15385160/CID: 23037829/CSID: 27194495 -beta-methylglutamine/D-beta-methylglutamine bMe-Gln/D-bMe-Gln C6H10N2O2 142.0742275756 CID: 44602399/CSID: 24604116 -3-hydroxy-octanoic acid/2.2-dimethyl-3-hydroxyhexanoic acid/3-hydroxy-2-methyl-heptanoic acid C8:0-OH(3)/C6:0-Me(2.2)-OH(3)/C7:0-Me(2)-OH(3) C8H14O2 142.0993796936 CSID: 24791/CSID: 21418738/CSID: 27143447 -3-Methyl-Glutamic acid/Glutamic Acid methyl ester/D-Glutamic Acid methyl ester/D-Glutamic Acid methyl ester/2-Aminoadipic acid 3Me-Glu/MeO-Glu/D-MeO-Glu/MeO-D-Glu/Aad C6H9NO3 143.0582431604 CSID: 207514/CSID: 66546/CSID: 66546/CSID: 66546/CSID: 456 -L-actinosamine/L-eremosamine/norstatine/Vancosamine/N-methyl-hydroxyisoleucine Act/Ere/Nst/Van/NMe-OH-Ile C7H13NO2 143.0946286667 CID: 20377364/CSID: 9542085/CSID: 151726/CSID: 164304/CSID: 24770217 -beta-hydroxyglutamine/D-beta-hydroxy-N2-methyl-asparagine/D-beta-hydroxy-N2-methyl-asparagine OH-Gln/Me-OH-Asn/D-N2Me-bOH-Asn C5H8N2O3 144.0534921335 CID: 22592766/CSID: 24604117/C(C(=O)O)(N)C(C(=O)NC)O in: NOR00669 -methoxyaspartic acid OMe-Asp C5H7NO4 145.0375077183 C(C(C(C(=O)O)N)=[O]C)(=O)O in: NOR00717 -3.5-hydroxy-4-amino-hexadecanoic acid C6:0-OH(3.5)-NH2(4) C6H11NO3 145.0738932246 C(CC(C(C(C)O)N)O)(O)=O in: NOR00444 -L-rhamnose Rha C6H10O4 146.0579088094 CSID: 190747 -Methionine-S-oxide O-Met C5H9NO2S 147.0353992283 CSID: 824 -Chloro-Isoleucine Cl-Ile C6H10ClNO 147.0450919483 C(C(O)=O)(N)C(C(C)Cl)C in CSID: 10269389 -DL-Phenylalanine/D-Phenylalanine/beta-phenylalanine/D-beta-phenylalanine/N-methyl-phenylglycine Phe/D-Phe/bPhe/D-bPhe/NMe-Ph-Gly C9H9NO 147.0684139162 CSID: 969/CSID: 64639/CSID: 62403/CSID: 598357/CSID: 198596 -2-hydroxyphenyl-2-oxo-ethanoic acid Hpoe C8H4O3 148.0160439947 CSID: 348 -Phenyl-lactate/D-Phenyl-lactate Ph-Lac/D-Ph-Lac C9H8O2 148.0524295010 CSID: 3715/CID: 643327 -HydroxyPhenylGlycine/D-HydroxyPhenylGlycine Hpg/D-Hpg C8H7NO2 149.0476784741 CSID: 83189/CID: 89853 -2.trans4-8-methyl-noneoic acid iC10:2(2.t4) C10H14O 150.1044650715 C(C=CC=CCCC(C)C)(O)=O in CSID: 16736750 -cysteic acid/D-cysteic acid CysA/D-CysA C3H5NO4S 150.9939283441 PDB: OCS/PDB: 00C -D-4-fluoroPhenylGlycin D-F-ph-Gly C8H6FNO 151.0433428199 CSID: 88776 -3-amino-2-methyloct-7-ynoic acid C8:0:1(7)-Me(2)-NH2(3) C9H13NO 151.0997140446 C(CCCC#C)(C(C(=O)O)C)N in CSID: 8230475 -2-methyl-3-hydroxy-7-octynoic acid C8:0:1(7)-Me(2)-OH(3) C9H12O2 152.0837296294 CSID: 9964309 -2-methyl-8-noneic acid C9:1(8)-Me(2) C10H16O 152.1201151357 CID: 17824924 -Hydroxyhistidine OH-His C6H7N3O2 153.0538264845 CSID: 379547 -N-methyl homo vinylogous Valine NMe-hv-Val C9H15NO 153.1153641088 C(C(NC)C(C)C)=C(C(O)=O)C in CSID: 10213622 -capreomycidine/enduracididine/D-enduracididine Cap/End/D-End C6H10N4O 154.0854609639 CSID: 3818574/CSID: 24775830/CSID: 24775830 -decanoic acid/isodecanoic acid/7-methylnonanoic acid C10:0/iC10:0/aC10:0 C10H18O 154.1357651999 CSID: 2863/CID: 111470/CSID: 4471754 -Alanine-thiazole Ala-Thz C6H7N2OS 155.0279085472 CSID: 23916434 -N-Acetylisoleucine/N-acetyl-Leucine/O-desmethyldolaproine NAc-Ile/NAc-Leu/dDap C8H13NO2 155.0946286667 CSID: 270615/CSID: 1918/C(C1CCCN1)(C(C(=O)O)C)O in CSID: 9938808 -2-Aminononanoic acid Me-AOA C9H17NO 155.1310141730 CSID: 198341 -2-carboxyquinoxaline COOH-Qui C9H4N2O 156.0323627609 CSID: 87301 -N-formyl-Glutamine NFo-Gln C6H8N2O3 156.0534921335 CSID: 2106926 -hydroxyisovalerylpropionyl Hip C8H12O3 156.0786442515 CID: 18942657 -3.4-dimethylglutamine 3Me-4Me-Gln C7H12N2O2 156.0898776398 CSID: 21376706 -DL-Arginine/D-Arginine/L-(+)-Arginine Arg/D-Arg/L-Arg C6H12N4O 156.1011110281 PDB: ARG/PDB: DAR/CSID: 6082 -3-hydroxy-4-methyloctanoic acid/3-hydroxy-nonanoic acid/3-hydroxy-isononanoic acid/3-hydroxy-6-methyloctanoic acid C8:0-Me(4)-OH(3)/C9:0-OH(3)/iC9:0-OH(3)/aC9:0-OH(3) C9H16O2 156.1150297578 CSID: 17247549/CSID: 33630/CID: 22472006/CSID: 10361823 -N-trimethyl-leucine NtMe-Leu C9H18NO 156.1388392051 C(C(=O)O)(CC(C)C)[N](C)(C)C in: NOR00695 -Citrulline/D-Citrulline Cit/D-Cit C6H11N3O2 157.0851266129 CSID: 810/CID: 637599 -isostatine/statine Ist/Sta C8H15NO2 157.1102787309 CSID: 19578058/CSID: 2632509 -N6-formyl-HydroxyOrnithine/D-formyl-hydroxyOrnithine Fo-OH-Orn/D-Fo-OH-Orn C6H10N2O3 158.0691421977 PDB: FHO/PDB: FH7 -alpha-amino-hydroxyadipic acid Ahad C6H9NO4 159.0531577825 CID: 22326384 -N-methyl-2.3-dehydrophenylalanine NMe-dPhe C10H9NO 159.0684139162 C(C(O)=O)(=CC1=CC=CC=C1)NC in CSID: 4444584 -O-methyl-L-rhamnose 2OMe-Rha C7H12O4 160.0735588736 CSID: 4352115 -N-Methyl-Phenylalanine/D-N-Methyl-Phenylalanine/3-methylphenylalanine/Homophenylalanine NMe-Phe/D-NMe-Phe/3Me-Phe/Hph C10H11NO 161.0840639804 PDB: MEA/PDB: ZAE/PDB: APD/CSID: 92605 -Hexose/L-glucose/D-Glucose Hexose/Glc/D-Glc C6H10O5 162.0528234315 CSID: 23139/CSID: 201/PDB: GLC -N-hydroxy-dehydro-HydroxyPhenylGlycine/D-N-hydroxy-dehydro-HydroxyPhenylGlycine OH-dHpg/D-OH-dHpg C8H5NO3 163.0269430320 CID: 20339127/C(C(=O)O)(C1=CC=C(C=C1)O)=NO in: NOR00822 -Methionine sulfone O2-Met C5H9NO3S 163.0303138504 CSID: 63154 -phosphinothricin PT C5H10NO3P 163.0398297025 CSID: 4630 -Tyrosine/D-Tyrosine/beta-tyrosine/Phenylserine/N-methyl-HydroxyPhenylGlycine Tyr/D-Tyr/bTyr/Ph-Ser/NMe-Hpg C9H9NO2 163.0633285383 CSID: 1121/CSID: 64252/CSID: 389285/CSID: 84951/CID: 15118056 -4-hydroxy-D-phenyl-lactate 4OH-D-Ph-Lac C9H8O3 164.0473441231 CID: 9378 -propenoyl-alanyloxazole acid PALOA C8H8N2O2 164.0585775114 C(C=CC1=COC(=N1)C(N)C)(=O)O in CSID: 10477875 -3.4-dichloro-proline Cl2-Pro C5H5Cl2NO 164.9748197878 CID: 21295133 -3.5-dihydroxyphenylglycine/D-3.5-dihydroxyphenylglycine Dhpg/D-Dhpg C8H7NO3 165.0425930962 PDB: D3P/PDB: D3P -cyclo alpha-ketoarginine ck-Arg C7H10N4O 166.0854609639 C12(C(CCCN1C(=NC2=O)-N)N)O in CSID: 9977717 -2.2-dimethyl-3-hydroxy-7-octynoic acid C8:0:1(7)-Me(2.2)-OH(3) C10H14O2 166.0993796936 CSID: 29330001 -2-carboxy-6-hydroxyoctahydroindole Choi C9H13NO2 167.0946286667 C1C(NC2C1CCC(C2)O)C(=O)O in CSID: 10480056 -3-Desoxy-Methyl-4-butenyl-4-methyl threonine 3d-NMe-Bmt C10H17NO 167.1310141730 CC=CCC(C)CC(NC)C(=O)O in CSID: 4953086 -1-methoxy-beta-alanine-thiazole OMe-bAla-Thz C7H8N2OS 168.0357335793 C(N)(CC(=O)OC)C1=NC=CS1 in CSID: 26365309 -2.2-dimethyl-3-hydroxy-7-octenoic acid C8:1(7)-Me(2.2)-OH(3) C10H16O2 168.1150297578 C(C(C(CCCC=C)O)(C)C)(O)=O in CSID: 8732670 -9-methyldecanoic acid/8-methyldecanoic acid iC11:0/aC11:0 C11H20O 168.1514152641 CSID: 4471714/CID: 21813 -4-butenyl-4-methyl threonine/Dolaproine Bmt/Dap C9H15NO2 169.1102787309 CC=CCC(C)C(C(C(=O)O)N)O in CSID: 4444325/C1C(CCN1)C(C(C(O)=O)C)OC in CSID: 7986684 -5-hydroxy-capreomycidine 5OH-Cap C6H10N4O2 170.0803755860 C1C(NC(NC1C(C(=O)O)N)=N)O in CSID: 2301596 -hydroxysecbutyl acetyl propionyl Hysp C9H14O3 170.0942943157 C(C(C(C(O)C(CC)C)=O)C)(=O)O in CSID: 10477730 -homoarginine Har C7H14N4O 170.1167610923 CSID: 8732 -3-hydroxy-decanoic acid/3-hydroxy-2-methyl-nonanoic acid/2.2-dimethyl-3-hydroxy-octanoic acid/2.4-dimethyl-3-hydroxyisooctanoic acid C10:0-OH(3)/C9:0-Me(2)-OH(3)/C8:0-Me(2.2)-OH(3)/iC8:0-Me(2.4)-OH(3) C10H18O2 170.1306798220 CSID: 24790/CSID: 9587708/CSID: 8949283/CSID: 25944197 -N-methoxyacetyl-valine NOMe-Ac-Val C8H13NO3 171.0895432888 CSID: 11856685 -N-desmethyldolaisoleuine/alpha-hydroxy-6-methyl-3-aminooctanoic acid dDil/aC9:0-OH(2)-NH2(3) C9H17NO2 171.1259287951 C(C(N)C(C)CC)(CC(O)=O)OC in CSID: 9938808/C(C(C(CCC(CC)C)N)O)(=O)O in CSID: 10475103 -N-acetyl-HydroxyOrnithine/D-N-acetyl-HydroxyOrnithine Ac-OH-Orn/D-Ac-OH-Orn C7H12N2O3 172.0847922619 PDB: AHO/CSID: 3670289 -tryptophanol Trpol C11H12N2 172.1000483956 CSID: 10234 -N-methyldichloropyrrole-2-carboxylic acid MdCP C6H3Cl2NO 174.9591697236 CSID: 21926880 -beta.beta-dimethyl-Methionine-S-oxide bbMe2-O-Met C7H13NO2S 175.0666993567 CSID: 29322228 -alpha-amino-phenyl-valeric acid Apv C11H13NO 175.0997140446 CSID: 262061 -Homotyrosine/N-methyltyrosine/beta-hydroxy-N-Methyl-Phenylalanine Hty/NMe-Tyr/bOH-NMe-Phe C10H11NO2 177.0789786025 CSID: 3365526/CSID: 453342/CSID: 14028021 -propenoyl-2-aminobutanoyloxazole acid PAOA C9H10N2O2 178.0742275756 C(C=CC1=COC(=N1)C(N)CC)(=O)O in CSID: 27026296 -2.4-dimethyl-dec-9-ynoic acid/10-methyl-2.trans4-undecanoic acid C10:0:1(9)-Me(2.4)/iC12:2(2.t4) C12H18O 178.1357651999 C(C(CC(CCCCC#C)C)C)(=O)O in CSID: 23076292/C(C=CC=CCCCCC(C)C)(O)=O in CSID: 24677772 -beta-hydroxy-tyrosine/3.4-dihydroxyphenylalanine bOH-Tyr/diOH-Phe C9H9NO3 179.0582431604 CSID: 13930867/CSID: 813 -proline-thiazole Pro-Thz C8H8N2OS 180.0357335793 C1=CSC(=N1)C2CCC(N2)C(=O)O in CSID: 8971346 -2-methyl-5-dodecenoic acid C12:1(5) C12H20O 180.1514152641 CSID: 4471802 -Anticapsin Aca C9H11NO3 181.0738932246 CSID: 2796855 -D-homoarginine D-Har C7H10N4O2 182.0803755860 CSID: 53295 -vinylogous arginine v-Arg C8H14N4O 182.1167610923 C(C(N)CCCNC(=N)N)=CC(=O)O in CSID: 8946030 -dodecanoic acid/isododecanoic acid C12:0/iC12:0 C12H22O 182.1670653283 CSID: 3756/CID: 75942 -3-chloro-4-hydroxyphenylglycine Cl-Hpg C8H6ClNO2 183.0087064420 CSID: 3817439 -N-methyl-butenylthreonine/2-amino-8-oxo-decanoic acid NMe-Bmt/C10:0-NH2(2)-oxo(8) C10H17NO2 183.1259287951 CSID: 9944222/CSID: 16281719 -2.3-Dehydro-Tryptophan dh-Trp C11H8N2O 184.0636628893 CSID: 7991355 -ureido-4-oxovancosamine U4oxo-Van C8H12N2O3 184.0847922619 C1(C2(C(CC(O1)O)(C)NC(N2)=O)O)C in: NOR00711 -alpha-ketoarginine k-Arg C7H12N4O2 184.0960256502 C(C(C(CCCNC(=N)N)N)=O)(=O)O in CSID: 10477079 -3-hydroxy-undecanoic acid/3-hydroxy-isoundecanoic acid/3-hydroxy-2-methyl-decanoic acid/3-hydroxy-4-methyl-decanoic acid C11:0-OH(3)/iC11:0-OH(3)/C10:0-Me(2)-OH(3)/C10:0-Me(4)-OH(3) C11H20O2 184.1463298862 CSID: 2340495/CC(C)CCCCCC(CC(=O)O)O in: NOR00398/CSID: 13775620/CSID: 28533406 -Dolapyrrolidone Dpy C12H11NO 185.0840639804 CSID: 8735462 -Dolaisoleucine/8-hydroxy-2-amino-decanoic acid/9-hydroxy-2-amino-decanoic acid Dil/C10:0-OH(8)-NH2(2)/C10:0-OH(9)-NH2(2) C10H19NO2 185.1415788593 C(CC(O)=O)(OC)C(C(C)CC)NC in CSID: 7986684/CSID: 26949211/C(C(N)CCCCCCC(C)O)(=O)O in CSID: 10279723 -DL-Tryptophan/D-Tryptophan Trp/D-Trp C11H10N2O 186.0793129535 CSID: 1116/CSID: 8707 -hydrated alpha-ketoarginine hk-Arg C7H14N4O2 186.1116757144 C(C(C(CCCN=C(N)N)N)O)(=O)O in CSID: 8946570 -dehydro vinylogous tyrosine dv-Tyr C11H9NO2 187.0633285383 C(C(N)=CC1=CC=C(C=C1)O)=CC(=O)O in CSID: 8185737 -3.4-dihydroxyArginine diOH-Arg C6H12N4O3 188.0909402723 C(C(C(C(O)=O)N)O)(CN=C(N)N)O in CSID: 8801410 -vinylogous tyrosine/N-acetylphenylalanine v-Tyr/Ac-Phe C11H11NO2 189.0789786025 C(C(N)CC1=CC=C(C=C1)O)=CC(=O)O in CSID: 10477079/CSID: 1923 -kynurenine/D-kynurenine Kyn/D-Kyn C10H10N2O2 190.0742275756 CSID: 823/CID: 1152206 -coronafacic acid CFA C12H14O2 190.0993796936 CSID: 13300082 -N-methyl-4-methylamino-phenylalanine/N.O-dimethyl-tyrosinecarboxamid NMe-MeA-Phe/NMe-OMe-TyrC C11H14N2O 190.1106130819 CID: 21137790/CID: 19003692 -alpha-amino-hydroxyphenyl-valeric acid/N-methyl-homotyrosine/3-methyl-homotyrosine/ethylene inserted tyrosine/N.O-dimethyl-tyrosine/D-N.O-dimethyl-tyrosine Ahv/NMe-Hty/3Me-Hty/e-Tyr/NMe-OMe-Tyr/D-NMe-OMe-Tyr C11H13NO2 191.0946286667 C(C(=O)O)(CCCC1=CC=C(C=C1)O)N in CSID: 142959/C1=CC(=CC=C1CCC(C(=O)O)NC)O in CSID: 10477716/C1=CC(=CC=C1CC(C(C(=O)O)N)C)O in: NOR00265/C(C(N)CC1=CC=C(C=C1)O)CC(=O)O in CSID: 9977717/CID: 18925327/CID: 18925327 -10-methyl-2.trans4-dodecenoic acid aC13:2(2.t4) C13H20O 192.1514152641 C(C=CC=CCCCCC(CC)C)(O)=O in CSID: 24665012 -di-chloro-N-methyl-dehydroLeucine Cl2-NMe-dhLeu C7H9Cl2NO 193.0061199162 C(C(O)=O)(NC)=CC(C)C(Cl)Cl in CSID: 8701761 -beta-methoxy-tyrosine bOMe-Tyr C10H11NO3 193.0738932246 CSID: 16174140 -O-sulfate-2-hydroxy-3-methylpentanoic acid OSu-Hmp C6H10O5S 194.0248941215 C(C(C(CC)C)O[S](=O)(=O)O)(=O)O in CSID: 10477875 -methyloxazoline-isoleucine MeOx-Ile C11H18N2O 194.1419132103 C(N)(C(C)CC)C1=NC(C(C1)C)C(=O)O in CSID: 10477991 -11-methyl-3-dodecenoic acid/10-methyl-3-dodecenoic acid iC13:1(3)/aC13:1(3) C13H22O 194.1670653283 C(CC=CCCCCCCC(C)C)(O)=O in: NOR00296/C(CC=CCCCCCC(CC)C)(O)=O in: NOR00767 -di-chloro-N-methyl-Leucine Cl2-NMe-Leu C7H11Cl2NO 195.0217699804 C(C(O)=O)(NC)CC(C)C(Cl)Cl in CSID: 8773801 -3-hydroxy-5-dodecenoic acid/9-oxo-2.4-dimethyldecanoic acid/8-hydroxy-2.4.6-trimethyl-4-nonenoic acid C12:1(5)-OH(3)/C10:0-Me(2.4)-oxo(9)/C9:1(4)-Me(2.4.6)-OH(8) C12H20O2 196.1463298862 CSID: 10761118/C(C(CC(CCCCC(C)=O)C)C)(=O)O in CSID: 8946480/C(C(CC(=CC(CC(C)O)C)C)C)(O)=O in CSID: 8007368 -11-methyldodecanoic acid/10-methyldodecanoic acid iC13:0/aC13:0 C13H24O 196.1827153925 CID: 33002/CSID: 2282934 -chloro-tyrosine Cl-Tyr C9H8ClNO2 197.0243565062 CSID: 106510 -2-amino-9.10-epoxi-8-oxodecanoic acid C10:0-NH2(2)-Ep(9)-oxo(8) C10H15NO3 197.1051933530 CSID: 11345228 -4-butenyl-4-methyl-N.4-methyl threonine Me2-Bmt C11H19NO2 197.1415788593 CSID: 4450325 -3-hydroxy-dodecanoic acid/3-hydroxy-isododecanoic acid/3-hydroxy-2-methyl-undecanoic acid C12:0-OH(3)/iC12:0-OH(3)/C11:0-Me(2)-OH(3) C12H22O2 198.1619799504 CSID: 85026/CID: 15089799/CSID: 13775586 -9-hydroxy-2-amino-8-oxo-decanoic acid C10:0-OH(9)-NH2(2)-oxo(8) C10H17NO3 199.1208434172 CSID: 25942012 -N-acetyl-N6-formyl-N6-hydroxyOrnithine NAc-Fo-OH-Orn C8H12N2O4 200.0797068840 C(C(=O)O)(NC(C)=O)CCCN(O)C=O in CSID: 3294 -N1-methyl-tryptophan 1Me-Trp C12H12N2O 200.0949630177 CSID: 88584 -5-hydroxytryptophan/phototryptophan OH-Trp/pTrp C11H10N2O2 202.0742275756 CSID: 141/CID: 10331043 -N-methyl-4-dimethylamino-phenylalanine NMe-Me2A-Phe C12H16N2O 204.1262631461 CSID: 27594543 -vinylogous hydroxy tyrosine v-OH-Tyr C11H11NO3 205.0738932246 C(C(N)CC1=CC(=C(C=C1)O)O)=CC(=O)O in CSID: 9204437 -alpha-amino-methoxyphenyl-valeric acid Amv C12H15NO2 205.1102787309 CSID: 9681632 -N-Methyl-Lanthionine NMe-Lan C6H10N2O4S 206.0361275098 C(SCC(C(=O)O)N)C(C(O)=O)NO in: NOR00149 -3-nitrotyrosine 3NO2-Tyr C9H8N2O4 208.0484067556 CSID: 205676 -7-tetradecenoic acid/12-methyl-3-tridecenoic acid C14:1(7)/iC14:1(3) C14H24O 208.1827153925 CSID: 10722652/PDB: LNG -D-PhosphateAsparagine D-PO-Asn C4H7N2O6P 210.0041724777 C(C(C(C(O)=O)N)O[P](O)(=O)O)(=O)N in: NOR00025 -propenoyl-O-methylserinylthiazole acid PMST C9H10N2O2S 210.0462982656 C(C=CC1=CSC(=N1)C(N)COC)(=O)O in CSID: 8503913 -5-oxo-8-hydroxy-2.4.6-trimethyl-4-nonaneic acid C9:1(Me4)-Me(2.4.6)-OH(8)-Oxo(5) C12H18O3 210.1255944441 C(C(CC(C(C(CC(C)O)C)=O)=C)C)(O)=O in CSID: 8434247 -tetradecanoic acid/12-methyl-tridecanoic acid C14:0/iC14:0 C14H26O 210.1983654567 PDB: MYR/CID: 520298 -Chloro-N-methyl-tyrosine/D-3-chloro-N-methyl-Tyrosine Cl-NMe-Tyr/D-Cl-NMe-Tyr C10H10ClNO2 211.0400065704 PDB: CNT/C(C(=O)O)(NC)CC1=CC(=C(C=C1)O)Cl in: NOR00614 -3-amino-tridecanoic acid C13:0-NH2(3) C13H25NO 211.1936144298 CSID: 26283438 -3-hydroxy-tridecanoic acid/3-hydroxy-isotridecanoic acid/3-hydroxy-10-methyl-dodecanoic acid C13:0-OH(3)/iC13:0-OH(3)/aC13:0-OH(3) C13H24O2 212.1776300146 CSID: 4472174/CID: 15089800/C(CC(CCCCCCC(CC)C)O)(O)=O in: NOR00857 -beta-hydroxy-chloro-tyrosine bOH-Cl-Tyr C9H8ClNO3 213.0192711283 CSID: 25938524 -3-amino-6-hydroxy-2-piperidone Ahp C9H14N2O4 214.0953569482 CSID: 25058696 -N-methyl-5-hydroxytryptophan/methoxytryptophan NMe-OH-Trp/OMe-Trp C12H12N2O2 216.0898776398 C(C(=O)O)(NC)CC1=C[N]C2=C1C=C(C=C2)O in CSID: 10476796/O(C(=O)[C@@H](N([H])[H])CC1=C[N](C2=CC=CC=C12)OC)[H] in CSID: 5293532 -2.6-diamino-7-hydroxyazelaic acid Daz C9H16N2O4 216.1110070124 CSID: 391749 -4-amino-7-guanidino-2.3-dihydroxyheptanoic acid Agdha C8H16N4O3 216.1222404007 CSID: 21377788 -3.5-dichloro-4-hydroxyphenylglycine Cl2-Hpg C8H5Cl2NO2 216.9697344099 CSID: 9804791 -DHP-methyloxazolinyl group DMOG C11H9NO4 219.0531577825 CSID: 12721 -N-methoxyacetyl-D-phenylalanine NOMe-Ac-D-Phe C12H13NO3 219.0895432888 CSID: 11859621 -D-6'-chloro-tryptophan D-Cl-Trp C11H9ClN2O 220.0403409214 C(C(=O)O)(N)CC1=NC2=C(C1)C=CC(=C2)Cl in CSID: 8094776 -dihydroxyphenylthiazol group DHPT C10H7NO3S 221.0146637862 CSID: 23110909 -12-methyl-3-tetradecenoic acid aC15:1(3) C15H26O 222.1983654567 C(CC=CCCCCCCCC(CC)C)(O)=O in: NOR00768 -2.3-dihydroxy-2.6.8-trimethyldeca-(4Z.6E)-dienoic acid/2.3-dihydroxy-trans4.trans6-tridecenoic acid aC11:2(4.6)-Me(2.6)-OH(2.3)/C13:2(t4.t6)-OH(2.3) C13H20O3 224.1412445083 C(C(C(C=CC(=CC(CC)C)C)O)(O)C)(O)=O in CSID: 4977118/C(C(C(C=CC=CCCCCCC)O)O)(O)=O in CSID: 4976886 -12-methyltetradecanoic acid aC15:0 C15H28O 224.2140155209 CSID: 20368 -bromophenylalanine Br-Phe C9H8BrNO 224.9789158841 CSID: 77275 -3-amino-tetradecanoic acid/3-amino-isotetradecanoic acid C14:0-NH2(3)/iC14:0-NH2(3) C14H27NO 225.2092644940 CSID: 15571256/CID: 22471993 -3-hydroxy-tetradecanoic acid/3-hydroxy-12-methyl-tridecanoic acid C14:0-OH(3)/iC14:0-OH(3) C14H26O2 226.1932800788 CSID: 15252/CID: 22471995 -tri-chloro-N-methyl-dehydroLeucine Cl3-NMe-dhLeu C7H8Cl3NO 226.9671478841 C(C(O)=O)(NC)=CC(C)C(Cl)(Cl)Cl in CSID: 10477276 -N-acetyltryptophan Ac-Trp C13H12N2O2 228.0898776398 CSID: 1925 -beta.beta.N-trimethyltryptophan bbMe-NMe-Trp C14H16N2O 228.1262631461 C1=CC=CC2=C1C(=C[N]2)C(C(C(O)=O)NC)(C)C in CSID: 8158974 -3-hydroxy-2.2.4-trimethyl-7-hydroxydecanoic acid C10:0-Me(2.2.4)-OH(3.7) C13H24O3 228.1725446367 C(C(C(C(=O)O)(C)C)O)(CCC(CCC)O)C in CSID: 8184030 -tri-chloro-N-methyl-Leucine Cl3-NMe-Leu C7H10Cl3NO 228.9827979483 C(C(O)=O)(NC)CC(C)C(Cl)(Cl)Cl in CSID: 10477275 -thiazolylphenylalanine Phe-Thz C12H10N2OS 230.0513836435 C(N)(CC1=CC=CC=C1)C2=NC(=CS2)C(O)=O in CSID: 8593238 -D-2-carboxy-tryptophan D-COOH-Trp C12H10N2O3 230.0691421977 C(C(O)=O)(N)CC1=C([N]C2=C1C=CC=C2)C(=O)O in CSID: 7987591 -N-methyl-6-chloro-tryptophan NMe-Cl-Trp C12H11ClN2O 234.0559909856 C(C(=O)O)(NC)CC1=C[N]C2=C1C=CC(=C2)Cl in CSID: 8805002 -7-hexadecenoic acid/9-hexadecenoic acid C16:1(7)/C16:1(9) C16H28O 236.2140155209 CSID: 4895966/CSID: 4445872 -2.3-dihydroxy-trans4.trans6-tetradecenoic acid/2.6.8-trimethyl-5.7-dihydroxy-trans2.trans8-undecenoic acid C14:2(t4.t6)-OH(2.3)/C11:2(t2.t8)-Me(2.6.8)-OH(5.7) C14H22O3 238.1568945725 C(C(C(C=CC=CCCCCCCC)O)O)(O)=O in CSID: 8924310/C(C(=CCC(C(C(C(=CCC)C)O)C)O)C)(O)=O in CSID: 10481263 -hexadecanoic acid C16:0 C16H30O 238.2296655851 CSID: 960 -beta-methyl-bromophenylalanine bMe-Br-Phe C10H10BrNO 238.9945659483 C(C(=O)O)(C(C1=CC=C(C=C1)Br)C)N in CSID: 10475327 -3-amino-pentadecanoic acid/3-amino-isopentadecanoic acid/3-amino-12-methyl-tetradecanoic acid C15:0-NH2(3)/iC15:0-NH2(3)/aC15:0-NH2(3) C15H29NO 239.2249145582 CSID: 26283439/C(CC(CCCCCCCCCC(C)C)N)(O)=O in: NOR00784/C(CC(CCCCCCCCC(CC)C)N)(O)=O in: NOR00785 -3-hydroxy-13-methyltetradecanoic acid/3-hydroxy-pentadecanoic acid/3-hydroxy-isopentadecanoic acid/3-hydroxy-12-methyl-tetradecanoic acid C14:0-Me(13)-OH(3)/C15:0-OH(3)/iC15:0-OH(3)/aC15:0-OH(3) C15H28O2 240.2089301430 CSID: 9218624/CSID: 158374/CSID: 9218624/C(CC(CCCCCCCCC(CC)C)O)(O)=O in: NOR00211 -bromotyrosine/beta-hydroxy-bromophenylalanine Br-Tyr/bOH-Br-Phe C9H8BrNO2 240.9738305062 CSID: 131083/CSID: 19757850 -beta.beta.N1.N-tetramethyltryptophan bbNMe-NMe-Trp C15H18N2O 242.1419132103 C1=CC=CC2=C1C(=C[N]2C)C(C(C(O)=O)NC)(C)C in CSID: 8570259 -3.4-dihydroxy-tetradecanoic acid/ 3-hydroxy-2.2.4-trimethyl-7-methoxydecanoic acid C14:0-OH(3.4)/C10:0-Me(2.2.4)-OH(3)-OMe(7) C14H26O3 242.1881947009 CID: 22667431/CSID: 28587148 -3-amino-4-hydroxy-6-methyl-8-phenyl-5.7-octadienoic acid C8:2(5.7)-Me(6)-OH(4)-NH2(3)-Ph(8) C15H17NO2 243.1259287951 C(CC(C(C=C(C=CC1=CC=CC=C1)C)O)N)(=O)O in CSID: 10475327 -tri-chloro-2-hydroxy-N-methyl-Leucine/tri-chloro-5-hydroxy-N-methyl-Leucine Cl3-2OH-NMe-Leu/Cl3-5OH-NMe-Leu C7H10Cl3NO2 244.9777125704 C(C(O)=O)(NC)(CC(C)C(Cl)(Cl)Cl)O in CSID: 10477276/C(C(O)=O)(NC)CC(CO)C(Cl)(Cl)Cl in: NOR00511 -N-methyl-6-chloro-5-hydroxytryptophan NMe-Cl-OH-Trp C12H11ClN2O2 250.0509056077 C(C(=O)O)(NC)CC1=C[N]C2=C1C=C(C(=C2)Cl)O in CSID: 10473575 -2.3-dihydroxy-trans4.trans6-pentadecenoic acid C15:2(t4.t6)-OH(2.3) C15H24O3 252.1725446367 C(C(C(C=CC=CCCCCCCCC)O)O)(O)=O in CSID: 4976888 -3-hydroxy-9-hexadecenoic acid C16:1(9)-OH(3) C16H28O2 252.2089301430 C(CC(CCCCCC=CCCCCCC)O)(O)=O in: NOR00720 -3-amino-hexadecanoic acid/3-amino-isohexadecanoic acid C16:0-NH2(3)/iC16:0-NH2(3) C16H31NO 253.2405646224 CSID: 24597602/C(CC(CCCCCCCCCCC(C)C)N)(O)=O in: NOR00793 -3-hydroxy-hexadecanoic acid/3-hydroxy-isohexadecanoic acid C16:0-OH(3)/iC16:0-OH(3) C16H30O2 254.2245802072 CSID: 266538/C(CC(CCCCCCCCCCC(C)C)O)(O)=O in: NOR00897 -D-3-bromo-N-methyl-Tyrosine D-Br-NMe-Tyr C10H10BrNO2 254.9894805704 CSID: 2128826 -pyoverdin Pa A chromophore ChrPaA C13H11N3O3 257.0800412350 C1=C(C(=CC2=C1N3C(C(=C2)N)=NC(CC3)C(O)=O)O)O in CSID: 0 -N1-carboxy-bichomotryptophan N1-COOH-bhTrp C14H14N2O3 258.1004423261 C(CC1=C[N](C2=C1C=CC=C2)C(=O)O)CC(C(=O)O)N in CSID: 9968260 -isopyoverdin chromophore/pyoverdin chromophore ChrI/ChrP C13H13N3O3 259.0956912992 C1=C(C(=CC2=C1N3C(C(=C2)N)NC(CC3)C(O)=O)O)O in: NOR00163/C1=C(C(=CC2=C1N3C(C(=C2)N)NC(CC3)C(O)=O)O)O in CID: 5289234 -5.6-dihydropyoverdin chromophore ChrD C13H15N3O3 261.1113413634 C1=C(C(=CC2=C1N3C(C(N)C2)NCCC3C(O)=O)O)O in: NOR00903 -D-6-chloro-N2-formamidotryptophan D-Cl-CONH2-Trp C12H10ClN3O2 263.0461545808 C(C(O)=O)(N)CC1=C[N](C2=C1C=CC(=C2)Cl)C(=O)N in CSID: 8138519 -3-amino-8-phenyl-2.4.5-trihydroxyoct-7-enoic acid C8:1(7)-OH(2.4.5)-NH2(3)-Ph(8) C14H17NO4 263.1157580393 CSID: 29330841 -5-bromo-tryptophan Br-Trp C11H9BrN2O 263.9898149214 CSID: 87339 -9-octadecenoic acid C18:1(9) C18H32O 264.2453156493 CSID: 553123 -8.10-Dimethyl-9-hydroxy-7-methoxytridecadienoic acid DHMDA C16H26O3 266.1881947009 C(C(C(CCC)C)O)(C(C=CC=CCC(=O)O)OC)C in CSID: 10479168 -3-amino-14-methyl-hexadecanoic acid/3-amino-15-methyl-hexadecanoic acid aC17:0-NH2(3)/iC17:0-NH2(3) C17H33NO 267.2562146866 C(CC(CCCCCCCCCCC(CC)C)N)(O)=O in CSID: 2340866/C(CC(CCCCCCCCCCCC(C)C)N)(O)=O in: NOR00801 -3-hydroxy-14-methyl-hexadecanoic acid/3-hydroxy-15-methyl-hexadecanoic acid aC17:0-OH(3)/iC17:0-OH(3) C17H32O2 268.2402302714 C(CC(CCCCCCCCCCC(CC)C)O)(O)=O in: NOR00900/CSID: 141849 -3.4-dihydroxy-hexadecanoic acid C16:0-OH(3.4) C16H30O3 270.2194948293 CID: 22348653 -4-propenoyl-2-tyrosylthiazole acid PTTA C14H12N2O2S 272.0619483298 C(O)(=O)C=CC1=CSC(=N1)C(N)CC2=CC=C(C=C2)O in CSID: 16738243 -N-methyl-2-Bromo-tryptophan NMe-Br-Trp C12H11BrN2O 278.0054649856 C(C(=O)O)(NC)CC1=C([N]C2=C1C=CC=C2)Br in CSID: 8007368 -2-bromo-5-hydroxytryptophan Br-OH-Trp C11H9BrN2O2 279.9847295435 CSID: 643874 -3-hydroxy-9-octadecenoic acid C18:1(9)-OH(3) C18H32O2 280.2402302714 C(CC(CCCCCC=CCCCCCCCC)O)(O)=O in: NOR00724 -azotobactins chromophore ChrA C14H11N3O4 285.0749558571 C1=C(C(=CC2=C1N4C3C(=C2)NC(N3CCC4C(O)=O)=O)O)O in: NOR00208 -O-demethyl-Adda DMAdda C19H25NO2 299.1885290519 C(C(C(C=CC(=CC(C(CC1=CC=CC=C1)O)C)C)N)C)(O)=O in: NOR00129 -D-3-iodo-N-methyl-Tyrosine D-I-NMe-Tyr C10H10INO2 302.9756105704 C(C(=O)O)(NC)CC1=CC(=C(C=C1)O)I in CSID: 9017332 -actinomycin chromophore ChrAct C16H10N2O5 310.0589714419 CSID: 86817 -3-amino-9-methoxy-2.6.8-trimethyl-10-phenyldeca-4.6-dienoic acid Adda C20H27NO2 313.2041791161 CSID: 10471100 -3-amino-4-hydroxy-6-methyl-8-(p-bromophenyl)-5.7-octadienoic acid C8:2(5.7)-Me(6)-OH(4)-NH2(3)-brPh(8) C15H16BrNO2 321.0364307630 C(CC(C(C=C(C=CC1=CC=C(C=C1)Br)C)O)N)(=O)O in CSID: 10476834 -3-amino-6-methyl-12-phenyl-2.4.5-trihydroxydodeca-7.9.11-trienoic acid C12:3(7.9.11)-Me(6)-OH(2.4.5)-NH2(3)-Ph(12) C19H23NO4 329.1627082319 C(C(C(C(C(C(C=CC=CC=CC1=CC=CC=C1)C)O)O)N)O)(O)=O in CSID: 8923613 -3-amino-10-(p-ethoxyphenyl)-2.4.5-trihydroxydeca-7.9-dienoic acid C10:2(7.9)-OH(2.4.5)-NH2(3)-ePh(10) C18H23NO5 333.1576228540 CSID: 29330839 -O-Acetyl-O-demethylAdda ADMAdda C21H27NO3 341.1990937382 C(C(C(C=CC(=CC(C(CC1=CC=CC=C1)OC(C)=O)C)C)N)C)(O)=O in: NOR00144 -3-amino-6.10-dimethyl-12-phenyl-2.4.5-trihydroxydodeca-7.9.11-trienoic acid C12:3(7.9.11)-Me(6.10)-OH(2.4.5)-NH2(3)-Ph(12) C20H25NO4 343.1783582961 C(C(C(C(C(C(C=CC=C(C=CC1=CC=CC=C1)C)C)O)O)N)O)(O)=O in CSID: 10187168 -3-amino-6-methyl-12-(p-methoxyphenyl)-2.4.5-trihydroxydodec-11-enoic acid C12:1(11)-Me(6)-OH(2.4.5)-NH2(3)-mPhe(11) C20H29NO5 363.2045730466 CSID: 29330842 -norspermidine NSpd C6H15N3 129.1265974971 CID: 5942 -spermidine Spd C7H17N3 143.1422475613 PDB: SPD -guanylspermidine GSpd C8H19N5 185.1640456359 CID: 3082086 -formyl group CO CO 27.9949146221 PDB: FOR +Ethanolamine Eta C2H5N 43.0421990000 CSID: 13835336 +Glycine Gly C2H3NO 57.0214640000 CSID: 730 +pyrrolidone Pyr C4H5N 67.0421990000 CSID: 11530 +dehydroalanine dh-Ala C3H3NO 69.0214640000 CSID: 110510 +pyruvic acid Pya C3H2O2 70.0054790000 CSID: 1031 +butanoic acid C4:0 C4H6O 70.0418650000 CSID: 259 +DL-Alanine/D-Alanine/beta-Alanine/N-Methyl-Glycine Ala/D-Ala/bAla/NMe-Gly C3H5NO 71.0371140000 CSID: 582/CSID: 64234/CSID: 234/CSID: 1057 +Lactic acid/D-lactic acid Lac/D-Lac C3H4O2 72.0211290000 CSID: 592/CSID: 55423 +Serinol Serol C3H7NO 73.0527640000 CSID: 61591 +2.3-dehydro-2-aminobutyric acid/homoserine lactone/N-Methyl-dehydroalanine/hydroxy pyrrolidone dhAbu/HseL/NMe-Dha/OH-Pyr C4H5NO 83.0371140000 CSID: 4952645/CSID: 66194/CSID: 118845/CSID: 134682 +2-hydroxy-3-butenoic acid C4:1(3)-OH(2) C4H4O2 84.0211290000 CSID: 141066 +2-methyl-butanoic acid C4:0-Me(2) C5H8O 84.0575150000 CSID: 8012 +alpha-formylGlycine aFo-Gly C3H3NO2 85.0163780000 CSID: 28 +N-Methyl-L-alanine/N-methyl-beta-alanine/alpha-aminobutyric acid/D-alpha-aminobutyric acid/2-Methylalanine/methyl alaninate NMe-Ala/NMe-bAla/Abu/D-Abu/Aib/D-3OMe-Ala C4H7NO 85.0527640000 CSID: 4450824/CSID: 68396/PDB: ABA/PDB: DBB/CSID: 5891/CSID: 99878 +isovalinol/valinol Ivalol/Valol C5H11N 85.0891490000 CSID: 8329525/CSID: 71352 +3-hydroxybutanoic acid C4:0-OH(3) C4H6O2 86.0367790000 CSID: 428 +2.3-Diaminopropionic acid Dpr C3H6N2O 86.0480130000 CSID: 357 +DL-Serine/D-Serine/isoserine Ser/D-Ser/Iser C3H5NO2 87.0320280000 CSID: 597/CSID: 64231/CSID: 10793 +Sorbic acid C6:2(t2.t4) C6H6O 94.0418650000 CSID: 558605 +methyl-succinimide Me-Suc C5H5NO 95.0371140000 CSID: 122158 +proline carboxamid ProC C5H8N2 96.0687480000 CSID: 479142 +DL-Proline/D-Proline/2-methylamino-2-dehydrobutyric acid/norcoronamic acid Pro/D-Pro/2Dh-Mabu/norCMA C5H7NO 97.0527640000 CSID: 594/CSID: 8640/CSID: 16743754/CSID: 28708240 +3-methylvaleric acid/hexanoic acid Me-Vaa/C6:0 C6H10O 98.0731650000 CSID: 7469/CSID: 8552 +N-formyl-Alanine/D-N-formyl-Alanine NFo-Ala/D-NFo-Ala C4H5NO2 99.0320280000 CSID: 72251/CSID: 72251 +DL-Valine/D-Valine/Isovaline/D-Isovaline/Norvaline/D-Norvaline/2-methyl-3-aminobutanoic acid/N-dimethyl-Alanine/3-amino-pentanoic acid Val/D-Val/Ival/D-Ival/Nva/D-Nva/Mab/NdMe-Ala/C5:0-NH2(3) C5H9NO 99.0684140000 CSID: 1148/CSID: 64635/CSID: 85483/PDB: DIV/CSID: 801/CSID: 388660/CSID: 471786/CSID: 9962964/CSID: 11271826 +Leucinol/Isoleucinol Leuol/Ileol C6H13N 99.1047990000 CSID: 71362/CSID: 82355 +2-hydroxy-3-epoxy-butanoic acid C4:0-OH(2)-Ep(3) C4H4O3 100.0160440000 CSID: 15475591 +Succinic acid Suc C4H4O3 100.0160440000 CSID: 7634 +2-hydroxyisovaleric acid/D-2-hydroxyisovalerate Hiv/D-Hiv C5H8O2 100.0524300000 CSID: 90190/CID: 5289545 +2.4-diaminobutyric acid/D-2.4-diaminobutyric acid/2.3-diaminobutyric acid/(2S.3S)-2.3-diaminobutyric acid/(2R.3R)-2.3-diaminobutyric acid Dab/D-Dab/Dbu/L-Dbu/D-Dbu C4H8N2O 100.0636630000 CSID: 457/CID: 638153/CSID: 4475641/CID: 11768553/PDB: VDL +dehydro-cysteine dhCys C3H3NOS 100.9935340000 CSID: 24784832 +Threonine/D-Threonine/allo-Threonine/D-allo-Threonine/Homoserine/D-Homoserine/N-Methyl-Serine/N-Methyl-D-Serine/4-amino-3-hydroxybutyric acid Thr/D-Thr/aThr/D-aThr/Hse/D-Hse/NMe-Ser/D-NMe-Ser/OH-4Abu C4H7NO2 101.0476780000 PDB: THR/PDB: DTH/PDB: ALO/CSID: 81824/CSID: 758/CSID: 2006329/CSID: 481791/PDB: DSE/CSID: 2064 +2.3-dihydroxy-butanoic acid C4:0-OH(2.3) C4H6O3 102.0316940000 CSID: 219301 +DL-Cysteine Cys C3H5NOS 103.0091840000 CSID: 574 +benzoic acid Bz C7H4O 104.0262150000 CSID: 238 +N-methylglutamine NMe-Gln C6H10N2 110.0843980000 CSID: 10652941 +4-oxo-proline/pyroglutamic acid 4oxo-Pro/pGlu C5H5NO2 111.0320280000 CSID: 366185/CSID: 485 +3-Methylproline/4-Methylproline/homoproline/D-homoproline/coronamic acid 3Me-Pro/4Me-Pro/Hpr/D-Hpr/CMA C6H9NO 111.0684140000 CSID: 10610754/CSID: 312597/CSID: 826/CSID: 643442/CSID: 117751 +keto-Leucine/2-epoxy-hexanoic acid k-Leu/C6:0-Ep(2) C6H8O2 112.0524300000 CSID: 69/CSID: 14066572 +Hydroxy-cycloOrnithine/D-Hydroxy-cycloOrnithine OH-cOrn/D-OH-cOrn C5H8N2O 112.0636630000 CSID: 13539649/CSID: 13539649 +heptanoic acid/5-methyl-hexanoic acid C7:0/iC7:0 C7H12O 112.0888150000 CSID: 7803/CID: 12344 +aziridine dicarboxylic acid Azd C4H3NO3 113.0112930000 CSID: 11582505 +3-Hydroxyproline/4-Hydroxyproline/D-Hydroxyproline/2-formamidobutanoic acid 3OH-Pro/4OH-Pro/D-4OH-Pro/NFo-D-Abu C5H7NO2 113.0476780000 CSID: 486216/PDB: HYP/CID: 440014/CSID: 486348 +Leucine/D-Leucine/Isoleucine/D-Isoleucine/allo-Isoleucine/D-allo-Isoleucine/N-Methyl-L-valine/D-N-Methylvaline/3-Methylvaline/D-tert-Leu/2-methyl-3-aminopentanoic acid/D-N-methyl-norvaline Leu/D-Leu/Ile/D-Ile/aIle/D-aIle/NMe-Val/D-NMe-Val/t-Leu/D-t-Leu/Map/D-NMe-Nva C6H11NO 113.0840640000 CSID: 834/CSID: 388617/CSID: 769/CSID: 69017/CSID: 89698/CSID: 85019/CSID: 4225/CSID: 4225/CSID: 270637/CID: 6950340/CSID: 11643060/CSID: 10652938 +hydroxyacetyl propionyl/pentanedioic acid Hap/Pda C5H6O3 114.0316940000 C(C(C(CO)=O)C)(=O)O in CSID: 10477731/CSID: 723 +DL-Asparagine/D-Asparagine/N1-formyl-2.3-Diaminopropionic acid Asn/D-Asn/NFo-Dpr C4H6N2O2 114.0429270000 PDB: ASN/PDB: DSG/C(C(CN)NC=O)(=O)O in CSID: 8873525 +D-Leucic acid (2-hydroxy-4-methylpentanoic acid)/(R)-Leucic acid/3-hydroxyhexanoic acid/2-hydroxy-3-methyl-pentanoic acid/D-2-hydroxy-3-methyl-pentanoic acid C5:0-Me(4)-OH(2)/4Me-D-Hva/C6:0-OH(3)/Hmp/D-Hmp C6H10O2 114.0680800000 CSID: 83753/CSID: 388986/CSID: 133518/CSID: 144317/CSID: 144317 +DL-Ornithine/D-Ornithine Orn/D-Orn C5H10N2O 114.0793130000 CSID: 380/CSID: 64236 +DL-Aspartic acid/D-Aspartic acid/N-formyl-isoserine Asp/D-Asp/NFo-Iser C4H5NO3 115.0269430000 CSID: 411/CSID: 75697/C(C(C(=O)O)O)NC=O in CSID: 8503913 +beta-hydroxyvaline/D-beta-hydroxyvaline/N-Methylthreonine/O-Methylthreonine bOH-Val/D-bOH-Val/NMe-Thr/OMe-Thr C5H9NO2 115.0633290000 CSID: 244525/CID: 192763/CSID: 5373925/CSID: 193545 +2.3-dihydroxy-3-methylbutanoic acid/2.4-dihydroxy-3-methylbutanoic acid iC5:0-OH(2.3)/iC5:0-OH(2.4) C5H8O3 116.0473440000 CSID: 657/C(C(C(CO)C)O)(=O)O in: NOR00082 +2-Methylcysteine/Methylcysteine aMe-Cys/NMe-Cys C4H7NOS 117.0248350000 CSID: 8233116/CSID: 2074082 +4-Hydroxythreonine 4OH-Thr C4H7NO3 117.0425930000 CSID: 3137512 +2.3.4-trihydroxy-butanoic acid C4:0-OH(2.3.4) C4H6O4 118.0266090000 CSID: 388628 +phenylacetic acid Pha C8H6O 118.0418650000 CSID: 10181341 +4-Hydroxybenzoic acid pOH-Bz C7H4O2 120.0211290000 CSID: 132 +trans2.trans4.trans6-trioctaneic acid C8:3(t2.t4.t6) C8H8O 120.0575150000 CSID: 4520024 +hydroxypicolinic acid Hpa C6H3NO2 121.0163780000 CSID: 12827 +oct-7-ynoic acid/2.trans4-octenoic acid C8:0:1(7)/C8:2(2.t4) C8H10O 122.0731650000 CSID: 4472125/CSID: 4944992 +4-oxo-5-methylproline/4-oxo-homoproline/N-Formyl-Proline 4oxo-5Me-Pro/4oxo-Hpr/NFo-Pro C6H7NO2 125.0476780000 CSID: 2564339/CSID: 10739339/CSID: 87055 +octanoic acid/6-methylheptanoic acid C8:0/iC8:0 C8H14O 126.1044650000 CSID: 370/CSID: 81904 +beta-ureido-dehydroAlanine bU-dAla C4H5N3O2 127.0381760000 PDB: UAL +N-formyl-Valine/N-Acetyl-2-aminoisobutyric acid/3-Hydroxy-5-methylproline NFo-Val/Ac-Aib/3OH-5Me-Pro C6H9NO2 127.0633290000 CSID: 90479/CSID: 203779/CSID: 3823469 +N-Methyl-Leucine/D-N-methyl-Leucine/N-Methyl-Isoleucine/N-methyl-alloIsoleucine/D-N-methyl-alloIsoleucine/beta-methylisoleucine/homoisoleucine/alpha-ethylnorvaline/Dolavaline/2-methyl-3-aminohexadecanoic acid NMe-Leu/D-NMe-Leu/NMe-Ile/NMe-aIle/D-NMe-aIle/bMe-Ile/Hil/Et-Nva/Dov/C6:0-Me(2)-NH2(3) C7H13NO 127.0997140000 CSID: 493595/CSID: 493595/CSID: 487199/CCC(C)C(C(=O)O)NC in: NOR00428/CCC(C)C(C(=O)O)NC in: NOR00428/CSID: 19951406/CSID: 454232/CSID: 452678/CSID: 10731564/CSID: 21378848 +DL-Glutamine/D-Glutamine/N-methylasparagine/beta-methyl-asparagine/D-N2-methyl-asparagine/N1-acetyl-2.3-Diaminopropionic acid Gln/D-Gln/NMe-Asn/bMe-Asn/D-N2Me-Asn/NAc-Dpr C5H8N2O2 128.0585780000 PDB: GLN/PDB: DGN/CSID: 311563/CSID: 2284493/CSID: 288387/C(C(CN)NC(C)=O)(=O)O in CSID: 8570696 +3-methoxy-hexanoic acid/3-hydroxy-heptanoic acid C6:0-OMe(3)/C7:0-OH(3) C7H12O2 128.0837300000 CSID: 277923/CSID: 2340494 +DL-Lysine/D-Lysine/beta lysine/N-Hydroxy-histamine Lys/D-Lys/bLys/N-OH-Hta C6H12N2O 128.0949630000 CSID: 843/CSID: 51793/PDB: KBE/C1(CCCN1)CCNO in CSID: 4589228 +DL-Glutamic acid/D-Glutamic Acid/beta-methyl-aspartic acid/D-beta-methyl-aspartic acid/beta-methoxy-aspartic acid/O-acetyl-Serine Glu/D-Glu/bMe-Asp/D-bMe-Asp/bOMe-Asp/Ac-Ser C5H7NO3 129.0425930000 CSID: 591/PDB: DGL/PDB: 2AS/PDB: ACB/CSID: 92764/CSID: 184 +L-acosamine/3-hydroxyleucine/beta-hydroxy-N-Methyl-Valine/gamma-hydroxy-N-Methyl-Valine/L-ristosamine Aco/3OH-Leu/bOH-NMe-Val/gOH-NMe-Val/Ria C6H11NO2 129.0789790000 CSID: 370989/CSID: 244507/CSID: 9205156/CID: 12439044/CSID: 370989 +2-hydroxy-3-methyl-butanedioic acid iC5:0-OH(2)-CA(4) C5H6O4 130.0266090000 CSID: 485839 +Hydroxyasparagine/D-HydroxyAsparagine OH-Asn/D-OH-Asn C4H6N2O3 130.0378420000 CSID: 3670287/CSID: 3670287 +alpha-guanidino Serine gSer C3H6N4O2 130.0490750000 C(C(=O)O)(N)(O)NC(=N)N in: NOR00426 +2.3-dihydroxy-3-methylpentanoic acid aC6:0-OH(2.3) C6H10O3 130.0629940000 CSID: 7 +N5-hydroxy ornithine/D-N5-HydroxyOrnithine/hydroxy-beta lysine OH-Orn/D-OH-Orn/OH-bLys C5H10N2O2 130.0742280000 CSID: 148381/C(CC(C(=O)O)N)CNO in: NOR00205/C(NCC(=O)O)(CCN)O in: NOR00634 +Hydroxyaspartic acid/D-Hydroxyaspartic acid OH-Asp/D-OH-Asp C4H5NO4 131.0218580000 CSID: 5232/CSID: 5232 +Methionine/N.S-dimethylcysteine Met/diMe-Cys C5H9NOS 131.0404850000 CSID: 853/CSID: 4450935 +arabinose/lyxose Ara/Lyx C5H8O4 132.0422590000 CSID: 224/CSID: 831 +L-Olivose Oli C6H12O3 132.0786440000 CSID: 164228 +PhenylGlycine/D-PhenylGlycine Ph-Gly/D-ph-Gly C8H7NO 133.0527640000 CSID: 3732/PDB: PG9 +phenylalaninol Pheol C9H11N 133.0891490000 CSID: 69116 +4-Chloro-Threonine 4Cl-Thr C4H6ClNO2 135.0087060000 CSID: 111708 +2.3-dihydroxy-4-chloro-butanoic acid C4:0-OH(2.3)-Cl(4) C4H5ClO3 135.9927220000 CSID: 25900403 +2.3-dihydroxybenzoic acid diOH-Bz C7H4O3 136.0160440000 CSID: 18 +2-methyl-7-octynoic acid/2.trans4-7-methyl-octenoic acid C8:0:1(7)-Me(2)/iC9:2(2.t4) C9H12O 136.0888150000 CSID: 24770189/CSID: 10761068 +DL-Histidine His C6H7N3O 137.0589120000 CSID: 752 +dehydropyrrolidone dPyr C6H6N2O2 138.0429270000 C1(CC(C(=CC(=O)O)N1)N)=O in CSID: 10199318 +acetylproline/2.3-dimethylpyroglutamic acid Ac-Pro/2Me-3Me-pGlu C7H9NO2 139.0633290000 CSID: 285677/CSID: 13080150 +5.5-dimethyl-2-oxo-hexanoic acid C6:0-Me(5.5)-oxo(2) C8H12O2 140.0837300000 CID: 21197379 +argininal Argal C6H12N4 140.1061960000 CSID: 10655329 +Nonanoic acid/d-6-Methyloctanoic acid/7-Methyloctanoic acid C9:0/aC9:0/iC9:0 C9H16O 140.1201150000 CSID: 7866/CSID: 10015/CSID: 31022 +N-methylchloropyrrole MCP C6H4ClNO 140.9981420000 CSID: 7404981 +N-Acetylisovaline/N-Acetylvaline/N-Formylisoleucine/N-Formylleucin/4-Amino-2.2-dimethyl-3-oxopentanoic acid/4-oxovancosamine Ac-Ival/Ac-Val/NFo-Ile/NFo-Leu/Ibu/4oxo-Van C7H11NO2 141.0789790000 CSID: 272193/CSID: 198159/CSID: 383482/CSID: 90475/CSID: 29322188/C1(C(C(CC(O1)O)(C)N)=O)C in CSID: 10249894 +N-dimethyl-leucine/N.beta-dimethyl-leucine/O-acetyl-leucinol/N.O-dimethyl-isoleucine NdMe-Leu/NMe-bMe-Leu/OAc-Leuol/NMe-OMe-Ile C8H15NO 141.1153640000 CSID: 500040/CID: 15385160/CID: 23037829/CSID: 27194495 +beta-methylglutamine/D-beta-methylglutamine bMe-Gln/D-bMe-Gln C6H10N2O2 142.0742280000 CID: 44602399/CSID: 24604116 +3-hydroxy-octanoic acid/2.2-dimethyl-3-hydroxyhexanoic acid/3-hydroxy-2-methyl-heptanoic acid C8:0-OH(3)/C6:0-Me(2.2)-OH(3)/C7:0-Me(2)-OH(3) C8H14O2 142.0993800000 CSID: 24791/CSID: 21418738/CSID: 27143447 +3-Methyl-Glutamic acid/Glutamic Acid methyl ester/D-Glutamic Acid methyl ester/D-Glutamic Acid methyl ester/2-Aminoadipic acid 3Me-Glu/MeO-Glu/D-MeO-Glu/MeO-D-Glu/Aad C6H9NO3 143.0582430000 CSID: 207514/CSID: 66546/CSID: 66546/CSID: 66546/CSID: 456 +L-actinosamine/L-eremosamine/norstatine/Vancosamine/N-methyl-hydroxyisoleucine Act/Ere/Nst/Van/NMe-OH-Ile C7H13NO2 143.0946290000 CID: 20377364/CSID: 9542085/CSID: 151726/CSID: 164304/CSID: 24770217 +beta-hydroxyglutamine/D-beta-hydroxy-N2-methyl-asparagine/D-beta-hydroxy-N2-methyl-asparagine OH-Gln/Me-OH-Asn/D-N2Me-bOH-Asn C5H8N2O3 144.0534920000 CID: 22592766/CSID: 24604117/C(C(=O)O)(N)C(C(=O)NC)O in: NOR00669 +methoxyaspartic acid OMe-Asp C5H7NO4 145.0375080000 C(C(C(C(=O)O)N)=[O]C)(=O)O in: NOR00717 +3.5-hydroxy-4-amino-hexadecanoic acid C6:0-OH(3.5)-NH2(4) C6H11NO3 145.0738930000 C(CC(C(C(C)O)N)O)(O)=O in: NOR00444 +L-rhamnose Rha C6H10O4 146.0579090000 CSID: 190747 +Methionine-S-oxide O-Met C5H9NO2S 147.0353990000 CSID: 824 +Chloro-Isoleucine Cl-Ile C6H10ClNO 147.0450920000 C(C(O)=O)(N)C(C(C)Cl)C in CSID: 10269389 +DL-Phenylalanine/D-Phenylalanine/beta-phenylalanine/D-beta-phenylalanine/N-methyl-phenylglycine Phe/D-Phe/bPhe/D-bPhe/NMe-Ph-Gly C9H9NO 147.0684140000 CSID: 969/CSID: 64639/CSID: 62403/CSID: 598357/CSID: 198596 +2-hydroxyphenyl-2-oxo-ethanoic acid Hpoe C8H4O3 148.0160440000 CSID: 348 +Phenyl-lactate/D-Phenyl-lactate Ph-Lac/D-Ph-Lac C9H8O2 148.0524300000 CSID: 3715/CID: 643327 +HydroxyPhenylGlycine/D-HydroxyPhenylGlycine Hpg/D-Hpg C8H7NO2 149.0476780000 CSID: 83189/CID: 89853 +2.trans4-8-methyl-noneoic acid iC10:2(2.t4) C10H14O 150.1044650000 C(C=CC=CCCC(C)C)(O)=O in CSID: 16736750 +cysteic acid/D-cysteic acid CysA/D-CysA C3H5NO4S 150.9939280000 PDB: OCS/PDB: 00C +D-4-fluoroPhenylGlycin D-F-ph-Gly C8H6FNO 151.0433430000 CSID: 88776 +3-amino-2-methyloct-7-ynoic acid C8:0:1(7)-Me(2)-NH2(3) C9H13NO 151.0997140000 C(CCCC#C)(C(C(=O)O)C)N in CSID: 8230475 +2-methyl-3-hydroxy-7-octynoic acid C8:0:1(7)-Me(2)-OH(3) C9H12O2 152.0837300000 CSID: 9964309 +2-methyl-8-noneic acid C9:1(8)-Me(2) C10H16O 152.1201150000 CID: 17824924 +Hydroxyhistidine OH-His C6H7N3O2 153.0538260000 CSID: 379547 +N-methyl homo vinylogous Valine NMe-hv-Val C9H15NO 153.1153640000 C(C(NC)C(C)C)=C(C(O)=O)C in CSID: 10213622 +capreomycidine/enduracididine/D-enduracididine Cap/End/D-End C6H10N4O 154.0854610000 CSID: 3818574/CSID: 24775830/CSID: 24775830 +decanoic acid/isodecanoic acid/7-methylnonanoic acid C10:0/iC10:0/aC10:0 C10H18O 154.1357650000 CSID: 2863/CID: 111470/CSID: 4471754 +Alanine-thiazole Ala-Thz C6H7N2OS 155.0279090000 CSID: 23916434 +N-Acetylisoleucine/N-acetyl-Leucine/O-desmethyldolaproine NAc-Ile/NAc-Leu/dDap C8H13NO2 155.0946290000 CSID: 270615/CSID: 1918/C(C1CCCN1)(C(C(=O)O)C)O in CSID: 9938808 +2-Aminononanoic acid Me-AOA C9H17NO 155.1310140000 CSID: 198341 +2-carboxyquinoxaline COOH-Qui C9H4N2O 156.0323630000 CSID: 87301 +N-formyl-Glutamine NFo-Gln C6H8N2O3 156.0534920000 CSID: 2106926 +hydroxyisovalerylpropionyl Hip C8H12O3 156.0786440000 CID: 18942657 +3.4-dimethylglutamine 3Me-4Me-Gln C7H12N2O2 156.0898780000 CSID: 21376706 +DL-Arginine/D-Arginine/L-(+)-Arginine Arg/D-Arg/L-Arg C6H12N4O 156.1011110000 PDB: ARG/PDB: DAR/CSID: 6082 +3-hydroxy-4-methyloctanoic acid/3-hydroxy-nonanoic acid/3-hydroxy-isononanoic acid/3-hydroxy-6-methyloctanoic acid C8:0-Me(4)-OH(3)/C9:0-OH(3)/iC9:0-OH(3)/aC9:0-OH(3) C9H16O2 156.1150300000 CSID: 17247549/CSID: 33630/CID: 22472006/CSID: 10361823 +N-trimethyl-leucine NtMe-Leu C9H18NO 156.1388390000 C(C(=O)O)(CC(C)C)[N](C)(C)C in: NOR00695 +Citrulline/D-Citrulline Cit/D-Cit C6H11N3O2 157.0851270000 CSID: 810/CID: 637599 +isostatine/statine Ist/Sta C8H15NO2 157.1102790000 CSID: 19578058/CSID: 2632509 +N6-formyl-HydroxyOrnithine/D-formyl-hydroxyOrnithine Fo-OH-Orn/D-Fo-OH-Orn C6H10N2O3 158.0691420000 PDB: FHO/PDB: FH7 +alpha-amino-hydroxyadipic acid Ahad C6H9NO4 159.0531580000 CID: 22326384 +N-methyl-2.3-dehydrophenylalanine NMe-dPhe C10H9NO 159.0684140000 C(C(O)=O)(=CC1=CC=CC=C1)NC in CSID: 4444584 +O-methyl-L-rhamnose 2OMe-Rha C7H12O4 160.0735590000 CSID: 4352115 +N-Methyl-Phenylalanine/D-N-Methyl-Phenylalanine/3-methylphenylalanine/Homophenylalanine NMe-Phe/D-NMe-Phe/3Me-Phe/Hph C10H11NO 161.0840640000 PDB: MEA/PDB: ZAE/PDB: APD/CSID: 92605 +Hexose/L-glucose/D-Glucose Hexose/Glc/D-Glc C6H10O5 162.0528230000 CSID: 23139/CSID: 201/PDB: GLC +N-hydroxy-dehydro-HydroxyPhenylGlycine/D-N-hydroxy-dehydro-HydroxyPhenylGlycine OH-dHpg/D-OH-dHpg C8H5NO3 163.0269430000 CID: 20339127/C(C(=O)O)(C1=CC=C(C=C1)O)=NO in: NOR00822 +Methionine sulfone O2-Met C5H9NO3S 163.0303140000 CSID: 63154 +phosphinothricin PT C5H10NO3P 163.0398300000 CSID: 4630 +Tyrosine/D-Tyrosine/beta-tyrosine/Phenylserine/N-methyl-HydroxyPhenylGlycine Tyr/D-Tyr/bTyr/Ph-Ser/NMe-Hpg C9H9NO2 163.0633290000 CSID: 1121/CSID: 64252/CSID: 389285/CSID: 84951/CID: 15118056 +4-hydroxy-D-phenyl-lactate 4OH-D-Ph-Lac C9H8O3 164.0473440000 CID: 9378 +propenoyl-alanyloxazole acid PALOA C8H8N2O2 164.0585780000 C(C=CC1=COC(=N1)C(N)C)(=O)O in CSID: 10477875 +3.4-dichloro-proline Cl2-Pro C5H5Cl2NO 164.9748200000 CID: 21295133 +3.5-dihydroxyphenylglycine/D-3.5-dihydroxyphenylglycine Dhpg/D-Dhpg C8H7NO3 165.0425930000 PDB: D3P/PDB: D3P +cyclo alpha-ketoarginine ck-Arg C7H10N4O 166.0854610000 C12(C(CCCN1C(=NC2=O)-N)N)O in CSID: 9977717 +2.2-dimethyl-3-hydroxy-7-octynoic acid C8:0:1(7)-Me(2.2)-OH(3) C10H14O2 166.0993800000 CSID: 29330001 +2-carboxy-6-hydroxyoctahydroindole Choi C9H13NO2 167.0946290000 C1C(NC2C1CCC(C2)O)C(=O)O in CSID: 10480056 +3-Desoxy-Methyl-4-butenyl-4-methyl threonine 3d-NMe-Bmt C10H17NO 167.1310140000 CC=CCC(C)CC(NC)C(=O)O in CSID: 4953086 +1-methoxy-beta-alanine-thiazole OMe-bAla-Thz C7H8N2OS 168.0357340000 C(N)(CC(=O)OC)C1=NC=CS1 in CSID: 26365309 +2.2-dimethyl-3-hydroxy-7-octenoic acid C8:1(7)-Me(2.2)-OH(3) C10H16O2 168.1150300000 C(C(C(CCCC=C)O)(C)C)(O)=O in CSID: 8732670 +9-methyldecanoic acid/8-methyldecanoic acid iC11:0/aC11:0 C11H20O 168.1514150000 CSID: 4471714/CID: 21813 +4-butenyl-4-methyl threonine/Dolaproine Bmt/Dap C9H15NO2 169.1102790000 CC=CCC(C)C(C(C(=O)O)N)O in CSID: 4444325/C1C(CCN1)C(C(C(O)=O)C)OC in CSID: 7986684 +5-hydroxy-capreomycidine 5OH-Cap C6H10N4O2 170.0803760000 C1C(NC(NC1C(C(=O)O)N)=N)O in CSID: 2301596 +hydroxysecbutyl acetyl propionyl Hysp C9H14O3 170.0942940000 C(C(C(C(O)C(CC)C)=O)C)(=O)O in CSID: 10477730 +homoarginine Har C7H14N4O 170.1167610000 CSID: 8732 +3-hydroxy-decanoic acid/3-hydroxy-2-methyl-nonanoic acid/2.2-dimethyl-3-hydroxy-octanoic acid/2.4-dimethyl-3-hydroxyisooctanoic acid C10:0-OH(3)/C9:0-Me(2)-OH(3)/C8:0-Me(2.2)-OH(3)/iC8:0-Me(2.4)-OH(3) C10H18O2 170.1306800000 CSID: 24790/CSID: 9587708/CSID: 8949283/CSID: 25944197 +N-methoxyacetyl-valine NOMe-Ac-Val C8H13NO3 171.0895430000 CSID: 11856685 +N-desmethyldolaisoleuine/alpha-hydroxy-6-methyl-3-aminooctanoic acid dDil/aC9:0-OH(2)-NH2(3) C9H17NO2 171.1259290000 C(C(N)C(C)CC)(CC(O)=O)OC in CSID: 9938808/C(C(C(CCC(CC)C)N)O)(=O)O in CSID: 10475103 +N-acetyl-HydroxyOrnithine/D-N-acetyl-HydroxyOrnithine Ac-OH-Orn/D-Ac-OH-Orn C7H12N2O3 172.0847920000 PDB: AHO/CSID: 3670289 +tryptophanol Trpol C11H12N2 172.1000480000 CSID: 10234 +N-methyldichloropyrrole-2-carboxylic acid MdCP C6H3Cl2NO 174.9591700000 CSID: 21926880 +beta.beta-dimethyl-Methionine-S-oxide bbMe2-O-Met C7H13NO2S 175.0666990000 CSID: 29322228 +alpha-amino-phenyl-valeric acid Apv C11H13NO 175.0997140000 CSID: 262061 +Homotyrosine/N-methyltyrosine/beta-hydroxy-N-Methyl-Phenylalanine Hty/NMe-Tyr/bOH-NMe-Phe C10H11NO2 177.0789790000 CSID: 3365526/CSID: 453342/CSID: 14028021 +propenoyl-2-aminobutanoyloxazole acid PAOA C9H10N2O2 178.0742280000 C(C=CC1=COC(=N1)C(N)CC)(=O)O in CSID: 27026296 +2.4-dimethyl-dec-9-ynoic acid/10-methyl-2.trans4-undecanoic acid C10:0:1(9)-Me(2.4)/iC12:2(2.t4) C12H18O 178.1357650000 C(C(CC(CCCCC#C)C)C)(=O)O in CSID: 23076292/C(C=CC=CCCCCC(C)C)(O)=O in CSID: 24677772 +beta-hydroxy-tyrosine/3.4-dihydroxyphenylalanine bOH-Tyr/diOH-Phe C9H9NO3 179.0582430000 CSID: 13930867/CSID: 813 +proline-thiazole Pro-Thz C8H8N2OS 180.0357340000 C1=CSC(=N1)C2CCC(N2)C(=O)O in CSID: 8971346 +2-methyl-5-dodecenoic acid C12:1(5) C12H20O 180.1514150000 CSID: 4471802 +Anticapsin Aca C9H11NO3 181.0738930000 CSID: 2796855 +D-homoarginine D-Har C7H10N4O2 182.0803760000 CSID: 53295 +vinylogous arginine v-Arg C8H14N4O 182.1167610000 C(C(N)CCCNC(=N)N)=CC(=O)O in CSID: 8946030 +dodecanoic acid/isododecanoic acid C12:0/iC12:0 C12H22O 182.1670650000 CSID: 3756/CID: 75942 +3-chloro-4-hydroxyphenylglycine Cl-Hpg C8H6ClNO2 183.0087060000 CSID: 3817439 +N-methyl-butenylthreonine/2-amino-8-oxo-decanoic acid NMe-Bmt/C10:0-NH2(2)-oxo(8) C10H17NO2 183.1259290000 CSID: 9944222/CSID: 16281719 +2.3-Dehydro-Tryptophan dh-Trp C11H8N2O 184.0636630000 CSID: 7991355 +ureido-4-oxovancosamine U4oxo-Van C8H12N2O3 184.0847920000 C1(C2(C(CC(O1)O)(C)NC(N2)=O)O)C in: NOR00711 +alpha-ketoarginine k-Arg C7H12N4O2 184.0960260000 C(C(C(CCCNC(=N)N)N)=O)(=O)O in CSID: 10477079 +3-hydroxy-undecanoic acid/3-hydroxy-isoundecanoic acid/3-hydroxy-2-methyl-decanoic acid/3-hydroxy-4-methyl-decanoic acid C11:0-OH(3)/iC11:0-OH(3)/C10:0-Me(2)-OH(3)/C10:0-Me(4)-OH(3) C11H20O2 184.1463300000 CSID: 2340495/CC(C)CCCCCC(CC(=O)O)O in: NOR00398/CSID: 13775620/CSID: 28533406 +Dolapyrrolidone Dpy C12H11NO 185.0840640000 CSID: 8735462 +Dolaisoleucine/8-hydroxy-2-amino-decanoic acid/9-hydroxy-2-amino-decanoic acid Dil/C10:0-OH(8)-NH2(2)/C10:0-OH(9)-NH2(2) C10H19NO2 185.1415790000 C(CC(O)=O)(OC)C(C(C)CC)NC in CSID: 7986684/CSID: 26949211/C(C(N)CCCCCCC(C)O)(=O)O in CSID: 10279723 +DL-Tryptophan/D-Tryptophan Trp/D-Trp C11H10N2O 186.0793130000 CSID: 1116/CSID: 8707 +hydrated alpha-ketoarginine hk-Arg C7H14N4O2 186.1116760000 C(C(C(CCCN=C(N)N)N)O)(=O)O in CSID: 8946570 +dehydro vinylogous tyrosine dv-Tyr C11H9NO2 187.0633290000 C(C(N)=CC1=CC=C(C=C1)O)=CC(=O)O in CSID: 8185737 +3.4-dihydroxyArginine diOH-Arg C6H12N4O3 188.0909400000 C(C(C(C(O)=O)N)O)(CN=C(N)N)O in CSID: 8801410 +vinylogous tyrosine/N-acetylphenylalanine v-Tyr/Ac-Phe C11H11NO2 189.0789790000 C(C(N)CC1=CC=C(C=C1)O)=CC(=O)O in CSID: 10477079/CSID: 1923 +kynurenine/D-kynurenine Kyn/D-Kyn C10H10N2O2 190.0742280000 CSID: 823/CID: 1152206 +coronafacic acid CFA C12H14O2 190.0993800000 CSID: 13300082 +N-methyl-4-methylamino-phenylalanine/N.O-dimethyl-tyrosinecarboxamid NMe-MeA-Phe/NMe-OMe-TyrC C11H14N2O 190.1106130000 CID: 21137790/CID: 19003692 +alpha-amino-hydroxyphenyl-valeric acid/N-methyl-homotyrosine/3-methyl-homotyrosine/ethylene inserted tyrosine/N.O-dimethyl-tyrosine/D-N.O-dimethyl-tyrosine Ahv/NMe-Hty/3Me-Hty/e-Tyr/NMe-OMe-Tyr/D-NMe-OMe-Tyr C11H13NO2 191.0946290000 C(C(=O)O)(CCCC1=CC=C(C=C1)O)N in CSID: 142959/C1=CC(=CC=C1CCC(C(=O)O)NC)O in CSID: 10477716/C1=CC(=CC=C1CC(C(C(=O)O)N)C)O in: NOR00265/C(C(N)CC1=CC=C(C=C1)O)CC(=O)O in CSID: 9977717/CID: 18925327/CID: 18925327 +10-methyl-2.trans4-dodecenoic acid aC13:2(2.t4) C13H20O 192.1514150000 C(C=CC=CCCCCC(CC)C)(O)=O in CSID: 24665012 +di-chloro-N-methyl-dehydroLeucine Cl2-NMe-dhLeu C7H9Cl2NO 193.0061200000 C(C(O)=O)(NC)=CC(C)C(Cl)Cl in CSID: 8701761 +beta-methoxy-tyrosine bOMe-Tyr C10H11NO3 193.0738930000 CSID: 16174140 +O-sulfate-2-hydroxy-3-methylpentanoic acid OSu-Hmp C6H10O5S 194.0248940000 C(C(C(CC)C)O[S](=O)(=O)O)(=O)O in CSID: 10477875 +methyloxazoline-isoleucine MeOx-Ile C11H18N2O 194.1419130000 C(N)(C(C)CC)C1=NC(C(C1)C)C(=O)O in CSID: 10477991 +11-methyl-3-dodecenoic acid/10-methyl-3-dodecenoic acid iC13:1(3)/aC13:1(3) C13H22O 194.1670650000 C(CC=CCCCCCCC(C)C)(O)=O in: NOR00296/C(CC=CCCCCCC(CC)C)(O)=O in: NOR00767 +di-chloro-N-methyl-Leucine Cl2-NMe-Leu C7H11Cl2NO 195.0217700000 C(C(O)=O)(NC)CC(C)C(Cl)Cl in CSID: 8773801 +3-hydroxy-5-dodecenoic acid/9-oxo-2.4-dimethyldecanoic acid/8-hydroxy-2.4.6-trimethyl-4-nonenoic acid C12:1(5)-OH(3)/C10:0-Me(2.4)-oxo(9)/C9:1(4)-Me(2.4.6)-OH(8) C12H20O2 196.1463300000 CSID: 10761118/C(C(CC(CCCCC(C)=O)C)C)(=O)O in CSID: 8946480/C(C(CC(=CC(CC(C)O)C)C)C)(O)=O in CSID: 8007368 +11-methyldodecanoic acid/10-methyldodecanoic acid iC13:0/aC13:0 C13H24O 196.1827150000 CID: 33002/CSID: 2282934 +chloro-tyrosine Cl-Tyr C9H8ClNO2 197.0243570000 CSID: 106510 +2-amino-9.10-epoxi-8-oxodecanoic acid C10:0-NH2(2)-Ep(9)-oxo(8) C10H15NO3 197.1051930000 CSID: 11345228 +4-butenyl-4-methyl-N.4-methyl threonine Me2-Bmt C11H19NO2 197.1415790000 CSID: 4450325 +3-hydroxy-dodecanoic acid/3-hydroxy-isododecanoic acid/3-hydroxy-2-methyl-undecanoic acid C12:0-OH(3)/iC12:0-OH(3)/C11:0-Me(2)-OH(3) C12H22O2 198.1619800000 CSID: 85026/CID: 15089799/CSID: 13775586 +9-hydroxy-2-amino-8-oxo-decanoic acid C10:0-OH(9)-NH2(2)-oxo(8) C10H17NO3 199.1208430000 CSID: 25942012 +N-acetyl-N6-formyl-N6-hydroxyOrnithine NAc-Fo-OH-Orn C8H12N2O4 200.0797070000 C(C(=O)O)(NC(C)=O)CCCN(O)C=O in CSID: 3294 +N1-methyl-tryptophan 1Me-Trp C12H12N2O 200.0949630000 CSID: 88584 +5-hydroxytryptophan/phototryptophan OH-Trp/pTrp C11H10N2O2 202.0742280000 CSID: 141/CID: 10331043 +N-methyl-4-dimethylamino-phenylalanine NMe-Me2A-Phe C12H16N2O 204.1262630000 CSID: 27594543 +vinylogous hydroxy tyrosine v-OH-Tyr C11H11NO3 205.0738930000 C(C(N)CC1=CC(=C(C=C1)O)O)=CC(=O)O in CSID: 9204437 +alpha-amino-methoxyphenyl-valeric acid Amv C12H15NO2 205.1102790000 CSID: 9681632 +N-Methyl-Lanthionine NMe-Lan C6H10N2O4S 206.0361280000 C(SCC(C(=O)O)N)C(C(O)=O)NO in: NOR00149 +3-nitrotyrosine 3NO2-Tyr C9H8N2O4 208.0484070000 CSID: 205676 +7-tetradecenoic acid/12-methyl-3-tridecenoic acid C14:1(7)/iC14:1(3) C14H24O 208.1827150000 CSID: 10722652/PDB: LNG +D-PhosphateAsparagine D-PO-Asn C4H7N2O6P 210.0041720000 C(C(C(C(O)=O)N)O[P](O)(=O)O)(=O)N in: NOR00025 +propenoyl-O-methylserinylthiazole acid PMST C9H10N2O2S 210.0462980000 C(C=CC1=CSC(=N1)C(N)COC)(=O)O in CSID: 8503913 +5-oxo-8-hydroxy-2.4.6-trimethyl-4-nonaneic acid C9:1(Me4)-Me(2.4.6)-OH(8)-Oxo(5) C12H18O3 210.1255940000 C(C(CC(C(C(CC(C)O)C)=O)=C)C)(O)=O in CSID: 8434247 +tetradecanoic acid/12-methyl-tridecanoic acid C14:0/iC14:0 C14H26O 210.1983650000 PDB: MYR/CID: 520298 +Chloro-N-methyl-tyrosine/D-3-chloro-N-methyl-Tyrosine Cl-NMe-Tyr/D-Cl-NMe-Tyr C10H10ClNO2 211.0400070000 PDB: CNT/C(C(=O)O)(NC)CC1=CC(=C(C=C1)O)Cl in: NOR00614 +3-amino-tridecanoic acid C13:0-NH2(3) C13H25NO 211.1936140000 CSID: 26283438 +3-hydroxy-tridecanoic acid/3-hydroxy-isotridecanoic acid/3-hydroxy-10-methyl-dodecanoic acid C13:0-OH(3)/iC13:0-OH(3)/aC13:0-OH(3) C13H24O2 212.1776300000 CSID: 4472174/CID: 15089800/C(CC(CCCCCCC(CC)C)O)(O)=O in: NOR00857 +beta-hydroxy-chloro-tyrosine bOH-Cl-Tyr C9H8ClNO3 213.0192710000 CSID: 25938524 +3-amino-6-hydroxy-2-piperidone Ahp C9H14N2O4 214.0953570000 CSID: 25058696 +N-methyl-5-hydroxytryptophan/methoxytryptophan NMe-OH-Trp/OMe-Trp C12H12N2O2 216.0898780000 C(C(=O)O)(NC)CC1=C[N]C2=C1C=C(C=C2)O in CSID: 10476796/O(C(=O)[C@@H](N([H])[H])CC1=C[N](C2=CC=CC=C12)OC)[H] in CSID: 5293532 +2.6-diamino-7-hydroxyazelaic acid Daz C9H16N2O4 216.1110070000 CSID: 391749 +4-amino-7-guanidino-2.3-dihydroxyheptanoic acid Agdha C8H16N4O3 216.1222400000 CSID: 21377788 +3.5-dichloro-4-hydroxyphenylglycine Cl2-Hpg C8H5Cl2NO2 216.9697340000 CSID: 9804791 +DHP-methyloxazolinyl group DMOG C11H9NO4 219.0531580000 CSID: 12721 +N-methoxyacetyl-D-phenylalanine NOMe-Ac-D-Phe C12H13NO3 219.0895430000 CSID: 11859621 +D-6'-chloro-tryptophan D-Cl-Trp C11H9ClN2O 220.0403410000 C(C(=O)O)(N)CC1=NC2=C(C1)C=CC(=C2)Cl in CSID: 8094776 +dihydroxyphenylthiazol group DHPT C10H7NO3S 221.0146640000 CSID: 23110909 +12-methyl-3-tetradecenoic acid aC15:1(3) C15H26O 222.1983650000 C(CC=CCCCCCCCC(CC)C)(O)=O in: NOR00768 +2.3-dihydroxy-2.6.8-trimethyldeca-(4Z.6E)-dienoic acid/2.3-dihydroxy-trans4.trans6-tridecenoic acid aC11:2(4.6)-Me(2.6)-OH(2.3)/C13:2(t4.t6)-OH(2.3) C13H20O3 224.1412450000 C(C(C(C=CC(=CC(CC)C)C)O)(O)C)(O)=O in CSID: 4977118/C(C(C(C=CC=CCCCCCC)O)O)(O)=O in CSID: 4976886 +12-methyltetradecanoic acid aC15:0 C15H28O 224.2140160000 CSID: 20368 +bromophenylalanine Br-Phe C9H8BrNO 224.9789160000 CSID: 77275 +3-amino-tetradecanoic acid/3-amino-isotetradecanoic acid C14:0-NH2(3)/iC14:0-NH2(3) C14H27NO 225.2092640000 CSID: 15571256/CID: 22471993 +3-hydroxy-tetradecanoic acid/3-hydroxy-12-methyl-tridecanoic acid C14:0-OH(3)/iC14:0-OH(3) C14H26O2 226.1932800000 CSID: 15252/CID: 22471995 +tri-chloro-N-methyl-dehydroLeucine Cl3-NMe-dhLeu C7H8Cl3NO 226.9671480000 C(C(O)=O)(NC)=CC(C)C(Cl)(Cl)Cl in CSID: 10477276 +N-acetyltryptophan Ac-Trp C13H12N2O2 228.0898780000 CSID: 1925 +beta.beta.N-trimethyltryptophan bbMe-NMe-Trp C14H16N2O 228.1262630000 C1=CC=CC2=C1C(=C[N]2)C(C(C(O)=O)NC)(C)C in CSID: 8158974 +3-hydroxy-2.2.4-trimethyl-7-hydroxydecanoic acid C10:0-Me(2.2.4)-OH(3.7) C13H24O3 228.1725450000 C(C(C(C(=O)O)(C)C)O)(CCC(CCC)O)C in CSID: 8184030 +tri-chloro-N-methyl-Leucine Cl3-NMe-Leu C7H10Cl3NO 228.9827980000 C(C(O)=O)(NC)CC(C)C(Cl)(Cl)Cl in CSID: 10477275 +thiazolylphenylalanine Phe-Thz C12H10N2OS 230.0513840000 C(N)(CC1=CC=CC=C1)C2=NC(=CS2)C(O)=O in CSID: 8593238 +D-2-carboxy-tryptophan D-COOH-Trp C12H10N2O3 230.0691420000 C(C(O)=O)(N)CC1=C([N]C2=C1C=CC=C2)C(=O)O in CSID: 7987591 +N-methyl-6-chloro-tryptophan NMe-Cl-Trp C12H11ClN2O 234.0559910000 C(C(=O)O)(NC)CC1=C[N]C2=C1C=CC(=C2)Cl in CSID: 8805002 +7-hexadecenoic acid/9-hexadecenoic acid C16:1(7)/C16:1(9) C16H28O 236.2140160000 CSID: 4895966/CSID: 4445872 +2.3-dihydroxy-trans4.trans6-tetradecenoic acid/2.6.8-trimethyl-5.7-dihydroxy-trans2.trans8-undecenoic acid C14:2(t4.t6)-OH(2.3)/C11:2(t2.t8)-Me(2.6.8)-OH(5.7) C14H22O3 238.1568950000 C(C(C(C=CC=CCCCCCCC)O)O)(O)=O in CSID: 8924310/C(C(=CCC(C(C(C(=CCC)C)O)C)O)C)(O)=O in CSID: 10481263 +hexadecanoic acid C16:0 C16H30O 238.2296660000 CSID: 960 +beta-methyl-bromophenylalanine bMe-Br-Phe C10H10BrNO 238.9945660000 C(C(=O)O)(C(C1=CC=C(C=C1)Br)C)N in CSID: 10475327 +3-amino-pentadecanoic acid/3-amino-isopentadecanoic acid/3-amino-12-methyl-tetradecanoic acid C15:0-NH2(3)/iC15:0-NH2(3)/aC15:0-NH2(3) C15H29NO 239.2249150000 CSID: 26283439/C(CC(CCCCCCCCCC(C)C)N)(O)=O in: NOR00784/C(CC(CCCCCCCCC(CC)C)N)(O)=O in: NOR00785 +3-hydroxy-13-methyltetradecanoic acid/3-hydroxy-pentadecanoic acid/3-hydroxy-isopentadecanoic acid/3-hydroxy-12-methyl-tetradecanoic acid C14:0-Me(13)-OH(3)/C15:0-OH(3)/iC15:0-OH(3)/aC15:0-OH(3) C15H28O2 240.2089300000 CSID: 9218624/CSID: 158374/CSID: 9218624/C(CC(CCCCCCCCC(CC)C)O)(O)=O in: NOR00211 +bromotyrosine/beta-hydroxy-bromophenylalanine Br-Tyr/bOH-Br-Phe C9H8BrNO2 240.9738310000 CSID: 131083/CSID: 19757850 +beta.beta.N1.N-tetramethyltryptophan bbNMe-NMe-Trp C15H18N2O 242.1419130000 C1=CC=CC2=C1C(=C[N]2C)C(C(C(O)=O)NC)(C)C in CSID: 8570259 +3.4-dihydroxy-tetradecanoic acid/ 3-hydroxy-2.2.4-trimethyl-7-methoxydecanoic acid C14:0-OH(3.4)/C10:0-Me(2.2.4)-OH(3)-OMe(7) C14H26O3 242.1881950000 CID: 22667431/CSID: 28587148 +3-amino-4-hydroxy-6-methyl-8-phenyl-5.7-octadienoic acid C8:2(5.7)-Me(6)-OH(4)-NH2(3)-Ph(8) C15H17NO2 243.1259290000 C(CC(C(C=C(C=CC1=CC=CC=C1)C)O)N)(=O)O in CSID: 10475327 +tri-chloro-2-hydroxy-N-methyl-Leucine/tri-chloro-5-hydroxy-N-methyl-Leucine Cl3-2OH-NMe-Leu/Cl3-5OH-NMe-Leu C7H10Cl3NO2 244.9777130000 C(C(O)=O)(NC)(CC(C)C(Cl)(Cl)Cl)O in CSID: 10477276/C(C(O)=O)(NC)CC(CO)C(Cl)(Cl)Cl in: NOR00511 +N-methyl-6-chloro-5-hydroxytryptophan NMe-Cl-OH-Trp C12H11ClN2O2 250.0509060000 C(C(=O)O)(NC)CC1=C[N]C2=C1C=C(C(=C2)Cl)O in CSID: 10473575 +2.3-dihydroxy-trans4.trans6-pentadecenoic acid C15:2(t4.t6)-OH(2.3) C15H24O3 252.1725450000 C(C(C(C=CC=CCCCCCCCC)O)O)(O)=O in CSID: 4976888 +3-hydroxy-9-hexadecenoic acid C16:1(9)-OH(3) C16H28O2 252.2089300000 C(CC(CCCCCC=CCCCCCC)O)(O)=O in: NOR00720 +3-amino-hexadecanoic acid/3-amino-isohexadecanoic acid C16:0-NH2(3)/iC16:0-NH2(3) C16H31NO 253.2405650000 CSID: 24597602/C(CC(CCCCCCCCCCC(C)C)N)(O)=O in: NOR00793 +3-hydroxy-hexadecanoic acid/3-hydroxy-isohexadecanoic acid C16:0-OH(3)/iC16:0-OH(3) C16H30O2 254.2245800000 CSID: 266538/C(CC(CCCCCCCCCCC(C)C)O)(O)=O in: NOR00897 +D-3-bromo-N-methyl-Tyrosine D-Br-NMe-Tyr C10H10BrNO2 254.9894810000 CSID: 2128826 +pyoverdin Pa A chromophore ChrPaA C13H11N3O3 257.0800410000 C1=C(C(=CC2=C1N3C(C(=C2)N)=NC(CC3)C(O)=O)O)O in CSID: 0 +N1-carboxy-bichomotryptophan N1-COOH-bhTrp C14H14N2O3 258.1004420000 C(CC1=C[N](C2=C1C=CC=C2)C(=O)O)CC(C(=O)O)N in CSID: 9968260 +isopyoverdin chromophore/pyoverdin chromophore ChrI/ChrP C13H13N3O3 259.0956910000 C1=C(C(=CC2=C1N3C(C(=C2)N)NC(CC3)C(O)=O)O)O in: NOR00163/C1=C(C(=CC2=C1N3C(C(=C2)N)NC(CC3)C(O)=O)O)O in CID: 5289234 +5.6-dihydropyoverdin chromophore ChrD C13H15N3O3 261.1113410000 C1=C(C(=CC2=C1N3C(C(N)C2)NCCC3C(O)=O)O)O in: NOR00903 +D-6-chloro-N2-formamidotryptophan D-Cl-CONH2-Trp C12H10ClN3O2 263.0461550000 C(C(O)=O)(N)CC1=C[N](C2=C1C=CC(=C2)Cl)C(=O)N in CSID: 8138519 +3-amino-8-phenyl-2.4.5-trihydroxyoct-7-enoic acid C8:1(7)-OH(2.4.5)-NH2(3)-Ph(8) C14H17NO4 263.1157580000 CSID: 29330841 +5-bromo-tryptophan Br-Trp C11H9BrN2O 263.9898150000 CSID: 87339 +9-octadecenoic acid C18:1(9) C18H32O 264.2453160000 CSID: 553123 +8.10-Dimethyl-9-hydroxy-7-methoxytridecadienoic acid DHMDA C16H26O3 266.1881950000 C(C(C(CCC)C)O)(C(C=CC=CCC(=O)O)OC)C in CSID: 10479168 +3-amino-14-methyl-hexadecanoic acid/3-amino-15-methyl-hexadecanoic acid aC17:0-NH2(3)/iC17:0-NH2(3) C17H33NO 267.2562150000 C(CC(CCCCCCCCCCC(CC)C)N)(O)=O in CSID: 2340866/C(CC(CCCCCCCCCCCC(C)C)N)(O)=O in: NOR00801 +3-hydroxy-14-methyl-hexadecanoic acid/3-hydroxy-15-methyl-hexadecanoic acid aC17:0-OH(3)/iC17:0-OH(3) C17H32O2 268.2402300000 C(CC(CCCCCCCCCCC(CC)C)O)(O)=O in: NOR00900/CSID: 141849 +3.4-dihydroxy-hexadecanoic acid C16:0-OH(3.4) C16H30O3 270.2194950000 CID: 22348653 +4-propenoyl-2-tyrosylthiazole acid PTTA C14H12N2O2S 272.0619480000 C(O)(=O)C=CC1=CSC(=N1)C(N)CC2=CC=C(C=C2)O in CSID: 16738243 +N-methyl-2-Bromo-tryptophan NMe-Br-Trp C12H11BrN2O 278.0054650000 C(C(=O)O)(NC)CC1=C([N]C2=C1C=CC=C2)Br in CSID: 8007368 +2-bromo-5-hydroxytryptophan Br-OH-Trp C11H9BrN2O2 279.9847300000 CSID: 643874 +3-hydroxy-9-octadecenoic acid C18:1(9)-OH(3) C18H32O2 280.2402300000 C(CC(CCCCCC=CCCCCCCCC)O)(O)=O in: NOR00724 +azotobactins chromophore ChrA C14H11N3O4 285.0749560000 C1=C(C(=CC2=C1N4C3C(=C2)NC(N3CCC4C(O)=O)=O)O)O in: NOR00208 +O-demethyl-Adda DMAdda C19H25NO2 299.1885290000 C(C(C(C=CC(=CC(C(CC1=CC=CC=C1)O)C)C)N)C)(O)=O in: NOR00129 +D-3-iodo-N-methyl-Tyrosine D-I-NMe-Tyr C10H10INO2 302.9756110000 C(C(=O)O)(NC)CC1=CC(=C(C=C1)O)I in CSID: 9017332 +actinomycin chromophore ChrAct C16H10N2O5 310.0589710000 CSID: 86817 +3-amino-9-methoxy-2.6.8-trimethyl-10-phenyldeca-4.6-dienoic acid Adda C20H27NO2 313.2041790000 CSID: 10471100 +3-amino-4-hydroxy-6-methyl-8-(p-bromophenyl)-5.7-octadienoic acid C8:2(5.7)-Me(6)-OH(4)-NH2(3)-brPh(8) C15H16BrNO2 321.0364310000 C(CC(C(C=C(C=CC1=CC=C(C=C1)Br)C)O)N)(=O)O in CSID: 10476834 +3-amino-6-methyl-12-phenyl-2.4.5-trihydroxydodeca-7.9.11-trienoic acid C12:3(7.9.11)-Me(6)-OH(2.4.5)-NH2(3)-Ph(12) C19H23NO4 329.1627080000 C(C(C(C(C(C(C=CC=CC=CC1=CC=CC=C1)C)O)O)N)O)(O)=O in CSID: 8923613 +3-amino-10-(p-ethoxyphenyl)-2.4.5-trihydroxydeca-7.9-dienoic acid C10:2(7.9)-OH(2.4.5)-NH2(3)-ePh(10) C18H23NO5 333.1576230000 CSID: 29330839 +O-Acetyl-O-demethylAdda ADMAdda C21H27NO3 341.1990940000 C(C(C(C=CC(=CC(C(CC1=CC=CC=C1)OC(C)=O)C)C)N)C)(O)=O in: NOR00144 +3-amino-6.10-dimethyl-12-phenyl-2.4.5-trihydroxydodeca-7.9.11-trienoic acid C12:3(7.9.11)-Me(6.10)-OH(2.4.5)-NH2(3)-Ph(12) C20H25NO4 343.1783580000 C(C(C(C(C(C(C=CC=C(C=CC1=CC=CC=C1)C)C)O)O)N)O)(O)=O in CSID: 10187168 +3-amino-6-methyl-12-(p-methoxyphenyl)-2.4.5-trihydroxydodec-11-enoic acid C12:1(11)-Me(6)-OH(2.4.5)-NH2(3)-mPhe(11) C20H29NO5 363.2045730000 CSID: 29330842 +norspermidine NSpd C6H15N3 129.1265970000 CID: 5942 +spermidine Spd C7H17N3 143.1422480000 PDB: SPD +guanylspermidine GSpd C8H19N5 185.1640460000 CID: 3082086 +formyl group CO CO 27.9949150000 PDB: FOR diff --git a/CycloBranch/BrickDatabases/db33_v1.txt b/CycloBranch/BrickDatabases/db33_v1.txt index 9cbf0ac..790373a 100644 --- a/CycloBranch/BrickDatabases/db33_v1.txt +++ b/CycloBranch/BrickDatabases/db33_v1.txt @@ -1,33 +1,33 @@ -3-hydroxy-4-methyloctanoic acid C8:0-Me(4)-OH(3) C9H16O2 156.1150300000 CSID: 17247549 -DL-Phenylalanine Phe C9H9NO 147.0684140000 CSID: 969 -DL-Alanine/beta-Alanine/Sarcosine Ala/bAla/Sar C3H5NO 71.0371110000 CSID: 582/CSID: 234/CSID: 1057 -Leucine/Isoleucine/N-Methyl-L-valine Leu/Ile/NMe-Val C6H11NO 113.0840700000 CSID: 834/CSID: 769/CSID: 392093 -D-Leucic acid (2-hydroxy-4-methylpentanoic acid) C5:0-Me(4)-OH(2) C6H10O2 114.0680790000 CSID: 83753 -3-Methylproline/Pipecolic acid Me-Pro/Pip C6H9NO 111.0684140000 CSID: 10610754/CSID: 826 -N-Methyl-L-alanine/ABU/2-Methylalanine NMe-Ala/Abu/Aib C4H7NO 85.0527670000 CSID: 4450824/CSID: 6405/CSID: 5891 -DL-Ornithine Orn C5H10N2O 114.0793090000 CSID: 380 -DL-Proline Pro C5H7NO 97.0527670000 CSID: 594 -N-Acetylisoleucine N-Ac-Ile C8H13NO2 155.0946290000 CSID: 270615 -MeBmt MeBmt C10H17NO2 183.1259250000 CSID: 9944222 -N-methylleucine Me-Leu C7H13NO 127.0997100000 CSID: 493595 -DL-Valine/Isovaline Val/Ival C5H9NO 99.0684140000 CSID: 1148/CSID: 85483 -DL-Arginine/L-(+)-Arginine Arg/L-Arg C6H12N4O 156.1011140000 CSID: 227/CSID: 6082 -DL-Asparagine Asn C4H6N2O2 114.0429320000 CSID: 231 -DL-Aspartic acid Asp C4H5NO3 115.0269410000 CSID: 411 -DL-Cysteine Cys C3H5NOS 103.0091800000 CSID: 574 -DL-Glutamine Gln C5H8N2O2 128.0584350000 CSID: 718 -DL-Glutamic acid Glu C5H7NO3 129.0424290000 CSID: 591 -Glycine Gly C2H3NO 57.0214630000 CSID: 730 -DL-Histidine His C6H7N3O 137.0589080000 CSID: 752 -DL-Lysine Lys C6H12N2O 128.0949650000 CSID: 843 -Methionine Met C5H9NOS 131.0404910000 CSID: 853 -DL-Serine Ser C3H5NO2 87.0320300000 CSID: 597 -Threonine Thr C4H7NO2 101.0476780000 CSID: 200 -DL-Tryptophan Trp C11H10N2O 186.0793090000 CSID: 1116 -Tyrosine Tyr C9H9NO2 163.0633330000 CSID: 1121 -Lactic acid Lac C3H4O2 72.0211280000 CSID: 592 -2-hydroxyisovaleric acid Hiv C5H8O2 100.0524310000 CSID: 90190 -3-hydroxy-13-methyltetradecanoic acid C14:0-Me(13)-OH(3) C15H28O2 240.2089170000 CSID: 9218624 -N6-formyl-HydroxyOrnithine Fo-OH-Orn C6H10N2O3 158.0691470000 C(C(=O)O)(CCCN(C=O)O)N in CSID: 3294 -pyoverdin A chromophore derivate ChrPder C13H11N3O3 257.080048 C1=C(C(=CC2=C1N3C(C(=C2)N)=NC(CC3)C(O)=O)O)O in CSID: 0 -Succinic acid Suc C4H4O3 100.016045 CSID: 7634 +3-hydroxy-4-methyloctanoic acid C8:0-Me(4)-OH(3) C9H16O2 156.1150300000 CSID: 17247549 +DL-Phenylalanine Phe C9H9NO 147.0684140000 CSID: 969 +DL-Alanine/beta-Alanine/Sarcosine Ala/bAla/Sar C3H5NO 71.0371140000 CSID: 582/CSID: 234/CSID: 1057 +Leucine/Isoleucine/N-Methyl-L-valine Leu/Ile/NMe-Val C6H11NO 113.0840640000 CSID: 834/CSID: 769/CSID: 392093 +D-Leucic acid (2-hydroxy-4-methylpentanoic acid) C5:0-Me(4)-OH(2) C6H10O2 114.0680800000 CSID: 83753 +3-Methylproline/Pipecolic acid Me-Pro/Pip C6H9NO 111.0684140000 CSID: 10610754/CSID: 826 +N-Methyl-L-alanine/ABU/2-Methylalanine NMe-Ala/Abu/Aib C4H7NO 85.0527640000 CSID: 4450824/CSID: 6405/CSID: 5891 +DL-Ornithine Orn C5H10N2O 114.0793130000 CSID: 380 +DL-Proline Pro C5H7NO 97.0527640000 CSID: 594 +N-Acetylisoleucine N-Ac-Ile C8H13NO2 155.0946290000 CSID: 270615 +MeBmt MeBmt C10H17NO2 183.1259290000 CSID: 9944222 +N-methylleucine Me-Leu C7H13NO 127.0997140000 CSID: 493595 +DL-Valine/Isovaline Val/Ival C5H9NO 99.0684140000 CSID: 1148/CSID: 85483 +DL-Arginine/L-(+)-Arginine Arg/L-Arg C6H12N4O 156.1011110000 CSID: 227/CSID: 6082 +DL-Asparagine Asn C4H6N2O2 114.0429270000 CSID: 231 +DL-Aspartic acid Asp C4H5NO3 115.0269430000 CSID: 411 +DL-Cysteine Cys C3H5NOS 103.0091840000 CSID: 574 +DL-Glutamine Gln C5H8N2O2 128.0585780000 CSID: 718 +DL-Glutamic acid Glu C5H7NO3 129.0425930000 CSID: 591 +Glycine Gly C2H3NO 57.0214640000 CSID: 730 +DL-Histidine His C6H7N3O 137.0589120000 CSID: 752 +DL-Lysine Lys C6H12N2O 128.0949630000 CSID: 843 +Methionine Met C5H9NOS 131.0404850000 CSID: 853 +DL-Serine Ser C3H5NO2 87.0320280000 CSID: 597 +Threonine Thr C4H7NO2 101.0476780000 CSID: 200 +DL-Tryptophan Trp C11H10N2O 186.0793130000 CSID: 1116 +Tyrosine Tyr C9H9NO2 163.0633290000 CSID: 1121 +Lactic acid Lac C3H4O2 72.0211290000 CSID: 592 +2-hydroxyisovaleric acid Hiv C5H8O2 100.0524300000 CSID: 90190 +3-hydroxy-13-methyltetradecanoic acid C14:0-Me(13)-OH(3) C15H28O2 240.2089300000 CSID: 9218624 +N6-formyl-HydroxyOrnithine Fo-OH-Orn C6H10N2O3 158.0691420000 C(C(=O)O)(CCCN(C=O)O)N in CSID: 3294 +pyoverdin A chromophore derivate ChrPder C13H11N3O3 257.0800410000 C1=C(C(=CC2=C1N3C(C(=C2)N)=NC(CC3)C(O)=O)O)O in CSID: 0 +Succinic acid Suc C4H4O3 100.0160440000 CSID: 7634 diff --git a/CycloBranch/BrickDatabases/db33_v2.txt b/CycloBranch/BrickDatabases/db33_v2.txt index c4609f1..339d154 100644 --- a/CycloBranch/BrickDatabases/db33_v2.txt +++ b/CycloBranch/BrickDatabases/db33_v2.txt @@ -1,33 +1,33 @@ -Glycine Gly C2H3NO 57.0214637236 CSID: 730 -DL-Alanine/D-Alanine/beta-Alanine/N-Methyl-Glycine Ala/D-Ala/bAla/NMe-Gly C3H5NO 71.0371137878 CSID: 582/CSID: 64234/CSID: 234/CSID: 1057 -Lactic acid/D-lactic acid Lac/D-Lac C3H4O2 72.0211293726 CSID: 592/CSID: 55423 -N-Methyl-L-alanine/N-methyl-beta-alanine/alpha-aminobutyric acid/D-alpha-aminobutyric acid/2-Methylalanine/methyl alaninate NMe-Ala/NMe-bAla/Abu/D-Abu/Aib/D-3OMe-Ala C4H7NO 85.0527638520 CSID: 4450824/CSID: 68396/PDB: ABA/PDB: DBB/CSID: 5891/CSID: 99878 -DL-Serine/D-Serine/isoserine Ser/D-Ser/Iser C3H5NO2 87.0320284099 CSID: 597/CSID: 64231/CSID: 10793 -DL-Proline/D-Proline/2-methylamino-2-dehydrobutyric acid/norcoronamic acid Pro/D-Pro/2Dh-Mabu/norCMA C5H7NO 97.0527638520 CSID: 594/CSID: 8640/CSID: 16743754/CSID: 28708240 -DL-Valine/D-Valine/Isovaline/D-Isovaline/Norvaline/D-Norvaline/2-methyl-3-aminobutanoic acid/N-dimethyl-Alanine/3-amino-pentanoic acid Val/D-Val/Ival/D-Ival/Nva/D-Nva/Mab/NdMe-Ala/C5:0-NH2(3) C5H9NO 99.0684139162 CSID: 1148/CSID: 64635/CSID: 85483/PDB: DIV/CSID: 801/CSID: 388660/CSID: 471786/CSID: 9962964/CSID: 11271826 -Succinic acid Suc C4H4O3 100.0160439947 CSID: 7634 -2-hydroxyisovaleric acid/D-2-hydroxyisovalerate Hiv/D-Hiv C5H8O2 100.0524295010 CSID: 90190/CID: 5289545 -Threonine/D-Threonine/allo-Threonine/D-allo-Threonine/Homoserine/D-Homoserine/N-Methyl-Serine/N-Methyl-D-Serine/4-amino-3-hydroxybutyric acid Thr/D-Thr/aThr/D-aThr/Hse/D-Hse/NMe-Ser/D-NMe-Ser/OH-4Abu C4H7NO2 101.0476784741 PDB: THR/PDB: DTH/PDB: ALO/CSID: 81824/CSID: 758/CSID: 2006329/CSID: 481791/PDB: DSE/CSID: 2064 -DL-Cysteine Cys C3H5NOS 103.0091844778 CSID: 574 -3-Methylproline/4-Methylproline/homoproline/D-homoproline/coronamic acid 3Me-Pro/4Me-Pro/Hpr/D-Hpr/CMA C6H9NO 111.0684139162 CSID: 10610754/CSID: 312597/CSID: 826/CSID: 643442/CSID: 117751 -Leucine/D-Leucine/Isoleucine/D-Isoleucine/allo-Isoleucine/D-allo-Isoleucine/N-Methyl-L-valine/D-N-Methylvaline/3-Methylvaline/D-tert-Leu/2-methyl-3-aminopentanoic acid/D-N-methyl-norvaline Leu/D-Leu/Ile/D-Ile/aIle/D-aIle/NMe-Val/D-NMe-Val/t-Leu/D-t-Leu/Map/D-NMe-Nva C6H11NO 113.0840639804 CSID: 834/CSID: 388617/CSID: 769/CSID: 69017/CSID: 89698/CSID: 85019/CSID: 4225/CSID: 4225/CSID: 270637/CID: 6950340/CSID: 11643060/CSID: 10652938 -DL-Asparagine/D-Asparagine/N1-formyl-2.3-Diaminopropionic acid Asn/D-Asn/NFo-Dpr C4H6N2O2 114.0429274472 PDB: ASN/PDB: DSG/C(C(CN)NC=O)(=O)O in CSID: 8873525 -D-Leucic acid (2-hydroxy-4-methylpentanoic acid)/(R)-Leucic acid/3-hydroxyhexanoic acid/2-hydroxy-3-methyl-pentanoic acid/D-2-hydroxy-3-methyl-pentanoic acid C5:0-Me(4)-OH(2)/4Me-D-Hva/C6:0-OH(3)/Hmp/D-Hmp C6H10O2 114.0680795652 CSID: 83753/CSID: 388986/CSID: 133518/CSID: 144317/CSID: 144317 -DL-Ornithine/D-Ornithine Orn/D-Orn C5H10N2O 114.0793129535 CSID: 380/CSID: 64236 -DL-Aspartic acid/D-Aspartic acid/N-formyl-isoserine Asp/D-Asp/NFo-Iser C4H5NO3 115.0269430320 CSID: 411/CSID: 75697/C(C(C(=O)O)O)NC=O in CSID: 8503913 -N-Methyl-Leucine/D-N-methyl-Leucine/N-Methyl-Isoleucine/N-methyl-alloIsoleucine/D-N-methyl-alloIsoleucine/beta-methylisoleucine/homoisoleucine/alpha-ethylnorvaline/Dolavaline/2-methyl-3-aminohexadecanoic acid NMe-Leu/D-NMe-Leu/NMe-Ile/NMe-aIle/D-NMe-aIle/bMe-Ile/Hil/Et-Nva/Dov/C6:0-Me(2)-NH2(3) C7H13NO 127.0997140446 CSID: 493595/CSID: 493595/CSID: 487199/CCC(C)C(C(=O)O)NC in: NOR00428/CCC(C)C(C(=O)O)NC in: NOR00428/CSID: 19951406/CSID: 454232/CSID: 452678/CSID: 10731564/CSID: 21378848 -DL-Glutamine/D-Glutamine/N-methylasparagine/beta-methyl-asparagine/D-N2-methyl-asparagine/N1-acetyl-2.3-Diaminopropionic acid Gln/D-Gln/NMe-Asn/bMe-Asn/D-N2Me-Asn/NAc-Dpr C5H8N2O2 128.0585775114 PDB: GLN/PDB: DGN/CSID: 311563/CSID: 2284493/CSID: 288387/C(C(CN)NC(C)=O)(=O)O in CSID: 8570696 -DL-Lysine/D-Lysine/beta lysine/N-Hydroxy-histamine Lys/D-Lys/bLys/N-OH-Hta C6H12N2O 128.0949630177 CSID: 843/CSID: 51793/PDB: KBE/C1(CCCN1)CCNO in CSID: 4589228 -DL-Glutamic acid/D-Glutamic Acid/beta-methyl-aspartic acid/D-beta-methyl-aspartic acid/beta-methoxy-aspartic acid/O-acetyl-Serine Glu/D-Glu/bMe-Asp/D-bMe-Asp/bOMe-Asp/Ac-Ser C5H7NO3 129.0425930962 CSID: 591/PDB: DGL/PDB: 2AS/PDB: ACB/CSID: 92764/CSID: 184 -Methionine/N.S-dimethylcysteine Met/diMe-Cys C5H9NOS 131.0404846062 CSID: 853/CSID: 4450935 -DL-Histidine His C6H7N3O 137.0589118624 CSID: 752 -DL-Phenylalanine/D-Phenylalanine/beta-phenylalanine/D-beta-phenylalanine/N-methyl-phenylglycine Phe/D-Phe/bPhe/D-bPhe/NMe-Ph-Gly C9H9NO 147.0684139162 CSID: 969/CSID: 64639/CSID: 62403/CSID: 598357/CSID: 198596 -N-Acetylisoleucine/N-acetyl-Leucine/O-desmethyldolaproine NAc-Ile/NAc-Leu/dDap C8H13NO2 155.0946286667 CSID: 270615/CSID: 1918/C(C1CCCN1)(C(C(=O)O)C)O in CSID: 9938808 -DL-Arginine/D-Arginine/L-(+)-Arginine Arg/D-Arg/L-Arg C6H12N4O 156.1011110281 PDB: ARG/PDB: DAR/CSID: 6082 -3-hydroxy-4-methyloctanoic acid/3-hydroxy-nonanoic acid/3-hydroxy-isononanoic acid/3-hydroxy-6-methyloctanoic acid C8:0-Me(4)-OH(3)/C9:0-OH(3)/iC9:0-OH(3)/aC9:0-OH(3) C9H16O2 156.1150297578 CSID: 17247549/CSID: 33630/CID: 22472006/CSID: 10361823 -N6-formyl-HydroxyOrnithine/D-formyl-hydroxyOrnithine Fo-OH-Orn/D-Fo-OH-Orn C6H10N2O3 158.0691421977 PDB: FHO/PDB: FH7 -Tyrosine/D-Tyrosine/beta-tyrosine/Phenylserine/N-methyl-HydroxyPhenylGlycine Tyr/D-Tyr/bTyr/Ph-Ser/NMe-Hpg C9H9NO2 163.0633285383 CSID: 1121/CSID: 64252/CSID: 389285/CSID: 84951/CID: 15118056 -N-methyl-butenylthreonine/2-amino-8-oxo-decanoic acid NMe-Bmt/C10:0-NH2(2)-oxo(8) C10H17NO2 183.1259287951 CSID: 9944222/CSID: 16281719 -DL-Tryptophan/D-Tryptophan Trp/D-Trp C11H10N2O 186.0793129535 CSID: 1116/CSID: 8707 -3-hydroxy-13-methyltetradecanoic acid/3-hydroxy-pentadecanoic acid/3-hydroxy-isopentadecanoic acid/3-hydroxy-12-methyl-tetradecanoic acid C14:0-Me(13)-OH(3)/C15:0-OH(3)/iC15:0-OH(3)/aC15:0-OH(3) C15H28O2 240.2089301430 CSID: 9218624/CSID: 158374/CSID: 9218624/C(CC(CCCCCCCCC(CC)C)O)(O)=O in: NOR00211 -pyoverdin Pa A chromophore ChrPaA C13H11N3O3 257.0800412350 C1=C(C(=CC2=C1N3C(C(=C2)N)=NC(CC3)C(O)=O)O)O in CSID: 0 +Glycine Gly C2H3NO 57.0214640000 CSID: 730 +DL-Alanine/D-Alanine/beta-Alanine/N-Methyl-Glycine Ala/D-Ala/bAla/NMe-Gly C3H5NO 71.0371140000 CSID: 582/CSID: 64234/CSID: 234/CSID: 1057 +Lactic acid/D-lactic acid Lac/D-Lac C3H4O2 72.0211290000 CSID: 592/CSID: 55423 +N-Methyl-L-alanine/N-methyl-beta-alanine/alpha-aminobutyric acid/D-alpha-aminobutyric acid/2-Methylalanine/methyl alaninate NMe-Ala/NMe-bAla/Abu/D-Abu/Aib/D-3OMe-Ala C4H7NO 85.0527640000 CSID: 4450824/CSID: 68396/PDB: ABA/PDB: DBB/CSID: 5891/CSID: 99878 +DL-Serine/D-Serine/isoserine Ser/D-Ser/Iser C3H5NO2 87.0320280000 CSID: 597/CSID: 64231/CSID: 10793 +DL-Proline/D-Proline/2-methylamino-2-dehydrobutyric acid/norcoronamic acid Pro/D-Pro/2Dh-Mabu/norCMA C5H7NO 97.0527640000 CSID: 594/CSID: 8640/CSID: 16743754/CSID: 28708240 +DL-Valine/D-Valine/Isovaline/D-Isovaline/Norvaline/D-Norvaline/2-methyl-3-aminobutanoic acid/N-dimethyl-Alanine/3-amino-pentanoic acid Val/D-Val/Ival/D-Ival/Nva/D-Nva/Mab/NdMe-Ala/C5:0-NH2(3) C5H9NO 99.0684140000 CSID: 1148/CSID: 64635/CSID: 85483/PDB: DIV/CSID: 801/CSID: 388660/CSID: 471786/CSID: 9962964/CSID: 11271826 +Succinic acid Suc C4H4O3 100.0160440000 CSID: 7634 +2-hydroxyisovaleric acid/D-2-hydroxyisovalerate Hiv/D-Hiv C5H8O2 100.0524300000 CSID: 90190/CID: 5289545 +Threonine/D-Threonine/allo-Threonine/D-allo-Threonine/Homoserine/D-Homoserine/N-Methyl-Serine/N-Methyl-D-Serine/4-amino-3-hydroxybutyric acid Thr/D-Thr/aThr/D-aThr/Hse/D-Hse/NMe-Ser/D-NMe-Ser/OH-4Abu C4H7NO2 101.0476780000 PDB: THR/PDB: DTH/PDB: ALO/CSID: 81824/CSID: 758/CSID: 2006329/CSID: 481791/PDB: DSE/CSID: 2064 +DL-Cysteine Cys C3H5NOS 103.0091840000 CSID: 574 +3-Methylproline/4-Methylproline/homoproline/D-homoproline/coronamic acid 3Me-Pro/4Me-Pro/Hpr/D-Hpr/CMA C6H9NO 111.0684140000 CSID: 10610754/CSID: 312597/CSID: 826/CSID: 643442/CSID: 117751 +Leucine/D-Leucine/Isoleucine/D-Isoleucine/allo-Isoleucine/D-allo-Isoleucine/N-Methyl-L-valine/D-N-Methylvaline/3-Methylvaline/D-tert-Leu/2-methyl-3-aminopentanoic acid/D-N-methyl-norvaline Leu/D-Leu/Ile/D-Ile/aIle/D-aIle/NMe-Val/D-NMe-Val/t-Leu/D-t-Leu/Map/D-NMe-Nva C6H11NO 113.0840640000 CSID: 834/CSID: 388617/CSID: 769/CSID: 69017/CSID: 89698/CSID: 85019/CSID: 4225/CSID: 4225/CSID: 270637/CID: 6950340/CSID: 11643060/CSID: 10652938 +DL-Asparagine/D-Asparagine/N1-formyl-2.3-Diaminopropionic acid Asn/D-Asn/NFo-Dpr C4H6N2O2 114.0429270000 PDB: ASN/PDB: DSG/C(C(CN)NC=O)(=O)O in CSID: 8873525 +D-Leucic acid (2-hydroxy-4-methylpentanoic acid)/(R)-Leucic acid/3-hydroxyhexanoic acid/2-hydroxy-3-methyl-pentanoic acid/D-2-hydroxy-3-methyl-pentanoic acid C5:0-Me(4)-OH(2)/4Me-D-Hva/C6:0-OH(3)/Hmp/D-Hmp C6H10O2 114.0680800000 CSID: 83753/CSID: 388986/CSID: 133518/CSID: 144317/CSID: 144317 +DL-Ornithine/D-Ornithine Orn/D-Orn C5H10N2O 114.0793130000 CSID: 380/CSID: 64236 +DL-Aspartic acid/D-Aspartic acid/N-formyl-isoserine Asp/D-Asp/NFo-Iser C4H5NO3 115.0269430000 CSID: 411/CSID: 75697/C(C(C(=O)O)O)NC=O in CSID: 8503913 +N-Methyl-Leucine/D-N-methyl-Leucine/N-Methyl-Isoleucine/N-methyl-alloIsoleucine/D-N-methyl-alloIsoleucine/beta-methylisoleucine/homoisoleucine/alpha-ethylnorvaline/Dolavaline/2-methyl-3-aminohexadecanoic acid NMe-Leu/D-NMe-Leu/NMe-Ile/NMe-aIle/D-NMe-aIle/bMe-Ile/Hil/Et-Nva/Dov/C6:0-Me(2)-NH2(3) C7H13NO 127.0997140000 CSID: 493595/CSID: 493595/CSID: 487199/CCC(C)C(C(=O)O)NC in: NOR00428/CCC(C)C(C(=O)O)NC in: NOR00428/CSID: 19951406/CSID: 454232/CSID: 452678/CSID: 10731564/CSID: 21378848 +DL-Glutamine/D-Glutamine/N-methylasparagine/beta-methyl-asparagine/D-N2-methyl-asparagine/N1-acetyl-2.3-Diaminopropionic acid Gln/D-Gln/NMe-Asn/bMe-Asn/D-N2Me-Asn/NAc-Dpr C5H8N2O2 128.0585780000 PDB: GLN/PDB: DGN/CSID: 311563/CSID: 2284493/CSID: 288387/C(C(CN)NC(C)=O)(=O)O in CSID: 8570696 +DL-Lysine/D-Lysine/beta lysine/N-Hydroxy-histamine Lys/D-Lys/bLys/N-OH-Hta C6H12N2O 128.0949630000 CSID: 843/CSID: 51793/PDB: KBE/C1(CCCN1)CCNO in CSID: 4589228 +DL-Glutamic acid/D-Glutamic Acid/beta-methyl-aspartic acid/D-beta-methyl-aspartic acid/beta-methoxy-aspartic acid/O-acetyl-Serine Glu/D-Glu/bMe-Asp/D-bMe-Asp/bOMe-Asp/Ac-Ser C5H7NO3 129.0425930000 CSID: 591/PDB: DGL/PDB: 2AS/PDB: ACB/CSID: 92764/CSID: 184 +Methionine/N.S-dimethylcysteine Met/diMe-Cys C5H9NOS 131.0404850000 CSID: 853/CSID: 4450935 +DL-Histidine His C6H7N3O 137.0589120000 CSID: 752 +DL-Phenylalanine/D-Phenylalanine/beta-phenylalanine/D-beta-phenylalanine/N-methyl-phenylglycine Phe/D-Phe/bPhe/D-bPhe/NMe-Ph-Gly C9H9NO 147.0684140000 CSID: 969/CSID: 64639/CSID: 62403/CSID: 598357/CSID: 198596 +N-Acetylisoleucine/N-acetyl-Leucine/O-desmethyldolaproine NAc-Ile/NAc-Leu/dDap C8H13NO2 155.0946290000 CSID: 270615/CSID: 1918/C(C1CCCN1)(C(C(=O)O)C)O in CSID: 9938808 +DL-Arginine/D-Arginine/L-(+)-Arginine Arg/D-Arg/L-Arg C6H12N4O 156.1011110000 PDB: ARG/PDB: DAR/CSID: 6082 +3-hydroxy-4-methyloctanoic acid/3-hydroxy-nonanoic acid/3-hydroxy-isononanoic acid/3-hydroxy-6-methyloctanoic acid C8:0-Me(4)-OH(3)/C9:0-OH(3)/iC9:0-OH(3)/aC9:0-OH(3) C9H16O2 156.1150300000 CSID: 17247549/CSID: 33630/CID: 22472006/CSID: 10361823 +N6-formyl-HydroxyOrnithine/D-formyl-hydroxyOrnithine Fo-OH-Orn/D-Fo-OH-Orn C6H10N2O3 158.0691420000 PDB: FHO/PDB: FH7 +Tyrosine/D-Tyrosine/beta-tyrosine/Phenylserine/N-methyl-HydroxyPhenylGlycine Tyr/D-Tyr/bTyr/Ph-Ser/NMe-Hpg C9H9NO2 163.0633290000 CSID: 1121/CSID: 64252/CSID: 389285/CSID: 84951/CID: 15118056 +N-methyl-butenylthreonine/2-amino-8-oxo-decanoic acid NMe-Bmt/C10:0-NH2(2)-oxo(8) C10H17NO2 183.1259290000 CSID: 9944222/CSID: 16281719 +DL-Tryptophan/D-Tryptophan Trp/D-Trp C11H10N2O 186.0793130000 CSID: 1116/CSID: 8707 +3-hydroxy-13-methyltetradecanoic acid/3-hydroxy-pentadecanoic acid/3-hydroxy-isopentadecanoic acid/3-hydroxy-12-methyl-tetradecanoic acid C14:0-Me(13)-OH(3)/C15:0-OH(3)/iC15:0-OH(3)/aC15:0-OH(3) C15H28O2 240.2089300000 CSID: 9218624/CSID: 158374/CSID: 9218624/C(CC(CCCCCCCCC(CC)C)O)(O)=O in: NOR00211 +pyoverdin Pa A chromophore ChrPaA C13H11N3O3 257.0800410000 C1=C(C(=CC2=C1N3C(C(=C2)N)=NC(CC3)C(O)=O)O)O in CSID: 0 diff --git a/CycloBranch/BrickDatabases/inhouse_siderophores_blocks.txt b/CycloBranch/BrickDatabases/inhouse_siderophores_blocks.txt index f74b510..ddaf0c7 100644 --- a/CycloBranch/BrickDatabases/inhouse_siderophores_blocks.txt +++ b/CycloBranch/BrickDatabases/inhouse_siderophores_blocks.txt @@ -1,19 +1,19 @@ -Glycine Gly C2H3NO 57.0214640000 CSID: 730 -succinic semialdehyde Suc C4H4O2 84.0211290000 CSID: 1080 -3-Hydroxybutanoic acid C4:0-OH(3) C4H6O2 86.0367790000 CSID: 428 -(-2H) Putrescine Put C4N2H10 86.0843980000 CSID: 13837702 -DL-Serine Ser C3H5NO2 87.0320280000 CSID: 597 -Succinamic acid Suca C4H5NO2 99.0320280000 CSID: 12005 -Threonine Thr C4H7NO2 101.0476780000 CSID: 200 -(2E)-5-Hydroxy-3-methyl-2-pentenoic acid OH-MP C6H8O2 112.0524300000 CSID: 32988805 -3-Hydroxyhexanoic acid C6:0-OH(3) C6H10O2 114.0680800000 CSID: 133518 -(-2H) N-Hydroxy-1.5-pentanediamine Hpd C5H12N2O 116.0949630000 CSID: 13660043 -3-Methylglutaconic acid Mga C6H6O3 126.0316940000 CSID: 1267861 -Lysine Lys C6H12N2O 128.0949630000 CSID: 843 -N5-hydroxy ornithine OH-Orn C5H10N2O2 130.0742280000 CSID: 148381 -D-Hydroxyaspartic acid D-OH-Asp C4H5NO4 131.0218580000 CSID: 5232 -3-Hydroxyoctanoic acid C8:0-OH(3) C8H14O2 142.0993800000 CSID: 24791 -Arginine Arg C6H12N4O 156.1011110000 CSID: 227 -N5-formyl-N5-hydroxyornithine/N6-formyl-HydroxyOrnithine N5-Fo-OH-Orn/Fo-OH-Orn C6H10N2O3 158.0691420000 CSID: 25057473/PDB: FHO -N2-acetyl-N5-hydroxy-L-ornithine/D-N-acetyl-HydroxyOrnithine/2-acetamido-5-(hydroxyamino)pentanoic acid N2Ac-OH-Orn/D-Ac-OH-Orn/Ahp C7H12N2O3 172.0847920000 CSID: 0/CSID: 3670289/C(C(CCCNO)NC(=O)C)(O)=O in CSID: 0 -Pyoverdin Pa A chromophore ChrPaA C13H11N3O3 257.0800410000 CSID: 0 +Glycine Gly C2H3NO 57.0214640000 CSID: 730 +succinic semialdehyde Suc C4H4O2 84.0211290000 CSID: 1080 +3-Hydroxybutanoic acid C4:0-OH(3) C4H6O2 86.0367790000 CSID: 428 +(-2H) Putrescine Put C4N2H10 86.0843980000 CSID: 13837702 +DL-Serine Ser C3H5NO2 87.0320280000 CSID: 597 +Succinamic acid Suca C4H5NO2 99.0320280000 CSID: 12005 +Threonine Thr C4H7NO2 101.0476780000 CSID: 200 +(2E)-5-Hydroxy-3-methyl-2-pentenoic acid OH-MP C6H8O2 112.0524300000 CSID: 32988805 +3-Hydroxyhexanoic acid C6:0-OH(3) C6H10O2 114.0680800000 CSID: 133518 +(-2H) N-Hydroxy-1.5-pentanediamine Hpd C5H12N2O 116.0949630000 CSID: 13660043 +3-Methylglutaconic acid Mga C6H6O3 126.0316940000 CSID: 1267861 +Lysine Lys C6H12N2O 128.0949630000 CSID: 843 +N5-hydroxy ornithine OH-Orn C5H10N2O2 130.0742280000 CSID: 148381 +D-Hydroxyaspartic acid D-OH-Asp C4H5NO4 131.0218580000 CSID: 5232 +3-Hydroxyoctanoic acid C8:0-OH(3) C8H14O2 142.0993800000 CSID: 24791 +Arginine Arg C6H12N4O 156.1011110000 CSID: 227 +N5-formyl-N5-hydroxyornithine/N6-formyl-HydroxyOrnithine N5-Fo-OH-Orn/Fo-OH-Orn C6H10N2O3 158.0691420000 CSID: 25057473/PDB: FHO +N2-acetyl-N5-hydroxy-L-ornithine/D-N-acetyl-HydroxyOrnithine/2-acetamido-5-(hydroxyamino)pentanoic acid N2Ac-OH-Orn/D-Ac-OH-Orn/Ahp C7H12N2O3 172.0847920000 CSID: 0/CSID: 3670289/C(C(CCCNO)NC(=O)C)(O)=O in CSID: 0 +Pyoverdin Pa A chromophore ChrPaA C13H11N3O3 257.0800410000 CSID: 0 diff --git a/CycloBranch/BrickDatabases/pyoverdinDE_blocks.txt b/CycloBranch/BrickDatabases/pyoverdinDE_blocks.txt index dbc6ef7..e37d30e 100644 --- a/CycloBranch/BrickDatabases/pyoverdinDE_blocks.txt +++ b/CycloBranch/BrickDatabases/pyoverdinDE_blocks.txt @@ -1,8 +1,8 @@ -Succinic acid Succ C4H4O3 100.0160440000 CSID: 1080 -Serine Ser C3H5NO2 87.0320280000 CSID: 597 -Succinamic acid Suca C4H5NO2 99.0320280000 CSID: 12005 -Threonine Thr C4H7NO2 101.0476780000 CSID: 200 -Lysine Lys C6H12N2O 128.0949630000 CSID: 843 -Arginine Arg C6H12N4O 156.1011110000 CSID: 227 -N5-formyl-N5-hydroxyornithine N5-Fo-OH-Orn C6H10N2O3 158.0691420000 CSID: 25057473 -Pyoverdin Pa A chromophore ChrPaA C13H11N3O3 257.0800410000 CSID: 0 +Succinic acid Succ C4H4O3 100.0160440000 CSID: 1080 +Serine Ser C3H5NO2 87.0320280000 CSID: 597 +Succinamic acid Suca C4H5NO2 99.0320280000 CSID: 12005 +Threonine Thr C4H7NO2 101.0476780000 CSID: 200 +Lysine Lys C6H12N2O 128.0949630000 CSID: 843 +Arginine Arg C6H12N4O 156.1011110000 CSID: 227 +N5-formyl-N5-hydroxyornithine N5-Fo-OH-Orn C6H10N2O3 158.0691420000 CSID: 25057473 +Pyoverdin Pa A chromophore ChrPaA C13H11N3O3 257.0800410000 CSID: 0 diff --git a/CycloBranch/BrickDatabases/pyoverdinDE_blocks_retro_diels.txt b/CycloBranch/BrickDatabases/pyoverdinDE_blocks_retro_diels.txt index c82a633..fb7c137 100644 --- a/CycloBranch/BrickDatabases/pyoverdinDE_blocks_retro_diels.txt +++ b/CycloBranch/BrickDatabases/pyoverdinDE_blocks_retro_diels.txt @@ -1,10 +1,10 @@ -Arginine Arg C6H12N4O 156.1011110000 CSID: 227 -Lysine Lys C6H12N2O 128.0949630000 CSID: 843 -N5-formyl-N5-hydroxyornithine N5-Fo-OH-Orn C6H10N2O3 158.0691420000 CSID: 25057473 -Pyoverdin Pa A chromophore ChrPaA C13H11N3O3 257.0800410000 CSID: 0 -Pyoverdin Pa A chromophore - part 1 ChrPaA1 C10H9N3O2 203.0694770000 CSID: 0 -Pyoverdin Pa A chromophore - part 2 ChrPaA2 C3H2O 54.0105650000 CSID: 0 -Serine Ser C3H5NO2 87.0320280000 CSID: 597 -Succinamic acid Suca C4H5NO2 99.0320280000 CSID: 12005 -Succinic acid Succ C4H4O3 100.0160440000 CSID: 1080 -Threonine Thr C4H7NO2 101.0476780000 CSID: 200 +Arginine Arg C6H12N4O 156.1011110000 CSID: 227 +Lysine Lys C6H12N2O 128.0949630000 CSID: 843 +N5-formyl-N5-hydroxyornithine N5-Fo-OH-Orn C6H10N2O3 158.0691420000 CSID: 25057473 +Pyoverdin Pa A chromophore ChrPaA C13H11N3O3 257.0800410000 CSID: 0 +Pyoverdin Pa A chromophore - part 1 ChrPaA1 C10H9N3O2 203.0694770000 CSID: 0 +Pyoverdin Pa A chromophore - part 2 ChrPaA2 C3H2O 54.0105650000 CSID: 0 +Serine Ser C3H5NO2 87.0320280000 CSID: 597 +Succinamic acid Suca C4H5NO2 99.0320280000 CSID: 12005 +Succinic acid Succ C4H4O3 100.0160440000 CSID: 1080 +Threonine Thr C4H7NO2 101.0476780000 CSID: 200 diff --git a/CycloBranch/CycloBranch-Linux.pro b/CycloBranch/CycloBranch-Linux.pro index 0bf006b..1dacae9 100644 --- a/CycloBranch/CycloBranch-Linux.pro +++ b/CycloBranch/CycloBranch-Linux.pro @@ -7,7 +7,7 @@ TARGET = CycloBranch QT += core gui widgets printsupport svg INCLUDEPATH += . core gui parallel QMAKE_CXXFLAGS += -std=c++11 -DLINUX -m64 -QMAKE_LIBS += -lboost_regex -lxerces-c +QMAKE_LIBS += -lboost_regex -lboost_iostreams -lxerces-c OBJECTS_DIR = build/ MOC_DIR = moc/ diff --git a/CycloBranch/CycloBranch-MacOSX.pro b/CycloBranch/CycloBranch-MacOSX.pro index d4b40fd..18c60cc 100644 --- a/CycloBranch/CycloBranch-MacOSX.pro +++ b/CycloBranch/CycloBranch-MacOSX.pro @@ -7,7 +7,7 @@ TARGET = CycloBranch QT += core gui widgets printsupport svg INCLUDEPATH += . core gui parallel /usr/local/opt/boost/include /usr/local/opt/xerces-c/include QMAKE_CXXFLAGS += -std=c++11 -DMACOSX -m64 -QMAKE_LIBS += -lboost_regex -lxerces-c +QMAKE_LIBS += -lboost_regex -lboost_iostreams -lxerces-c QMAKE_LIBDIR = /usr/local/opt/boost/lib /usr/local/opt/xerces-c/lib OBJECTS_DIR = build/ MOC_DIR = moc/ diff --git a/CycloBranch/CycloBranch.vcxproj b/CycloBranch/CycloBranch.vcxproj index ba52ae1..d3a4baf 100644 --- a/CycloBranch/CycloBranch.vcxproj +++ b/CycloBranch/CycloBranch.vcxproj @@ -1,5 +1,5 @@  - + Debug @@ -22,23 +22,24 @@ {B12702AD-ABFB-343A-A199-8E24837244A3} Qt4VSv1.0 CycloBranch + 10.0.17763.0 Application - v110 + v141 Application - v110 + v141 Application - v110 + v141 Application - v110 + v141 @@ -74,7 +75,7 @@ - UNICODE;WIN32;WIN64;QT_DLL;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_PRINTSUPPORT_LIB;QT_SVG_LIB;%(PreprocessorDefinitions) + UNICODE;WIN32;WIN64;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_PRINTSUPPORT_LIB;QT_SVG_LIB;%(PreprocessorDefinitions) .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtPrintSupport;$(QTDIR)\include\QtSvg;%(AdditionalIncludeDirectories) Disabled ProgramDatabase @@ -91,7 +92,7 @@ - UNICODE;WIN32;WIN64;QT_DLL;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_PRINTSUPPORT_LIB;QT_SVG_LIB;%(PreprocessorDefinitions) + UNICODE;WIN32;WIN64;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_PRINTSUPPORT_LIB;QT_SVG_LIB;%(PreprocessorDefinitions) .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtPrintSupport;$(QTDIR)\include\QtSvg;%(AdditionalIncludeDirectories) Disabled ProgramDatabase @@ -108,7 +109,7 @@ - UNICODE;WIN32;WIN64;QT_DLL;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_PRINTSUPPORT_LIB;QT_SVG_LIB;%(PreprocessorDefinitions) + UNICODE;WIN32;WIN64;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_PRINTSUPPORT_LIB;QT_SVG_LIB;%(PreprocessorDefinitions) .\GeneratedFiles;.;$(QTDIR)\include;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtPrintSupport;$(QTDIR)\include\QtSvg;%(AdditionalIncludeDirectories) MultiThreadedDLL @@ -124,8 +125,8 @@ - UNICODE;WIN32;WIN64;QT_DLL;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_PRINTSUPPORT_LIB;QT_SVG_LIB;%(PreprocessorDefinitions) - .;.\GeneratedFiles;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtSvg;$(QTDIR)\include\QtPrintSupport;C:\boost_1_57_0\;C:\xerces-c-3.1.1\include + UNICODE;WIN32;WIN64;QT_NO_DEBUG;NDEBUG;QT_CORE_LIB;QT_GUI_LIB;QT_WIDGETS_LIB;QT_PRINTSUPPORT_LIB;QT_SVG_LIB;%(PreprocessorDefinitions) + .;.\GeneratedFiles;.\GeneratedFiles\$(ConfigurationName);$(QTDIR)\include;$(QTDIR)\include\QtCore;$(QTDIR)\include\QtGui;$(QTDIR)\include\QtWidgets;$(QTDIR)\include\QtSvg;$(QTDIR)\include\QtPrintSupport;C:\boost_1_71_0;C:\xerces-c-3.1.1\include;%(AdditionalIncludeDirectories) ProgramDatabase MultiThreadedDLL true @@ -138,9 +139,9 @@ Windows $(OutDir)\$(ProjectName).exe - $(QTDIR)\lib;C:\boost_1_57_0\lib64-msvc-11.0;C:\xerces-c-3.1.1\lib;%(AdditionalLibraryDirectories) + $(QTDIR)\lib;C:\boost_1_71_0\lib64-msvc-14.1;C:\xerces-c-3.1.1\lib;%(AdditionalLibraryDirectories) false - qtmain.lib;Qt5Core.lib;Qt5Gui.lib;Qt5Widgets.lib;Qt5Svg.lib;Qt5PrintSupport.lib;libboost_regex-vc110-mt-1_57.lib;xerces-c_3.lib + shell32.lib;qtmain.lib;Qt5Core.lib;Qt5Gui.lib;Qt5Widgets.lib;Qt5Svg.lib;Qt5PrintSupport.lib;xerces-c_3.lib true true UseLinkTimeCodeGeneration @@ -553,415 +554,415 @@ $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cNeutralLossesListWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cNeutralLossesListWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cNeutralLossesListWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cNeutralLossesListWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cChromatogramWindowWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cChromatogramWindowWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cChromatogramWindowWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cChromatogramWindowWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cChromatogramWindow.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cChromatogramWindow.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cChromatogramWindow.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cChromatogramWindow.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cHTMLDelegate.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cHTMLDelegate.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cHTMLDelegate.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cHTMLDelegate.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cBricksDatabaseProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cBricksDatabaseProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cBricksDatabaseProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cBricksDatabaseProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cMultipleButtonDelegate.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cMultipleButtonDelegate.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cMultipleButtonDelegate.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cMultipleButtonDelegate.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cModificationsProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cModificationsProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cModificationsProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cModificationsProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cViewButtonDelegate.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cViewButtonDelegate.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cViewButtonDelegate.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cViewButtonDelegate.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cComboBoxDelegate.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cComboBoxDelegate.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cComboBoxDelegate.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cComboBoxDelegate.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cCheckBoxDelegate.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cCheckBoxDelegate.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cCheckBoxDelegate.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cCheckBoxDelegate.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSequenceDatabaseProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSequenceDatabaseProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSequenceDatabaseProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSequenceDatabaseProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cMainWindowProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cMainWindowProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cMainWindowProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cMainWindowProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSpectrumDetailProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSpectrumDetailProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSpectrumDetailProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSpectrumDetailProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSummaryPeaksTableProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSummaryPeaksTableProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSummaryPeaksTableProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSummaryPeaksTableProxyModel.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cImageWindowWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cImageWindowWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cImageWindowWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cImageWindowWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cImageWindow.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cImageWindow.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cImageWindow.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cImageWindow.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSummaryPeaksTableWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSummaryPeaksTableWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSummaryPeaksTableWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSummaryPeaksTableWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cHTMLExportDialog.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cHTMLExportDialog.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cHTMLExportDialog.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cHTMLExportDialog.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cBranchCyclicWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cBranchCyclicWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cBranchCyclicWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cBranchCyclicWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cExportDialog.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cExportDialog.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cExportDialog.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cExportDialog.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cFindDialog.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cFindDialog.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cFindDialog.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cFindDialog.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSpectrumSceneWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSpectrumSceneWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSpectrumSceneWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSpectrumSceneWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cEventFilter.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cEventFilter.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cEventFilter.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cEventFilter.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" @@ -993,177 +994,177 @@ $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cDrawPeptideWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cDrawPeptideWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cDrawPeptideWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cDrawPeptideWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cModificationsWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cModificationsWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cModificationsWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cModificationsWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSequenceDatabaseWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSequenceDatabaseWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSequenceDatabaseWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSequenceDatabaseWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cBricksDatabaseWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cBricksDatabaseWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cBricksDatabaseWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cBricksDatabaseWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cLinearWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cLinearWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cLinearWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cLinearWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cCyclicWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cCyclicWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cCyclicWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cCyclicWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cBranchedWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cBranchedWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cBranchedWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cBranchedWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cFragmentIonsListWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cFragmentIonsListWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cFragmentIonsListWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cFragmentIonsListWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cGraphReaderThread.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cGraphReaderThread.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cGraphReaderThread.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cGraphReaderThread.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" Moc%27ing cSpectrumComparatorThread.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" Moc%27ing cSpectrumComparatorThread.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" Moc%27ing cSpectrumComparatorThread.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" Moc%27ing cSpectrumComparatorThread.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) $(QTDIR)\bin\moc.exe;%(FullPath) $(QTDIR)\bin\moc.exe;%(FullPath) @@ -1173,19 +1174,19 @@ $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSpectrumDetailWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSpectrumDetailWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSpectrumDetailWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cSpectrumDetailWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" @@ -1217,91 +1218,91 @@ $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cMainWindow.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cMainWindow.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cMainWindow.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cMainWindow.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cMainThread.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cMainThread.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cMainThread.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cMainThread.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cParametersWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cParametersWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cParametersWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cParametersWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cGraphWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cGraphWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cGraphWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cGraphWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cAboutWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cAboutWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cAboutWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSvg" $(QTDIR)\bin\moc.exe;%(FullPath) Moc%27ing cAboutWidget.h... .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp - "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_57_0" "-IC:\xerces-c-3.1.1\include" + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_PRINTSUPPORT_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtSvg" "-I$(QTDIR)\include\QtPrintSupport" "-IC:\boost_1_71_0" "-IC:\xerces-c-3.1.1\include" @@ -1332,7 +1333,7 @@ - + \ No newline at end of file diff --git a/CycloBranch/CycloBranch.vcxproj.user b/CycloBranch/CycloBranch.vcxproj.user index b65447a..6b88773 100644 --- a/CycloBranch/CycloBranch.vcxproj.user +++ b/CycloBranch/CycloBranch.vcxproj.user @@ -9,17 +9,17 @@ C:\Qt\5.1.1\msvc2012_64\ - C:\Qt\Qt5.2.1\5.2.1\msvc2012_64 - PATH=$(QTDIR)\bin%3b"$(QTDIR)\bin%3b$(PATH) + C:\Qt\Qt5.13.0\5.13.0\msvc2017_64 WindowsLocalDebugger + PATH=$(QTDIR)\bin%3b"$(QTDIR)\bin%3b$(PATH) - C:\Qt\Qt5.2.1\5.2.1\msvc2012_64 - PATH=$(QTDIR)\bin%3b%PATH%%3b"$(PATH) + C:\Qt\Qt5.13.0\5.13.0\msvc2017_64 WindowsLocalDebugger + PATH=$(QTDIR)\bin%3b%PATH%%3b"$(PATH) \ No newline at end of file diff --git a/CycloBranch/External/linux/any2mzml.sh b/CycloBranch/External/linux/any2mzml.sh new file mode 100644 index 0000000..1952322 --- /dev/null +++ b/CycloBranch/External/linux/any2mzml.sh @@ -0,0 +1,3 @@ +#!/bin/bash +name="$@" +FileConverter -in "$name" -out "$name"".mzML" diff --git a/CycloBranch/External/linux/correctprofile.sh b/CycloBranch/External/linux/correctprofile.sh index 1e283e8..d750724 100644 --- a/CycloBranch/External/linux/correctprofile.sh +++ b/CycloBranch/External/linux/correctprofile.sh @@ -3,9 +3,9 @@ SAVEIFS=$IFS IFS=$',' read name fwhm <<< $@ IFS=$SAVEIFS FileConverter -in "$name"".mgf" -out "$name"".FileConverter.mzML" -NoiseFilterGaussian -in "$name"".FileConverter.mzML" -out "$name"".NoiseFilterGaussian.mzML" -algorithm:gaussian_width $fwhm +#NoiseFilterGaussian -in "$name"".FileConverter.mzML" -out "$name"".NoiseFilterGaussian.mzML" -algorithm:gaussian_width $fwhm rm "$name"".mzML" -BaselineFilter -in "$name"".NoiseFilterGaussian.mzML" -out "$name"".mzML" +BaselineFilter -in "$name"".FileConverter.mzML" -out "$name"".mzML" rm "$name"".mgf" rm "$name"".FileConverter.mzML" -rm "$name"".NoiseFilterGaussian.mzML" +#rm "$name"".NoiseFilterGaussian.mzML" diff --git a/CycloBranch/External/linux/raw2peaks.sh b/CycloBranch/External/linux/raw2peaks.sh index 63191e7..5c5aae8 100644 --- a/CycloBranch/External/linux/raw2peaks.sh +++ b/CycloBranch/External/linux/raw2peaks.sh @@ -11,14 +11,14 @@ for i in "$name""00"*".mgf" do echo "Converting the file ""$i" FileConverter -in "$i" -out "$i"".FileConverter.mzML" -NoiseFilterGaussian -in "$i"".FileConverter.mzML" -out "$i"".NoiseFilterGaussian.mzML" -algorithm:gaussian_width $fwhm -BaselineFilter -in "$i"".NoiseFilterGaussian.mzML" -out "$i"".BaselineFilter.mzML" +#NoiseFilterGaussian -in "$i"".FileConverter.mzML" -out "$i"".NoiseFilterGaussian.mzML" -algorithm:gaussian_width $fwhm +BaselineFilter -in "$i"".FileConverter.mzML" -out "$i"".BaselineFilter.mzML" PeakPickerHiRes -in "$i"".BaselineFilter.mzML" -out "$i"".PeakPickerHiRes.mzML" -algorithm:ms_levels 1 2 -algorithm:signal_to_noise 4 FileConverter -in "$i"".PeakPickerHiRes.mzML" -out "$i"".FileConverter2.mgf" cat "$i"".FileConverter2.mgf" >> "$name""mgf" rm "$i" rm "$i"".FileConverter.mzML" -rm "$i"".NoiseFilterGaussian.mzML" +#rm "$i"".NoiseFilterGaussian.mzML" rm "$i"".BaselineFilter.mzML" rm "$i"".PeakPickerHiRes.mzML" rm "$i"".FileConverter2.mgf" diff --git a/CycloBranch/External/macosx/any2mzml.sh b/CycloBranch/External/macosx/any2mzml.sh new file mode 100644 index 0000000..a6f9d15 --- /dev/null +++ b/CycloBranch/External/macosx/any2mzml.sh @@ -0,0 +1,2 @@ +name="$@" +FileConverter -in "$name" -out "$name"".mzML" diff --git a/CycloBranch/External/macosx/correctprofile.sh b/CycloBranch/External/macosx/correctprofile.sh index 23ed9df..2a8f265 100644 --- a/CycloBranch/External/macosx/correctprofile.sh +++ b/CycloBranch/External/macosx/correctprofile.sh @@ -1 +1 @@ -SAVEIFS=$IFS IFS=$',' read name fwhm <<< $@ IFS=$SAVEIFS FileConverter -in "$name"".mgf" -out "$name"".FileConverter.mzML" NoiseFilterGaussian -in "$name"".FileConverter.mzML" -out "$name"".NoiseFilterGaussian.mzML" -algorithm:gaussian_width $fwhm rm "$name"".mzML" BaselineFilter -in "$name"".NoiseFilterGaussian.mzML" -out "$name"".mzML" rm "$name"".mgf" rm "$name"".FileConverter.mzML" rm "$name"".NoiseFilterGaussian.mzML" \ No newline at end of file +SAVEIFS=$IFS IFS=$',' read name fwhm <<< $@ IFS=$SAVEIFS FileConverter -in "$name"".mgf" -out "$name"".FileConverter.mzML" #NoiseFilterGaussian -in "$name"".FileConverter.mzML" -out "$name"".NoiseFilterGaussian.mzML" -algorithm:gaussian_width $fwhm rm "$name"".mzML" BaselineFilter -in "$name"".FileConverter.mzML" -out "$name"".mzML" rm "$name"".mgf" rm "$name"".FileConverter.mzML" #rm "$name"".NoiseFilterGaussian.mzML" \ No newline at end of file diff --git a/CycloBranch/External/macosx/raw2peaks.sh b/CycloBranch/External/macosx/raw2peaks.sh index b05156d..9a062ac 100644 --- a/CycloBranch/External/macosx/raw2peaks.sh +++ b/CycloBranch/External/macosx/raw2peaks.sh @@ -10,14 +10,14 @@ for i in "$name""00"*".mgf" do echo "Converting the file ""$i" FileConverter -in "$i" -out "$i"".FileConverter.mzML" -NoiseFilterGaussian -in "$i"".FileConverter.mzML" -out "$i"".NoiseFilterGaussian.mzML" -algorithm:gaussian_width $fwhm -BaselineFilter -in "$i"".NoiseFilterGaussian.mzML" -out "$i"".BaselineFilter.mzML" +#NoiseFilterGaussian -in "$i"".FileConverter.mzML" -out "$i"".NoiseFilterGaussian.mzML" -algorithm:gaussian_width $fwhm +BaselineFilter -in "$i"".FileConverter.mzML" -out "$i"".BaselineFilter.mzML" PeakPickerHiRes -in "$i"".BaselineFilter.mzML" -out "$i"".PeakPickerHiRes.mzML" -algorithm:ms_levels 1 2 -algorithm:signal_to_noise 4 FileConverter -in "$i"".PeakPickerHiRes.mzML" -out "$i"".FileConverter2.mgf" cat "$i"".FileConverter2.mgf" >> "$name""mgf" rm "$i" rm "$i"".FileConverter.mzML" -rm "$i"".NoiseFilterGaussian.mzML" +#rm "$i"".NoiseFilterGaussian.mzML" rm "$i"".BaselineFilter.mzML" rm "$i"".PeakPickerHiRes.mzML" rm "$i"".FileConverter2.mgf" diff --git a/CycloBranch/External/windows/any2mzml.bat b/CycloBranch/External/windows/any2mzml.bat new file mode 100644 index 0000000..efb6f83 --- /dev/null +++ b/CycloBranch/External/windows/any2mzml.bat @@ -0,0 +1,2 @@ +SET PATH=%PATH:C:\Xcalibur\system\programs;=% +FileConverter.exe -in %1 -out %1.mzML \ No newline at end of file diff --git a/CycloBranch/External/windows/baf2mzml.bat b/CycloBranch/External/windows/baf2mzml.bat new file mode 100644 index 0000000..e22a8bb --- /dev/null +++ b/CycloBranch/External/windows/baf2mzml.bat @@ -0,0 +1,3 @@ +@echo off +set PATH=%PATH% +"%programfiles(x86)%\Bruker Daltonik\CompassXport\CompassXport.exe" -mode 2 -a "%~f1" -o "%~f1.mzML" 1>NUL diff --git a/CycloBranch/External/windows/correctprofile.bat b/CycloBranch/External/windows/correctprofile.bat index ce03f08..5d7f287 100644 --- a/CycloBranch/External/windows/correctprofile.bat +++ b/CycloBranch/External/windows/correctprofile.bat @@ -2,10 +2,10 @@ SET PATH=%PATH:C:\Xcalibur\system\programs;=% FileConverter.exe -in "%~f1.mgf" -out "%~f1.FileConverter.mzML" 1>NUL -NoiseFilterGaussian.exe -in "%~f1.FileConverter.mzML" -out "%~f1.NoiseFilterGaussian.mzML" -algorithm:gaussian_width %2 1>NUL +rem NoiseFilterGaussian.exe -in "%~f1.FileConverter.mzML" -out "%~f1.NoiseFilterGaussian.mzML" -algorithm:gaussian_width %2 1>NUL del "%~f1.mzML" 2>NUL -BaselineFilter.exe -in "%~f1.NoiseFilterGaussian.mzML" -out "%~f1.mzML" 1>NUL +BaselineFilter.exe -in "%~f1.FileConverter.mzML" -out "%~f1.mzML" 1>NUL del "%~f1.mgf" 2>NUL del "%~f1.FileConverter.mzML" 2>NUL -del "%~f1.NoiseFilterGaussian.mzML" 2>NUL +rem del "%~f1.NoiseFilterGaussian.mzML" 2>NUL diff --git a/CycloBranch/External/windows/raw2mzml.bat b/CycloBranch/External/windows/raw2mzml.bat index 6e5813c..fc5b04c 100644 --- a/CycloBranch/External/windows/raw2mzml.bat +++ b/CycloBranch/External/windows/raw2mzml.bat @@ -1,2 +1,2 @@ SET PATH=%PATH% -msconvert.exe %1 --mzML -o "%~d1%~p1%\" \ No newline at end of file +msconvert.exe %1 --mzML --inten64 -o "%~d1%~p1\" diff --git a/CycloBranch/External/windows/raw2mzmlpeaks.bat b/CycloBranch/External/windows/raw2mzmlpeaks.bat new file mode 100644 index 0000000..05ddde3 --- /dev/null +++ b/CycloBranch/External/windows/raw2mzmlpeaks.bat @@ -0,0 +1,2 @@ +SET PATH=%PATH% +msconvert.exe %1 --mzML --inten64 --filter "peakPicking vendor msLevel=1-" -o "%~d1%~p1\" --outfile "%~n1_converted.mzML" \ No newline at end of file diff --git a/CycloBranch/External/windows/raw2peaks.bat b/CycloBranch/External/windows/raw2peaks.bat index 145bd7c..850a034 100644 --- a/CycloBranch/External/windows/raw2peaks.bat +++ b/CycloBranch/External/windows/raw2peaks.bat @@ -5,14 +5,14 @@ SET PATH=%PATH:C:\Xcalibur\system\programs;=% for %%f in ("%~d1%~p1%~n1.00*.mgf") do ( echo Converting the file %%f FileConverter.exe -in "%%f" -out "%%f.FileConverter.mzML" 1>NUL -NoiseFilterGaussian.exe -in "%%f.FileConverter.mzML" -out "%%f.NoiseFilterGaussian.mzML" -algorithm:gaussian_width %2 1>NUL -BaselineFilter.exe -in "%%f.NoiseFilterGaussian.mzML" -out "%%f.BaselineFilter.mzML" 1>NUL +rem NoiseFilterGaussian.exe -in "%%f.FileConverter.mzML" -out "%%f.NoiseFilterGaussian.mzML" -algorithm:gaussian_width %2 1>NUL +BaselineFilter.exe -in "%%f.FileConverter.mzML" -out "%%f.BaselineFilter.mzML" 1>NUL PeakPickerHiRes.exe -in "%%f.BaselineFilter.mzML" -out "%%f.PeakPickerHiRes.mzML" -algorithm:ms_levels 1 2 -algorithm:signal_to_noise 4 1>NUL FileConverter.exe -in "%%f.PeakPickerHiRes.mzML" -out "%%f.FileConverter2.mgf" 1>NUL (type "%%f.FileConverter2.mgf" 2>NUL) >> "%~1mgf" del "%%f" 2>NUL del "%%f.FileConverter.mzML" 2>NUL -del "%%f.NoiseFilterGaussian.mzML" 2>NUL +rem del "%%f.NoiseFilterGaussian.mzML" 2>NUL del "%%f.BaselineFilter.mzML" 2>NUL del "%%f.PeakPickerHiRes.mzML" 2>NUL del "%%f.FileConverter2.mgf" 2>NUL diff --git a/CycloBranch/SequenceDatabases/siderophores/709_siderophores_and_secondary_metabolites.txt b/CycloBranch/SequenceDatabases/siderophores/709_siderophores_and_secondary_metabolites.txt index d812d00..459a04f 100644 --- a/CycloBranch/SequenceDatabases/siderophores/709_siderophores_and_secondary_metabolites.txt +++ b/CycloBranch/SequenceDatabases/siderophores/709_siderophores_and_secondary_metabolites.txt @@ -5,15 +5,15 @@ other Nicotinic acid C6H5NO2 123.0320284099 other Hydroxyquinone C6H4O3 124.0160439947 other Orcinol C7H8O2 124.0524295010 other Epoxysuccinic acid C4H4O5 132.0058732389 -other salicylic acid C7H6O3 138.0316940589 +other salicylic acid C7H6O3 138.0316940589 SB: 73 other Quinone C6H4O4 140.0109586168 -other 2.3-dihydroxybenzoic acid C7H6O4 154.0266086810 -other 3.4-dihydroxybenzoic acid (Protocatechuic acid) C7H6O4 154.0266086810 -other 3.5-dihydroxybenzoic acid C7H6O4 154.0266086810 +other 2.3-dihydroxybenzoic acid C7H6O4 154.0266086810 SB: 54 +other 3.4-dihydroxybenzoic acid (Protocatechuic acid) C7H6O4 154.0266086810 SB: 57 +other 3.5-dihydroxybenzoic acid C7H6O4 154.0266086810 SB: 202 other 3.4-dihydroxytoluquinone C7H6O4 154.0266086810 other Phyllostin C7H6O4 154.0266086810 other cyclo-(Pro-Gly) C7H10N2O2 154.0742275756 -other Cepabactin C7H9N1O3 155.0582431604 +other Cepabactin C7H9N1O3 155.0582431604 SB: 72 other 1.8-dihydroxynaphthalene C10H8O2 160.0524295010 other Formamide. N-[2-(4-hydroxyphenyl)ethenyl]- C9H9NO2 163.0633285383 other Phthalic acid C8H6O4 166.0266086810 @@ -31,7 +31,7 @@ other cyclo-(Pro-Ser) C8H12N2O3 184.0847922619 other cyclo-(Ala-trans-4-OH-Pro) C8H12N2O3 184.0847922619 other Dihydrospinulosin quinol C8H12O5 188.0684734957 other 2-Hydroxyjuglone C10H6O4 190.0266086810 -other Citrate C6H8O7 192.0270026115 +other Citrate C6H8O7 192.0270026115 SB: 282 other 1.3.6.8-Naphthalenetetrol C10H8O4 192.0422587452 other trans-3.4-dihydro-3.4.8-trihydroxynaphthalen-1(2H)-one C10H10O4 194.0579088094 other cis-3.4-dihydro-3.4.8-trihydroxynaphthalen-1(2H)-one C10H10O4 194.0579088094 @@ -40,7 +40,7 @@ other Anthrone C14H10O 194.0731649431 other Cyclo(L-Pro-L-Pro) C10H14N2O2 194.1055277040 other 1H-Naphtho[2.1-b]pyran-1-one C13H8O2 196.0524295010 other Pyrrolo[1.2-a]pyrazine-1.4-dione C10H16N2O2 196.1211777682 -other Pyridine-2.6-bis(thiocarboxylic acid) C7H5N1O2S2 198.9761697899 +other Pyridine-2.6-bis(thiocarboxylic acid) C7H5N1O2S2 198.9761697899 SB: 93 other cyclo-(Ser-trans-4-OH-Pro) C8H12N2O4 200.0797068840 other Spinulosin hydrate C8H10O6 202.0477380536 other Spinulosin quinol hydrate C8H12O6 204.0633881178 @@ -50,45 +50,45 @@ other Flaviolin C10H6O5 206.0215233031 other Anthraquinone C14H8O2 208.0524295010 other cyclo-(Gly-Ala) C10H14N2O3 210.1004423261 other L-prolylhydroxy-L-prolinediketopiperazine C10H14N2O3 210.1004423261 -other itoic acid C9H9N1O5 211.0480724046 -other 2.3-dihydroxybenzoylglycine C9H9N1O5 211.0480724046 -other Quinolobactin C11H9N1O4 219.0531577825 +other itoic acid C9H9N1O5 211.0480724046 SB: 113 +other 2.3-dihydroxybenzoylglycine C9H9N1O5 211.0480724046 SB: 81 +other Quinolobactin C11H9N1O4 219.0531577825 SB: 278 other Fumigatin chlorohydrin C8H9ClO5 220.0138513994 -other Aeruginic acid C10H7N1O3S1 221.0146637862 +other Aeruginic acid C10H7N1O3S1 221.0146637862 SB: 285 other Parvulenone C12H14O4 222.0892089378 -other Aminochelin C11H16N2O3 224.1160923903 -other Aspergilic acid C12H20N2O2 224.1524778966 -other Neoaspergillic acid C12H20N2O2 224.1524778966 +other Aminochelin C11H16N2O3 224.1160923903 SB: 88 +other Aspergilic acid C12H20N2O2 224.1524778966 SB: 232 +other Neoaspergillic acid C12H20N2O2 224.1524778966 SB: 233 other Csypyrone B1 C10H10O6 226.0477380536 other Cyclo(L-leucyl-trans-4-hydroxy-L-proline) C11H18N2O3 226.1317424545 other Carbonarone A C13H11NO3 229.0738932246 other Tensidol A C13H11NO3 229.0738932246 -other Siderochelin A C12H14N2O3 234.1004423261 -other Thio-quinolobactin C11H9N1O3S1 235.0303138504 +other Siderochelin A C12H14N2O3 234.1004423261 SB: 281 +other Thio-quinolobactin C11H9N1O3S1 235.0303138504 SB: 94 other Siderochelin B C11H13N3O3 235.0956912992 -other Desferrithiocin C10H10N2O3S1 238.0412128877 +other Desferrithiocin C10H10N2O3S1 238.0412128877 SB: 51 other Agroclavin C16H18N2 238.1469985882 other Csypyrone B2 C11H12O6 240.0633881178 other Festuclavin C16H20N2 240.1626486524 -other 2.3-dihydroxybenzoylserine C10H11N1O6 241.0586370909 +other 2.3-dihydroxybenzoylserine C10H11N1O6 241.0586370909 SB: 79 other cyclo-(R-Pro-R-Phe) C14H16N2O2 244.1211777682 other 5-demethoxyfumagillol C15H24O3 252.1725446367 other Csypyrone B3 C12H14O6 254.0790381820 other Fumiquinone A C12H14O6 254.0790381820 other Elymoclavin C16H18N2O 254.1419132103 -other 2.3-dihydroxybenzoylthreonine C11H13N1O6 255.0742871551 +other 2.3-dihydroxybenzoylthreonine C11H13N1O6 255.0742871551 SB: 80 other Chanoclavine I C16H20N2O 256.1575632745 other Fumigaclavine B C16H20N2O 256.1575632745 other [1.1'-Biphenyl]-4-carboxylic acid. 3.3'-dihydroxy-5.5'-dimethyl C15H14O4 258.0892089378 other cyclo-(cisOH-D-Pro-L-Phe) C14H16N2O3 260.1160923903 other Cyclo(L-trans-(4-hydroxyprolinyl)-L-phenylalanine) C14H16N2O3 260.1160923903 -other Cis-fusarinine C11H20N2O5 260.1372217629 -other Trans-fusarinine C11H20N2O5 260.1372217629 +other Cis-fusarinine C11H20N2O5 260.1372217629 SB: 6 +other Trans-fusarinine C11H20N2O5 260.1372217629 SB: 5 other cyclo-(R-Phe-S-Ile) C15H20N2O2 260.1524778966 other Violacerol I C14H14O5 262.0841235599 other Violacerol II C14H14O5 262.0841235599 other cyclo-(R-Valr-S-Tyr) C14H18N2O3 262.1317424545 -other pyridoxatin C15H21N1O3 263.1521435456 +other pyridoxatin C15H21N1O3 263.1521435456 SB: 279 other Fumigatin bromohydrin C8H9BrO5 263.9633253994 other Microperfuranone C17H14O3 266.0942943157 other emodin C15H10O5 270.0528234315 @@ -107,25 +107,25 @@ other 2-Deoxymugeneic acid C12H20N2O7 304.1270510071 other 9(10H)-Anthracenone. 2-chloro-1.3.8-trihydroxy-6-(hydroxymethyl)- C15H11ClO5 306.0295014636 other Endocrocin C16H10O7 314.0426526757 other Asperthecin C15H10O8 318.0375672978 -other Mugeneic acid C12H20N2O8 320.1219656292 -other Avenic acid C12H22N2O8 322.1376156934 -other Enantio-pyochelin C14H16N2O3S2 324.0602337703 -other Pyochelin C14H16N2O3S2 324.0602337703 +other Mugeneic acid C12H20N2O8 320.1219656292 SB: 268 +other Avenic acid C12H22N2O8 322.1376156934 SB: 82 +other Enantio-pyochelin C14H16N2O3S2 324.0602337703 SB: 230 +other Pyochelin C14H16N2O3S2 324.0602337703 SB: 38 other Sterigmatocystine C18H12O6 324.0633881178 other terezine D C19H23N3O2 325.1790269981 other gliotoxin C13H14N2O4S2 326.0394983282 other Bis-N-norgliovictin C14H18N2O3S2 326.0758838345 other Bisdechlorogeodin C17H14O7 330.0739528041 -other Pseudomonine C16H18N4O4 330.1328050870 +other Pseudomonine C16H18N4O4 330.1328050870 SB: 92 other Asperfuranone C19H24O5 332.1623738809 other 3-hydroxymugeneic acid C12H20N2O9 336.1168802513 -other Thiazostatin C15H18N2O3S2 338.0758838345 +other Thiazostatin C15H18N2O3S2 338.0758838345 SB: 283 other Bis(2-hydroxy-3-tert.butyl-5-methylphenyl)methane C23H32O2 340.2402302714 other Trypacidin C18H16O7 344.0896028683 -other Rhodotorulic acid C14H24N4O6 344.1695845238 +other Rhodotorulic acid C14H24N4O6 344.1695845238 SB: 69 other m-Anisic acid C18H18O7 346.1052529325 -other Acinetobactin C16H18N4O5 346.1277197091 -other Anguibactin C15H16N4O4S1 348.0892257128 +other Acinetobactin C16H18N4O5 346.1277197091 SB: 47 +other Anguibactin C15H16N4O4S1 348.0892257128 SB: 74 other Demethoxyfumitremorgin C C21H23N3O2 349.1790269981 other Tryptostatin B C21H25N3O2 351.1946770623 other Didehydrobisdethiobis(methylthio)gliotoxin C15H18N2O4S2 354.0707984566 @@ -137,11 +137,11 @@ other fumiquinazolines G C21H18N4O2 358.1429758428 other Asperfumoid C18H17NO7 359.1005019056 other Spirotryprostatin B C21H21N3O3 363.1582915560 other Fumigaclavine C C23H30N2O2 366.2307282176 -other Chrysobactin C16H23N3O7 369.1536001086 +other Chrysobactin C16H23N3O7 369.1536001086 SB: 90 other Azaspirene C21H23NO5 369.1576228540 -other Putrebactin C16H28N4O6 372.2008846522 +other Putrebactin C16H28N4O6 372.2008846522 SB: 63 other Asperfumin C19H20O8 376.1158176188 -other Rhizobactin C15H27N3O8 377.1798148591 +other Rhizobactin C15H27N3O8 377.1798148591 SB: 102 other Cyclotryprostatine D C21H21N3O4 379.1532061781 other fumitremorgin C C22H25N3O3 379.1895916844 other Cyclotryprostatine C C21H23N3O4 381.1688562423 @@ -156,43 +156,42 @@ other Spirotryprostatin A C22H25N3O4 395.1845063065 other F 9775A C21H16O8 396.0845174904 other F 9775B C21H16O8 396.0845174904 other Ergosterol C28H44O 396.3392160345 -other Vanchrobactin C16H23N5O7 397.1597481190 +other Vanchrobactin C16H23N5O7 397.1597481190 SB: 118 other 24S-Methylcholesta-5.22-dien-3-ol; 4.22-Ergostadien-3-ol C28H46O 398.3548660987 other Aspernidine A C24H33NO4 399.2409585529 -other Bisucaberin C18H32N4O6 400.2321847806 +other Bisucaberin C18H32N4O6 400.2321847806 SB: 64 other Sphingofungin F C21H39NO6 401.2777379897 other tryptoquivaline F C22H18N4O4 402.1328050870 other fumitremorgin J (tryptoquivaline J) C22H18N4O4 402.1328050870 other tryptoquivaline O C22H18N4O4 402.1328050870 -other Schizokinen A C16H26N4O8 402.1750638322 +other Schizokinen A C16H26N4O8 402.1750638322 SB: 105 other Aspernidine E C24H34O5 402.2406242019 -other Salmochelin SX (Pacifarinic acid) C16H21N1O11 403.1114605224 +other Salmochelin SX (Pacifarinic acid) C16H21N1O11 403.1114605224 SB: 241 other Myxochelin B C20H25N3O6 403.1743355507 -other Myxochelin A C20H24N2O7 404.1583511355 -other Alcaligin C16H28N4O8 404.1907138964 -other N-deoxyschizokinen C16H28N4O8 404.1907138964 +other Myxochelin A C20H24N2O7 404.1583511355 SB: 293 +other Alcaligin C16H28N4O8 404.1907138964 SB: 53 +other N-deoxyschizokinen C16H28N4O8 404.1907138964 SB: 286 other Shamixanthone C25H26O5 406.1780239451 other Emericellin C25H28O5 408.1936740093 other Orlandin C22H18O8 410.1001675546 -other Benarthin C17H25N5O7 411.1753981832 +other Benarthin C17H25N5O7 411.1753981832 SB: 263 other Verruculogen TR 3 C22H25N3O5 411.1794209286 other Cyclotryprostatine A C22H25N3O5 411.1794209286 other Synerazol C22H23NO7 413.1474520982 other Aspernidine C C25H35NO4 413.2566086171 -other Serratiochelin C20H21N3O7 415.1379500444 +other Serratiochelin C20H21N3O7 415.1379500444 SB: 288 other Fusarin Y C22H25NO7 415.1631021624 other -12-hydroxyverruculogen TR-2 C21H25N3O6 415.1743355507 other Fusarin A C23H29NO6 415.1994876687 other Pseurotin F2 C21H23NO8 417.1423667203 other Pseurotin F2 C21H23NO8 417.1423667203 -other Pistillarin C21H27N3O6 417.1899856149 +other Pistillarin C21H27N3O6 417.1899856149 SB: 85 other Sphingofungin E C21H39NO7 417.2726526118 other Tryptoquivaline H C22H18N4O5 418.1277197091 other Tryptoquivaline E C22H18N4O5 418.1277197091 -other Azotochelin C20H22N2O8 418.1376156934 +other Azotochelin C20H22N2O8 418.1376156934 SB: 87 other Bisucaberin B C18H34N4O7 418.2427494669 -other Schizokinen C16H28N4O9 420.1856285185 -other Schizokinen C16H28N4O9 420.1856285185 +other Schizokinen C16H28N4O9 420.1856285185 SB: 104 other Norrhizoferrin C15H22N2O12 422.1172741818 other Demethylkotanin C23H20O8 424.1158176188 other Cyclotryprostatine B C23H27N3O5 425.1950709928 @@ -200,7 +199,7 @@ other Protostadienol C30H50O 426.3861662271 other cyclo-(Pro-trans-4-OH-Pro) C22H25N3O6 427.1743355507 other Ergosterol peroxide C28H44O3 428.3290452787 other 2-Azaspiro[4.4]non-7-ene-1.6-dione. 3-benzoyl-8-(1.2-dihydroxy-5-oxo-3-hexenyl)-3.4-dihydroxy-7-methyl-. [3S-[3.4.5(1S*.2R*.3E)]]- (9CI) C22H23NO8 429.1423667203 -other Serratiochelins A C21H23N3O7 429.1536001086 +other Serratiochelins A C21H23N3O7 429.1536001086 SB: 300 other verruculogen TR-2 C22H27N3O6 429.1899856149 other pseurotin A C22H25NO8 431.1580167845 other pseurotin A1 C22H25NO8 431.1580167845 @@ -212,10 +211,10 @@ other Sphingofungin D C22H41NO7 431.2883026760 other Sphingofungin A C21H41N3O6 431.2995360643 other Tryptoquivaline L C23H20N4O5 432.1433697733 other Tryptoquivaline G C23H20N4O5 432.1433697733 -other Vibrioferrin C16H22N2O12 434.1172741818 -other rhizoferrin C16H24N2O12 436.1329242460 -other (S.S) enantio Rhizoferrin C16H24N2O12 436.1329242460 -other Heterobactin B C19H27N5O7 437.1910482474 +other Vibrioferrin C16H22N2O12 434.1172741818 SB: 201 +other rhizoferrin C16H24N2O12 436.1329242460 SB: 65 +other (S.S) enantio Rhizoferrin C16H24N2O12 436.1329242460 SB: 86 +other Heterobactin B C19H27N5O7 437.1910482474 SB: 205 other Kotanin C24H22O8 438.1314676830 other fumiquinazolines D C24H21N5O4 443.1593541885 other Fumiquinazoline C C24H21N5O4 443.1593541885 @@ -227,11 +226,11 @@ other fumiquinazolines A C24H23N5O4 445.1750042527 other Fumiquinazoline B C24H23N5O4 445.1750042527 other Pseurotin B C22H25NO9 447.1529314066 other Pseurotin C C22H25NO9 447.1529314066 -other Serratiochelins B C21H25N3O8 447.1641647949 -other Serratiochelins C C21H25N3O8 447.1641647949 +other Serratiochelins B C21H25N3O8 447.1641647949 SB: 299 +other Serratiochelins C C21H25N3O8 447.1641647949 SB: 298 other Fusarin X C23H29NO8 447.1893169129 other Fusarin X C23H29NO8 447.1893169129 -other Staphyloferrin B C16H24N4O11 448.1441576343 +other Staphyloferrin B C16H24N4O11 448.1441576343 SB: 43 other 2-Oxorhizoferrin C16H22N2O13 450.1121888039 other Homorhizoferrin C17H26N2O12 450.1485743102 other Pyripyropene E C27H33NO5 451.2358731750 @@ -239,7 +238,7 @@ other Oxahomorhizoferrin C16H24N2O13 452.1278388681 other Dehydroaustinol C25H28O8 456.1784178756 other Austinol C25H30O8 458.1940679398 other Fumagillin C26H34O7 458.2304534461 -other Desferrioxamine H C20H36N4O8 460.2533141532 +other Desferrioxamine H C20H36N4O8 460.2533141532 SB: 116 other 3-hydroxyfumiquinazoline A C24H23N5O5 461.1699188748 other 2-Methylhomorhizoferrin C18H28N2O12 464.1642243744 other Pyripyropene F C28H35NO5 465.2515232392 @@ -247,180 +246,179 @@ other Pyripyropene G C27H33NO6 467.2307877971 other Tryptoquivaline N C26H24N4O5 472.1746699017 other Fumiquinazoline E C25H25N5O5 475.1855689390 other Fumagiringillin C26H36O8 476.2410181324 -other Arthrobactin C20H36N4O9 476.2482287753 +other Arthrobactin C20H36N4O9 476.2482287753 SB: 76 other Fumitremorgin B C27H33N3O5 479.2420211854 -other Staphyloferrin A C17H24N2O14 480.1227534902 -other Yersiniabactin C21H27N3O4S3 481.1163684407 +other Staphyloferrin A C17H24N2O14 480.1227534902 SB: 8 +other Yersiniabactin C21H27N3O4S3 481.1163684407 SB: 60 other Pyripyropene H C28H35NO6 481.2464378613 -other Dimerumic acid C22H36N4O8 484.2533141532 +other Dimerumic acid C22H36N4O8 484.2533141532 SB: 3 other Pseudomonic acid C C26H44O8 484.3036183892 other Cepaciachelin C24H32N4O7 488.2270994027 other Terrequinone A C32H30N2O3 490.2256428397 -other Corynebactin C18H26N2O14 494.1384035544 +other Corynebactin C18H26N2O14 494.1384035544 SB: 296 other Pseudomonic acid A C26H44O9 500.2985330113 other Tryptoquivaline I C27H26N4O6 502.1852345880 -other Fusarinine A C22H38N4O9 502.2638788395 -other Snychobactin A C22H40N4O9 504.2795289037 +other Fusarinine A C22H38N4O9 502.2638788395 SB: 306 +other Synechobactin C C22H40N4O9 504.2795289037 SB: 272 other Pyripyropene O C29H35NO7 509.2413524834 other verruculogen C27H33N3O7 511.2318504296 other Pseudomonic acid B C26H44O10 516.2934476334 other Pyripyropene P C30H37NO7 523.2570025476 other Pyripyropene R C30H37NO7 523.2570025476 other Helvolinic acid C31H42O7 526.2930537029 -other Rhizobactin 1021 C24H42N4O9 530.2951789679 +other Rhizobactin 1021 C24H42N4O9 530.2951789679 SB: 103 other Tryptoquivaline D C28H28N4O7 532.1957992743 other tryptoquivaline D C28H28N4O7 532.1957992743 other Tryptoquivaline M C28H28N4O7 532.1957992743 other Norisotryptoquivaline C28H28N4O7 532.1957992743 -other Snychobactin B C24H44N4O9 532.3108290321 -other Desferrioxamine A2 C23H44N6O8 532.3220624204 -other Neurosporin C40H58 538.4538518618 +other Synechobactin B C24H44N4O9 532.3108290321 SB: 271 +other Desferrioxamine A2 C23H44N6O8 532.3220624204 SB: 107 other Pyripyropene Q C30H37NO8 539.2519171697 other tryptoquivaline C C29H30N4O7 546.2114493385 other Isotryptoquivaline C29H30N4O7 546.2114493385 -other Desferrioxamine A1 C24H46N6O8 546.3377124846 +other Desferrioxamine A1 C24H46N6O8 546.3377124846 SB: 106 other Micacocidin P2 C26H35N3O4S3 549.1789686975 other Micacocidin P1 C26H37N3O4S3 551.1946187617 other Pyripyropene N C31H39NO8 553.2675672339 -other Desferrioxamine X2 C24H42N6O9 558.3013269783 -other Snychobactin C C26H48N4O9 560.3421291605 -other Desferrioxamine B C25H48N6O8 560.3533625488 +other Desferrioxamine X2 C24H42N6O9 558.3013269783 SB: 128 +other Synechobactin A C26H48N4O9 560.3421291605 SB: 270 +other Desferrioxamine B C25H48N6O8 560.3533625488 SB: 45 other Micacocidin P3 C27H37N3O4S3 563.1946187617 -other Aerobactin C22H36N4O13 564.2278872637 -other Micacocidin C27H39N3O4S3 565.2102688259 -other Coelichelin C21H39N7O11 565.2707551314 +other Aerobactin C22H36N4O13 564.2278872637 SB: 70 +other Micacocidin C27H39N3O4S3 565.2102688259 SB: 287 +other Coelichelin C21H39N7O11 565.2707551314 SB: 156 other helvolic acid C33H44O8 568.3036183892 other Acetoxyverruculogen C29H35N3O9 569.2373297380 other 29-Nordammara-1.17(20).24-trien-21-oic acid. 6.16-bis(acetyloxy)-3-hydroxy-7-oxo-. (4.6.8.9.13.14.16.17Z)- (9CI) C33H46O8 570.3192684534 -other Desferrioxamine X1 C25H44N6O9 572.3169770425 -other Nocardia heterobactin (JBIR-16) C26H31N5O10 573.2070922421 +other Desferrioxamine X1 C25H44N6O9 572.3169770425 SB: 126 +other Nocardia heterobactin (JBIR-16) C26H31N5O10 573.2070922421 SB: 206 other Tryptoquivaline M acetate C30H30N4O8 574.2063639606 other Demethyltryptoquivaline A C30H30N4O8 574.2063639606 other Desferrioxamine N C26H50N6O8 574.3690126130 -other Foroxymithine C22H37N7O11 575.2551050672 +other Foroxymithine C22H37N7O11 575.2551050672 SB: 231 other Micacocidin P5 C28H39N3O4S3 577.2102688259 other Micacocidin P4 C28H41N3O4S3 579.2259188901 other Fumitremorgin A C32H41N3O7 579.2944506864 other Pyripyropene M C32H39NO9 581.2624818560 other Pyripyropene A C31H37NO10 583.2417464139 -other Acinetoferrin C28H48N4O9 584.3421291605 +other Acinetoferrin C28H48N4O9 584.3421291605 SB: 46 other Micacocidin P6 C26H36ClN3O4S3 585.1556467296 -other Desferrioxamine D2 C26H46N6O9 586.3326271067 -other Achromobactin C22H29N3O16 591.1547819001 -other Maduraferrin C26H37N7O9 591.2652758230 -other Madurastatin C1 C26H37N7O9 591.2652758230 -other Nigribactin C30H32N4O9 592.2169286469 +other Desferrioxamine D2 C26H46N6O9 586.3326271067 SB: 110 +other Achromobactin C22H29N3O16 591.1547819001 SB: 91 +other Maduraferrin C26H37N7O9 591.2652758230 SB: 305 +other Madurastatin C1 C26H37N7O9 591.2652758230 SB: 269 +other Nigribactin C30H32N4O9 592.2169286469 SB: 312 other Pyripyropene B C32H39NO10 597.2573964781 other Pyripyropene C C32H39NO10 597.2573964781 other Pyripyropene D C32H39NO10 597.2573964781 -other Desferrioxamine E C27H48N6O9 600.3482771709 +other Heterobactin A C27H30N6O10 598.2023412152 SB: 204 +other Desferrioxamine E C27H48N6O9 600.3482771709 SB: 49 other Desferrioxamine Et1 C26H46N6O10 602.3275417288 -other Desferrioxamine D1 C27H50N6O9 602.3639272351 -other Erythrochelin C24H41N7O11 603.2864051956 +other Desferrioxamine D1 C27H50N6O9 602.3639272351 SB: 109 +other Erythrochelin C24H41N7O11 603.2864051956 SB: 190 other Nidulanin C34H45N5O5 603.3420695810 -other Mirubactin C26H32N6O11 604.2129059015 +other Mirubactin C26H32N6O11 604.2129059015 SB: 297 other Desferrioxamine Et2 C25H44N6O11 604.3068062867 -other Desferrioxamine G2A C26H48N6O10 604.3431917930 -other Desferrioxamine G2B C26H48N6O10 604.3431917930 -other Desferrioxamine G2C C26H48N6O10 604.3431917930 +other Desferrioxamine G2A C26H48N6O10 604.3431917930 SB: 112 +other Desferrioxamine G2B C26H48N6O10 604.3431917930 SB: 114 +other Desferrioxamine G2C C26H48N6O10 604.3431917930 SB: 115 other Desferrioxamine Et3 C24H42N6O12 606.2860708446 -other Exochelin MS C23H44N8O11 608.3129542971 +other Exochelin MS C23H44N8O11 608.3129542971 SB: 173 other Emericellamide A C31H55N5O7 609.4101491462 other Pyripyropene J C33H41NO10 611.2730465423 other Pyripyropene K C33H41NO10 611.2730465423 other Pyripyropene L C33H41NO10 611.2730465423 -other Desferrioxamine X3 C28H50N6O9 614.3639272351 -other Heterobactin A C27H33N7O10 615.2288903167 +other Desferrioxamine X3 C28H50N6O9 614.3639272351 SB: 129 other Desferrioxamine P1 C26H45N7O10 615.3227907019 other Desferrioxamine Te1 C26H46N6O9S1 618.3046977967 -other Desferrioxamine G1 C27H50N6O10 618.3588418572 -other Parabactin C32H36N4O9 620.2482287753 -other Fluvibactin C31H34N4O10 622.2274933332 -other Protochelin C31H36N4O10 624.2431433974 +other Desferrioxamine G1 C27H50N6O10 618.3588418572 SB: 50 +other Parabactin C32H36N4O9 620.2482287753 SB: 179 +other Fluvibactin C31H34N4O10 622.2274933332 SB: 177 +other Protochelin C31H36N4O10 624.2431433974 SB: 89 other Pyripyropene I C34H43NO10 625.2886966065 -other Salmochelin S1 C26H30N2O16 626.1595329270 -other Neocoprogen II C27H44N6O11 628.3068062867 -other Desferrioxamine X4 C29H52N6O9 628.3795772993 +other Salmochelin S1 C26H30N2O16 626.1595329270 SB: 242 +other Neocoprogen II C27H44N6O11 628.3068062867 SB: 153 +other Desferrioxamine X4 C29H52N6O9 628.3795772993 SB: 130 other Ergosteryl palmitate C44H74O2 634.5688816196 -other Agrobactin C32H36N4O10 636.2431433974 +other Agrobactin C32H36N4O10 636.2431433974 SB: 176 other Desferrioxamine Te2 C25H44N6O9S2 636.2611184225 -other Acyl-desferrioxamine 1 C31H52N6O8 636.3846626772 -other Parabactin A C32H38N4O10 638.2587934616 +other Acyl-desferrioxamine 1 C31H52N6O8 636.3846626772 SB: 213 +other Parabactin A C32H38N4O10 638.2587934616 SB: 180 other Desferrioxamine Te3 C24H42N6O9S3 654.2175390483 -other Agrobactin A C32H38N4O11 654.2537080837 -other Acyl-desferrioxamine 3 C32H62N6O8 658.4629129982 -other Enterobactin C30H27N3O15 669.1442172138 -other Porocentrin C39H60O9 672.4237335249 -other Vulnibactin C35H39N5O9 673.2747778768 -other Acyl-desferrioxamine 2 C33H54N6O9 678.3952273635 +other Agrobactin A C32H38N4O11 654.2537080837 SB: 178 +other Acyl-desferrioxamine 3 C32H62N6O8 658.4629129982 SB: 221 +other Enterobactin C30H27N3O15 669.1442172138 SB: 48 +other Porocentrin C39H60O9 672.4237335249 SB: 196 +other Vulnibactin C35H39N5O9 673.2747778768 SB: 181 +other Acyl-desferrioxamine 2 C33H54N6O9 678.3952273635 SB: 219 other Ornibactin C4 C26H48N8O13 680.3340836697 -other Exochelin MN C28H49N11O9 683.3714722290 -other Dimethylneocoprogen I C31H52N6O11 684.3694065435 -other Dimethyltriornicin C31H52N6O11 684.3694065435 +other Exochelin MN C28H49N11O9 683.3714722290 SB: 71 +other Dimethylneocoprogen I C31H52N6O11 684.3694065435 SB: 155 +other Dimethyltriornicin C31H52N6O11 684.3694065435 SB: 158 other Dimethylisoneocoprogen I C31H52N6O11 684.3694065435 -other Acyl-desferrioxamine 4 C34H66N6O8 686.4942131266 -other Ferrichrome C27H45N9O12 687.3187679565 +other Acyl-desferrioxamine 4 C34H66N6O8 686.4942131266 SB: 223 +other Ferrichrome C27H45N9O12 687.3187679565 SB: 41 other Carboxymycobactin C2 C32H43N5O12 689.2908218715 other Carboxymycobactin 3 C1 C32H45N5O12 691.3064719357 -other Amonabactin P693 C35H43N5O10 693.3009926273 +other Amonabactin P693 C35H43N5O10 693.3009926273 SB: 292 other Heterobactin S1 C27H33N7O13S 695.1857048730 other Heterobactin S2 C27H33N7O13S 695.1857048730 -other isoneocoprogen I C31H50N6O12 698.3486711014 -other isotriornicin C31H50N6O12 698.3486711014 -other Neocoprogen I C31H50N6O12 698.3486711014 -other Triornicin C31H50N6O12 698.3486711014 -other Acyl-desferrioxamine 5 C34H64N6O9 700.4734776845 -other Ferrichrome C C28H47N9O12 701.3344180207 +other isoneocoprogen I C31H50N6O12 698.3486711014 SB: 149 +other isotriornicin C31H50N6O12 698.3486711014 SB: 151 +other Neocoprogen I C31H50N6O12 698.3486711014 SB: 151 +other Triornicin C31H50N6O12 698.3486711014 SB: 149 +other Acyl-desferrioxamine 5 C34H64N6O9 700.4734776845 SB: 225 +other Ferrichrome C C28H47N9O12 701.3344180207 SB: 131 other Carboxymycobactin C3 C33H45N5O12 703.3064719357 -other Vibriobactin C35H39N5O11 705.2646071210 +other Vibriobactin C35H39N5O11 705.2646071210 SB: 52 other Carboxymycobactin 3 C2 C33H47N5O12 705.3221219999 -other Tsukubachelin C27H49N9O13 707.3449827070 +other Tsukubachelin C27H49N9O13 707.3449827070 SB: 227 other Ornibactin C6 C28H52N8O13 708.3653837981 -other Hydroxyisoneocoprogen I C31H50N6O13 714.3435857235 -other Hydroxyneocoprogen I C31H50N6O13 714.3435857235 -other Sake colorant A C29H49N9O12 715.3500680849 +other Hydroxyisoneocoprogen I C31H50N6O13 714.3435857235 SB: 161 +other Hydroxyneocoprogen I C31H50N6O13 714.3435857235 SB: 160 +other Sake colorant A C29H49N9O12 715.3500680849 SB: 132 other Mycobactin S C9 C36H53N5O10 715.3792429483 -other Desferrioxamine T8 C30H52N8O12 716.3704691760 +other Desferrioxamine T8 C30H52N8O12 716.3704691760 SB: 125 other Carboxymycobactin C4 C34H47N5O12 717.3221219999 -other Ferricrocin C28H47N9O13 717.3293326428 -other Petrobactin C34H50N6O11 718.3537564793 +other Ferricrocin C28H47N9O13 717.3293326428 SB: 40 +other Petrobactin C34H50N6O11 718.3537564793 SB: 67 other Carboxymycobactin 3 C3 C34H49N5O12 719.3377720641 other Carboxymycobactin 4 C2 C34H49N5O12 719.3377720641 -other Dichrysobactin C32H44N6O13 720.2966355309 +other Dichrysobactin C32H44N6O13 720.2966355309 SB: 218 other Progenin II C39H62O12 722.4241274554 -other Coprogen B C33H54N6O12 726.3799712298 -other Fusarinine C (cyclic fusigen) C33H54N6O12 726.3799712298 -other Des(diserylglycyl)ferrirhodin C33H56N6O12 728.3956212940 +other Coprogen B C33H54N6O12 726.3799712298 SB: 147 +other Fusarinine C (cyclic fusigen) C33H54N6O12 726.3799712298 SB: 20 +other Des(diserylglycyl)ferrirhodin C33H56N6O12 728.3956212940 SB: 99 other Mycobactin F C9 C37H55N5O10 729.3948930125 other Mycobactin S C10 C37H55N5O10 729.3948930125 other Carboxymycobactin C5 C35H49N5O12 731.3377720641 other Carboxymycobactin 1 C2 C35H49N5O12 731.3377720641 -other Amonabactin T732 C37H44N6O10 732.3118916646 +other Amonabactin T732 C37H44N6O10 732.3118916646 SB: 291 other Carboxymycobactin 3 C4 C35H51N5O12 733.3534221283 other Carboxymycobactin 4 C3 C35H51N5O12 733.3534221283 other Tsukubachelin B C29H54N10O12 734.3922672506 -other Amycolachrom C28H49N9O14 735.3398973291 +other Amycolachrom C28H49N9O14 735.3398973291 SB: 294 other Ornibactin C8 C30H56N8O13 736.3966839265 -other Amychelin C30H42N8O14 738.2820480992 -other Nannochelin C C36H44N4O13 740.2904875205 -other 2-N-methylcoprogen B C34H56N6O12 740.3956212940 +other Amychelin C30H42N8O14 738.2820480992 SB: 303 +other Nannochelin C C36H44N4O13 740.2904875205 SB: 236 +other 2-N-methylcoprogen B C34H56N6O12 740.3956212940 SB: 7 other Formobactin C38H57N5O10 743.4105430767 other Mycobactin F C10 C38H57N5O10 743.4105430767 other Mycobactin S C11 C38H57N5O10 743.4105430767 other Mycobactin NA (Nocobactin) C9 C38H57N5O10 743.4105430767 -other Tetraglycine ferrichrome C29H48N10O13 744.3402316801 +other Tetraglycine ferrichrome C29H48N10O13 744.3402316801 SB: 141 other Tetraglycyl-ferrichrome C29H48N10O13 744.3402316801 -other Fusarinine B C33H56N6O13 744.3905359161 -other Linear fusigen C33H56N6O13 744.3905359161 +other Fusarinine B C33H56N6O13 744.3905359161 SB: 142 +other Linear fusigen C33H56N6O13 744.3905359161 SB: 197 other Carboxymycobactin C6 C36H51N5O12 745.3534221283 other Carboxymycobactin 1 C3 C36H51N5O12 745.3534221283 other Carboxymycobactin 2 C2 C36H51N5O12 745.3534221283 -other Ferrichrysin C29H49N9O14 747.3398973291 +other Ferrichrysin C29H49N9O14 747.3398973291 SB: 42 other Carboxymycobactin 3 C5 C36H53N5O12 747.3690721925 other Carboxymycobactin 4 C4 C36H53N5O12 747.3690721925 -other Amonabactin P750 C37H46N6O11 750.3224563509 -other Nannochelin B C37H46N4O13 754.3061375847 -other Dimethylcoprogen C35H58N6O12 754.4112713582 +other Amonabactin P750 C37H46N6O11 750.3224563509 SB: 84 +other Nannochelin B C37H46N4O13 754.3061375847 SB: 235 +other Dimethylcoprogen C35H58N6O12 754.4112713582 SB: 154 other Ochrobactin A C36H60N4O13 756.4156880341 other Mycobactin F C11 C39H59N5O10 757.4261931409 other Mycobactin S C12 C39H59N5O10 757.4261931409 @@ -429,52 +427,53 @@ other Ochrobactin B C36H62N4O13 758.4313380983 other Carboxymycobactin C7 C37H53N5O12 759.3690721925 other Carboxymycobactin 1C4 C37H53N5O12 759.3690721925 other Carboxymycobactin 2 C3 C37H53N5O12 759.3690721925 -other Anacheline-1 C35H49N6O13 761.3357606914 -other Anacheline-2 C35H49N6O13 761.3357606914 +other Anacheline-1 C35H48N6O13 760.3279356593 SB: 274 +other Anacheline-2 C35H48N6O13 760.3279356593 SB: 275 other Carboxymycobactin 3 C6 C37H55N5O12 761.3847222567 other Carboxymycobactin 4 C5 C37H55N5O12 761.3847222567 -other Nannochelin A C38H48N4O13 768.3217876489 -other Coprogen C35H56N6O13 768.3905359161 +other Nannochelin A C38H48N4O13 768.3217876489 SB: 234 +other Coprogen C35H56N6O13 768.3905359161 SB: 13 other Carboxymycobactin 2 C4 C38H53N5O12 771.3690721925 other Mycobactin F C12 C40H61N5O10 771.4418432051 other Mycobactin S C13 C40H61N5O10 771.4418432051 other Mycobactin NA (Nocobactin) C11 C40H61N5O10 771.4418432051 -other Desferrioxamine T3 C34H60N8O12 772.4330694328 -other Desferrioxamine T7 C34H60N8O12 772.4330694328 +other Desferrioxamine T3 C34H60N8O12 772.4330694328 SB: 123 +other Desferrioxamine T7 C34H60N8O12 772.4330694328 SB: 124 other Carboxymycobactin C8 C38H55N5O12 773.3847222567 other Carboxymycobactin 1 C5 C38H55N5O12 773.3847222567 -other Vicibactin C33H54N6O15 774.3647150961 +other Vicibactin C33H54N6O15 774.3647150961 SB: 101 other Carboxymycobactin 3 C7 C38H57N5O12 775.4003723209 -other Divanchrobactin C32H44N10O13 776.3089315517 -other Anacheline-H C35H51N6O14 779.3463253777 -other 2-N-methylcoprogen C36H58N6O13 782.4061859803 -other Hydroxycoprogen C35H56N6O14 784.3854505382 +other Divanchrobactin C32H44N10O13 776.3089315517 SB: 119 +other Anacheline-H C35H50N6O14 778.3385003456 SB: 273 +other 2-N-methylcoprogen C36H58N6O13 782.4061859803 SB: 188 +other Hydroxycoprogen C35H56N6O14 784.3854505382 SB: 159 other Ochrobactin C C38H64N4O13 784.4469881625 other Mycobactin A C41H63N5O10 785.4574932693 other Mycobactin F C13 C41H63N5O10 785.4574932693 other Mycobactin S C14 C41H63N5O10 785.4574932693 other Mycobactin Av C11 C41H63N5O10 785.4574932693 -other Basidiochrome C33H50N6O16 786.3283295898 -other Desferrioxamine T2 C35H62N8O12 786.4487194970 +other Basidiochrome C33H50N6O16 786.3283295898 SB: 97 +other Desferrioxamine T2 C35H62N8O12 786.4487194970 SB: 122 other Carboxymycobactin C9 C39H57N5O12 787.4003723209 other Carboxymycobactin 1 C6 C39H57N5O12 787.4003723209 -other Amonabactin T789 C39H47N7O11 789.3333553882 +other Amonabactin T789 C39H47N7O11 789.3333553882 SB: 83 other Carboxymycobactin 3 C8 C39H59N5O12 789.4160223851 -other Petrobactin sulphonate C34H50N6O14S1 798.3105710356 +other Petrobactin sulphonate C34H50N6O14S1 798.3105710356 SB: 68 other Mycobactin F C14 C42H65N5O10 799.4731433335 other Mycobactin S C15 C42H65N5O10 799.4731433335 other Mycobactin Av C12 C42H65N5O10 799.4731433335 -other Desferrioxamine T1 C36H64N8O12 800.4643695612 +other Desferrioxamine T1 C36H64N8O12 800.4643695612 SB: 121 other Carboxymycobactin 1 C7 C40H59N5O12 801.4160223851 other Carboxymycobactin 3 C9 C40H61N5O12 803.4316724493 other Amphibactin T C36H65N7O13 803.4640352102 -other Cupriachelin C33H57N7O16 807.3861788197 +other Dibenarthin C34H48N10O13 804.3402316801 SB: 264 +other Cupriachelin C33H57N7O16 807.3861788197 SB: 276 other Mycobactin F C15 C43H67N5O10 813.4887933977 other Mycobactin S C16 C43H67N5O10 813.4887933977 other Mycobactin Av C13 C43H67N5O10 813.4887933977 -other Asperchrome D1 C33H55N9O15 817.3817621438 -other Asperchrome D2 C33H55N9O15 817.3817621438 -other Asperchrome D3 C33H55N9O15 817.3817621438 +other Asperchrome D1 C33H55N9O15 817.3817621438 SB: 59 +other Asperchrome D2 C33H55N9O15 817.3817621438 SB: 61 +other Asperchrome D3 C33H55N9O15 817.3817621438 SB: 62 other Mycobactin F C16 C44H69N5O10 827.5044434619 other Mycobactin M C15 C44H69N5O10 827.5044434619 other Mycobactin S C17 C44H69N5O10 827.5044434619 @@ -482,10 +481,10 @@ other Mycobactin T C17 C44H69N5O10 827.5044434619 other Mycobactin Av C14 C44H69N5O10 827.5044434619 other Amphibactin S C38H67N7O13 829.4796852744 other Rhodobactin C36H50N10O13 830.3558817443 -other Amphibactin D C38H69N7O13 831.4953353386 -other Malonichrome C31H47N9O18 833.3039057533 -other Corynebactin C36H36N6O18 840.2086083846 -other Mycobactin P C15 C45H71N5O10 841.5200935261 +other Amphibactin D C38H69N7O13 831.4953353386 SB: 165 +other Malonichrome C31H47N9O18 833.3039057533 SB: 133 +other Corynebactin C36H36N6O18 840.2086083846 SB: 199 +other Mycobactin P C15 C45H71N5O10 841.5200935261 SB: 77 other Mycobactin F C17 C45H71N5O10 841.5200935261 other Mycobactin M C16 C45H71N5O10 841.5200935261 other Mycobactin N C15 C45H71N5O10 841.5200935261 @@ -493,8 +492,9 @@ other Mycobactin S C18 C45H71N5O10 841.5200935261 other Mycobactin T C18 C45H71N5O10 841.5200935261 other Mycobactin Av C15 C45H71N5O10 841.5200935261 other Mycobactin J C45H71N5O10 841.5200935261 -other Amphibactin B C38H69N7O14 847.4902499607 -other N'.N'.N'- triacetylfusarinin C C39H60N6O15 852.4116652887 +other Amphibactin B C38H69N7O14 847.4902499607 SB: 163 +other Neurosporin C39H60N6O15 852.4116652887 SB: 143 +other N'.N'.N'- triacetylfusarinin C C39H60N6O15 852.4116652887 SB: 39 other Mycobactin P C16 C46H73N5O10 855.5357435903 other Mycobactin H C17 C46H73N5O10 855.5357435903 other Mycobactin M C17 C46H73N5O10 855.5357435903 @@ -502,8 +502,8 @@ other Mycobactin N C16 C46H73N5O10 855.5357435903 other Mycobactin S C19 C46H73N5O10 855.5357435903 other Mycobactin T C19 C46H73N5O10 855.5357435903 other Mycobactin Av C16 C46H73N5O10 855.5357435903 -other Amphibactin E C40H71N7O13 857.5109854028 -other Amphibactin H C40H73N7O13 859.5266354670 +other Amphibactin E C40H71N7O13 857.5109854028 SB: 166 +other Amphibactin H C40H73N7O13 859.5266354670 SB: 169 other Dioscin C45H72O16 868.4820362648 other Mycobactin P C17 C47H75N5O10 869.5513936545 other Mycobactin H C18 C47H75N5O10 869.5513936545 @@ -511,40 +511,40 @@ other Mycobactin M C18 C47H75N5O10 869.5513936545 other Mycobactin N C17 C47H75N5O10 869.5513936545 other Mycobactin T C20 C47H75N5O10 869.5513936545 other Mycobactin Av C17 C47H75N5O10 869.5513936545 -other Amphibactin C C40H71N7O14 873.5059000249 -other Amphibactin F C40H73N7O14 875.5215500891 -other Petrobactin disulphonate C34H50N6O17S2 878.2673855919 -other Bacillibactin C39H42N6O18 882.2555585772 +other Amphibactin C C40H71N7O14 873.5059000249 SB: 164 +other Amphibactin F C40H73N7O14 875.5215500891 SB: 167 +other Petrobactin disulphonate C34H50N6O17S2 878.2673855919 SB: 308 +other Bacillibactin C39H42N6O18 882.2555585772 SB: 66 other Mycobactin P C18 C48H77N5O10 883.5670437187 other Mycobactin H C19 C48H77N5O10 883.5670437187 other Mycobactin N C18 C48H77N5O10 883.5670437187 other Mycobactin R C48H77N5O10 883.5670437187 other Mycobactin Av C18 C48H77N5O10 883.5670437187 -other Amphibactin I C42H75N7O13 885.5422855312 -other Asperchrome B1 C37H61N9O16 887.4236269585 -other Asperchrome B2 C37H61N9O16 887.4236269585 -other Asperchrome B3 C37H61N9O16 887.4236269585 +other Amphibactin I C42H75N7O13 885.5422855312 SB: 170 +other Asperchrome B1 C37H61N9O16 887.4236269585 SB: 55 +other Asperchrome B2 C37H61N9O16 887.4236269585 SB: 134 +other Asperchrome B3 C37H61N9O16 887.4236269585 SB: 135 other Mycobactin P C19 C49H79N5O10 897.5826937829 -other Amphibactin G C42H75N7O14 901.5372001533 -other paenibactin C42H48N6O18 924.3025087698 -other Ferrimycin C41H70N10O14 926.5072970084 -other Alterobactin A C36H53N11O18 927.3570039563 +other Amphibactin G C42H75N7O14 901.5372001533 SB: 168 +other paenibactin C42H48N6O18 924.3025087698 SB: 304 +other Ferrimycin C41H70N10O14 926.5072970084 SB: 277 +other Alterobactin A C36H53N11O18 927.3570039563 SB: 309 other Marinobactin A C40H69N9O16 931.4862272153 -other Asperchrome A C41H67N9O16 941.4705771511 -other Alterobactin B C36H55N11O19 945.3675686426 -other Albomycin C36H59N11O17S1 949.3811102168 -other Albomycin 1 C36H58N10O18S1 950.3651258016 -other Asperchrome E C41H67N9O17 957.4654917732 -other Ferrirhodin C41H67N9O17 957.4654917732 -other Ferrirubin C41H67N9O17 957.4654917732 +other Asperchrome A C41H67N9O16 941.4705771511 SB: 58 +other Alterobactin B C36H55N11O19 945.3675686426 SB: 310 +other Albomycin C36H59N11O17S1 949.3811102168 SB: 239 +other Albomycin 1 C36H58N10O18S1 950.3651258016 SB: 237 +other Asperchrome E C41H67N9O17 957.4654917732 SB: 137 +other Ferrirhodin C41H67N9O17 957.4654917732 SB: 98 +other Ferrirubin C41H67N9O17 957.4654917732 SB: 56 other Marinobactin B C42H71N9O16 957.5018772795 other Marinobactin C C42H73N9O16 959.5175273437 -other Taiwachelin C41H70N8O18 962.4808074864 -other palmitoylcoprogen C49H84N6O13 964.6096368149 +other Taiwachelin C41H70N8O18 962.4808074864 SB: 311 +other palmitoylcoprogen C49H84N6O13 964.6096368149 SB: 162 other Salmycin C C40H70N6O21 970.4594033423 -other Asperchrome F1 C41H69N9O18 975.4760564595 -other Asperchrome F2 C41H69N9O18 975.4760564595 -other Asperchrome F3 C41H69N9O18 975.4760564595 +other Asperchrome F1 C41H69N9O18 975.4760564595 SB: 138 +other Asperchrome F2 C41H69N9O18 975.4760564595 SB: 139 +other Asperchrome F3 C41H69N9O18 975.4760564595 SB: 140 other Salmycin B C41H72N6O21 984.4750534065 other Marinobactin D1 C44H75N9O16 985.5331774079 other Marinobactin D2 C44H75N9O16 985.5331774079 @@ -552,19 +552,18 @@ other Marinobactin E C44H77N9O16 987.5488274721 other Pyoverdin 6.1 (Pseudobactin) C42H60N12O16 988.4250239420 other Pyoverdin B10 C42H60N12O16 988.4250239420 other Pseudobactin A C42H62N12O16 990.4406740062 -other Albomycin 2 C37H60N12O18S1 992.3869238762 -other Salmochelin S4 C42H47N3O25 993.2498640768 -other Corrugatin C40H63N13O17 997.4464876656 -other Ferrichrome A C41H61N9O20 999.4032854469 -other Asperchrome C C43H69N9O18 999.4760564595 -other Salmycin A C41H73N7O21 999.4859524438 -other Salmochelin S2 C42H49N3O26 1011.2604287631 +other Albomycin 2 C37H60N12O18S1 992.3869238762 SB: 238 +other Salmochelin S4 C42H47N3O25 993.2498640768 SB: 117 +other Corrugatin C40H63N13O17 997.4464876656 SB: 95 +other Ferrichrome A C41H61N9O20 999.4032854469 SB: 78 +other Asperchrome C C43H69N9O18 999.4760564595 SB: 136 +other Salmycin A C41H73N7O21 999.4859524438 SB: 240 +other Salmochelin S2 C42H49N3O26 1011.2604287631 SB: 200 other Salmochelin S3 C42H49N3O26 1011.2604287631 -other Ornicorrugatin C41H65N13O17 1011.4621377298 +other Ornicorrugatin C41H65N13O17 1011.4621377298 SB: 96 other Pyoverdin Thai C43H60N12O17 1016.4199385641 other Epichloenin B C44H71N11O17 1025.5029399120 -other Fuscachelin A C42H59N15O16 1029.4264209255 -other Fuscachelin C C42H62N16O15 1030.4580554049 +other Fuscachelin A C42H59N15O16 1029.4264209255 SB: 189 other Pseudoprotodioscin C51H82O21 1030.5348596963 other Protodioscin C51H82O21 1030.5348596963 other Epichloeamide C46H74N12O15 1034.5396597693 @@ -573,21 +572,22 @@ other Pyoverdin 9AW (amide) C44H62N14O16 1042.4468220166 other Pyoverdin 9AW C44H61N13O17 1043.4308376014 other Pyoverdin R' C43H60N14O17 1044.4260865745 other Pyoverdin PL7 C44H62N12O18 1046.4305032504 -other Fuscachelin B C42H61N15O17 1047.4369856118 +other Fuscachelin C C42H62N16O16 1046.4529700270 SB: 229 +other Fuscachelin B C42H61N15O17 1047.4369856118 SB: 228 other Pyoverdin BTP2 (amide) C43H60N12O19 1048.4097678083 other Pyoverdin BTP2 C43H59N11O20 1049.3937833931 -other Cyclic trichrisobactin C48H63N9O18 1053.4291062669 +other Cyclic trichrisobactin C48H63N9O18 1053.4291062669 SB: 216 other Hexadehydro-Astechrome C60H63N9O9 1053.4748746680 other Loihichelin A C44H73N11O19 1059.5084192204 other Astechrome C60H69N9O9 1059.5218248606 other Pyoverdin 1W C45H68N14O16 1060.4937722092 -other Aquachelin A C44H74N10O20 1062.5080848694 +other Aquachelin A C44H74N10O20 1062.5080848694 SB: 198 other Aquachelin B C44H76N10O20 1064.5237349336 -other Linear trichrisobactin C48H65N9O19 1071.4396709532 +other Linear trichrisobactin C48H65N9O19 1071.4396709532 SB: 217 other Pyoverdin G4R C44H60N14O18 1072.4210011966 other Pyoverdin G4R A C44H59N13O19 1073.4050167814 other Isopyoverdin C44H60N12O20 1076.4046824304 -other Pseudoalterobactin A C41H63N11O21S1 1077.3920688336 +other Pseudoalterobactin A C41H63N11O21S1 1077.3920688336 SB: 301 other Aquachelin I C44H76N10O21 1080.5186495557 other Epichloenin A C46H74N12O18 1082.5244036356 other Loihichelin C C46H75N11O19 1085.5240692846 @@ -604,7 +604,7 @@ other Pyoverdin P cic. C44H59N11O22 1093.3836126373 other Azotabactin P19 C43H59N12O22 1095.3866866425 other Pyoverdin PL8 C47H69N13O18 1103.4883524803 other Loihichelin B C46H77N11O20 1103.5346339709 -other Pseudoalterobactin B C41H63N13O21S1 1105.3982168440 +other Pseudoalterobactin B C41H63N13O21S1 1105.3982168440 SB: 302 other Pyoverdin 11370 (amide) C45H63N13O20 1105.4312315319 other Pyoverdin Ps 6.10 C47H71N13O18 1105.5040025445 other 5-chloropyoverdin G4R C44H59ClN14O18 1106.3820291645 @@ -622,7 +622,7 @@ other Pyoverdin Syr 19310 (amide) C45H64N12O23 1140.4207264251 other Pyoverdin Syr 19310 C45H63N11O24 1141.4047420099 other Pseudobactin P39167-II C46H63N13O22 1149.4210607761 other Methanobactin C45H58N10O16S5 1154.2635793174 -other Trivanchrobactin C48H65N15O19 1155.4581149844 +other Trivanchrobactin C48H65N15O19 1155.4581149844 SB: 120 other Pyoverdin Pfl 13525 C49H72N14O19 1160.5098162039 other Pseudobactin PA225-II C46H63N13O23 1165.4159753982 other Pseudobactin P39167-I C46H65N13O23 1167.4316254624 @@ -630,28 +630,28 @@ other Pyoverdin Pa6 R (amide) C48H68N16O19 1172.4846640859 other Pyoverdin Pa6 R C48H67N15O20 1173.4686796707 other Pyoverdin G173 C49H70N14O20 1174.4890807618 other Pyoverdin G173 C49H69N13O21 1175.4730963466 -other Streptobactin C51H69N15O18 1179.4945004907 +other Streptobactin C51H69N15O18 1179.4945004907 SB: 266 other Pseudobactin PA225-I C46H65N13O24 1183.4265400845 -other Ferrocin A C51H85N13O19 1183.6084676160 +other Ferrocin A C51H85N13O19 1183.6084676160 SB: 171 other Pyoverdin Pfl W (amide) C48H66N16O20 1186.4639286438 other Pyoverdin Pfl W C48H65N15O21 1187.4479442286 other Pyoverdin 96-312 (amide) C50H75N15O19 1189.5363653054 other Pyoverdin 96-312 C50H74N14O20 1190.5203808902 other Pyoverdin 90-33 C49H71N13O22 1193.4836610329 -other Tribenarthin C51H71N15O19 1197.5050651770 +other Tribenarthin C51H71N15O19 1197.5050651770 SB: 265 other Ferrocin C C52H87N13O19 1197.6241176802 other Ferrocin D C52H87N13O19 1197.6241176802 -other Ferrocin B C51H85N13O20 1199.6033822381 +other Ferrocin B C51H85N13O20 1199.6033822381 SB: 172 other Pyoverdin Pfl W (amide) C48H66N16O21 1202.4588432659 other Pyoverdin Pfl W C48H65N15O22 1203.4428588507 -other Pyoverdin 96-312 C51H74N14O21 1218.5152955123 other Pyoverdin D47 C51H75N15O20 1217.5312799275 other Pyoverdin D47 (amide) C51H75N15O20 1217.5312799275 +other Pyoverdin 96-312 C51H74N14O21 1218.5152955123 other Pyoverdin D47 C51H74N14O21 1218.5152955123 +other Pyoverdin 90-51 C51H74N14O21 1218.5152955123 other Pyoverdin D-TR133 (amide) C52H75N15O20 1229.5312799275 other Pyoverdin D-TR133 C52H74N14O21 1230.5152955123 other Pyoverdin 96-188 C52H76N14O21 1232.5309455765 -other Pyoverdin 90-51 C51H74N14O21 1218.5152955123 other Pyoverdin D-TR133 (gly. amide) C53H77N15O20 1243.5469299917 other Pyoverdin D-TR133 (gly) C53H76N14O21 1244.5309455765 other Pyoverdin 90-51 (amide) C51H75N15O22 1249.5211091717 diff --git a/CycloBranch/SequenceDatabases/tutorials/cb2_tutorial4_db.txt b/CycloBranch/SequenceDatabases/tutorials/cb2_tutorial4_db.txt new file mode 100644 index 0000000..fc77de5 --- /dev/null +++ b/CycloBranch/SequenceDatabases/tutorials/cb2_tutorial4_db.txt @@ -0,0 +1,3 @@ +other Dimethylgliotoxin C15H20N2O4S2 356.0864485208 +other TAFC C39H60N6O15 852.4116652887 +other Desferrioxamine E C27H48N6O9 600.3482771709 diff --git a/CycloBranch/Settings/tutorials/cb2_tutorial1.ini b/CycloBranch/Settings/tutorials/cb2_tutorial1.ini new file mode 100644 index 0000000..f05721e --- /dev/null +++ b/CycloBranch/Settings/tutorials/cb2_tutorial1.ini @@ -0,0 +1,127 @@ +[General] +mode=3 +maximumnumberofthreads=1 +peptidetype=0 +peaklist=cb-jms-data/jemna_obalka/Pyoverdin_standard_CASI_1000_1600_4M_accu0.05_EP45_000001.d/analysis.baf +useprofiledata=1 +scannumber=1 +precursormass=0 +precursoradduct= +precursormasserrortolerance=1 +precursorcharge=1 +fragmentmasserrortolerance=1 +minimumrelativeintensitythreshold=1 +minimumabsoluteintensitythreshold=0 +minimummz=150 +maximummz=0 +fwhm=0.002 +brickdatabase= +maximumbricksincombinationbegin=1 +maximumbricksincombinationmiddle=1 +maximumbricksincombinationend=1 +maximumcumulativemass=0 +modificationsfile= +blindedges=2 +cyclicnterminus=0 +cycliccterminus=0 +internalfragments=0 +enablescrambling=0 +similaritysearch=0 +regularblocksorder=0 +sequencedatabase=D:/CycloBranch-git/cyclobranch/CycloBranch/SequenceDatabases/siderophores/709_siderophores_and_secondary_metabolites.txt +scoretype=3 +hitsreported=100 +sequencetag= +fragmentiontype_0=1 +fragmentiontype_1=0 +fragmentiontype_2=0 +fragmentiontype_3=0 +fragmentiontype_4=0 +fragmentiontype_5=0 +fragmentiontype_6=0 +fragmentiontype_7=0 +fragmentiontype_8=0 +fragmentiontype_9=0 +fragmentiontype_10=0 +fragmentiontype_11=0 +fragmentiontype_12=0 +fragmentiontype_13=0 +fragmentiontype_14=0 +fragmentiontype_15=0 +fragmentiontype_16=0 +fragmentiontype_17=0 +fragmentiontype_18=0 +fragmentiontype_19=0 +fragmentiontype_20=0 +fragmentiontype_21=0 +fragmentiontype_22=0 +fragmentiontype_23=0 +fragmentiontype_24=0 +fragmentiontype_25=0 +fragmentiontype_26=0 +fragmentiontype_27=0 +fragmentiontype_28=0 +fragmentiontype_29=0 +fragmentiontype_30=0 +fragmentiontype_31=0 +fragmentiontype_32=0 +fragmentiontype_33=0 +fragmentiontype_34=0 +fragmentiontype_35=0 +fragmentiontype_36=0 +fragmentiontype_37=0 +fragmentiontype_38=0 +fragmentiontype_39=0 +fragmentiontype_40=0 +fragmentiontype_41=0 +fragmentiontype_42=0 +fragmentiontype_43=0 +fragmentiontype_44=0 +fragmentiontype_45=0 +fragmentiontype_46=0 +fragmentiontype_47=0 +fragmentiontype_48=0 +fragmentiontype_49=0 +fragmentiontype_50=0 +fragmentiontype_51=0 +fragmentiontype_52=0 +fragmentiontype_53=0 +fragmentiontype_54=0 +fragmentiontype_55=0 +fragmentiontype_56=0 +fragmentiontype_57=0 +fragmentiontype_58=0 +fragmentiontype_59=0 +fragmentiontype_60=0 +fragmentiontype_61=0 +fragmentiontype_62=0 +fragmentiontype_63=0 +fragmentiontype_64=0 +fragmentiontype_65=0 +fragmentiontype_66=0 +fragmentiontype_67=0 +fragmentiontype_68=0 +fragmentiontype_69=0 +fragmentiontype_70=0 +fragmentiontype_71=0 +fragmentiontype_72=0 +fragmentiontype_73=0 +fragmentiontype_74=0 +neutrallosstype_0=0 +neutrallossformula_0=H2O +maximumcombinedlosses=0 +reportunmatchedtheoreticalpeaks=0 +generateisotopepattern=1 +minimumpatternsize=3 +minimumfeaturesize=1 +minimumiontypes=1 +basicformulacheck=0 +advancedformulacheck=1 +noratiocheck=1 +mzdifftolerance=0 +intensitytolerance=0 +searchedsequence= +searchedsequenceNtermmodif= +searchedsequenceCtermmodif= +searchedsequenceTmodif= +searchedsequenceformula= diff --git a/CycloBranch/Settings/tutorials/cb2_tutorial2.ini b/CycloBranch/Settings/tutorials/cb2_tutorial2.ini new file mode 100644 index 0000000..b93eb78 --- /dev/null +++ b/CycloBranch/Settings/tutorials/cb2_tutorial2.ini @@ -0,0 +1,125 @@ +[General] +mode=3 +maximumnumberofthreads=1 +peptidetype=1 +peaklist=HL_1to1_profile_BB7_01_4492.d/analysis.baf +useprofiledata=1 +scannumber=1 +precursormass=0 +precursoradduct= +precursormasserrortolerance=1 +precursorcharge=2 +fragmentmasserrortolerance=2 +minimumrelativeintensitythreshold=3 +minimumabsoluteintensitythreshold=100000 +minimummz=650 +maximummz=1400 +fwhm=0.05 +brickdatabase= +maximumbricksincombinationbegin=1 +maximumbricksincombinationmiddle=1 +maximumbricksincombinationend=1 +maximumcumulativemass=0 +modificationsfile= +blindedges=1 +cyclicnterminus=0 +cycliccterminus=0 +internalfragments=0 +enablescrambling=0 +similaritysearch=0 +regularblocksorder=0 +sequencedatabase=D:/CycloBranch-git/cyclobranch/CycloBranch/SequenceDatabases/siderophores/709_siderophores_and_secondary_metabolites.txt +scoretype=3 +hitsreported=1000 +sequencetag= +fragmentiontype_0=0 +fragmentiontype_1=0 +fragmentiontype_2=0 +fragmentiontype_3=0 +fragmentiontype_4=0 +fragmentiontype_5=0 +fragmentiontype_6=1 +fragmentiontype_7=0 +fragmentiontype_8=0 +fragmentiontype_9=0 +fragmentiontype_10=0 +fragmentiontype_11=0 +fragmentiontype_12=0 +fragmentiontype_13=0 +fragmentiontype_14=0 +fragmentiontype_15=0 +fragmentiontype_16=0 +fragmentiontype_17=0 +fragmentiontype_18=0 +fragmentiontype_19=0 +fragmentiontype_20=0 +fragmentiontype_21=0 +fragmentiontype_22=0 +fragmentiontype_23=0 +fragmentiontype_24=0 +fragmentiontype_25=0 +fragmentiontype_26=0 +fragmentiontype_27=0 +fragmentiontype_28=0 +fragmentiontype_29=0 +fragmentiontype_30=0 +fragmentiontype_31=0 +fragmentiontype_32=0 +fragmentiontype_33=0 +fragmentiontype_34=0 +fragmentiontype_35=0 +fragmentiontype_36=0 +fragmentiontype_37=0 +fragmentiontype_38=0 +fragmentiontype_39=0 +fragmentiontype_40=0 +fragmentiontype_41=0 +fragmentiontype_42=0 +fragmentiontype_43=0 +fragmentiontype_44=0 +fragmentiontype_45=0 +fragmentiontype_46=0 +fragmentiontype_47=0 +fragmentiontype_48=0 +fragmentiontype_49=0 +fragmentiontype_50=0 +fragmentiontype_51=0 +fragmentiontype_52=0 +fragmentiontype_53=0 +fragmentiontype_54=0 +fragmentiontype_55=0 +fragmentiontype_56=0 +fragmentiontype_57=0 +fragmentiontype_58=0 +fragmentiontype_59=0 +fragmentiontype_60=0 +fragmentiontype_61=0 +fragmentiontype_62=0 +fragmentiontype_63=0 +fragmentiontype_64=0 +fragmentiontype_65=0 +fragmentiontype_66=0 +fragmentiontype_67=0 +fragmentiontype_68=0 +fragmentiontype_69=0 +fragmentiontype_70=0 +fragmentiontype_71=0 +fragmentiontype_72=0 +fragmentiontype_73=0 +fragmentiontype_74=0 +maximumcombinedlosses=0 +reportunmatchedtheoreticalpeaks=0 +generateisotopepattern=1 +minimumpatternsize=4 +minimumfeaturesize=4 +minimumiontypes=1 +basicformulacheck=0 +advancedformulacheck=1 +noratiocheck=1 +mzdifftolerance=0 +intensitytolerance=0 +searchedsequence= +searchedsequenceNtermmodif= +searchedsequenceCtermmodif= +searchedsequenceTmodif= +searchedsequenceformula= diff --git a/CycloBranch/Settings/tutorials/cb2_tutorial3.ini b/CycloBranch/Settings/tutorials/cb2_tutorial3.ini new file mode 100644 index 0000000..53080c2 --- /dev/null +++ b/CycloBranch/Settings/tutorials/cb2_tutorial3.ini @@ -0,0 +1,137 @@ +[General] +mode=4 +maximumnumberofthreads=1 +peptidetype=1 +peaklist=HL_1to1_profile_BB7_01_4492.d/analysis.baf +useprofiledata=0 +scannumber=1 +precursormass=0 +precursoradduct= +precursormasserrortolerance=1 +precursorcharge=2 +fragmentmasserrortolerance=2 +minimumrelativeintensitythreshold=3 +minimumabsoluteintensitythreshold=100000 +minimummz=650 +maximummz=1400 +fwhm=0.05 +brickdatabase= +maximumbricksincombinationbegin=1 +maximumbricksincombinationmiddle=1 +maximumbricksincombinationend=1 +maximumcumulativemass=0 +modificationsfile= +blindedges=1 +cyclicnterminus=0 +cycliccterminus=0 +internalfragments=0 +enablescrambling=0 +similaritysearch=0 +regularblocksorder=0 +sequencedatabase=D:/CycloBranch-git/cyclobranch/CycloBranch/SequenceDatabases/siderophores/709_siderophores_and_secondary_metabolites.txt +scoretype=3 +hitsreported=1000 +sequencetag= +fragmentiontype_0=0 +fragmentiontype_1=0 +fragmentiontype_2=0 +fragmentiontype_3=0 +fragmentiontype_4=0 +fragmentiontype_5=0 +fragmentiontype_6=1 +fragmentiontype_7=0 +fragmentiontype_8=0 +fragmentiontype_9=0 +fragmentiontype_10=0 +fragmentiontype_11=0 +fragmentiontype_12=0 +fragmentiontype_13=0 +fragmentiontype_14=0 +fragmentiontype_15=0 +fragmentiontype_16=0 +fragmentiontype_17=0 +fragmentiontype_18=0 +fragmentiontype_19=0 +fragmentiontype_20=0 +fragmentiontype_21=0 +fragmentiontype_22=0 +fragmentiontype_23=0 +fragmentiontype_24=0 +fragmentiontype_25=0 +fragmentiontype_26=0 +fragmentiontype_27=0 +fragmentiontype_28=0 +fragmentiontype_29=0 +fragmentiontype_30=0 +fragmentiontype_31=0 +fragmentiontype_32=0 +fragmentiontype_33=0 +fragmentiontype_34=0 +fragmentiontype_35=0 +fragmentiontype_36=0 +fragmentiontype_37=0 +fragmentiontype_38=0 +fragmentiontype_39=0 +fragmentiontype_40=0 +fragmentiontype_41=0 +fragmentiontype_42=0 +fragmentiontype_43=0 +fragmentiontype_44=0 +fragmentiontype_45=0 +fragmentiontype_46=0 +fragmentiontype_47=0 +fragmentiontype_48=0 +fragmentiontype_49=0 +fragmentiontype_50=0 +fragmentiontype_51=0 +fragmentiontype_52=0 +fragmentiontype_53=0 +fragmentiontype_54=0 +fragmentiontype_55=0 +fragmentiontype_56=0 +fragmentiontype_57=0 +fragmentiontype_58=0 +fragmentiontype_59=0 +fragmentiontype_60=0 +fragmentiontype_61=0 +fragmentiontype_62=0 +fragmentiontype_63=0 +fragmentiontype_64=0 +fragmentiontype_65=0 +fragmentiontype_66=0 +fragmentiontype_67=0 +fragmentiontype_68=0 +fragmentiontype_69=0 +fragmentiontype_70=0 +fragmentiontype_71=0 +fragmentiontype_72=0 +fragmentiontype_73=0 +fragmentiontype_74=0 +neutrallosstype_0=1 +neutrallossformula_0=H +neutrallosstype_1=1 +neutrallossformula_1=C +neutrallosstype_2=1 +neutrallossformula_2=O +neutrallosstype_3=1 +neutrallossformula_3=N +neutrallosstype_4=0 +neutrallossformula_4=S:1 +neutrallosstype_5=0 +neutrallossformula_5=P:1 +maximumcombinedlosses=180 +reportunmatchedtheoreticalpeaks=0 +generateisotopepattern=1 +minimumpatternsize=4 +minimumfeaturesize=4 +minimumiontypes=1 +basicformulacheck=1 +advancedformulacheck=1 +noratiocheck=1 +mzdifftolerance=0 +intensitytolerance=10 +searchedsequence= +searchedsequenceNtermmodif= +searchedsequenceCtermmodif= +searchedsequenceTmodif= +searchedsequenceformula= diff --git a/CycloBranch/Settings/tutorials/cb2_tutorial4.ini b/CycloBranch/Settings/tutorials/cb2_tutorial4.ini new file mode 100644 index 0000000..35d5213 --- /dev/null +++ b/CycloBranch/Settings/tutorials/cb2_tutorial4.ini @@ -0,0 +1,125 @@ +[General] +mode=3 +maximumnumberofthreads=1 +peptidetype=1 +peaklist=D:/raw_data/MSI/ITO14_new_reduced.imzML +useprofiledata=1 +scannumber=1 +precursormass=0 +precursoradduct= +precursormasserrortolerance=1 +precursorcharge=1 +fragmentmasserrortolerance=2 +minimumrelativeintensitythreshold=1 +minimumabsoluteintensitythreshold=0 +minimummz=350 +maximummz=950 +fwhm=0.001 +brickdatabase= +maximumbricksincombinationbegin=1 +maximumbricksincombinationmiddle=1 +maximumbricksincombinationend=1 +maximumcumulativemass=0 +modificationsfile= +blindedges=1 +cyclicnterminus=0 +cycliccterminus=0 +internalfragments=0 +enablescrambling=0 +similaritysearch=0 +regularblocksorder=0 +sequencedatabase=D:/CycloBranch-git/cyclobranch/CycloBranch/SequenceDatabases/tutorials/cb2_tutorial4_db.txt +scoretype=3 +hitsreported=1000 +sequencetag= +fragmentiontype_0=0 +fragmentiontype_1=1 +fragmentiontype_2=1 +fragmentiontype_3=0 +fragmentiontype_4=0 +fragmentiontype_5=0 +fragmentiontype_6=1 +fragmentiontype_7=0 +fragmentiontype_8=0 +fragmentiontype_9=0 +fragmentiontype_10=0 +fragmentiontype_11=0 +fragmentiontype_12=0 +fragmentiontype_13=0 +fragmentiontype_14=0 +fragmentiontype_15=0 +fragmentiontype_16=0 +fragmentiontype_17=0 +fragmentiontype_18=0 +fragmentiontype_19=0 +fragmentiontype_20=0 +fragmentiontype_21=0 +fragmentiontype_22=0 +fragmentiontype_23=0 +fragmentiontype_24=0 +fragmentiontype_25=0 +fragmentiontype_26=0 +fragmentiontype_27=0 +fragmentiontype_28=0 +fragmentiontype_29=0 +fragmentiontype_30=0 +fragmentiontype_31=0 +fragmentiontype_32=0 +fragmentiontype_33=0 +fragmentiontype_34=0 +fragmentiontype_35=0 +fragmentiontype_36=0 +fragmentiontype_37=0 +fragmentiontype_38=0 +fragmentiontype_39=0 +fragmentiontype_40=0 +fragmentiontype_41=0 +fragmentiontype_42=0 +fragmentiontype_43=0 +fragmentiontype_44=0 +fragmentiontype_45=0 +fragmentiontype_46=0 +fragmentiontype_47=0 +fragmentiontype_48=0 +fragmentiontype_49=0 +fragmentiontype_50=0 +fragmentiontype_51=0 +fragmentiontype_52=0 +fragmentiontype_53=0 +fragmentiontype_54=0 +fragmentiontype_55=0 +fragmentiontype_56=0 +fragmentiontype_57=0 +fragmentiontype_58=0 +fragmentiontype_59=0 +fragmentiontype_60=0 +fragmentiontype_61=0 +fragmentiontype_62=0 +fragmentiontype_63=0 +fragmentiontype_64=0 +fragmentiontype_65=0 +fragmentiontype_66=0 +fragmentiontype_67=0 +fragmentiontype_68=0 +fragmentiontype_69=0 +fragmentiontype_70=0 +fragmentiontype_71=0 +fragmentiontype_72=0 +fragmentiontype_73=0 +fragmentiontype_74=0 +maximumcombinedlosses=0 +reportunmatchedtheoreticalpeaks=0 +generateisotopepattern=1 +minimumpatternsize=3 +minimumfeaturesize=50 +minimumiontypes=1 +basicformulacheck=0 +advancedformulacheck=1 +noratiocheck=1 +mzdifftolerance=0 +intensitytolerance=0 +searchedsequence= +searchedsequenceNtermmodif= +searchedsequenceCtermmodif= +searchedsequenceTmodif= +searchedsequenceformula= diff --git a/CycloBranch/Settings/tutorials/cb2_tutorial5.ini b/CycloBranch/Settings/tutorials/cb2_tutorial5.ini new file mode 100644 index 0000000..75dcf44 --- /dev/null +++ b/CycloBranch/Settings/tutorials/cb2_tutorial5.ini @@ -0,0 +1,137 @@ +[General] +mode=4 +maximumnumberofthreads=1 +peptidetype=1 +peaklist=D:/raw_data/MSI/ITO14_new_reduced.imzML +useprofiledata=1 +scannumber=1 +precursormass=0 +precursoradduct= +precursormasserrortolerance=1 +precursorcharge=1 +fragmentmasserrortolerance=2 +minimumrelativeintensitythreshold=1 +minimumabsoluteintensitythreshold=0 +minimummz=350 +maximummz=950 +fwhm=0.001 +brickdatabase= +maximumbricksincombinationbegin=1 +maximumbricksincombinationmiddle=1 +maximumbricksincombinationend=1 +maximumcumulativemass=0 +modificationsfile= +blindedges=1 +cyclicnterminus=0 +cycliccterminus=0 +internalfragments=0 +enablescrambling=0 +similaritysearch=0 +regularblocksorder=0 +sequencedatabase=D:/CycloBranch-git/cyclobranch/CycloBranch/SequenceDatabases/siderophores/709_siderophores_and_secondary_metabolites.txt +scoretype=3 +hitsreported=1000 +sequencetag= +fragmentiontype_0=0 +fragmentiontype_1=1 +fragmentiontype_2=1 +fragmentiontype_3=0 +fragmentiontype_4=0 +fragmentiontype_5=0 +fragmentiontype_6=1 +fragmentiontype_7=0 +fragmentiontype_8=0 +fragmentiontype_9=0 +fragmentiontype_10=0 +fragmentiontype_11=0 +fragmentiontype_12=0 +fragmentiontype_13=0 +fragmentiontype_14=0 +fragmentiontype_15=0 +fragmentiontype_16=0 +fragmentiontype_17=0 +fragmentiontype_18=0 +fragmentiontype_19=0 +fragmentiontype_20=0 +fragmentiontype_21=0 +fragmentiontype_22=0 +fragmentiontype_23=0 +fragmentiontype_24=0 +fragmentiontype_25=0 +fragmentiontype_26=0 +fragmentiontype_27=0 +fragmentiontype_28=0 +fragmentiontype_29=0 +fragmentiontype_30=0 +fragmentiontype_31=0 +fragmentiontype_32=0 +fragmentiontype_33=0 +fragmentiontype_34=0 +fragmentiontype_35=0 +fragmentiontype_36=0 +fragmentiontype_37=0 +fragmentiontype_38=0 +fragmentiontype_39=0 +fragmentiontype_40=0 +fragmentiontype_41=0 +fragmentiontype_42=0 +fragmentiontype_43=0 +fragmentiontype_44=0 +fragmentiontype_45=0 +fragmentiontype_46=0 +fragmentiontype_47=0 +fragmentiontype_48=0 +fragmentiontype_49=0 +fragmentiontype_50=0 +fragmentiontype_51=0 +fragmentiontype_52=0 +fragmentiontype_53=0 +fragmentiontype_54=0 +fragmentiontype_55=0 +fragmentiontype_56=0 +fragmentiontype_57=0 +fragmentiontype_58=0 +fragmentiontype_59=0 +fragmentiontype_60=0 +fragmentiontype_61=0 +fragmentiontype_62=0 +fragmentiontype_63=0 +fragmentiontype_64=0 +fragmentiontype_65=0 +fragmentiontype_66=0 +fragmentiontype_67=0 +fragmentiontype_68=0 +fragmentiontype_69=0 +fragmentiontype_70=0 +fragmentiontype_71=0 +fragmentiontype_72=0 +fragmentiontype_73=0 +fragmentiontype_74=0 +neutrallosstype_0=1 +neutrallossformula_0=H +neutrallosstype_1=1 +neutrallossformula_1=C +neutrallosstype_2=1 +neutrallossformula_2=O +neutrallosstype_3=1 +neutrallossformula_3=N +neutrallosstype_4=1 +neutrallossformula_4=S:2 +neutrallosstype_5=0 +neutrallossformula_5=P:1 +maximumcombinedlosses=150 +reportunmatchedtheoreticalpeaks=0 +generateisotopepattern=1 +minimumpatternsize=3 +minimumfeaturesize=50 +minimumiontypes=1 +basicformulacheck=1 +advancedformulacheck=1 +noratiocheck=1 +mzdifftolerance=2 +intensitytolerance=5 +searchedsequence= +searchedsequenceNtermmodif= +searchedsequenceCtermmodif= +searchedsequenceTmodif= +searchedsequenceformula= diff --git a/CycloBranch/Settings/tutorials/cb2_tutorial6.ini b/CycloBranch/Settings/tutorials/cb2_tutorial6.ini new file mode 100644 index 0000000..0feecf6 --- /dev/null +++ b/CycloBranch/Settings/tutorials/cb2_tutorial6.ini @@ -0,0 +1,60 @@ +[General] +mode=1 +maximumnumberofthreads=1 +peptidetype=6 +peaklist=PCH_c325w1e15_UHR_onlinecal_000001.d/analysis.baf +useprofiledata=1 +scannumber=1 +precursormass=325.06733 +precursoradduct= +precursormasserrortolerance=2 +precursorcharge=1 +fragmentmasserrortolerance=2 +minimumrelativeintensitythreshold=5 +minimumabsoluteintensitythreshold=0 +minimummz=100 +maximummz=0 +fwhm=0.001 +brickdatabase=BrickDatabases/inhouse_siderophores_blocks.txt +maximumbricksincombinationbegin=2 +maximumbricksincombinationmiddle=2 +maximumbricksincombinationend=2 +maximumcumulativemass=0 +modificationsfile= +blindedges=1 +cyclicnterminus=0 +cycliccterminus=0 +internalfragments=0 +enablescrambling=0 +similaritysearch=0 +regularblocksorder=0 +sequencedatabase= +scoretype=1 +hitsreported=100 +sequencetag= +neutrallosstype_0=1 +neutrallossformula_0=H +neutrallosstype_1=1 +neutrallossformula_1=C +neutrallosstype_2=1 +neutrallossformula_2=O +neutrallosstype_3=1 +neutrallossformula_3=N +neutrallosstype_4=1 +neutrallossformula_4=S:2 +maximumcombinedlosses=38 +reportunmatchedtheoreticalpeaks=0 +generateisotopepattern=1 +minimumpatternsize=1 +minimumfeaturesize=1 +minimumiontypes=1 +basicformulacheck=1 +advancedformulacheck=1 +noratiocheck=1 +mzdifftolerance=0 +intensitytolerance=10 +searchedsequence= +searchedsequenceNtermmodif= +searchedsequenceCtermmodif= +searchedsequenceTmodif= +searchedsequenceformula=C14H16N2O3S2 diff --git a/CycloBranch/core/cBrick.cpp b/CycloBranch/core/cBrick.cpp index 7e124c4..ac43168 100644 --- a/CycloBranch/core/cBrick.cpp +++ b/CycloBranch/core/cBrick.cpp @@ -33,6 +33,8 @@ void cBrick::clear() { composition = ""; artificial = false; residuelosstype = h2o_loss; + losses.clear(); + lossids.clear(); } @@ -67,6 +69,16 @@ vector& cBrick::getAcronyms() { } +string& cBrick::getLosses() { + return losses; +} + + +vector& cBrick::getLossIDs() { + return lossids; +} + + vector& cBrick::getReferences() { return references; } @@ -142,6 +154,16 @@ void cBrick::setAcronyms(const string& acronyms) { } +void cBrick::setLosses(const string& str) { + losses = str; +} + + +void cBrick::setLossIDs(vector& lossids) { + this->lossids = lossids; +} + + void cBrick::setReferences(const string& references) { this->references.clear(); string s = ""; @@ -270,7 +292,7 @@ string cBrick::getAcronymsWithReferencesAsHTMLString() { if (!correctreference) { rx = "^CSID: [0-9]+$"; if (regex_search(references[i], rx)) { - s += ""; + s += ""; s += acronyms[i]; s += ""; correctreference = true; @@ -281,18 +303,29 @@ string cBrick::getAcronymsWithReferencesAsHTMLString() { if (!correctreference) { rx = "^CID: [0-9]+$"; if (regex_search(references[i], rx)) { - s += ""; + s += ""; s += acronyms[i]; s += ""; correctreference = true; } } + // ChEBI + if (!correctreference) { + rx = "^CHEBI: [0-9]+$"; + if (regex_search(references[i], rx)) { + s += ""; + s += name; + s += ""; + correctreference = true; + } + } + // PDB if (!correctreference) { rx = "^PDB: ([A-Z]|[0-9])+$"; if (regex_search(references[i], rx)) { - s += ""; + s += ""; s += acronyms[i]; s += ""; correctreference = true; @@ -303,7 +336,7 @@ string cBrick::getAcronymsWithReferencesAsHTMLString() { if (!correctreference) { rx = " in CSID: [0-9]+$"; if (regex_search(references[i], rx)) { - s += ""; + s += ""; s += acronyms[i]; s += ""; correctreference = true; @@ -314,7 +347,7 @@ string cBrick::getAcronymsWithReferencesAsHTMLString() { if (!correctreference) { rx = " in CID: [0-9]+$"; if (regex_search(references[i], rx)) { - s += ""; + s += ""; s += acronyms[i]; s += ""; correctreference = true; @@ -325,7 +358,7 @@ string cBrick::getAcronymsWithReferencesAsHTMLString() { if (!correctreference) { rx = " in: NOR"; if (regex_search(references[i], rx)) { - s += ""; + s += ""; s += acronyms[i]; s += ""; correctreference = true; @@ -379,6 +412,8 @@ void cBrick::store(ofstream& os) { storeString(composition, os); os.write((char *)&artificial, sizeof(bool)); os.write((char *)&residuelosstype, sizeof(eResidueLossType)); + storeString(losses, os); + storeIntVector(lossids, os); } @@ -392,5 +427,7 @@ void cBrick::load(ifstream& is) { loadString(composition, is); is.read((char *)&artificial, sizeof(bool)); is.read((char *)&residuelosstype, sizeof(eResidueLossType)); + loadString(losses, is); + loadIntVector(lossids, is); } diff --git a/CycloBranch/core/cBrick.h b/CycloBranch/core/cBrick.h index 4e413d9..3e24c6f 100644 --- a/CycloBranch/core/cBrick.h +++ b/CycloBranch/core/cBrick.h @@ -48,6 +48,8 @@ class cBrick { string composition; bool artificial; eResidueLossType residuelosstype; + string losses; + vector lossids; public: @@ -85,14 +87,14 @@ class cBrick { /** - \brief Access to a string variable which stores a summary molecular formula of the brick. + \brief Access to a string variable which stores a molecular formula of the brick. \retval reference to a string */ string& getSummary(); /** - \brief Access to a map which stores a summary molecular formula of the brick. + \brief Access to a map which stores a molecular formula of the brick. \retval map reference to a map */ map& getSummaryMap(); @@ -105,6 +107,20 @@ class cBrick { vector& getAcronyms(); + /** + \brief Access to a string variable which stores a list of neutral losses. + \retval reference to a string + */ + string& getLosses(); + + + /** + \brief Access to a vector of identifiers of neutral losses + \retval reference to a vector of identifiers of neutral losses + */ + vector& getLossIDs(); + + /** \brief Access to a vector of strings which stores references (e.g., to ChemSpider) of all izomers corresponding to the brick. \retval reference to a vector of strings @@ -156,7 +172,7 @@ class cBrick { /** - \brief Create an internal map of atoms from the summary formula. + \brief Create a map of atoms from the molecular formula. */ void createSummaryMap(); @@ -168,6 +184,20 @@ class cBrick { void setAcronyms(const string& acronyms); + /** + \brief Set the list of losses. + \param str reference to a string + */ + void setLosses(const string& str); + + + /** + \brief Set a vector of identifiers of neutral losses. + \param lossids a vector of identifiers of neutral losses + */ + void setLossIDs(vector& lossids); + + /** \brief Set references (e.g., to ChemSpider) of all izomers corresponding to the brick. \param references reference to a string where references to izomers are separated by '/' diff --git a/CycloBranch/core/cBricksDatabase.cpp b/CycloBranch/core/cBricksDatabase.cpp index 3a421e1..ce2576a 100644 --- a/CycloBranch/core/cBricksDatabase.cpp +++ b/CycloBranch/core/cBricksDatabase.cpp @@ -56,6 +56,86 @@ void generateBricksPermutations(vector& bricks, vector& currentp } +void cBricksDatabase::addLossToMap(string& lossstr, vector& lossids) { + lossids.clear(); + + if (lossstr.size() == 0) { + return; + } + + map tmpmap; + string tmpstring; + int tmpsize; + + cSummaryFormula formula; + double tmpmass; + + size_t last = 0; + size_t next = 0; + while ((next = lossstr.find(";", last)) != string::npos) { + tmpstring = lossstr.substr(last, next - last); + + if (lossorders.count(tmpstring) > 0) { + lossids.push_back(lossorders[tmpstring]); + } + else { + tmpsize = (int)lossorders.size(); + lossorders[tmpstring] = tmpsize; + lossids.push_back(tmpsize); + + losssummaries.push_back(tmpstring); + + formula.clear(); + formula.addFormula(tmpstring, true); + tmpmass = formula.getMass(); + lossmasses.push_back(tmpmass); + + tmpmap.clear(); + tmpstring = formula.getSummary(); + addStringFormulaToMap(tmpstring, tmpmap); + lossmaps.push_back(tmpmap); + } + + last = next + 1; + } + + tmpstring = lossstr.substr(last); + + if (lossorders.count(tmpstring) > 0) { + lossids.push_back(lossorders[tmpstring]); + } + else { + tmpsize = (int)lossorders.size(); + lossorders[tmpstring] = tmpsize; + lossids.push_back(tmpsize); + + losssummaries.push_back(tmpstring); + + formula.clear(); + formula.addFormula(tmpstring, true); + tmpmass = formula.getMass(); + lossmasses.push_back(tmpmass); + + tmpmap.clear(); + tmpstring = formula.getSummary(); + addStringFormulaToMap(tmpstring, tmpmap); + lossmaps.push_back(tmpmap); + } +} + + +double cBricksDatabase::getMassFromCombCounts(vector& combcounts, vector& combmasses) { + int size = (int)combcounts.size(); + double mass = 0; + for (int i = 0; i < size; i++) { + if (combcounts[i] > 0) { + mass += (double)(combcounts[i]) * combmasses[i]; + } + } + return mass; +} + + bool cBricksDatabase::nextCombination(vector& combarray, int numberofbasicbricks, int maximumbricksincombination, double maximumcumulativemass, double neutralprecursormass) { int pointer = 0; int cyFlag = 0; @@ -102,6 +182,250 @@ bool cBricksDatabase::nextCombination(vector& combarray, int numberofbasicb return true; + } + else { + + cyFlag = 1; + pointer++; + + } + + } while (pointer < maximumbricksincombination); + + return false; +} + + +bool cBricksDatabase::nextCombinationFast(vector& combarray, vector& combcounts, vector& combmasses, double& mass, int numberofbasicbricks, int maximumbricksincombination, double maximumcumulativemass, double neutralprecursormass) { + int pointer = 0; + int cyFlag = 0; + + mass = 0; + + do { + + if ((combarray[pointer] > 0) && (combarray[pointer] <= numberofbasicbricks)) { + combcounts[combarray[pointer] - 1]--; + } + + combarray[pointer]++; + + if ((combarray[pointer] > 0) && (combarray[pointer] <= numberofbasicbricks)) { + combcounts[combarray[pointer] - 1]++; + } + + // set combarray[pointer] to the maximum value when outside of the mass range + mass = getMassFromCombCounts(combcounts, combmasses); + + if ((cyFlag == 0) && (combarray[pointer] <= numberofbasicbricks) && (((maximumcumulativemass > 0) && (mass > maximumcumulativemass)) || ((neutralprecursormass > 0) && (mass > neutralprecursormass)))) { + if (combarray[pointer] > 0) { + combcounts[combarray[pointer] - 1]--; + } + + combarray[pointer] = numberofbasicbricks + 1; + + mass = getMassFromCombCounts(combcounts, combmasses); + } + + if (combarray[pointer] <= numberofbasicbricks) { + + if (cyFlag > 0) { + + for (int i = pointer - 1; i >= 0; i--) { + if ((combarray[i] > 0) && (combarray[i] <= numberofbasicbricks)) { + combcounts[combarray[i] - 1]--; + } + + combarray[i] = combarray[pointer]; + + if ((combarray[i] > 0) && (combarray[i] <= numberofbasicbricks)) { + combcounts[combarray[i] - 1]++; + } + } + + // skip combinations outside of the mass range + mass = getMassFromCombCounts(combcounts, combmasses); + + while ((combarray[pointer] <= numberofbasicbricks) && (pointer < maximumbricksincombination - 1) && (((maximumcumulativemass > 0) && (mass > maximumcumulativemass)) || ((neutralprecursormass > 0) && (mass > neutralprecursormass)))) { + pointer++; + + if ((combarray[pointer] > 0) && (combarray[pointer] <= numberofbasicbricks)) { + combcounts[combarray[pointer] - 1]--; + } + + combarray[pointer]++; + + if ((combarray[pointer] > 0) && (combarray[pointer] <= numberofbasicbricks)) { + combcounts[combarray[pointer] - 1]++; + } + + for (int i = pointer - 1; i >= 0; i--) { + if ((combarray[i] > 0) && (combarray[i] <= numberofbasicbricks)) { + combcounts[combarray[i] - 1]--; + } + + combarray[i] = combarray[pointer]; + + if ((combarray[i] > 0) && (combarray[i] <= numberofbasicbricks)) { + combcounts[combarray[i] - 1]++; + } + } + + mass = getMassFromCombCounts(combcounts, combmasses); + } + + if ((combarray[pointer] > numberofbasicbricks) || ((maximumcumulativemass > 0) && (mass > maximumcumulativemass)) || ((neutralprecursormass > 0) && (mass > neutralprecursormass))) { + return false; + } + + } + + return true; + + } + else { + + cyFlag = 1; + pointer++; + + } + + } while (pointer < maximumbricksincombination); + + return false; +} + + +bool cBricksDatabase::nextCombinationFastLimited(vector& combarray, vector& combcounts, vector& comblimits, vector& combmasses, double& mass, int numberofbasicbricks, int maximumbricksincombination, double maximumcumulativemass, double neutralprecursormass) { + int pointer = 0; + int cyFlag = 0; + int lastval; + + mass = 0; + + do { + + if ((combarray[pointer] > 0) && (combarray[pointer] <= numberofbasicbricks)) { + combcounts[combarray[pointer] - 1]--; + } + + combarray[pointer]++; + + if ((combarray[pointer] > 0) && (combarray[pointer] <= numberofbasicbricks)) { + combcounts[combarray[pointer] - 1]++; + } + + // set combarray[pointer] to the maximum value when outside of the mass range + mass = getMassFromCombCounts(combcounts, combmasses); + + if ((cyFlag == 0) && (combarray[pointer] <= numberofbasicbricks) && (((maximumcumulativemass > 0) && (mass > maximumcumulativemass)) || ((neutralprecursormass > 0) && (mass > neutralprecursormass)) || ((comblimits[combarray[pointer] - 1] > 0) && (combcounts[combarray[pointer] - 1] > comblimits[combarray[pointer] - 1])))) { + + if (((maximumcumulativemass > 0) && (mass > maximumcumulativemass)) || ((neutralprecursormass > 0) && (mass > neutralprecursormass))) { + + lastval = combarray[pointer]; + + if (combarray[pointer] > 0) { + combcounts[combarray[pointer] - 1]--; + } + + combarray[pointer] = numberofbasicbricks + 1; + + while ((pointer + 1 < maximumbricksincombination) && (combarray[pointer + 1] >= lastval - 1)) { + + pointer++; + + if (combarray[pointer] > 0) { + combcounts[combarray[pointer] - 1]--; + } + + combarray[pointer] = numberofbasicbricks + 1; + + } + + } + else { + + while ((combarray[pointer] <= numberofbasicbricks) && ((comblimits[combarray[pointer] - 1] > 0) && (combcounts[combarray[pointer] - 1] > comblimits[combarray[pointer] - 1]))) { + + if ((combarray[pointer] > 0) && (combarray[pointer] <= numberofbasicbricks)) { + combcounts[combarray[pointer] - 1]--; + } + + combarray[pointer]++; + + if ((combarray[pointer] > 0) && (combarray[pointer] <= numberofbasicbricks)) { + combcounts[combarray[pointer] - 1]++; + } + + } + + } + + mass = getMassFromCombCounts(combcounts, combmasses); + + } + + if (combarray[pointer] <= numberofbasicbricks) { + + if (cyFlag > 0) { + + for (int i = pointer - 1; i >= 0; i--) { + if ((combarray[i] > 0) && (combarray[i] <= numberofbasicbricks)) { + combcounts[combarray[i] - 1]--; + } + + combarray[i] = combarray[i + 1]; + while ((combarray[i] > 0) && (combarray[i] <= numberofbasicbricks) && (comblimits[combarray[i] - 1] > 0) && (combcounts[combarray[i] - 1] + 1 > comblimits[combarray[i] - 1])) { + combarray[i]++; + } + + if ((combarray[i] > 0) && (combarray[i] <= numberofbasicbricks)) { + combcounts[combarray[i] - 1]++; + } + } + + // skip combinations outside of the mass range + mass = getMassFromCombCounts(combcounts, combmasses); + + while ((combarray[pointer] <= numberofbasicbricks) && (pointer < maximumbricksincombination - 1) && (((maximumcumulativemass > 0) && (mass > maximumcumulativemass)) || ((neutralprecursormass > 0) && (mass > neutralprecursormass)) || ((comblimits[combarray[pointer] - 1] > 0) && (combcounts[combarray[pointer] - 1] > comblimits[combarray[pointer] - 1])) || (combarray[0] > numberofbasicbricks))) { + pointer++; + + if ((combarray[pointer] > 0) && (combarray[pointer] <= numberofbasicbricks)) { + combcounts[combarray[pointer] - 1]--; + } + + combarray[pointer]++; + + if ((combarray[pointer] > 0) && (combarray[pointer] <= numberofbasicbricks)) { + combcounts[combarray[pointer] - 1]++; + } + + for (int i = pointer - 1; i >= 0; i--) { + if ((combarray[i] > 0) && (combarray[i] <= numberofbasicbricks)) { + combcounts[combarray[i] - 1]--; + } + + combarray[i] = combarray[i + 1]; + while ((combarray[i] > 0) && (combarray[i] <= numberofbasicbricks) && (comblimits[combarray[i] - 1] > 0) && (combcounts[combarray[i] - 1] + 1 > comblimits[combarray[i] - 1])) { + combarray[i]++; + } + + if ((combarray[i] > 0) && (combarray[i] <= numberofbasicbricks)) { + combcounts[combarray[i] - 1]++; + } + } + + mass = getMassFromCombCounts(combcounts, combmasses); + } + + if ((combarray[pointer] > numberofbasicbricks) || ((maximumcumulativemass > 0) && (mass > maximumcumulativemass)) || ((neutralprecursormass > 0) && (mass > neutralprecursormass)) || ((comblimits[combarray[pointer] - 1] > 0) && (combcounts[combarray[pointer] - 1] > comblimits[combarray[pointer] - 1])) || (combarray[0] > numberofbasicbricks)) { + return false; + } + + } + + return true; + } else { @@ -122,7 +446,7 @@ cBricksDatabase::cBricksDatabase() { int cBricksDatabase::loadFromPlainTextStream(ifstream &stream, string& errormessage, bool ignoreerrors, bool skiph2blocks) { - string s; + string s, tmps; cBrick b; size_t pos; double mass; @@ -133,6 +457,7 @@ int cBricksDatabase::loadFromPlainTextStream(ifstream &stream, string& errormess bool error = false; errormessage = ""; cSummaryFormula formula; + vector lossids; bricks.clear(); while (stream.good()) { @@ -200,6 +525,19 @@ int cBricksDatabase::loadFromPlainTextStream(ifstream &stream, string& errormess break; } + // load the list of losses + pos = s.find('\t'); + if (pos != string::npos) { + tmps = s.substr(0, pos); + b.setLosses(tmps); + addLossToMap(tmps, lossids); + b.setLossIDs(lossids); + s = s.substr(pos + 1); + } + else { + // nothing to do - compatibility with the old format of database + } + // load references #if OS_TYPE != WIN if ((s.size() > 0) && (s.back() == '\r')) { @@ -248,6 +586,7 @@ void cBricksDatabase::storeToPlainTextStream(ofstream &stream) { stream << bricks[i].getAcronymsAsString() << "\t"; stream << bricks[i].getSummary() << "\t"; stream << std::fixed << std::setprecision(10) << bricks[i].getMass() << "\t"; + stream << bricks[i].getLosses() << "\t"; stream << bricks[i].getReferencesAsString() << endl; } } @@ -278,7 +617,8 @@ cBrick& cBricksDatabase::operator[](int position) { double cBricksDatabase::getMassOfComposition(vector& combarray, int numberofbasicbricks) { double mass = 0; int i = 0; - while (i < (int)combarray.size()) { + int size = (int)combarray.size(); + while (i < size) { if ((combarray[i] > 0) && (combarray[i] <= numberofbasicbricks)) { mass += bricks[combarray[i] - 1].getMass(); } @@ -448,6 +788,10 @@ string cBricksDatabase::getTagNameOfTPeptide(string& tcomposition) { void cBricksDatabase::clear() { bricks.clear(); + lossorders.clear(); + lossmasses.clear(); + losssummaries.clear(); + lossmaps.clear(); } @@ -543,6 +887,11 @@ void cBricksDatabase::store(ofstream& os) { for (int i = 0; i < (int)bricks.size(); i++) { bricks[i].store(os); } + + storeStringIntMap(lossorders, os); + storeDoubleVector(lossmasses, os); + storeStringVector(losssummaries, os); + storeStringIntMapVector(lossmaps, os); } @@ -555,6 +904,11 @@ void cBricksDatabase::load(ifstream& is) { for (int i = 0; i < (int)bricks.size(); i++) { bricks[i].load(is); } + + loadStringIntMap(lossorders, is); + loadDoubleVector(lossmasses, is); + loadStringVector(losssummaries, is); + loadStringIntMapVector(lossmaps, is); } @@ -594,3 +948,38 @@ bool cBricksDatabase::checkKetideBlocks(cBrick& brickseries, bool regularblockso return false; } + +double cBricksDatabase::getMassOfNeutralLosses(vector& lossids) { + int size = (int)lossmasses.size(); + double mass = 0; + for (auto& it : lossids) { + if (it < size) { + mass += lossmasses[it]; + } + } + return mass; +} + + +string cBricksDatabase::getSummaryFormulaOfNeutralLosses(vector& lossids) { + int size = (int)losssummaries.size(); + string summary = ""; + for (auto& it : lossids) { + if (it < size) { + summary += losssummaries[it]; + } + } + return summary; +} + + +void cBricksDatabase::getMapOfNeutralLosses(vector& lossids, map& summarymap) { + int size = (int)lossmaps.size(); + summarymap.clear(); + for (auto& it : lossids) { + if (it < size) { + mergeMaps(lossmaps[it], summarymap); + } + } +} + diff --git a/CycloBranch/core/cBricksDatabase.h b/CycloBranch/core/cBricksDatabase.h index 76dac2f..1f2d35e 100644 --- a/CycloBranch/core/cBricksDatabase.h +++ b/CycloBranch/core/cBricksDatabase.h @@ -67,18 +67,61 @@ class cBricksDatabase { vector bricks; + map lossorders; + + vector lossmasses; + vector losssummaries; + vector< map > lossmaps; + + void addLossToMap(string& lossstr, vector& lossids); + + double getMassFromCombCounts(vector& combcounts, vector& combmasses); + + public: + + + /** + \brief Get next combination of bricks. + \param combarray reference to an input/output vector of integers + \param numberofbasicbricks initial number of bricks in a database + \param maximumbricksincombination maximum number of combined bricks + \param maximumcumulativemass maximum cummulative mass of combined bricks + \param neutralprecursormass neutral precursor mass + \retval bool true when a valid vector is stored in combarray, false when all valid vectors were already generated + */ + bool nextCombination(vector& combarray, int numberofbasicbricks, int maximumbricksincombination, double maximumcumulativemass, double neutralprecursormass); + + + /** + \brief Get next combination of bricks. + \param combarray reference to an input/output vector of integers + \param combcounts reference to an input/output vector containing counts of elements in \a combarray + \param combmasses reference to an input vector containing masses of elements in \a combarray + \param mass sum of masses of blocks + \param numberofbasicbricks initial number of bricks in a database + \param maximumbricksincombination maximum number of combined bricks + \param maximumcumulativemass maximum cummulative mass of combined bricks + \param neutralprecursormass neutral precursor mass + \retval bool true when a valid vector is stored in combarray, false when all valid vectors were already generated + */ + bool nextCombinationFast(vector& combarray, vector& combcounts, vector& combmasses, double& mass, int numberofbasicbricks, int maximumbricksincombination, double maximumcumulativemass, double neutralprecursormass); + /** \brief Get next combination of bricks. \param combarray reference to an input/output vector of integers + \param combcounts reference to an input/output vector containing counts of elements in \a combarray + \param comblimits reference to an input vector containing maximum allowed numbers of elements in \a combarray + \param combmasses reference to an input vector containing masses of elements in \a combarray + \param mass sum of masses of blocks \param numberofbasicbricks initial number of bricks in a database \param maximumbricksincombination maximum number of combined bricks \param maximumcumulativemass maximum cummulative mass of combined bricks \param neutralprecursormass neutral precursor mass \retval bool true when a valid vector is stored in combarray, false when all valid vectors were already generated */ - bool nextCombination(vector& combarray, int numberofbasicbricks, int maximumbricksincombination, double maximumcumulativemass, double neutralprecursormass); + bool nextCombinationFastLimited(vector& combarray, vector& combcounts, vector& comblimits, vector& combmasses, double& mass, int numberofbasicbricks, int maximumbricksincombination, double maximumcumulativemass, double neutralprecursormass); /** @@ -242,6 +285,29 @@ class cBricksDatabase { bool checkKetideBlocks(cBrick& brickseries, bool regularblocksorder); + /** + \brief Get the summary mass of neutral losses. + \param lossids a vector of ids of neutral losses + \retval double mass + */ + double getMassOfNeutralLosses(vector& lossids); + + + /** + \brief Get the summary formula of neutral losses. + \param lossids a vector of ids of neutral losses + \retval string formula + */ + string getSummaryFormulaOfNeutralLosses(vector& lossids); + + + /** + \brief Get the summary map of neutral losses. + \param lossids an input vector of ids of neutral losses + \param summarymap an output map of atoms + */ + void getMapOfNeutralLosses(vector& lossids, map& summarymap); + }; diff --git a/CycloBranch/core/cCandidate.cpp b/CycloBranch/core/cCandidate.cpp index 2f13763..f1d1bcf 100644 --- a/CycloBranch/core/cCandidate.cpp +++ b/CycloBranch/core/cCandidate.cpp @@ -738,7 +738,7 @@ void cCandidate::getPermutationsOfBranches(vector& tpermutations) } -double cCandidate::calculatePrecursorMass(cBricksDatabase& brickdatabasewithcombinations, cParameters* parameters) { +double cCandidate::calculatePrecursorMassFromBricks(cBricksDatabase& brickdatabasewithcombinations, cParameters* parameters) { cBrick b; vector bricks; b.setComposition(internalcomposition, false); @@ -749,30 +749,29 @@ double cCandidate::calculatePrecursorMass(cBricksDatabase& brickdatabasewithcomb } double mass = 0; - switch (parameters->peptidetype) - { - case linear: - mass = parameters->iondefinitions[precursor_ion].massdifference + parameters->searchedmodifications[startmodifID].massdifference + parameters->searchedmodifications[endmodifID].massdifference; - break; - case cyclic: - mass = parameters->iondefinitions[cyclic_precursor_ion].massdifference; - break; - case branched: - mass = parameters->iondefinitions[precursor_ion].massdifference + parameters->searchedmodifications[startmodifID].massdifference + parameters->searchedmodifications[endmodifID].massdifference + parameters->searchedmodifications[middlemodifID].massdifference; - break; - case branchcyclic: - mass = parameters->iondefinitions[cyclic_precursor_ion].massdifference + parameters->searchedmodifications[middlemodifID].massdifference; - break; - case linearpolyketide: - // not supported because of terminal ambiguities H- -OH, H- -H, OH- -OH - break; - case cyclicpolyketide: - mass = parameters->iondefinitions[cyclic_polyketide_precursor_ion].massdifference; - break; - case other: - break; - default: - break; + switch (parameters->peptidetype) { + case linear: + mass = parameters->iondefinitions[precursor_ion].massdifference + parameters->searchedmodifications[startmodifID].massdifference + parameters->searchedmodifications[endmodifID].massdifference; + break; + case cyclic: + mass = parameters->iondefinitions[cyclic_precursor_ion].massdifference; + break; + case branched: + mass = parameters->iondefinitions[precursor_ion].massdifference + parameters->searchedmodifications[startmodifID].massdifference + parameters->searchedmodifications[endmodifID].massdifference + parameters->searchedmodifications[middlemodifID].massdifference; + break; + case branchcyclic: + mass = parameters->iondefinitions[cyclic_precursor_ion].massdifference + parameters->searchedmodifications[middlemodifID].massdifference; + break; + case linearpolyketide: + // not supported because of terminal ambiguities H- -OH, H- -H, OH- -OH + break; + case cyclicpolyketide: + mass = parameters->iondefinitions[cyclic_polyketide_precursor_ion].massdifference; + break; + case other: + break; + default: + break; } for (int i = 0; i < (int)bricks.size(); i++) { @@ -785,6 +784,7 @@ double cCandidate::calculatePrecursorMass(cBricksDatabase& brickdatabasewithcomb bool cCandidate::isEqualTo(cCandidate& candidate) { if ((internalcomposition.compare(candidate.internalcomposition) == 0) + && (name.compare(candidate.name) == 0) && (summary.getSummary().compare(candidate.summary.getSummary()) == 0) && (summary.isPartial() == candidate.summary.isPartial()) && (startmodifID == candidate.startmodifID) @@ -986,7 +986,7 @@ void cCandidate::getBranchCyclicRotations(vector& branchcyclicrotati } -cSummaryFormula cCandidate::calculateSummaryFormula(cParameters& parameters, ePeptideType peptidetype, double precursormass) { +cSummaryFormula cCandidate::calculateSummaryFormulaFromBricks(cParameters& parameters, ePeptideType peptidetype, double precursormass) { cBrick b; vector bricks; b.setComposition(internalcomposition, false); @@ -999,36 +999,35 @@ cSummaryFormula cCandidate::calculateSummaryFormula(cParameters& parameters, ePe return formula; } - switch (peptidetype) - { - case linear: - summary = "H2O"; - formula.addFormula(summary); - formula.addFormula(parameters.searchedmodifications[startmodifID].summary); - formula.addFormula(parameters.searchedmodifications[endmodifID].summary); - break; - case cyclic: - break; - case branched: - summary = "H2O"; - formula.addFormula(summary); - formula.addFormula(parameters.searchedmodifications[startmodifID].summary); - formula.addFormula(parameters.searchedmodifications[endmodifID].summary); - formula.addFormula(parameters.searchedmodifications[middlemodifID].summary); - break; - case branchcyclic: - formula.addFormula(parameters.searchedmodifications[middlemodifID].summary); - break; - case linearpolyketide: - formula.addFormula(parameters.searchedmodifications[startmodifID].summary); - formula.addFormula(parameters.searchedmodifications[endmodifID].summary); - break; - case cyclicpolyketide: - break; - case other: - break; - default: - break; + switch (peptidetype) { + case linear: + summary = "H2O"; + formula.addFormula(summary); + formula.addFormula(parameters.searchedmodifications[startmodifID].summary); + formula.addFormula(parameters.searchedmodifications[endmodifID].summary); + break; + case cyclic: + break; + case branched: + summary = "H2O"; + formula.addFormula(summary); + formula.addFormula(parameters.searchedmodifications[startmodifID].summary); + formula.addFormula(parameters.searchedmodifications[endmodifID].summary); + formula.addFormula(parameters.searchedmodifications[middlemodifID].summary); + break; + case branchcyclic: + formula.addFormula(parameters.searchedmodifications[middlemodifID].summary); + break; + case linearpolyketide: + formula.addFormula(parameters.searchedmodifications[startmodifID].summary); + formula.addFormula(parameters.searchedmodifications[endmodifID].summary); + break; + case cyclicpolyketide: + break; + case other: + break; + default: + break; } summary = parameters.precursoradduct.empty()?"":"H-1"; @@ -1309,43 +1308,45 @@ string& cCandidate::getPathAsString() { void cCandidate::setRealPeptideName(cBricksDatabase& bricksdatabase, ePeptideType peptidetype) { - switch (peptidetype) - { - case linear: - case cyclic: - case linearpolyketide: - case cyclicpolyketide: - realpeptidename = bricksdatabase.getRealName(internalcomposition); - break; - case branched: - case branchcyclic: - realpeptidename = getRealNameTComposition(bricksdatabase); - break; - case other: - default: - realpeptidename = ""; - break; + switch (peptidetype) { + case linear: + case cyclic: + case linearpolyketide: + case cyclicpolyketide: + realpeptidename = bricksdatabase.getRealName(internalcomposition); + break; + case branched: + case branchcyclic: + realpeptidename = getRealNameTComposition(bricksdatabase); + break; + case other: + realpeptidename = ""; + break; + default: + realpeptidename = ""; + break; } } void cCandidate::setAcronymPeptideNameWithHTMLReferences(cBricksDatabase& bricksdatabase, ePeptideType peptidetype) { - switch (peptidetype) - { - case linear: - case cyclic: - case linearpolyketide: - case cyclicpolyketide: - acronympeptidename = bricksdatabase.getAcronymName(internalcomposition, true); - break; - case branched: - case branchcyclic: - acronympeptidename = getAcronymsTComposition(bricksdatabase); - break; - case other: - default: - acronympeptidename = ""; - break; + switch (peptidetype) { + case linear: + case cyclic: + case linearpolyketide: + case cyclicpolyketide: + acronympeptidename = bricksdatabase.getAcronymName(internalcomposition, true); + break; + case branched: + case branchcyclic: + acronympeptidename = getAcronymsTComposition(bricksdatabase); + break; + case other: + acronympeptidename = ""; + break; + default: + acronympeptidename = ""; + break; } } diff --git a/CycloBranch/core/cCandidate.h b/CycloBranch/core/cCandidate.h index 623085e..ad51c2b 100644 --- a/CycloBranch/core/cCandidate.h +++ b/CycloBranch/core/cCandidate.h @@ -313,12 +313,12 @@ class cCandidate { /** - \brief Calculate the precursor mass of the peptide sequence candidate. + \brief Calculate the precursor mass of the peptide sequence candidate from bricks. \param brickdatabasewithcombinations reference to an input database of bricks with combinations of bricks \param parameters a pointer to the parameters of the application \retval double precursor mass of the candidate */ - double calculatePrecursorMass(cBricksDatabase& brickdatabasewithcombinations, cParameters* parameters); + double calculatePrecursorMassFromBricks(cBricksDatabase& brickdatabasewithcombinations, cParameters* parameters); /** @@ -457,7 +457,7 @@ class cCandidate { \param precursormass experimantal precursor mass \retval string summary formula */ - cSummaryFormula calculateSummaryFormula(cParameters& parameters, ePeptideType peptidetype, double precursormass = 0); + cSummaryFormula calculateSummaryFormulaFromBricks(cParameters& parameters, ePeptideType peptidetype, double precursormass = 0); /** diff --git a/CycloBranch/core/cDeNovoGraph.cpp b/CycloBranch/core/cDeNovoGraph.cpp index b10b76a..8d83a8c 100644 --- a/CycloBranch/core/cDeNovoGraph.cpp +++ b/CycloBranch/core/cDeNovoGraph.cpp @@ -178,471 +178,470 @@ int cDeNovoGraph::createGraph(bool& terminatecomputation) { string negativeshiftsummary = (parameters->precursorcharge > 0)?"":"H-2+-2"; // insert system nodes - switch (parameters->peptidetype) - { - case cyclic: - node.clear(); - node.setMZRatio(0); - node.setIntensity(0); - node.addIonAnnotation(b_ion); - graph.push_back(node); - - node.clear(); - node.setMZRatio(parameters->iondefinitions[b_ion].massdifference + negativeshift); - node.setIntensity(0); - node.addIonAnnotation(b_ion); - graph.push_back(node); - - edge.clear(); - edge.composition = "0"; - tmpformula.clear(); - tmpformula.addFormula(parameters->iondefinitions[b_ion].summary); - tmpformula.addFormula(negativeshiftsummary); - edge.summary = tmpformula.getSummary(); - edge.targetnode = 1; - edge.targetion = b_ion; - edge.massdifference = graph[edge.targetnode].getMZRatio(); - graph[0].insertTempEdge(edge); - - lastsystemnode = (int)graph.size() - 1; - startnode = 1; - break; - case linear: - case branched: - node.clear(); - node.setMZRatio(0); - node.setIntensity(0); - node.addIonAnnotation(b_ion); - node.addIonAnnotation(y_ion); - graph.push_back(node); - - node.clear(); - node.setMZRatio(parameters->iondefinitions[b_ion].massdifference + negativeshift); - node.setIntensity(0); - node.addIonAnnotation(b_ion); - graph.push_back(node); - - node.clear(); - node.setMZRatio(parameters->iondefinitions[y_ion].massdifference + negativeshift); - node.setIntensity(0); - node.addIonAnnotation(y_ion); - graph.push_back(node); - - edge.clear(); - edge.composition = "0"; - tmpformula.clear(); - tmpformula.addFormula(parameters->iondefinitions[b_ion].summary); - tmpformula.addFormula(negativeshiftsummary); - edge.summary = tmpformula.getSummary(); - edge.targetnode = 1; - edge.targetion = b_ion; - edge.massdifference = graph[edge.targetnode].getMZRatio(); - graph[0].insertTempEdge(edge); - - edge.clear(); - edge.composition = "0"; - tmpformula.clear(); - tmpformula.addFormula(parameters->iondefinitions[y_ion].summary); - tmpformula.addFormula(negativeshiftsummary); - edge.summary = tmpformula.getSummary(); - edge.targetnode = 2; - edge.targetion = y_ion; - edge.massdifference = graph[edge.targetnode].getMZRatio(); - graph[0].insertTempEdge(edge); - - targetnode = 2; - - for (i = 1; i < (int)parameters->searchedmodifications.size(); i++) { + switch (parameters->peptidetype) { + case cyclic: + node.clear(); + node.setMZRatio(0); + node.setIntensity(0); + node.addIonAnnotation(b_ion); + graph.push_back(node); + + node.clear(); + node.setMZRatio(parameters->iondefinitions[b_ion].massdifference + negativeshift); + node.setIntensity(0); + node.addIonAnnotation(b_ion); + graph.push_back(node); + + edge.clear(); + edge.composition = "0"; + tmpformula.clear(); + tmpformula.addFormula(parameters->iondefinitions[b_ion].summary); + tmpformula.addFormula(negativeshiftsummary); + edge.summary = tmpformula.getSummary(); + edge.targetnode = 1; + edge.targetion = b_ion; + edge.massdifference = graph[edge.targetnode].getMZRatio(); + graph[0].insertTempEdge(edge); + + lastsystemnode = (int)graph.size() - 1; + startnode = 1; + break; + case linear: + case branched: + node.clear(); + node.setMZRatio(0); + node.setIntensity(0); + node.addIonAnnotation(b_ion); + node.addIonAnnotation(y_ion); + graph.push_back(node); + + node.clear(); + node.setMZRatio(parameters->iondefinitions[b_ion].massdifference + negativeshift); + node.setIntensity(0); + node.addIonAnnotation(b_ion); + graph.push_back(node); + + node.clear(); + node.setMZRatio(parameters->iondefinitions[y_ion].massdifference + negativeshift); + node.setIntensity(0); + node.addIonAnnotation(y_ion); + graph.push_back(node); + + edge.clear(); + edge.composition = "0"; + tmpformula.clear(); + tmpformula.addFormula(parameters->iondefinitions[b_ion].summary); + tmpformula.addFormula(negativeshiftsummary); + edge.summary = tmpformula.getSummary(); + edge.targetnode = 1; + edge.targetion = b_ion; + edge.massdifference = graph[edge.targetnode].getMZRatio(); + graph[0].insertTempEdge(edge); + + edge.clear(); + edge.composition = "0"; + tmpformula.clear(); + tmpformula.addFormula(parameters->iondefinitions[y_ion].summary); + tmpformula.addFormula(negativeshiftsummary); + edge.summary = tmpformula.getSummary(); + edge.targetnode = 2; + edge.targetion = y_ion; + edge.massdifference = graph[edge.targetnode].getMZRatio(); + graph[0].insertTempEdge(edge); + + targetnode = 2; + + for (i = 1; i < (int)parameters->searchedmodifications.size(); i++) { - if (parameters->searchedmodifications[i].nterminal) { - node.clear(); - node.setMZRatio(parameters->iondefinitions[b_ion].massdifference + parameters->searchedmodifications[i].massdifference + negativeshift); - node.setIntensity(0); - node.addIonAnnotation(b_ion); - graph.push_back(node); - - edge.clear(); - edge.composition = "0"; - edge.startmodifID = i; - tmpformula.clear(); - tmpformula.addFormula(parameters->iondefinitions[b_ion].summary); - tmpformula.addFormula(parameters->searchedmodifications[i].summary); - tmpformula.addFormula(negativeshiftsummary); - edge.summary = tmpformula.getSummary(); - targetnode++; - edge.targetnode = targetnode; - edge.targetion = b_ion; - edge.massdifference = graph[edge.targetnode].getMZRatio(); + if (parameters->searchedmodifications[i].nterminal) { + node.clear(); + node.setMZRatio(parameters->iondefinitions[b_ion].massdifference + parameters->searchedmodifications[i].massdifference + negativeshift); + node.setIntensity(0); + node.addIonAnnotation(b_ion); + graph.push_back(node); + + edge.clear(); + edge.composition = "0"; + edge.startmodifID = i; + tmpformula.clear(); + tmpformula.addFormula(parameters->iondefinitions[b_ion].summary); + tmpformula.addFormula(parameters->searchedmodifications[i].summary); + tmpformula.addFormula(negativeshiftsummary); + edge.summary = tmpformula.getSummary(); + targetnode++; + edge.targetnode = targetnode; + edge.targetion = b_ion; + edge.massdifference = graph[edge.targetnode].getMZRatio(); - graph[0].insertTempEdge(edge); - } - - if (parameters->searchedmodifications[i].cterminal) { - node.clear(); - node.setMZRatio(parameters->iondefinitions[y_ion].massdifference + parameters->searchedmodifications[i].massdifference + negativeshift); - node.setIntensity(0); - node.addIonAnnotation(y_ion); - graph.push_back(node); - - edge.clear(); - edge.composition = "0"; - edge.startmodifID = i; - tmpformula.clear(); - tmpformula.addFormula(parameters->iondefinitions[y_ion].summary); - tmpformula.addFormula(parameters->searchedmodifications[i].summary); - tmpformula.addFormula(negativeshiftsummary); - edge.summary = tmpformula.getSummary(); - targetnode++; - edge.targetnode = targetnode; - edge.targetion = y_ion; - edge.massdifference = graph[edge.targetnode].getMZRatio(); - - graph[0].insertTempEdge(edge); - } - - } + graph[0].insertTempEdge(edge); + } - lastsystemnode = (int)graph.size() - 1; - startnode = 1; - break; - case branchcyclic: - node.clear(); - node.setMZRatio(0); - node.setIntensity(0); - node.addIonAnnotation(b_ion); - //node.addIonAnnotation(y_ion); - graph.push_back(node); + if (parameters->searchedmodifications[i].cterminal) { + node.clear(); + node.setMZRatio(parameters->iondefinitions[y_ion].massdifference + parameters->searchedmodifications[i].massdifference + negativeshift); + node.setIntensity(0); + node.addIonAnnotation(y_ion); + graph.push_back(node); + + edge.clear(); + edge.composition = "0"; + edge.startmodifID = i; + tmpformula.clear(); + tmpformula.addFormula(parameters->iondefinitions[y_ion].summary); + tmpformula.addFormula(parameters->searchedmodifications[i].summary); + tmpformula.addFormula(negativeshiftsummary); + edge.summary = tmpformula.getSummary(); + targetnode++; + edge.targetnode = targetnode; + edge.targetion = y_ion; + edge.massdifference = graph[edge.targetnode].getMZRatio(); + + graph[0].insertTempEdge(edge); + } - node.clear(); - node.setMZRatio(parameters->iondefinitions[b_ion].massdifference + negativeshift); - node.setIntensity(0); - node.addIonAnnotation(b_ion); - graph.push_back(node); + } - //node.clear(); - //node.setMZRatio(parameters->iondefinitions[y_ion].massdifference + negativeshift); - //node.setIntensity(0); - //node.addIonAnnotation(y_ion); - //graph.push_back(node); - - edge.clear(); - edge.composition = "0"; - tmpformula.clear(); - tmpformula.addFormula(parameters->iondefinitions[b_ion].summary); - tmpformula.addFormula(negativeshiftsummary); - edge.summary = tmpformula.getSummary(); - edge.targetnode = 1; - edge.targetion = b_ion; - edge.massdifference = graph[edge.targetnode].getMZRatio(); - graph[0].insertTempEdge(edge); - - //edge.clear(); - //edge.composition = "0"; - //tmpformula.clear(); - //tmpformula.addFormula(parameters->iondefinitions[y_ion].summary); - //tmpformula.addFormula(negativeshiftsummary); - //edge.summary = tmpformula.getSummary(); - //edge.targetnode = 2; - //edge.targetion = y_ion; - //edge.massdifference = graph[edge.targetnode].getMZRatio(); - //graph[0].insertTempEdge(edge); - - /* + lastsystemnode = (int)graph.size() - 1; + startnode = 1; + break; + case branchcyclic: + node.clear(); + node.setMZRatio(0); + node.setIntensity(0); + node.addIonAnnotation(b_ion); + //node.addIonAnnotation(y_ion); + graph.push_back(node); + + node.clear(); + node.setMZRatio(parameters->iondefinitions[b_ion].massdifference + negativeshift); + node.setIntensity(0); + node.addIonAnnotation(b_ion); + graph.push_back(node); + + //node.clear(); + //node.setMZRatio(parameters->iondefinitions[y_ion].massdifference + negativeshift); + //node.setIntensity(0); + //node.addIonAnnotation(y_ion); + //graph.push_back(node); + + edge.clear(); + edge.composition = "0"; + tmpformula.clear(); + tmpformula.addFormula(parameters->iondefinitions[b_ion].summary); + tmpformula.addFormula(negativeshiftsummary); + edge.summary = tmpformula.getSummary(); + edge.targetnode = 1; + edge.targetion = b_ion; + edge.massdifference = graph[edge.targetnode].getMZRatio(); + graph[0].insertTempEdge(edge); + + //edge.clear(); + //edge.composition = "0"; + //tmpformula.clear(); + //tmpformula.addFormula(parameters->iondefinitions[y_ion].summary); + //tmpformula.addFormula(negativeshiftsummary); + //edge.summary = tmpformula.getSummary(); + //edge.targetnode = 2; + //edge.targetion = y_ion; + //edge.massdifference = graph[edge.targetnode].getMZRatio(); + //graph[0].insertTempEdge(edge); + + /* - targetnode = 2; - - for (i = 1; i < (int)parameters->searchedmodifications.size(); i++) { - - if (parameters->searchedmodifications[i].nterminal) { - node.clear(); - node.setMZRatio(parameters->iondefinitions[b_ion].massdifference + parameters->searchedmodifications[i].massdifference + negativeshift); - node.setIntensity(0); - node.addIonAnnotation(b_ion); - graph.push_back(node); - - edge.clear(); - edge.composition = "0"; - edge.startmodifID = i; - tmpformula.clear(); - tmpformula.addFormula(parameters->iondefinitions[b_ion].summary); - tmpformula.addFormula(parameters->searchedmodifications[i].summary); - tmpformula.addFormula(negativeshiftsummary); - edge.summary = tmpformula.getSummary(); - targetnode++; - edge.targetnode = targetnode; - edge.targetion = b_ion; - edge.massdifference = graph[edge.targetnode].getMZRatio(); + targetnode = 2; + + for (i = 1; i < (int)parameters->searchedmodifications.size(); i++) { + + if (parameters->searchedmodifications[i].nterminal) { + node.clear(); + node.setMZRatio(parameters->iondefinitions[b_ion].massdifference + parameters->searchedmodifications[i].massdifference + negativeshift); + node.setIntensity(0); + node.addIonAnnotation(b_ion); + graph.push_back(node); + + edge.clear(); + edge.composition = "0"; + edge.startmodifID = i; + tmpformula.clear(); + tmpformula.addFormula(parameters->iondefinitions[b_ion].summary); + tmpformula.addFormula(parameters->searchedmodifications[i].summary); + tmpformula.addFormula(negativeshiftsummary); + edge.summary = tmpformula.getSummary(); + targetnode++; + edge.targetnode = targetnode; + edge.targetion = b_ion; + edge.massdifference = graph[edge.targetnode].getMZRatio(); - graph[0].insertTempEdge(edge); - } - - if (parameters->searchedmodifications[i].cterminal) { - node.clear(); - node.setMZRatio(parameters->iondefinitions[y_ion].massdifference + parameters->searchedmodifications[i].massdifference + negativeshift); - node.setIntensity(0); - node.addIonAnnotation(y_ion); - graph.push_back(node); - - edge.clear(); - edge.composition = "0"; - edge.startmodifID = i; - tmpformula.clear(); - tmpformula.addFormula(parameters->iondefinitions[y_ion].summary); - tmpformula.addFormula(parameters->searchedmodifications[i].summary); - tmpformula.addFormula(negativeshiftsummary); - edge.summary = tmpformula.getSummary(); - targetnode++; - edge.targetnode = targetnode; - edge.targetion = y_ion; - edge.massdifference = graph[edge.targetnode].getMZRatio(); - - graph[0].insertTempEdge(edge); - } - - } - */ - - lastsystemnode = (int)graph.size() - 1; - startnode = 1; - break; - case linearpolyketide: - node.clear(); - node.setMZRatio(0); - node.setIntensity(0); - node.addIonAnnotation(l1h_ion); - node.addIonAnnotation(l2h_ion); - node.addIonAnnotation(l1oh_ion); - node.addIonAnnotation(l2oh_ion); - graph.push_back(node); - - node.clear(); - node.setMZRatio(parameters->iondefinitions[l1h_ion].massdifference + negativeshift); - node.setIntensity(0); - node.addIonAnnotation(l1h_ion); - graph.push_back(node); - - node.clear(); - node.setMZRatio(parameters->iondefinitions[l2h_ion].massdifference + negativeshift); - node.setIntensity(0); - node.addIonAnnotation(l2h_ion); - graph.push_back(node); - - node.clear(); - node.setMZRatio(parameters->iondefinitions[l1oh_ion].massdifference + negativeshift); - node.setIntensity(0); - node.addIonAnnotation(l1oh_ion); - graph.push_back(node); + graph[0].insertTempEdge(edge); + } - node.clear(); - node.setMZRatio(parameters->iondefinitions[l2oh_ion].massdifference + negativeshift); - node.setIntensity(0); - node.addIonAnnotation(l2oh_ion); - graph.push_back(node); + if (parameters->searchedmodifications[i].cterminal) { + node.clear(); + node.setMZRatio(parameters->iondefinitions[y_ion].massdifference + parameters->searchedmodifications[i].massdifference + negativeshift); + node.setIntensity(0); + node.addIonAnnotation(y_ion); + graph.push_back(node); + + edge.clear(); + edge.composition = "0"; + edge.startmodifID = i; + tmpformula.clear(); + tmpformula.addFormula(parameters->iondefinitions[y_ion].summary); + tmpformula.addFormula(parameters->searchedmodifications[i].summary); + tmpformula.addFormula(negativeshiftsummary); + edge.summary = tmpformula.getSummary(); + targetnode++; + edge.targetnode = targetnode; + edge.targetion = y_ion; + edge.massdifference = graph[edge.targetnode].getMZRatio(); + + graph[0].insertTempEdge(edge); + } - edge.clear(); - edge.composition = "0"; - tmpformula.clear(); - tmpformula.addFormula(parameters->iondefinitions[l1h_ion].summary); - tmpformula.addFormula(negativeshiftsummary); - edge.summary = tmpformula.getSummary(); - edge.targetnode = 1; - edge.targetion = l1h_ion; - edge.massdifference = graph[edge.targetnode].getMZRatio(); - graph[0].insertTempEdge(edge); - - edge.clear(); - edge.composition = "0"; - tmpformula.clear(); - tmpformula.addFormula(parameters->iondefinitions[l2h_ion].summary); - tmpformula.addFormula(negativeshiftsummary); - edge.summary = tmpformula.getSummary(); - edge.targetnode = 2; - edge.targetion = l2h_ion; - edge.massdifference = graph[edge.targetnode].getMZRatio(); - graph[0].insertTempEdge(edge); - - edge.clear(); - edge.composition = "0"; - tmpformula.clear(); - tmpformula.addFormula(parameters->iondefinitions[l1oh_ion].summary); - tmpformula.addFormula(negativeshiftsummary); - edge.summary = tmpformula.getSummary(); - edge.targetnode = 3; - edge.targetion = l1oh_ion; - edge.massdifference = graph[edge.targetnode].getMZRatio(); - graph[0].insertTempEdge(edge); - - edge.clear(); - edge.composition = "0"; - tmpformula.clear(); - tmpformula.addFormula(parameters->iondefinitions[l2oh_ion].summary); - tmpformula.addFormula(negativeshiftsummary); - edge.summary = tmpformula.getSummary(); - edge.targetnode = 4; - edge.targetion = l2oh_ion; - edge.massdifference = graph[edge.targetnode].getMZRatio(); - graph[0].insertTempEdge(edge); - - targetnode = 4; - - for (i = 1; i < (int)parameters->searchedmodifications.size(); i++) { - - if (parameters->searchedmodifications[i].nterminal) { - node.clear(); - node.setMZRatio(parameters->iondefinitions[l1h_ion].massdifference + parameters->searchedmodifications[i].massdifference + negativeshift); - node.setIntensity(0); - node.addIonAnnotation(l1h_ion); - graph.push_back(node); - - edge.clear(); - edge.composition = "0"; - edge.startmodifID = i; - tmpformula.clear(); - tmpformula.addFormula(parameters->iondefinitions[l1h_ion].summary); - tmpformula.addFormula(parameters->searchedmodifications[i].summary); - tmpformula.addFormula(negativeshiftsummary); - edge.summary = tmpformula.getSummary(); - targetnode++; - edge.targetnode = targetnode; - edge.targetion = l1h_ion; - edge.massdifference = graph[edge.targetnode].getMZRatio(); - - graph[0].insertTempEdge(edge); - - node.clear(); - node.setMZRatio(parameters->iondefinitions[l2h_ion].massdifference + parameters->searchedmodifications[i].massdifference + negativeshift); - node.setIntensity(0); - node.addIonAnnotation(l2h_ion); - graph.push_back(node); - - edge.clear(); - edge.composition = "0"; - edge.startmodifID = i; - tmpformula.clear(); - tmpformula.addFormula(parameters->iondefinitions[l2h_ion].summary); - tmpformula.addFormula(parameters->searchedmodifications[i].summary); - tmpformula.addFormula(negativeshiftsummary); - edge.summary = tmpformula.getSummary(); - targetnode++; - edge.targetnode = targetnode; - edge.targetion = l2h_ion; - edge.massdifference = graph[edge.targetnode].getMZRatio(); - - graph[0].insertTempEdge(edge); } + */ + + lastsystemnode = (int)graph.size() - 1; + startnode = 1; + break; + case linearpolyketide: + node.clear(); + node.setMZRatio(0); + node.setIntensity(0); + node.addIonAnnotation(l1h_ion); + node.addIonAnnotation(l2h_ion); + node.addIonAnnotation(l1oh_ion); + node.addIonAnnotation(l2oh_ion); + graph.push_back(node); + + node.clear(); + node.setMZRatio(parameters->iondefinitions[l1h_ion].massdifference + negativeshift); + node.setIntensity(0); + node.addIonAnnotation(l1h_ion); + graph.push_back(node); + + node.clear(); + node.setMZRatio(parameters->iondefinitions[l2h_ion].massdifference + negativeshift); + node.setIntensity(0); + node.addIonAnnotation(l2h_ion); + graph.push_back(node); + + node.clear(); + node.setMZRatio(parameters->iondefinitions[l1oh_ion].massdifference + negativeshift); + node.setIntensity(0); + node.addIonAnnotation(l1oh_ion); + graph.push_back(node); + + node.clear(); + node.setMZRatio(parameters->iondefinitions[l2oh_ion].massdifference + negativeshift); + node.setIntensity(0); + node.addIonAnnotation(l2oh_ion); + graph.push_back(node); + + edge.clear(); + edge.composition = "0"; + tmpformula.clear(); + tmpformula.addFormula(parameters->iondefinitions[l1h_ion].summary); + tmpformula.addFormula(negativeshiftsummary); + edge.summary = tmpformula.getSummary(); + edge.targetnode = 1; + edge.targetion = l1h_ion; + edge.massdifference = graph[edge.targetnode].getMZRatio(); + graph[0].insertTempEdge(edge); + + edge.clear(); + edge.composition = "0"; + tmpformula.clear(); + tmpformula.addFormula(parameters->iondefinitions[l2h_ion].summary); + tmpformula.addFormula(negativeshiftsummary); + edge.summary = tmpformula.getSummary(); + edge.targetnode = 2; + edge.targetion = l2h_ion; + edge.massdifference = graph[edge.targetnode].getMZRatio(); + graph[0].insertTempEdge(edge); + + edge.clear(); + edge.composition = "0"; + tmpformula.clear(); + tmpformula.addFormula(parameters->iondefinitions[l1oh_ion].summary); + tmpformula.addFormula(negativeshiftsummary); + edge.summary = tmpformula.getSummary(); + edge.targetnode = 3; + edge.targetion = l1oh_ion; + edge.massdifference = graph[edge.targetnode].getMZRatio(); + graph[0].insertTempEdge(edge); + + edge.clear(); + edge.composition = "0"; + tmpformula.clear(); + tmpformula.addFormula(parameters->iondefinitions[l2oh_ion].summary); + tmpformula.addFormula(negativeshiftsummary); + edge.summary = tmpformula.getSummary(); + edge.targetnode = 4; + edge.targetion = l2oh_ion; + edge.massdifference = graph[edge.targetnode].getMZRatio(); + graph[0].insertTempEdge(edge); + + targetnode = 4; + + for (i = 1; i < (int)parameters->searchedmodifications.size(); i++) { + + if (parameters->searchedmodifications[i].nterminal) { + node.clear(); + node.setMZRatio(parameters->iondefinitions[l1h_ion].massdifference + parameters->searchedmodifications[i].massdifference + negativeshift); + node.setIntensity(0); + node.addIonAnnotation(l1h_ion); + graph.push_back(node); + + edge.clear(); + edge.composition = "0"; + edge.startmodifID = i; + tmpformula.clear(); + tmpformula.addFormula(parameters->iondefinitions[l1h_ion].summary); + tmpformula.addFormula(parameters->searchedmodifications[i].summary); + tmpformula.addFormula(negativeshiftsummary); + edge.summary = tmpformula.getSummary(); + targetnode++; + edge.targetnode = targetnode; + edge.targetion = l1h_ion; + edge.massdifference = graph[edge.targetnode].getMZRatio(); + + graph[0].insertTempEdge(edge); + + node.clear(); + node.setMZRatio(parameters->iondefinitions[l2h_ion].massdifference + parameters->searchedmodifications[i].massdifference + negativeshift); + node.setIntensity(0); + node.addIonAnnotation(l2h_ion); + graph.push_back(node); + + edge.clear(); + edge.composition = "0"; + edge.startmodifID = i; + tmpformula.clear(); + tmpformula.addFormula(parameters->iondefinitions[l2h_ion].summary); + tmpformula.addFormula(parameters->searchedmodifications[i].summary); + tmpformula.addFormula(negativeshiftsummary); + edge.summary = tmpformula.getSummary(); + targetnode++; + edge.targetnode = targetnode; + edge.targetion = l2h_ion; + edge.massdifference = graph[edge.targetnode].getMZRatio(); + + graph[0].insertTempEdge(edge); + } - if (parameters->searchedmodifications[i].cterminal) { - node.clear(); - node.setMZRatio(parameters->iondefinitions[l1oh_ion].massdifference + parameters->searchedmodifications[i].massdifference + negativeshift); - node.setIntensity(0); - node.addIonAnnotation(l1oh_ion); - graph.push_back(node); - - edge.clear(); - edge.composition = "0"; - edge.startmodifID = i; - tmpformula.clear(); - tmpformula.addFormula(parameters->iondefinitions[l1oh_ion].summary); - tmpformula.addFormula(parameters->searchedmodifications[i].summary); - tmpformula.addFormula(negativeshiftsummary); - edge.summary = tmpformula.getSummary(); - targetnode++; - edge.targetnode = targetnode; - edge.targetion = l1oh_ion; - edge.massdifference = graph[edge.targetnode].getMZRatio(); - - graph[0].insertTempEdge(edge); - - node.clear(); - node.setMZRatio(parameters->iondefinitions[l2oh_ion].massdifference + parameters->searchedmodifications[i].massdifference + negativeshift); - node.setIntensity(0); - node.addIonAnnotation(l2oh_ion); - graph.push_back(node); - - edge.clear(); - edge.composition = "0"; - edge.startmodifID = i; - tmpformula.clear(); - tmpformula.addFormula(parameters->iondefinitions[l2oh_ion].summary); - tmpformula.addFormula(parameters->searchedmodifications[i].summary); - tmpformula.addFormula(negativeshiftsummary); - edge.summary = tmpformula.getSummary(); - targetnode++; - edge.targetnode = targetnode; - edge.targetion = l2oh_ion; - edge.massdifference = graph[edge.targetnode].getMZRatio(); - - graph[0].insertTempEdge(edge); - } + if (parameters->searchedmodifications[i].cterminal) { + node.clear(); + node.setMZRatio(parameters->iondefinitions[l1oh_ion].massdifference + parameters->searchedmodifications[i].massdifference + negativeshift); + node.setIntensity(0); + node.addIonAnnotation(l1oh_ion); + graph.push_back(node); + + edge.clear(); + edge.composition = "0"; + edge.startmodifID = i; + tmpformula.clear(); + tmpformula.addFormula(parameters->iondefinitions[l1oh_ion].summary); + tmpformula.addFormula(parameters->searchedmodifications[i].summary); + tmpformula.addFormula(negativeshiftsummary); + edge.summary = tmpformula.getSummary(); + targetnode++; + edge.targetnode = targetnode; + edge.targetion = l1oh_ion; + edge.massdifference = graph[edge.targetnode].getMZRatio(); + + graph[0].insertTempEdge(edge); + + node.clear(); + node.setMZRatio(parameters->iondefinitions[l2oh_ion].massdifference + parameters->searchedmodifications[i].massdifference + negativeshift); + node.setIntensity(0); + node.addIonAnnotation(l2oh_ion); + graph.push_back(node); + + edge.clear(); + edge.composition = "0"; + edge.startmodifID = i; + tmpformula.clear(); + tmpformula.addFormula(parameters->iondefinitions[l2oh_ion].summary); + tmpformula.addFormula(parameters->searchedmodifications[i].summary); + tmpformula.addFormula(negativeshiftsummary); + edge.summary = tmpformula.getSummary(); + targetnode++; + edge.targetnode = targetnode; + edge.targetion = l2oh_ion; + edge.massdifference = graph[edge.targetnode].getMZRatio(); + + graph[0].insertTempEdge(edge); + } - } - - lastsystemnode = (int)graph.size() - 1; - startnode = 1; - break; - case cyclicpolyketide: - node.clear(); - node.setMZRatio(0); - node.setIntensity(0); - //node.addIonAnnotation(l0h_ion); - node.addIonAnnotation(l1h_ion); - node.addIonAnnotation(l2h_ion); - graph.push_back(node); - - //node.clear(); - //node.setMZRatio(parameters->iondefinitions[l0h_ion].massdifference + negativeshift); - //node.setIntensity(0); - //node.addIonAnnotation(l0h_ion); - //graph.push_back(node); - - node.clear(); - node.setMZRatio(parameters->iondefinitions[l1h_ion].massdifference + negativeshift); - node.setIntensity(0); - node.addIonAnnotation(l1h_ion); - graph.push_back(node); - - node.clear(); - node.setMZRatio(parameters->iondefinitions[l2h_ion].massdifference + negativeshift); - node.setIntensity(0); - node.addIonAnnotation(l2h_ion); - graph.push_back(node); + } - edge.clear(); - edge.composition = "0"; - tmpformula.clear(); - tmpformula.addFormula(parameters->iondefinitions[l1h_ion].summary); - tmpformula.addFormula(negativeshiftsummary); - edge.summary = tmpformula.getSummary(); - edge.targetnode = 1; - edge.targetion = l1h_ion; - edge.massdifference = graph[edge.targetnode].getMZRatio(); - graph[0].insertTempEdge(edge); - - edge.clear(); - edge.composition = "0"; - tmpformula.clear(); - tmpformula.addFormula(parameters->iondefinitions[l2h_ion].summary); - tmpformula.addFormula(negativeshiftsummary); - edge.summary = tmpformula.getSummary(); - edge.targetnode = 2; - edge.targetion = l2h_ion; - edge.massdifference = graph[edge.targetnode].getMZRatio(); - graph[0].insertTempEdge(edge); - - /*edge.clear(); - edge.composition = "0"; - edge.targetnode = 3; - graph[0].insertTempEdge(e);*/ - - lastsystemnode = (int)graph.size() - 1; - startnode = 1; - break; - case other: - *os << "Invalid peptide type 'Other'." << endl; - return -1; - default: - *os << "Undefined peptide type." << endl; - return -1; + lastsystemnode = (int)graph.size() - 1; + startnode = 1; + break; + case cyclicpolyketide: + node.clear(); + node.setMZRatio(0); + node.setIntensity(0); + //node.addIonAnnotation(l0h_ion); + node.addIonAnnotation(l1h_ion); + node.addIonAnnotation(l2h_ion); + graph.push_back(node); + + //node.clear(); + //node.setMZRatio(parameters->iondefinitions[l0h_ion].massdifference + negativeshift); + //node.setIntensity(0); + //node.addIonAnnotation(l0h_ion); + //graph.push_back(node); + + node.clear(); + node.setMZRatio(parameters->iondefinitions[l1h_ion].massdifference + negativeshift); + node.setIntensity(0); + node.addIonAnnotation(l1h_ion); + graph.push_back(node); + + node.clear(); + node.setMZRatio(parameters->iondefinitions[l2h_ion].massdifference + negativeshift); + node.setIntensity(0); + node.addIonAnnotation(l2h_ion); + graph.push_back(node); + + edge.clear(); + edge.composition = "0"; + tmpformula.clear(); + tmpformula.addFormula(parameters->iondefinitions[l1h_ion].summary); + tmpformula.addFormula(negativeshiftsummary); + edge.summary = tmpformula.getSummary(); + edge.targetnode = 1; + edge.targetion = l1h_ion; + edge.massdifference = graph[edge.targetnode].getMZRatio(); + graph[0].insertTempEdge(edge); + + edge.clear(); + edge.composition = "0"; + tmpformula.clear(); + tmpformula.addFormula(parameters->iondefinitions[l2h_ion].summary); + tmpformula.addFormula(negativeshiftsummary); + edge.summary = tmpformula.getSummary(); + edge.targetnode = 2; + edge.targetion = l2h_ion; + edge.massdifference = graph[edge.targetnode].getMZRatio(); + graph[0].insertTempEdge(edge); + + /*edge.clear(); + edge.composition = "0"; + edge.targetnode = 3; + graph[0].insertTempEdge(e);*/ + + lastsystemnode = (int)graph.size() - 1; + startnode = 1; + break; + case other: + *os << "Invalid peptide type 'Other'." << endl; + return -1; + default: + *os << "Undefined peptide type." << endl; + return -1; } // sort(graph.begin() + startnode, graph.end(), compareNodes); diff --git a/CycloBranch/core/cFragmentIons.cpp b/CycloBranch/core/cFragmentIons.cpp index 8808182..772229a 100644 --- a/CycloBranch/core/cFragmentIons.cpp +++ b/CycloBranch/core/cFragmentIons.cpp @@ -172,7 +172,7 @@ cIsotopeMap::cIsotopeMap() { ismap["H"] = is; is.mass = H2; is.probability = Pr_H2; - ismap["2H"] = is; + ismap["2H"] = is; table["H"] = ismap; ismap.clear(); @@ -190,7 +190,7 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = He3; is.probability = Pr_He3; - ismap["3He"] = is; + ismap["3He"] = is; is.mass = He4; is.probability = Pr_He4; ismap["He"] = is; @@ -199,7 +199,7 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = Li6; is.probability = Pr_Li6; - ismap["6Li"] = is; + ismap["6Li"] = is; is.mass = Li7; is.probability = Pr_Li7; ismap["Li"] = is; @@ -214,7 +214,7 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = B10; is.probability = Pr_B10; - ismap["10B"] = is; + ismap["10B"] = is; is.mass = B11; is.probability = Pr_B11; ismap["B"] = is; @@ -226,7 +226,7 @@ cIsotopeMap::cIsotopeMap() { ismap["C"] = is; is.mass = C13; is.probability = Pr_C13; - ismap["13C"] = is; + ismap["13C"] = is; table["C"] = ismap; ismap.clear(); @@ -235,7 +235,7 @@ cIsotopeMap::cIsotopeMap() { ismap["N"] = is; is.mass = N15; is.probability = Pr_N15; - ismap["15N"] = is; + ismap["15N"] = is; table["N"] = ismap; ismap.clear(); @@ -244,10 +244,10 @@ cIsotopeMap::cIsotopeMap() { ismap["O"] = is; is.mass = O17; is.probability = Pr_O17; - ismap["17O"] = is; + ismap["17O"] = is; is.mass = O18; is.probability = Pr_O18; - ismap["18O"] = is; + ismap["18O"] = is; table["O"] = ismap; ismap.clear(); @@ -262,10 +262,10 @@ cIsotopeMap::cIsotopeMap() { ismap["Ne"] = is; is.mass = Ne21; is.probability = Pr_Ne21; - ismap["21Ne"] = is; + ismap["21Ne"] = is; is.mass = Ne22; is.probability = Pr_Ne22; - ismap["22Ne"] = is; + ismap["22Ne"] = is; table["Ne"] = ismap; ismap.clear(); @@ -280,10 +280,10 @@ cIsotopeMap::cIsotopeMap() { ismap["Mg"] = is; is.mass = Mg25; is.probability = Pr_Mg25; - ismap["25Mg"] = is; + ismap["25Mg"] = is; is.mass = Mg26; is.probability = Pr_Mg26; - ismap["26Mg"] = is; + ismap["26Mg"] = is; table["Mg"] = ismap; ismap.clear(); @@ -298,10 +298,10 @@ cIsotopeMap::cIsotopeMap() { ismap["Si"] = is; is.mass = Si29; is.probability = Pr_Si29; - ismap["29Si"] = is; + ismap["29Si"] = is; is.mass = Si30; is.probability = Pr_Si30; - ismap["30Si"] = is; + ismap["30Si"] = is; table["Si"] = ismap; ismap.clear(); @@ -316,13 +316,13 @@ cIsotopeMap::cIsotopeMap() { ismap["S"] = is; is.mass = S33; is.probability = Pr_S33; - ismap["33S"] = is; + ismap["33S"] = is; is.mass = S34; is.probability = Pr_S34; - ismap["34S"] = is; + ismap["34S"] = is; is.mass = S36; is.probability = Pr_S36; - ismap["36S"] = is; + ismap["36S"] = is; table["S"] = ismap; ismap.clear(); @@ -331,16 +331,16 @@ cIsotopeMap::cIsotopeMap() { ismap["Cl"] = is; is.mass = Cl37; is.probability = Pr_Cl37; - ismap["37Cl"] = is; + ismap["37Cl"] = is; table["Cl"] = ismap; ismap.clear(); is.mass = Ar36; is.probability = Pr_Ar36; - ismap["36Ar"] = is; + ismap["36Ar"] = is; is.mass = Ar38; is.probability = Pr_Ar38; - ismap["38Ar"] = is; + ismap["38Ar"] = is; is.mass = Ar40; is.probability = Pr_Ar40; ismap["Ar"] = is; @@ -352,10 +352,10 @@ cIsotopeMap::cIsotopeMap() { ismap["K"] = is; is.mass = K40; is.probability = Pr_K40; - ismap["40K"] = is; + ismap["40K"] = is; is.mass = K41; is.probability = Pr_K41; - ismap["41K"] = is; + ismap["41K"] = is; table["K"] = ismap; ismap.clear(); @@ -364,19 +364,19 @@ cIsotopeMap::cIsotopeMap() { ismap["Ca"] = is; is.mass = Ca42; is.probability = Pr_Ca42; - ismap["42Ca"] = is; + ismap["42Ca"] = is; is.mass = Ca43; is.probability = Pr_Ca43; - ismap["43Ca"] = is; + ismap["43Ca"] = is; is.mass = Ca44; is.probability = Pr_Ca44; - ismap["44Ca"] = is; + ismap["44Ca"] = is; is.mass = Ca46; is.probability = Pr_Ca46; - ismap["46Ca"] = is; + ismap["46Ca"] = is; is.mass = Ca48; is.probability = Pr_Ca48; - ismap["48Ca"] = is; + ismap["48Ca"] = is; table["Ca"] = ismap; ismap.clear(); @@ -388,25 +388,25 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = Ti46; is.probability = Pr_Ti46; - ismap["46Ti"] = is; + ismap["46Ti"] = is; is.mass = Ti47; is.probability = Pr_Ti47; - ismap["47Ti"] = is; + ismap["47Ti"] = is; is.mass = Ti48; is.probability = Pr_Ti48; ismap["Ti"] = is; is.mass = Ti49; is.probability = Pr_Ti49; - ismap["49Ti"] = is; + ismap["49Ti"] = is; is.mass = Ti50; is.probability = Pr_Ti50; - ismap["50Ti"] = is; + ismap["50Ti"] = is; table["Ti"] = ismap; ismap.clear(); is.mass = V50; is.probability = Pr_V50; - ismap["50V"] = is; + ismap["50V"] = is; is.mass = V51; is.probability = Pr_V51; ismap["V"] = is; @@ -415,16 +415,16 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = Cr50; is.probability = Pr_Cr50; - ismap["50Cr"] = is; + ismap["50Cr"] = is; is.mass = Cr52; is.probability = Pr_Cr52; ismap["Cr"] = is; is.mass = Cr53; is.probability = Pr_Cr53; - ismap["53Cr"] = is; + ismap["53Cr"] = is; is.mass = Cr54; is.probability = Pr_Cr54; - ismap["54Cr"] = is; + ismap["54Cr"] = is; table["Cr"] = ismap; ismap.clear(); @@ -436,16 +436,16 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = Fe54; is.probability = Pr_Fe54; - ismap["54Fe"] = is; + ismap["54Fe"] = is; is.mass = Fe56; is.probability = Pr_Fe56; ismap["Fe"] = is; is.mass = Fe57; is.probability = Pr_Fe57; - ismap["57Fe"] = is; + ismap["57Fe"] = is; is.mass = Fe58; is.probability = Pr_Fe58; - ismap["58Fe"] = is; + ismap["58Fe"] = is; table["Fe"] = ismap; ismap.clear(); @@ -460,16 +460,16 @@ cIsotopeMap::cIsotopeMap() { ismap["Ni"] = is; is.mass = Ni60; is.probability = Pr_Ni60; - ismap["60Ni"] = is; + ismap["60Ni"] = is; is.mass = Ni61; is.probability = Pr_Ni61; - ismap["61Ni"] = is; + ismap["61Ni"] = is; is.mass = Ni62; is.probability = Pr_Ni62; - ismap["62Ni"] = is; + ismap["62Ni"] = is; is.mass = Ni64; is.probability = Pr_Ni64; - ismap["64Ni"] = is; + ismap["64Ni"] = is; table["Ni"] = ismap; ismap.clear(); @@ -478,7 +478,7 @@ cIsotopeMap::cIsotopeMap() { ismap["Cu"] = is; is.mass = Cu65; is.probability = Pr_Cu65; - ismap["65Cu"] = is; + ismap["65Cu"] = is; table["Cu"] = ismap; ismap.clear(); @@ -487,16 +487,16 @@ cIsotopeMap::cIsotopeMap() { ismap["Zn"] = is; is.mass = Zn66; is.probability = Pr_Zn66; - ismap["66Zn"] = is; + ismap["66Zn"] = is; is.mass = Zn67; is.probability = Pr_Zn67; - ismap["67Zn"] = is; + ismap["67Zn"] = is; is.mass = Zn68; is.probability = Pr_Zn68; - ismap["68Zn"] = is; + ismap["68Zn"] = is; is.mass = Zn70; is.probability = Pr_Zn70; - ismap["70Zn"] = is; + ismap["70Zn"] = is; table["Zn"] = ismap; ismap.clear(); @@ -505,25 +505,25 @@ cIsotopeMap::cIsotopeMap() { ismap["Ga"] = is; is.mass = Ga71; is.probability = Pr_Ga71; - ismap["71Ga"] = is; + ismap["71Ga"] = is; table["Ga"] = ismap; ismap.clear(); is.mass = Ge70; is.probability = Pr_Ge70; - ismap["70Ge"] = is; + ismap["70Ge"] = is; is.mass = Ge72; is.probability = Pr_Ge72; - ismap["72Ge"] = is; + ismap["72Ge"] = is; is.mass = Ge73; is.probability = Pr_Ge73; - ismap["73Ge"] = is; + ismap["73Ge"] = is; is.mass = Ge74; is.probability = Pr_Ge74; ismap["Ge"] = is; is.mass = Ge76; is.probability = Pr_Ge76; - ismap["76Ge"] = is; + ismap["76Ge"] = is; table["Ge"] = ismap; ismap.clear(); @@ -535,22 +535,22 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = Se74; is.probability = Pr_Se74; - ismap["74Se"] = is; + ismap["74Se"] = is; is.mass = Se76; is.probability = Pr_Se76; - ismap["76Se"] = is; + ismap["76Se"] = is; is.mass = Se77; is.probability = Pr_Se77; - ismap["77Se"] = is; + ismap["77Se"] = is; is.mass = Se78; is.probability = Pr_Se78; - ismap["78Se"] = is; + ismap["78Se"] = is; is.mass = Se80; is.probability = Pr_Se80; ismap["Se"] = is; is.mass = Se82; is.probability = Pr_Se82; - ismap["82Se"] = is; + ismap["82Se"] = is; table["Se"] = ismap; ismap.clear(); @@ -559,28 +559,28 @@ cIsotopeMap::cIsotopeMap() { ismap["Br"] = is; is.mass = Br81; is.probability = Pr_Br81; - ismap["81Br"] = is; + ismap["81Br"] = is; table["Br"] = ismap; ismap.clear(); is.mass = Kr78; is.probability = Pr_Kr78; - ismap["78Kr"] = is; + ismap["78Kr"] = is; is.mass = Kr80; is.probability = Pr_Kr80; - ismap["80Kr"] = is; + ismap["80Kr"] = is; is.mass = Kr82; is.probability = Pr_Kr82; - ismap["82Kr"] = is; + ismap["82Kr"] = is; is.mass = Kr83; is.probability = Pr_Kr83; - ismap["83Kr"] = is; + ismap["83Kr"] = is; is.mass = Kr84; is.probability = Pr_Kr84; ismap["Kr"] = is; is.mass = Kr86; is.probability = Pr_Kr86; - ismap["86Kr"] = is; + ismap["86Kr"] = is; table["Kr"] = ismap; ismap.clear(); @@ -589,19 +589,19 @@ cIsotopeMap::cIsotopeMap() { ismap["Rb"] = is; is.mass = Rb87; is.probability = Pr_Rb87; - ismap["87Rb"] = is; + ismap["87Rb"] = is; table["Rb"] = ismap; ismap.clear(); is.mass = Sr84; is.probability = Pr_Sr84; - ismap["84Sr"] = is; + ismap["84Sr"] = is; is.mass = Sr86; is.probability = Pr_Sr86; - ismap["86Sr"] = is; + ismap["86Sr"] = is; is.mass = Sr87; is.probability = Pr_Sr87; - ismap["87Sr"] = is; + ismap["87Sr"] = is; is.mass = Sr88; is.probability = Pr_Sr88; ismap["Sr"] = is; @@ -619,16 +619,16 @@ cIsotopeMap::cIsotopeMap() { ismap["Zr"] = is; is.mass = Zr91; is.probability = Pr_Zr91; - ismap["91Zr"] = is; + ismap["91Zr"] = is; is.mass = Zr92; is.probability = Pr_Zr92; - ismap["92Zr"] = is; + ismap["92Zr"] = is; is.mass = Zr94; is.probability = Pr_Zr94; - ismap["94Zr"] = is; + ismap["94Zr"] = is; is.mass = Zr96; is.probability = Pr_Zr96; - ismap["96Zr"] = is; + ismap["96Zr"] = is; table["Zr"] = ismap; ismap.clear(); @@ -640,25 +640,25 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = Mo92; is.probability = Pr_Mo92; - ismap["92Mo"] = is; + ismap["92Mo"] = is; is.mass = Mo94; is.probability = Pr_Mo94; - ismap["94Mo"] = is; + ismap["94Mo"] = is; is.mass = Mo95; is.probability = Pr_Mo95; - ismap["95Mo"] = is; + ismap["95Mo"] = is; is.mass = Mo96; is.probability = Pr_Mo96; - ismap["96Mo"] = is; + ismap["96Mo"] = is; is.mass = Mo97; is.probability = Pr_Mo97; - ismap["97Mo"] = is; + ismap["97Mo"] = is; is.mass = Mo98; is.probability = Pr_Mo98; ismap["Mo"] = is; is.mass = Mo100; is.probability = Pr_Mo100; - ismap["100Mo"] = is; + ismap["100Mo"] = is; table["Mo"] = ismap; ismap.clear(); @@ -670,25 +670,25 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = Ru96; is.probability = Pr_Ru96; - ismap["96Ru"] = is; + ismap["96Ru"] = is; is.mass = Ru98; is.probability = Pr_Ru98; - ismap["98Ru"] = is; + ismap["98Ru"] = is; is.mass = Ru99; is.probability = Pr_Ru99; - ismap["99Ru"] = is; + ismap["99Ru"] = is; is.mass = Ru100; is.probability = Pr_Ru100; - ismap["100Ru"] = is; + ismap["100Ru"] = is; is.mass = Ru101; is.probability = Pr_Ru101; - ismap["101Ru"] = is; + ismap["101Ru"] = is; is.mass = Ru102; is.probability = Pr_Ru102; ismap["Ru"] = is; is.mass = Ru104; is.probability = Pr_Ru104; - ismap["104Ru"] = is; + ismap["104Ru"] = is; table["Ru"] = ismap; ismap.clear(); @@ -700,22 +700,22 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = Pd102; is.probability = Pr_Pd102; - ismap["102Pd"] = is; + ismap["102Pd"] = is; is.mass = Pd104; is.probability = Pr_Pd104; - ismap["104Pd"] = is; + ismap["104Pd"] = is; is.mass = Pd105; is.probability = Pr_Pd105; - ismap["105Pd"] = is; + ismap["105Pd"] = is; is.mass = Pd106; is.probability = Pr_Pd106; ismap["Pd"] = is; is.mass = Pd108; is.probability = Pr_Pd108; - ismap["108Pd"] = is; + ismap["108Pd"] = is; is.mass = Pd110; is.probability = Pr_Pd110; - ismap["110Pd"] = is; + ismap["110Pd"] = is; table["Pd"] = ismap; ismap.clear(); @@ -724,40 +724,40 @@ cIsotopeMap::cIsotopeMap() { ismap["Ag"] = is; is.mass = Ag109; is.probability = Pr_Ag109; - ismap["109Ag"] = is; + ismap["109Ag"] = is; table["Ag"] = ismap; ismap.clear(); is.mass = Cd106; is.probability = Pr_Cd106; - ismap["106Cd"] = is; + ismap["106Cd"] = is; is.mass = Cd108; is.probability = Pr_Cd108; - ismap["108Cd"] = is; + ismap["108Cd"] = is; is.mass = Cd110; is.probability = Pr_Cd110; - ismap["110Cd"] = is; + ismap["110Cd"] = is; is.mass = Cd111; is.probability = Pr_Cd111; - ismap["111Cd"] = is; + ismap["111Cd"] = is; is.mass = Cd112; is.probability = Pr_Cd112; - ismap["112Cd"] = is; + ismap["112Cd"] = is; is.mass = Cd113; is.probability = Pr_Cd113; - ismap["113Cd"] = is; + ismap["113Cd"] = is; is.mass = Cd114; is.probability = Pr_Cd114; ismap["Cd"] = is; is.mass = Cd116; is.probability = Pr_Cd116; - ismap["116Cd"] = is; + ismap["116Cd"] = is; table["Cd"] = ismap; ismap.clear(); is.mass = In113; is.probability = Pr_In113; - ismap["113In"] = is; + ismap["113In"] = is; is.mass = In115; is.probability = Pr_In115; ismap["In"] = is; @@ -766,34 +766,34 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = Sn112; is.probability = Pr_Sn112; - ismap["112Sn"] = is; + ismap["112Sn"] = is; is.mass = Sn114; is.probability = Pr_Sn114; - ismap["114Sn"] = is; + ismap["114Sn"] = is; is.mass = Sn115; is.probability = Pr_Sn115; - ismap["115Sn"] = is; + ismap["115Sn"] = is; is.mass = Sn116; is.probability = Pr_Sn116; - ismap["116Sn"] = is; + ismap["116Sn"] = is; is.mass = Sn117; is.probability = Pr_Sn117; - ismap["117Sn"] = is; + ismap["117Sn"] = is; is.mass = Sn118; is.probability = Pr_Sn118; - ismap["118Sn"] = is; + ismap["118Sn"] = is; is.mass = Sn119; is.probability = Pr_Sn119; - ismap["119Sn"] = is; + ismap["119Sn"] = is; is.mass = Sn120; is.probability = Pr_Sn120; ismap["Sn"] = is; is.mass = Sn122; is.probability = Pr_Sn122; - ismap["122Sn"] = is; + ismap["122Sn"] = is; is.mass = Sn124; is.probability = Pr_Sn124; - ismap["124Sn"] = is; + ismap["124Sn"] = is; table["Sn"] = ismap; ismap.clear(); @@ -802,31 +802,31 @@ cIsotopeMap::cIsotopeMap() { ismap["Sb"] = is; is.mass = Sb123; is.probability = Pr_Sb123; - ismap["123Sb"] = is; + ismap["123Sb"] = is; table["Sb"] = ismap; ismap.clear(); is.mass = Te120; is.probability = Pr_Te120; - ismap["120Te"] = is; + ismap["120Te"] = is; is.mass = Te122; is.probability = Pr_Te122; - ismap["122Te"] = is; + ismap["122Te"] = is; is.mass = Te123; is.probability = Pr_Te123; - ismap["123Te"] = is; + ismap["123Te"] = is; is.mass = Te124; is.probability = Pr_Te124; - ismap["124Te"] = is; + ismap["124Te"] = is; is.mass = Te125; is.probability = Pr_Te125; - ismap["125Te"] = is; + ismap["125Te"] = is; is.mass = Te126; is.probability = Pr_Te126; - ismap["126Te"] = is; + ismap["126Te"] = is; is.mass = Te128; is.probability = Pr_Te128; - ismap["128Te"] = is; + ismap["128Te"] = is; is.mass = Te130; is.probability = Pr_Te130; ismap["Te"] = is; @@ -841,31 +841,31 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = Xe124; is.probability = Pr_Xe124; - ismap["124Xe"] = is; + ismap["124Xe"] = is; is.mass = Xe126; is.probability = Pr_Xe126; - ismap["126Xe"] = is; + ismap["126Xe"] = is; is.mass = Xe128; is.probability = Pr_Xe128; - ismap["128Xe"] = is; + ismap["128Xe"] = is; is.mass = Xe129; is.probability = Pr_Xe129; - ismap["129Xe"] = is; + ismap["129Xe"] = is; is.mass = Xe130; is.probability = Pr_Xe130; - ismap["130Xe"] = is; + ismap["130Xe"] = is; is.mass = Xe131; is.probability = Pr_Xe131; - ismap["131Xe"] = is; + ismap["131Xe"] = is; is.mass = Xe132; is.probability = Pr_Xe132; ismap["Xe"] = is; is.mass = Xe134; is.probability = Pr_Xe134; - ismap["134Xe"] = is; + ismap["134Xe"] = is; is.mass = Xe136; is.probability = Pr_Xe136; - ismap["136Xe"] = is; + ismap["136Xe"] = is; table["Xe"] = ismap; ismap.clear(); @@ -877,22 +877,22 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = Ba130; is.probability = Pr_Ba130; - ismap["130Ba"] = is; + ismap["130Ba"] = is; is.mass = Ba132; is.probability = Pr_Ba132; - ismap["132Ba"] = is; + ismap["132Ba"] = is; is.mass = Ba134; is.probability = Pr_Ba134; - ismap["134Ba"] = is; + ismap["134Ba"] = is; is.mass = Ba135; is.probability = Pr_Ba135; - ismap["135Ba"] = is; + ismap["135Ba"] = is; is.mass = Ba136; is.probability = Pr_Ba136; - ismap["136Ba"] = is; + ismap["136Ba"] = is; is.mass = Ba137; is.probability = Pr_Ba137; - ismap["137Ba"] = is; + ismap["137Ba"] = is; is.mass = Ba138; is.probability = Pr_Ba138; ismap["Ba"] = is; @@ -901,7 +901,7 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = La138; is.probability = Pr_La138; - ismap["138La"] = is; + ismap["138La"] = is; is.mass = La139; is.probability = Pr_La139; ismap["La"] = is; @@ -910,16 +910,16 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = Ce136; is.probability = Pr_Ce136; - ismap["136Ce"] = is; + ismap["136Ce"] = is; is.mass = Ce138; is.probability = Pr_Ce138; - ismap["138Ce"] = is; + ismap["138Ce"] = is; is.mass = Ce140; is.probability = Pr_Ce140; ismap["Ce"] = is; is.mass = Ce142; is.probability = Pr_Ce142; - ismap["142Ce"] = is; + ismap["142Ce"] = is; table["Ce"] = ismap; ismap.clear(); @@ -934,22 +934,22 @@ cIsotopeMap::cIsotopeMap() { ismap["Nd"] = is; is.mass = Nd143; is.probability = Pr_Nd143; - ismap["143Nd"] = is; + ismap["143Nd"] = is; is.mass = Nd144; is.probability = Pr_Nd144; - ismap["144Nd"] = is; + ismap["144Nd"] = is; is.mass = Nd145; is.probability = Pr_Nd145; - ismap["145Nd"] = is; + ismap["145Nd"] = is; is.mass = Nd146; is.probability = Pr_Nd146; - ismap["146Nd"] = is; + ismap["146Nd"] = is; is.mass = Nd148; is.probability = Pr_Nd148; - ismap["148Nd"] = is; + ismap["148Nd"] = is; is.mass = Nd150; is.probability = Pr_Nd150; - ismap["150Nd"] = is; + ismap["150Nd"] = is; table["Nd"] = ismap; ismap.clear(); @@ -961,31 +961,31 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = Sm144; is.probability = Pr_Sm144; - ismap["144Sm"] = is; + ismap["144Sm"] = is; is.mass = Sm147; is.probability = Pr_Sm147; - ismap["147Sm"] = is; + ismap["147Sm"] = is; is.mass = Sm148; is.probability = Pr_Sm148; - ismap["148Sm"] = is; + ismap["148Sm"] = is; is.mass = Sm149; is.probability = Pr_Sm149; - ismap["149Sm"] = is; + ismap["149Sm"] = is; is.mass = Sm150; is.probability = Pr_Sm150; - ismap["150Sm"] = is; + ismap["150Sm"] = is; is.mass = Sm152; is.probability = Pr_Sm152; ismap["Sm"] = is; is.mass = Sm154; is.probability = Pr_Sm154; - ismap["154Sm"] = is; + ismap["154Sm"] = is; table["Sm"] = ismap; ismap.clear(); is.mass = Eu151; is.probability = Pr_Eu151; - ismap["151Eu"] = is; + ismap["151Eu"] = is; is.mass = Eu153; is.probability = Pr_Eu153; ismap["Eu"] = is; @@ -994,25 +994,25 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = Gd152; is.probability = Pr_Gd152; - ismap["152Gd"] = is; + ismap["152Gd"] = is; is.mass = Gd154; is.probability = Pr_Gd154; - ismap["154Gd"] = is; + ismap["154Gd"] = is; is.mass = Gd155; is.probability = Pr_Gd155; - ismap["155Gd"] = is; + ismap["155Gd"] = is; is.mass = Gd156; is.probability = Pr_Gd156; - ismap["156Gd"] = is; + ismap["156Gd"] = is; is.mass = Gd157; is.probability = Pr_Gd157; - ismap["157Gd"] = is; + ismap["157Gd"] = is; is.mass = Gd158; is.probability = Pr_Gd158; ismap["Gd"] = is; is.mass = Gd160; is.probability = Pr_Gd160; - ismap["160Gd"] = is; + ismap["160Gd"] = is; table["Gd"] = ismap; ismap.clear(); @@ -1024,22 +1024,22 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = Dy156; is.probability = Pr_Dy156; - ismap["156Dy"] = is; + ismap["156Dy"] = is; is.mass = Dy158; is.probability = Pr_Dy158; - ismap["158Dy"] = is; + ismap["158Dy"] = is; is.mass = Dy160; is.probability = Pr_Dy160; - ismap["160Dy"] = is; + ismap["160Dy"] = is; is.mass = Dy161; is.probability = Pr_Dy161; - ismap["161Dy"] = is; + ismap["161Dy"] = is; is.mass = Dy162; is.probability = Pr_Dy162; - ismap["162Dy"] = is; + ismap["162Dy"] = is; is.mass = Dy163; is.probability = Pr_Dy163; - ismap["163Dy"] = is; + ismap["163Dy"] = is; is.mass = Dy164; is.probability = Pr_Dy164; ismap["Dy"] = is; @@ -1054,22 +1054,22 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = Er162; is.probability = Pr_Er162; - ismap["162Er"] = is; + ismap["162Er"] = is; is.mass = Er164; is.probability = Pr_Er164; - ismap["164Er"] = is; + ismap["164Er"] = is; is.mass = Er166; is.probability = Pr_Er166; ismap["Er"] = is; is.mass = Er167; is.probability = Pr_Er167; - ismap["167Er"] = is; + ismap["167Er"] = is; is.mass = Er168; is.probability = Pr_Er168; - ismap["168Er"] = is; + ismap["168Er"] = is; is.mass = Er170; is.probability = Pr_Er170; - ismap["170Er"] = is; + ismap["170Er"] = is; table["Er"] = ismap; ismap.clear(); @@ -1081,25 +1081,25 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = Yb168; is.probability = Pr_Yb168; - ismap["168Yb"] = is; + ismap["168Yb"] = is; is.mass = Yb170; is.probability = Pr_Yb170; - ismap["170Yb"] = is; + ismap["170Yb"] = is; is.mass = Yb171; is.probability = Pr_Yb171; - ismap["171Yb"] = is; + ismap["171Yb"] = is; is.mass = Yb172; is.probability = Pr_Yb172; - ismap["172Yb"] = is; + ismap["172Yb"] = is; is.mass = Yb173; is.probability = Pr_Yb173; - ismap["173Yb"] = is; + ismap["173Yb"] = is; is.mass = Yb174; is.probability = Pr_Yb174; ismap["Yb"] = is; is.mass = Yb176; is.probability = Pr_Yb176; - ismap["176Yb"] = is; + ismap["176Yb"] = is; table["Yb"] = ismap; ismap.clear(); @@ -1108,25 +1108,25 @@ cIsotopeMap::cIsotopeMap() { ismap["Lu"] = is; is.mass = Lu176; is.probability = Pr_Lu176; - ismap["176Lu"] = is; + ismap["176Lu"] = is; table["Lu"] = ismap; ismap.clear(); is.mass = Hf174; is.probability = Pr_Hf174; - ismap["174Hf"] = is; + ismap["174Hf"] = is; is.mass = Hf176; is.probability = Pr_Hf176; - ismap["176Hf"] = is; + ismap["176Hf"] = is; is.mass = Hf177; is.probability = Pr_Hf177; - ismap["177Hf"] = is; + ismap["177Hf"] = is; is.mass = Hf178; is.probability = Pr_Hf178; - ismap["178Hf"] = is; + ismap["178Hf"] = is; is.mass = Hf179; is.probability = Pr_Hf179; - ismap["179Hf"] = is; + ismap["179Hf"] = is; is.mass = Hf180; is.probability = Pr_Hf180; ismap["Hf"] = is; @@ -1135,7 +1135,7 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = Ta180; is.probability = Pr_Ta180; - ismap["180Ta"] = is; + ismap["180Ta"] = is; is.mass = Ta181; is.probability = Pr_Ta181; ismap["Ta"] = is; @@ -1144,25 +1144,25 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = W180; is.probability = Pr_W180; - ismap["180W"] = is; + ismap["180W"] = is; is.mass = W182; is.probability = Pr_W182; - ismap["182W"] = is; + ismap["182W"] = is; is.mass = W183; is.probability = Pr_W183; - ismap["183W"] = is; + ismap["183W"] = is; is.mass = W184; is.probability = Pr_W184; ismap["W"] = is; is.mass = W186; is.probability = Pr_W186; - ismap["186W"] = is; + ismap["186W"] = is; table["W"] = ismap; ismap.clear(); is.mass = Re185; is.probability = Pr_Re185; - ismap["185Re"] = is; + ismap["185Re"] = is; is.mass = Re187; is.probability = Pr_Re187; ismap["Re"] = is; @@ -1171,22 +1171,22 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = Os184; is.probability = Pr_Os184; - ismap["184Os"] = is; + ismap["184Os"] = is; is.mass = Os186; is.probability = Pr_Os186; - ismap["186Os"] = is; + ismap["186Os"] = is; is.mass = Os187; is.probability = Pr_Os187; - ismap["187Os"] = is; + ismap["187Os"] = is; is.mass = Os188; is.probability = Pr_Os188; - ismap["188Os"] = is; + ismap["188Os"] = is; is.mass = Os189; is.probability = Pr_Os189; - ismap["189Os"] = is; + ismap["189Os"] = is; is.mass = Os190; is.probability = Pr_Os190; - ismap["190Os"] = is; + ismap["190Os"] = is; is.mass = Os192; is.probability = Pr_Os192; ismap["Os"] = is; @@ -1195,7 +1195,7 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = Ir191; is.probability = Pr_Ir191; - ismap["191Ir"] = is; + ismap["191Ir"] = is; is.mass = Ir193; is.probability = Pr_Ir193; ismap["Ir"] = is; @@ -1204,22 +1204,22 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = Pt190; is.probability = Pr_Pt190; - ismap["190Pt"] = is; + ismap["190Pt"] = is; is.mass = Pt192; is.probability = Pr_Pt192; - ismap["192Pt"] = is; + ismap["192Pt"] = is; is.mass = Pt194; is.probability = Pr_Pt194; - ismap["194Pt"] = is; + ismap["194Pt"] = is; is.mass = Pt195; is.probability = Pr_Pt195; ismap["Pt"] = is; is.mass = Pt196; is.probability = Pr_Pt196; - ismap["196Pt"] = is; + ismap["196Pt"] = is; is.mass = Pt198; is.probability = Pr_Pt198; - ismap["198Pt"] = is; + ismap["198Pt"] = is; table["Pt"] = ismap; ismap.clear(); @@ -1231,31 +1231,31 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = Hg196; is.probability = Pr_Hg196; - ismap["196Hg"] = is; + ismap["196Hg"] = is; is.mass = Hg198; is.probability = Pr_Hg198; - ismap["198Hg"] = is; + ismap["198Hg"] = is; is.mass = Hg199; is.probability = Pr_Hg199; - ismap["199Hg"] = is; + ismap["199Hg"] = is; is.mass = Hg200; is.probability = Pr_Hg200; - ismap["200Hg"] = is; + ismap["200Hg"] = is; is.mass = Hg201; is.probability = Pr_Hg201; - ismap["201Hg"] = is; + ismap["201Hg"] = is; is.mass = Hg202; is.probability = Pr_Hg202; ismap["Hg"] = is; is.mass = Hg204; is.probability = Pr_Hg204; - ismap["204Hg"] = is; + ismap["204Hg"] = is; table["Hg"] = ismap; ismap.clear(); is.mass = Tl203; is.probability = Pr_Tl203; - ismap["203Tl"] = is; + ismap["203Tl"] = is; is.mass = Tl205; is.probability = Pr_Tl205; ismap["Tl"] = is; @@ -1264,13 +1264,13 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = Pb204; is.probability = Pr_Pb204; - ismap["204Pb"] = is; + ismap["204Pb"] = is; is.mass = Pb206; is.probability = Pr_Pb206; - ismap["206Pb"] = is; + ismap["206Pb"] = is; is.mass = Pb207; is.probability = Pr_Pb207; - ismap["207Pb"] = is; + ismap["207Pb"] = is; is.mass = Pb208; is.probability = Pr_Pb208; ismap["Pb"] = is; @@ -1333,10 +1333,10 @@ cIsotopeMap::cIsotopeMap() { ismap.clear(); is.mass = U234; is.probability = Pr_U234; - ismap["234U"] = is; + ismap["234U"] = is; is.mass = U235; is.probability = Pr_U235; - ismap["235U"] = is; + ismap["235U"] = is; is.mass = U238; is.probability = Pr_U238; ismap["U"] = is; diff --git a/CycloBranch/core/cMzML.cpp b/CycloBranch/core/cMzML.cpp index 4baadb7..e4cb643 100644 --- a/CycloBranch/core/cMzML.cpp +++ b/CycloBranch/core/cMzML.cpp @@ -1,5 +1,10 @@ #include "core/cMzML.h" +#include +#include +#include +#include + #include #include "core/cPeaksList.h" @@ -48,7 +53,18 @@ cMzML::~cMzML() { } -int cMzML::parse(string& filename, vector& peaklists, eModeType mode, cMainThread* os, bool& terminatecomputation) { +int cMzML::parse(string& filename, vector& peaklists, int profilespectrumid, eModeType mode, cMainThread* os, bool& terminatecomputation) { + + ifstream f; + bool good; + + f.open(filename.c_str()); + good = f.good(); + f.close(); + + if (!good) { + return 0; + } parser->parse(filename.c_str()); document = parser->getDocument(); @@ -100,6 +116,8 @@ int cMzML::parse(string& filename, vector& peaklists, eModeType mode string mgfname = filename.substr(0, (int)filename.size() - 4); stringstream ss; + + cPeaksList peaklist; // childrens of mzML DOMNode* currentNode1 = root->getFirstChild(); @@ -132,6 +150,7 @@ int cMzML::parse(string& filename, vector& peaklists, eModeType mode DOMElement* currentElement3 = dynamic_cast(currentNode3); if (compareElementTagName(currentElement3, "spectrum")) { + peaklist.clear(); string title = getAttribute(currentElement3, "id"); bool skipspectrum = false; @@ -149,36 +168,90 @@ int cMzML::parse(string& filename, vector& peaklists, eModeType mode if (compareElementTagName(currentElement4, "cvParam")) { - string accession = getAttribute(currentElement4, "accession"); + string accession = getAttribute(currentElement4, "accession"); - if (accession.compare("MS:1000128") == 0) { - isprofilespectrum = true; - } + if (accession.compare("MS:1000128") == 0) { + isprofilespectrum = true; + } - if (accession.compare("MS:1000511") == 0) { + if (accession.compare("MS:1000511") == 0) { - int level = atoi(getAttribute(currentElement4, "value").c_str()); + int level = atoi(getAttribute(currentElement4, "value").c_str()); - if ((level == 1) && (mode != dereplication)) { - skipspectrum = true; - } + if ((level == 1) && ((mode == denovoengine) || (mode == singlecomparison) || (mode == databasesearch))) { + skipspectrum = true; + } - if ((level > 1) && (mode == dereplication)) { - skipspectrum = true; + if ((level > 1) && ((mode == dereplication) || (mode == compoundsearch))) { + skipspectrum = true; + } + + } + + + } + + + if (!skipspectrum && compareElementTagName(currentElement4, "scanList")) { + + // childrens of scanList + DOMNode* currentNode5 = currentNode4->getFirstChild(); + while (currentNode5) { + + + if (currentNode5->getNodeType() == DOMNode::ELEMENT_NODE) { + + DOMElement* currentElement5 = dynamic_cast(currentNode5); + if (compareElementTagName(currentElement5, "scan")) { + + + // childrens of scan + DOMNode* currentNode6 = currentNode5->getFirstChild(); + while (currentNode6) { + + + if (currentNode6->getNodeType() == DOMNode::ELEMENT_NODE) { + + DOMElement* currentElement6 = dynamic_cast(currentNode6); + if (compareElementTagName(currentElement6, "cvParam")) { + + + string accession = getAttribute(currentElement6, "accession"); + + if (accession.compare("MS:1000016") == 0) { + double rt = atof(getAttribute(currentElement6, "value").c_str()); + peaklist.setRetentionTime(rt); + } + + + } + + } + + + currentNode6 = currentNode6->getNextSibling(); + + + } + + } } + currentNode5 = currentNode5->getNextSibling(); + + } + } + if (!skipspectrum && compareElementTagName(currentElement4, "binaryDataArrayList")) { - cPeaksList peaklist; bool peaklistdefined = false; - - + if (isprofilespectrum) { profilespectra = true; } @@ -197,6 +270,7 @@ int cMzML::parse(string& filename, vector& peaklists, eModeType mode // childrens of binaryDataArray bool precision64 = false; + bool zlib = false; bool mzratio = false; bool intensity = false; @@ -226,11 +300,7 @@ int cMzML::parse(string& filename, vector& peaklists, eModeType mode } if (accession.compare("MS:1000574") == 0) { - // zlib compression detected - if (mgfofstream.is_open()) { - mgfofstream.close(); - } - return -3; + zlib = true; } @@ -251,44 +321,62 @@ int cMzML::parse(string& filename, vector& peaklists, eModeType mode datasize = 8; } - if (mzratio) { - for (int ii = 0; ii < binarysize/datasize; ii++) { + string datastring; + datastring.resize(binarysize); + for (int ii = 0; ii < binarysize; ii++) { + datastring[ii] = decoded[ii]; + } + + if (zlib) { + string compressed = datastring; + datastring.clear(); + + boost::iostreams::filtering_streambuf in; + in.push(boost::iostreams::zlib_decompressor()); + in.push(boost::make_iterator_range(compressed)); + boost::iostreams::copy(in, boost::iostreams::back_inserter(datastring)); + } + + int size = (int)datastring.size() / datasize; + + if (mzratio) { + for (int ii = 0; ii < size; ii++) { if (precision64) { - memcpy(&dblval, &decoded[ii*datasize], datasize); + memcpy(&dblval, &(datastring.data())[ii*datasize], datasize); } else { - memcpy(&fltval, &decoded[ii*datasize], datasize); + memcpy(&fltval, &(datastring.data())[ii*datasize], datasize); } if (peaklistdefined) { - peaklist[ii].mzratio = precision64?dblval:fltval; + peaklist[ii].mzratio = precision64 ? dblval : fltval; } else { cPeak peak; - peak.mzratio = precision64?dblval:fltval; + peak.mzratio = precision64 ? dblval : fltval; peaklist.add(peak); } } } if (intensity) { - for (int ii = 0; ii < binarysize/datasize; ii++) { + for (int ii = 0; ii < size; ii++) { if (precision64) { - memcpy(&dblval, &decoded[ii*datasize], datasize); + memcpy(&dblval, &(datastring.data())[ii*datasize], datasize); } else { - memcpy(&fltval, &decoded[ii*datasize], datasize); + memcpy(&fltval, &(datastring.data())[ii*datasize], datasize); } if (peaklistdefined) { - peaklist[ii].absoluteintensity = precision64?dblval:fltval; + peaklist[ii].absoluteintensity = precision64 ? dblval : fltval; } else { cPeak peak; - peak.absoluteintensity = precision64?dblval:fltval; + peak.absoluteintensity = precision64 ? dblval : fltval; peaklist.add(peak); } - } + } } XMLPlatformUtils::fgMemoryManager->deallocate(decoded); @@ -325,7 +413,12 @@ int cMzML::parse(string& filename, vector& peaklists, eModeType mode if (profilespectra) { if (count == 0) { - ss << mgfname << setw(10) << setfill('0') << 0 << ".mgf"; + if (profilespectrumid == -1) { + ss << mgfname << setw(10) << setfill('0') << 0 << ".mgf"; + } + else { + ss << mgfname << "profile." << to_string(profilespectrumid) << ".mgf"; + } mgfofstream.open(ss.str()); } @@ -338,32 +431,39 @@ int cMzML::parse(string& filename, vector& peaklists, eModeType mode } } - mgfofstream << "BEGIN IONS" << endl; - mgfofstream << "TITLE=" << title << endl; - mgfofstream << "SCAN=" << to_string(count + 1) << endl; - mgfofstream << "PEPMASS=1" << endl; - mgfofstream << "RTINSECONDS=1" << endl; - mgfofstream << "CHARGE=1+" << endl << endl; - - peaksstring.clear(); - for (int ii = 0; ii < peaklist.size(); ii++) { - sprintf_s(tempstring, "%f %f\n\0", peaklist[ii].mzratio, peaklist[ii].absoluteintensity); - peaksstring.append(tempstring); + if ((profilespectrumid == -1) || (profilespectrumid == count)) { + mgfofstream << "BEGIN IONS" << endl; + mgfofstream << "TITLE=" << title << endl; + mgfofstream << "SCANS=" << to_string(count + 1) << endl; + mgfofstream << "PEPMASS=1" << endl; + mgfofstream << "RTINSECONDS=" << to_string(peaklist.getRetentionTime()) << endl; + mgfofstream << "CHARGE=1+" << endl << endl; + + peaksstring.clear(); + for (int ii = 0; ii < peaklist.size(); ii++) { + sprintf_s(tempstring, "%f %f\n\0", peaklist[ii].mzratio, peaklist[ii].absoluteintensity); + peaksstring.append(tempstring); + } + mgfofstream << peaksstring; + mgfofstream << "END IONS" << endl << endl; } - mgfofstream << peaksstring; - mgfofstream << "END IONS" << endl << endl; - if (((count + 1) % 100 == 0) && (count > 0)) { - mgfofstream.close(); - stringstream ss; - strip = (count + 1) / 100; - ss << mgfname << setw(10) << setfill('0') << strip << ".mgf"; - mgfofstream.open(ss.str()); + if (profilespectrumid == -1) { + if (((count + 1) % 100 == 0) && (count > 0)) { + mgfofstream.close(); + stringstream ss; + strip = (count + 1) / 100; + ss << mgfname << setw(10) << setfill('0') << strip << ".mgf"; + mgfofstream.open(ss.str()); + } + } + + if ((profilespectrumid == -1) || (profilespectrumid == count)) { + cPeaksList emptypeaklist; + emptypeaklist.setTitle(title); + peaklists.push_back(emptypeaklist); } - cPeaksList emptypeaklist; - emptypeaklist.setTitle(title); - peaklists.push_back(emptypeaklist); count++; } diff --git a/CycloBranch/core/cMzML.h b/CycloBranch/core/cMzML.h index 7d33db4..7bc4ac0 100644 --- a/CycloBranch/core/cMzML.h +++ b/CycloBranch/core/cMzML.h @@ -84,12 +84,13 @@ class cMzML { \brief Parse a mzml file. \param filename mzml filename \param peaklists mzml filename + \param profilespectrumid id of a profile spectrum to be extracted, -1 = extract all profile spectra \param mode program mode \param os pointer to the main thread of the application (output stream) \param terminatecomputation reference to a variable determining that the computation must be stopped - \retval 0 = success; -1 = aborted by user; -3 = zlib compression detected + \retval 0 = success; -1 = aborted by user */ - int parse(string& filename, vector& peaklists, eModeType mode, cMainThread* os, bool& terminatecomputation); + int parse(string& filename, vector& peaklists, int profilespectrumid, eModeType mode, cMainThread* os, bool& terminatecomputation); /** diff --git a/CycloBranch/core/cParameters.cpp b/CycloBranch/core/cParameters.cpp index a70a2ea..c332ffe 100644 --- a/CycloBranch/core/cParameters.cpp +++ b/CycloBranch/core/cParameters.cpp @@ -4,6 +4,79 @@ #include "core/cSummaryFormula.h" +void cParameters::fixIntensities(cPeaksList& centroidspectrum, cPeaksList& profilespectrum) { + if ((centroidspectrum.size() == 0) || (profilespectrum.size() == 0)) { + return; + } + + double minval; + int mem_j = 0; + + for (int i = 0; i < centroidspectrum.size(); i++) { + minval = fabs(centroidspectrum[i].mzratio - profilespectrum[mem_j].mzratio); + for (int j = mem_j + 1; j < profilespectrum.size(); j++) { + if ((fabs(centroidspectrum[i].mzratio - profilespectrum[j].mzratio)) < minval) { + minval = fabs(centroidspectrum[i].mzratio - profilespectrum[j].mzratio); + mem_j = j; + } + else { + break; + } + } + centroidspectrum[i].absoluteintensity = profilespectrum[mem_j].absoluteintensity; + } +} + + +bool cParameters::checkSeniorRules(vector& combarray, vector& valences, int maxcomponents) { + int totalvalence = 0; + int i, size; + + i = 0; + size = (int)combarray.size(); + while ((i < size) && (combarray[i] > 0)) { + totalvalence += valences[combarray[i] - 1]; + i++; + } + + // SENIOR rule 1 - the sum of valences must be even + // SENIOR rule 3 - the sum of valences >= 2 * (atomscount - maximum number of allowed components in the graph); edges - nodes + components >= 0 + if ((totalvalence % 2 == 1) || (totalvalence < 2 * (i - maxcomponents))) { + return false; + } + + return true; +} + + +/*double cParameters::getMassAndCounts(vector& combarray, vector& countsofelements, vector& massesofelements) { + int i, size; + + i = 0; + size = (int)countsofelements.size(); + for (i = 0; i < size; i++) { + countsofelements[i] = 0; + } + + i = 0; + size = (int)combarray.size(); + while ((i < size) && (combarray[i] > 0)) { + countsofelements[combarray[i] - 1]++; + i++; + } + + double mass = 0; + size = (int)countsofelements.size(); + for (i = 0; i < size; i++) { + if (countsofelements[i] > 0) { + mass += massesofelements[i] * (double)(countsofelements[i]); + } + } + + return mass; +}*/ + + cParameters::cParameters() { clear(); } @@ -30,6 +103,7 @@ void cParameters::clear() { minimumrelativeintensitythreshold = 1; minimumabsoluteintensitythreshold = 0; minimummz = 150; + maximummz = 0; fwhm = 0.05; bricksdatabasefilename = ""; bricksdatabase.clear(); @@ -41,15 +115,20 @@ void cParameters::clear() { modificationsfilename = ""; searchedmodifications.clear(); maximumnumberofthreads = 1; - mode = denovoengine; + mode = dereplication; scoretype = number_of_matched_peaks; maximumcombinedlosses = 2; //clearhitswithoutparent = false; + basicformulacheck = true; + advancedformulacheck = true; + noratiocheck = true; + mzdifftolerance = 0; + intensitytolerance = 0; reportunmatchedtheoreticalpeaks = false; generateisotopepattern = false; minimumpatternsize = 1; minimumfeaturesize = 1; - allionsmustbepresent = false; + minimumiontypes = 1; cyclicnterminus = false; cycliccterminus = false; internalfragments = false; @@ -117,6 +196,15 @@ int cParameters::checkAndPrepare(bool& terminatecomputation) { string ibdfilename; string mzmlname; + cPeaksList profilelist; + ifstream profilestream; + string profilemgfname; + string peaksfoldername; + + int hrs, mins, secs; + QTime time; + bool good; + if (peaklistfilename.empty()) { error = true; errormessage = "A peaklist is not specified. Have you configured the engine (Search -> Settings...) ?\n"; @@ -193,197 +281,288 @@ int cParameters::checkAndPrepare(bool& terminatecomputation) { if (!error) { - switch (peaklistfileformat) - { - case txt: - peakliststream.open(peaklistfilename); - break; - case mgf: - peakliststream.open(peaklistfilename); - break; - case mzXML: - *os << "Converting the file " + peaklistfilename + " to mgf ... "; + switch (peaklistfileformat) { + case txt: + peakliststream.open(peaklistfilename); + break; + case mgf: + peakliststream.open(peaklistfilename); + break; + case mzXML: + *os << "Converting the file " + peaklistfilename + " to mzML ... "; - #if OS_TYPE == UNX - s = installdir.toStdString() + "External/linux/any2mgf.sh " + peaklistfilename; - if (system(s.c_str()) != 0) { - error = true; - errormessage = "The file cannot be converted.\n"; - errormessage += "Does the file '" + peaklistfilename + "' exist ?\n"; - errormessage += "Is the directory with the file '" + peaklistfilename + "' writable ?\n"; - errormessage += "Do you have FileConverter installed (OpenMS 2.x must be installed) ?\n"; - errormessage += "Do you have 'any2mgf.sh' file located in '" + installdir.toStdString() + "External/linux' folder ?\n"; - errormessage += "Is the file 'any2mgf.sh' executable (sudo chmod +x " + installdir.toStdString() + "External/linux/any2mgf.sh) ? \n"; - } - #else - #if OS_TYPE == OSX - s = installdir.toStdString() + "External/macosx/any2mgf.sh " + peaklistfilename; + #if OS_TYPE == UNX + s = installdir.toStdString() + "External/linux/any2mzml.sh " + peaklistfilename; if (system(s.c_str()) != 0) { error = true; errormessage = "The file cannot be converted.\n"; errormessage += "Does the file '" + peaklistfilename + "' exist ?\n"; errormessage += "Is the directory with the file '" + peaklistfilename + "' writable ?\n"; errormessage += "Do you have FileConverter installed (OpenMS 2.x must be installed) ?\n"; - errormessage += "Do you have 'any2mgf.sh' file located in '" + installdir.toStdString() + "External/macosx' folder ?\n"; - errormessage += "Is the file 'any2mgf.sh' executable ? \n"; + errormessage += "Do you have 'any2mzml.sh' file located in '" + installdir.toStdString() + "External/linux' folder ?\n"; + errormessage += "Is the file 'any2mzml.sh' executable (sudo chmod +x " + installdir.toStdString() + "External/linux/any2mzml.sh) ? \n"; } - #else - s = "External\\windows\\any2mgf.bat \"" + peaklistfilename + "\""; + #else + #if OS_TYPE == OSX + s = installdir.toStdString() + "External/macosx/any2mzml.sh " + peaklistfilename; + if (system(s.c_str()) != 0) { + error = true; + errormessage = "The file cannot be converted.\n"; + errormessage += "Does the file '" + peaklistfilename + "' exist ?\n"; + errormessage += "Is the directory with the file '" + peaklistfilename + "' writable ?\n"; + errormessage += "Do you have FileConverter installed (OpenMS 2.x must be installed) ?\n"; + errormessage += "Do you have 'any2mzml.sh' file located in '" + installdir.toStdString() + "External/macosx' folder ?\n"; + errormessage += "Is the file 'any2mzml.sh' executable ? \n"; + } + #else + s = "External\\windows\\any2mzml.bat \"" + peaklistfilename + "\""; + if (system(s.c_str()) != 0) { + error = true; + errormessage = "The file cannot be converted.\n"; + errormessage += "Does the file '" + peaklistfilename + "' exist ?\n"; + errormessage += "Is the directory with the file '" + peaklistfilename + "' writable ?\n"; + errormessage += "Do you have FileConverter installed (OpenMS 2.x must be installed) ?\n"; + errormessage += "Do you have a path to FileConverter in your PATH variable (e.g., 'C:/Program Files/OpenMS-2.3.0/bin') ?\n"; + errormessage += "Do you have 'any2mzml.bat' file located in the '" + appname.toStdString() + "/External/windows' folder ?\n"; + } + #endif + #endif + + if (!error) { + *os << "ok" << endl << endl; + mzmlname = peaklistfilename + ".mzML"; + peakliststream.open(mzmlname); + } + break; + case baf: + #if OS_TYPE == WIN + time.start(); + + *os << "Processing the file " + peaklistfilename + ":" << endl; + + /* + s = "External\\windows\\baf2csv.bat \"" + peaklistfilename + "\""; if (system(s.c_str()) != 0) { error = true; errormessage = "The file cannot be converted.\n"; errormessage += "Does the file '" + peaklistfilename + "' exist ?\n"; + errormessage += "Do you have Bruker Daltonik's CompassXport installed ?\n"; + errormessage += "Do you have path to the CompassXport.exe in your PATH variable ?\n"; errormessage += "Is the directory with the file '" + peaklistfilename + "' writable ?\n"; - errormessage += "Do you have FileConverter installed (OpenMS 2.x must be installed) ?\n"; - errormessage += "Do you have a path to FileConverter in your PATH variable (e.g., 'C:/Program Files/OpenMS-2.3.0/bin') ?\n"; - errormessage += "Do you have 'any2mgf.bat' file located in the '" + appname.toStdString() + "/External/windows' folder ?\n"; + errormessage += "Do you have 'baf2csv.bat' file located in the 'External/windows' folder ?\n"; } - #endif - #endif - if (!error) { - *os << "ok" << endl << endl; - peakliststream.open(peaklistfilename + ".mgf"); - } - break; - case baf: - #if OS_TYPE == WIN - *os << "Processing the file " + peaklistfilename + ":" << endl; + if (!error) { + *os << "ok" << endl; + peakliststream.open(peaklistfilename + ".csv"); + } + */ - *os << "centroid spectra ... "; - s = "External\\windows\\baf2csv.bat \"" + peaklistfilename + "\""; - if (system(s.c_str()) != 0) { - error = true; - errormessage = "The file cannot be converted.\n"; - errormessage += "Does the file '" + peaklistfilename + "' exist ?\n"; - errormessage += "Do you have Bruker Daltonik's CompassXport installed ?\n"; - errormessage += "Do you have path to the CompassXport.exe in your PATH variable ?\n"; - errormessage += "Is the directory with the file '" + peaklistfilename + "' writable ?\n"; - errormessage += "Do you have 'baf2csv.bat' file located in the 'External/windows' folder ?\n"; - } + mzmlname = peaklistfilename + ".mzML"; + peakliststream.open(mzmlname); + good = peakliststream.good(); + peakliststream.close(); - if (!error) { - *os << "ok" << endl; - peakliststream.open(peaklistfilename + ".csv"); - } + if (good) { + *os << "The previously converted centroid spectra were found." << endl; + *os << "The following file was used: " << mzmlname << endl; + } + else { + *os << "centroid spectra ... "; + + s = "External\\windows\\baf2mzml.bat \"" + peaklistfilename + "\""; + if (system(s.c_str()) != 0) { + error = true; + errormessage = "The file cannot be converted.\n"; + errormessage += "Does the file '" + peaklistfilename + "' exist ?\n"; + errormessage += "Do you have Bruker Daltonik's CompassXport installed ?\n"; + errormessage += "Do you have path to the CompassXport.exe in your PATH variable ?\n"; + errormessage += "Is the directory with the file '" + peaklistfilename + "' writable ?\n"; + errormessage += "Do you have 'baf2mzml.bat' file located in the 'External/windows' folder ?\n"; + } + if (!error) { + *os << "ok" << endl; + } + } + + if (!error) { + peakliststream.open(mzmlname); + } + + if (!error && useprofiledata && convertprofiledata) { + *os << "profile spectra ... "; + s = "External\\windows\\baf2profile.bat \"" + peaklistfilename + "\""; + if (system(s.c_str()) != 0) { + error = true; + errormessage = "The file cannot be converted.\n"; + errormessage += "Does the file '" + peaklistfilename + "' exist ?\n"; + errormessage += "Do you have Bruker Daltonik's CompassXport installed ?\n"; + errormessage += "Do you have path to the CompassXport.exe in your PATH variable ?\n"; + errormessage += "Is the directory with the file '" + peaklistfilename + "' writable ?\n"; + errormessage += "Do you have 'baf2profile.bat' file located in the 'External/windows' folder ?\n"; + } + + if (!error) { + *os << "ok" << endl; + } + } + + *os << endl; + + secs = time.elapsed() / 1000; + mins = (secs / 60) % 60; + hrs = (secs / 3600); + secs = secs % 60; + + *os << "The data conversion took: " << to_string(hrs) << " hrs, " << to_string(mins) << " min, " << to_string(secs) << " sec." << endl << endl; + #endif + break; + case raw: + #if OS_TYPE == WIN + *os << "Converting the file " + peaklistfilename + " ... "; - if (useprofiledata && convertprofiledata) { - *os << "profile spectra ... "; - s = "External\\windows\\baf2profile.bat \"" + peaklistfilename + "\""; + s = "External\\windows\\raw2mzmlpeaks.bat \"" + peaklistfilename + "\""; if (system(s.c_str()) != 0) { error = true; errormessage = "The file cannot be converted.\n"; + errormessage += "Is the file '" + peaklistfilename + "' opened elsewhere ?\n"; errormessage += "Does the file '" + peaklistfilename + "' exist ?\n"; - errormessage += "Do you have Bruker Daltonik's CompassXport installed ?\n"; - errormessage += "Do you have path to the CompassXport.exe in your PATH variable ?\n"; errormessage += "Is the directory with the file '" + peaklistfilename + "' writable ?\n"; - errormessage += "Do you have 'baf2profile.bat' file located in the 'External/windows' folder ?\n"; + errormessage += "Do you have msconvert.exe installed (OpenMS 2.x including ProteoWizard must be installed) ?\n"; + errormessage += "Do you have a path to msconvert.exe in your PATH variable (e.g., 'C:/Program Files/OpenMS-2.3.0/share/OpenMS/THIRDPARTY/pwiz-bin') ?\n"; + errormessage += "Do you have 'raw2mzmlpeaks.bat' file located in the '" + appname.toStdString() + "/External/windows' folder ?\n"; + } + + if (!error && useprofiledata) { + s = "External\\windows\\raw2mzml.bat \"" + peaklistfilename + "\""; + if (system(s.c_str()) != 0) { + error = true; + errormessage = "The file cannot be converted.\n"; + errormessage += "Is the file '" + peaklistfilename + "' opened elsewhere ?\n"; + errormessage += "Does the file '" + peaklistfilename + "' exist ?\n"; + errormessage += "Is the directory with the file '" + peaklistfilename + "' writable ?\n"; + errormessage += "Do you have msconvert.exe installed (OpenMS 2.x including ProteoWizard must be installed) ?\n"; + errormessage += "Do you have a path to msconvert.exe in your PATH variable (e.g., 'C:/Program Files/OpenMS-2.3.0/share/OpenMS/THIRDPARTY/pwiz-bin') ?\n"; + errormessage += "Do you have 'raw2mzml.bat' file located in the '" + appname.toStdString() + "/External/windows' folder ?\n"; + } } if (!error) { - *os << "ok" << endl; + *os << "ok" << endl << endl; + mzmlname = peaklistfilename.substr(0, peaklistfilename.rfind('.')) + "_converted.mzML"; + peakliststream.open(mzmlname); } - } + #endif + break; + case dat: + #if OS_TYPE == WIN + foldername = peaklistfilename.substr(0, peaklistfilename.rfind('/')); + peaksfoldername = foldername.substr(0, foldername.size() - 4) + "_PEAKS.raw"; - *os << endl; - #endif - break; - case raw: - #if OS_TYPE == WIN - *os << "Converting the file " + peaklistfilename + " ... "; - s = "External\\windows\\raw2mzml.bat \"" + peaklistfilename + "\""; - if (system(s.c_str()) != 0) { - error = true; - errormessage = "The file cannot be converted.\n"; - errormessage += "Is the file '" + peaklistfilename + "' opened elsewhere ?\n"; - errormessage += "Does the file '" + peaklistfilename + "' exist ?\n"; - errormessage += "Is the directory with the file '" + peaklistfilename + "' writable ?\n"; - errormessage += "Do you have msconvert.exe installed (OpenMS 2.x including ProteoWizard must be installed) ?\n"; - errormessage += "Do you have a path to msconvert.exe in your PATH variable (e.g., 'C:/Program Files/OpenMS-2.3.0/share/OpenMS/THIRDPARTY/pwiz-bin') ?\n"; - errormessage += "Do you have 'raw2mzml.bat' file located in the '" + appname.toStdString() + "/External/windows' folder ?\n"; - } + *os << "Generating centroid data folder from " + foldername + " ... "; + s = "External\\windows\\waters\\profile2peaks.exe \"" + foldername + "\""; + if (system(s.c_str()) != 0) { + error = true; + errormessage = "The raw data folder cannot be converted.\n"; + errormessage += "Does the folder '" + foldername + "' exist ?\n"; + errormessage += "Is the folder with the folder '" + foldername + "' writable ?\n"; + errormessage += "Do you have 'profile2peaks.exe' file located in the 'External/windows/waters' folder ?\n"; + } + else { + *os << "ok" << endl << endl; + *os << "Centroid data folder " + peaksfoldername + " successfully created." << endl << endl; + } - if (!error) { - *os << "ok" << endl << endl; - mzmlname = peaklistfilename.substr(0, peaklistfilename.rfind('.')) + ".mzML"; - peakliststream.open(mzmlname); - } - #endif - break; - case dat: - #if OS_TYPE == WIN - foldername = peaklistfilename.substr(0, peaklistfilename.rfind('/')); - *os << "Converting the raw data folder " + foldername + " ... "; - s = "External\\windows\\waters\\raw2mgf.exe \"" + foldername + "\""; - if (system(s.c_str()) != 0) { - error = true; - errormessage = "The raw data folder cannot be converted.\n"; - errormessage += "Does the folder '" + foldername + "' exist ?\n"; - errormessage += "Is the folder with the folder '" + foldername + "' writable ?\n"; - errormessage += "Do you have 'raw2mgf.exe' file located in the 'External/windows/waters' folder ?\n"; - } + if (!error) { + *os << "Converting profile data " + foldername + " ... "; + s = "External\\windows\\waters\\raw2mgf.exe \"" + foldername + "\""; + if (system(s.c_str()) != 0) { + error = true; + errormessage = "The raw data folder cannot be converted.\n"; + errormessage += "Does the folder '" + foldername + "' exist ?\n"; + errormessage += "Is the folder with the folder '" + foldername + "' writable ?\n"; + errormessage += "Do you have 'raw2mgf.exe' file located in the 'External/windows/waters' folder ?\n"; + } + else { + *os << "ok" << endl << endl; + } + } - if (!error) { - *os << "ok" << endl << endl; - string mgfname = foldername.substr(0, foldername.rfind('.')) + ".mgf"; - peakliststream.open(mgfname); - } - #endif - break; - case mis: - #if OS_TYPE == WIN - foldername = peaklistfilename.substr(0, peaklistfilename.rfind('.')); - *os << "Converting flexImaging data folder " + foldername + " ... "; - s = "External\\windows\\mis2csv.bat \"" + foldername + "\""; - if (system(s.c_str()) != 0) { - error = true; - errormessage = "The folder cannot be converted.\n"; - errormessage += "Does the folder '" + foldername + "' exist ?\n"; - errormessage += "Do you have Bruker Daltonik's CompassXport installed ?\n"; - errormessage += "Do you have path to the CompassXport.exe in your PATH variable ?\n"; - errormessage += "Is the directory with the file '" + peaklistfilename + "' writable ?\n"; - errormessage += "Do you have 'mis2csv.bat' file located in the 'External/windows' folder ?\n"; - } + if (!error) { + *os << "Converting centroid data " + peaksfoldername + " ... "; + s = "External\\windows\\waters\\raw2mgf.exe \"" + peaksfoldername + "\""; + if (system(s.c_str()) != 0) { + error = true; + errormessage = "The raw data folder cannot be converted.\n"; + errormessage += "Does the folder '" + peaksfoldername + "' exist ?\n"; + errormessage += "Is the folder with the folder '" + peaksfoldername + "' writable ?\n"; + errormessage += "Do you have 'raw2mgf.exe' file located in the 'External/windows/waters' folder ?\n"; + } + else { + *os << "ok" << endl << endl; + } + } - if (!error) { - *os << "ok" << endl << endl; - peakliststream.open(foldername + ".baf.csv"); - spotliststream.open(foldername + ".baf.txt"); - } - #endif - break; - case ser: - #if OS_TYPE == WIN - foldername = peaklistfilename.substr(0, peaklistfilename.length() - 4); - *os << "Converting apex data folder " + foldername + " ... "; - s = "External\\windows\\ser2csv.bat \"" + foldername + "\""; - if (system(s.c_str()) != 0) { - error = true; - errormessage = "The folder cannot be converted.\n"; - errormessage += "Does the folder '" + foldername + "' exist ?\n"; - errormessage += "Do you have Bruker Daltonik's CompassXport installed ?\n"; - errormessage += "Do you have path to the CompassXport.exe in your PATH variable ?\n"; - errormessage += "Is the directory with the file '" + peaklistfilename + "' writable ?\n"; - errormessage += "Do you have 'ser2csv.bat' file located in the 'External/windows' folder ?\n"; - } + if (!error) { + string mgfname = peaksfoldername.substr(0, peaksfoldername.rfind('.')) + ".mgf"; + peakliststream.open(mgfname); + } + #endif + break; + case mis: + #if OS_TYPE == WIN + foldername = peaklistfilename.substr(0, peaklistfilename.rfind('.')); + *os << "Converting flexImaging data folder " + foldername + " ... "; + s = "External\\windows\\mis2csv.bat \"" + foldername + "\""; + if (system(s.c_str()) != 0) { + error = true; + errormessage = "The folder cannot be converted.\n"; + errormessage += "Does the folder '" + foldername + "' exist ?\n"; + errormessage += "Do you have Bruker Daltonik's CompassXport installed ?\n"; + errormessage += "Do you have path to the CompassXport.exe in your PATH variable ?\n"; + errormessage += "Is the directory with the file '" + peaklistfilename + "' writable ?\n"; + errormessage += "Do you have 'mis2csv.bat' file located in the 'External/windows' folder ?\n"; + } - if (!error) { - *os << "ok" << endl << endl; - peakliststream.open(foldername + ".csv"); - titleliststream.open(foldername + ".txt"); - } - #endif - break; - case mzML: - peakliststream.open(peaklistfilename); - break; - case imzML: - ibdfilename = peaklistfilename.substr(0, (int)peaklistfilename.size() - 5); - ibdfilename += "ibd"; - peakliststream.open(ibdfilename, std::ifstream::binary); - break; - default: - break; + if (!error) { + *os << "ok" << endl << endl; + peakliststream.open(foldername + ".baf.csv"); + spotliststream.open(foldername + ".baf.txt"); + } + #endif + break; + case ser: + #if OS_TYPE == WIN + foldername = peaklistfilename.substr(0, peaklistfilename.length() - 4); + *os << "Converting apex data folder " + foldername + " ... "; + s = "External\\windows\\ser2csv.bat \"" + foldername + "\""; + if (system(s.c_str()) != 0) { + error = true; + errormessage = "The folder cannot be converted.\n"; + errormessage += "Does the folder '" + foldername + "' exist ?\n"; + errormessage += "Do you have Bruker Daltonik's CompassXport installed ?\n"; + errormessage += "Do you have path to the CompassXport.exe in your PATH variable ?\n"; + errormessage += "Is the directory with the file '" + peaklistfilename + "' writable ?\n"; + errormessage += "Do you have 'ser2csv.bat' file located in the 'External/windows' folder ?\n"; + } + + if (!error) { + *os << "ok" << endl << endl; + peakliststream.open(foldername + ".csv"); + titleliststream.open(foldername + ".txt"); + } + #endif + break; + case mzML: + peakliststream.open(peaklistfilename); + break; + case imzML: + ibdfilename = peaklistfilename.substr(0, (int)peaklistfilename.size() - 5); + ibdfilename += "ibd"; + peakliststream.open(ibdfilename, std::ifstream::binary); + break; + default: + break; } } @@ -404,7 +583,7 @@ int cParameters::checkAndPrepare(bool& terminatecomputation) { } } else { - if (os && (peaklistfileformat != mzML) && (peaklistfileformat != imzML) && (peaklistfileformat != raw) && (peaklistfileformat != ser)) { + if (os && (peaklistfileformat != mzML) && (peaklistfileformat != mzXML) && (peaklistfileformat != imzML) && (peaklistfileformat != baf) && (peaklistfileformat != raw) && (peaklistfileformat != ser)) { *os << "Loading the peaklist(s)... "; } switch (peaklistfileformat) { @@ -412,13 +591,58 @@ int cParameters::checkAndPrepare(bool& terminatecomputation) { peaklistseries.loadFromPlainTextStream(peakliststream); break; case mzXML: + errtype = peaklistseries.loadFromMZMLStream(mzmlname, peakliststream, fwhm, mode, os, terminatecomputation); + if (errtype == -1) { + error = true; + errormessage = "Aborted by user.\n"; + } + if (errtype == -2) { + error = true; + #if OS_TYPE == UNX + errormessage = "Raw data cannot be converted.\n"; + errormessage += "Does the file '" + mzmlname + "' exist ?\n"; + errormessage += "Is the directory with the file '" + mzmlname + "' writable ?\n"; + errormessage += "Do you have enough space on your hard drive ?\n"; + errormessage += "Do you have OpenMS 2.x installed ?\n"; + errormessage += "Do you have 'raw2peaks.sh' file located in '" + installdir.toStdString() + "External/linux' folder ?\n"; + errormessage += "Is the file 'raw2peaks.sh' executable (sudo chmod +x " + installdir.toStdString() + "External/linux/raw2peaks.sh) ? \n"; + #else + #if OS_TYPE == OSX + errormessage = "Raw data cannot be converted.\n"; + errormessage += "Does the file '" + mzmlname + "' exist ?\n"; + errormessage += "Is the directory with the file '" + mzmlname + "' writable ?\n"; + errormessage += "Do you have enough space on your hard drive ?\n"; + errormessage += "Do you have OpenMS 2.x installed ?\n"; + errormessage += "Do you have 'raw2peaks.sh' file located in '" + installdir.toStdString() + "External/macosx' folder ?\n"; + errormessage += "Is the file 'raw2peaks.sh' executable (sudo chmod +x " + installdir.toStdString() + "External/macosx/raw2peaks.sh) ? \n"; + #else + errormessage = "Raw data cannot be converted.\n"; + errormessage += "Does the file '" + mzmlname + "' exist ?\n"; + errormessage += "Is the directory with the file '" + mzmlname + "' writable ?\n"; + errormessage += "Do you have enough space on your hard drive ?\n"; + errormessage += "Do you have OpenMS 2.x installed ?\n"; + errormessage += "Do you have a path to OpenMS binaries folder in your PATH variable (e.g., 'C:/Program Files/OpenMS-2.3.0/bin') ?\n"; + errormessage += "Do you have 'raw2peaks.bat' file located in the '" + appname.toStdString() + "/External/windows' folder ?\n"; + #endif + #endif + } + break; case mgf: peaklistseries.loadFromMGFStream(peakliststream); break; case baf: + /* #if OS_TYPE == WIN peaklistseries.loadFromBAFStream(peakliststream); #endif + */ + #if OS_TYPE == WIN + errtype = peaklistseries.loadFromMZMLStream(mzmlname, peakliststream, fwhm, mode, os, terminatecomputation); + if (errtype == -1) { + error = true; + errormessage = "Aborted by user.\n"; + } + #endif break; case raw: #if OS_TYPE == WIN @@ -437,15 +661,29 @@ int cParameters::checkAndPrepare(bool& terminatecomputation) { errormessage += "Do you have a path to OpenMS binaries folder in your PATH variable (e.g., 'C:/Program Files/OpenMS-2.3.0/bin') ?\n"; errormessage += "Do you have 'raw2peaks.bat' file located in the '" + appname.toStdString() + "/External/windows' folder ?\n"; } - if (errtype == -3) { - error = true; - errormessage = "Failed to load the mzML file, zlib compression is not supported. The spectra must be stored in the mzML file with the attribute \"no compression\".\n"; - } #endif break; case dat: #if OS_TYPE == WIN peaklistseries.loadFromMGFStream(peakliststream); + + profilemgfname = foldername.substr(0, foldername.rfind('.')) + ".mgf"; + profilestream.open(profilemgfname); + + for (int i = 0; i < peaklistseries.size(); i++) { + profilelist.clear(); + profilelist.loadFromMGFStream(profilestream); + + if (peaklistseries[i].getTitle().compare(profilelist.getTitle()) != 0) { + error = true; + errormessage = "The number of spectra in " + foldername + " and " + peaksfoldername + " is different.\n"; + break; + } + + fixIntensities(peaklistseries[i], profilelist); + } + + profilestream.close(); #endif break; case mis: @@ -511,10 +749,6 @@ int cParameters::checkAndPrepare(bool& terminatecomputation) { #endif #endif } - if (errtype == -3) { - error = true; - errormessage = "Failed to load the mzML file, zlib compression is not supported. The spectra must be stored in the mzML file with the attribute \"no compression\".\n"; - } break; case imzML: errtype = peaklistseries.loadFromIMZMLStream(peaklistfilename, peakliststream, fwhm, defaultmaxx, defaultmaxy, defaultpixelsizex, defaultpixelsizey, vendor, os, terminatecomputation); @@ -560,7 +794,7 @@ int cParameters::checkAndPrepare(bool& terminatecomputation) { default: break; } - if (os && (peaklistfileformat != mzML) && (peaklistfileformat != imzML) && (peaklistfileformat != raw) && (peaklistfileformat != ser)) { + if (os && (peaklistfileformat != mzML) && (peaklistfileformat != mzXML) && (peaklistfileformat != imzML) && (peaklistfileformat != baf) && (peaklistfileformat != raw) && (peaklistfileformat != ser)) { *os << "ok" << endl << endl; } } @@ -571,7 +805,7 @@ int cParameters::checkAndPrepare(bool& terminatecomputation) { // bricksdatabase check - if (!error && ((mode == denovoengine) || (mode == singlecomparison) || (mode == databasesearch))) { + if (!error && ((mode == denovoengine) || ((mode == singlecomparison) && (peptidetype != other)) || ((mode == databasesearch) && (peptidetype != other)))) { bricksdatabasestream.open(bricksdatabasefilename); if (!bricksdatabasestream.good()) { @@ -622,7 +856,7 @@ int cParameters::checkAndPrepare(bool& terminatecomputation) { // modifications check - if (!error && ((mode == denovoengine) || (mode == singlecomparison) || (mode == databasesearch))) { + if (!error && ((mode == denovoengine) || (mode == singlecomparison) || ((mode == databasesearch) && (peptidetype != other)))) { searchedmodifications.clear(); @@ -734,7 +968,7 @@ int cParameters::checkAndPrepare(bool& terminatecomputation) { // check theoretical fragments in positive/negative mode - if (!error && (mode == dereplication)) { + if (!error && ((mode == dereplication) || (mode == compoundsearch))) { i = 0; while (i < (int)ionsfortheoreticalspectra.size()) { if (iondefinitions[ionsfortheoreticalspectra[i]].positive != (precursorcharge > 0)) { @@ -747,15 +981,6 @@ int cParameters::checkAndPrepare(bool& terminatecomputation) { } - // calculate combinations of neutral losses - if (!error) { - errtype = calculateNeutralLosses(terminatecomputation, errormessage); - if (errtype == -1) { - error = true; - } - } - - // report errors and return if (error) { if (os) { @@ -772,18 +997,60 @@ int cParameters::checkAndPrepare(bool& terminatecomputation) { } -bool cParameters::checkModifications(cSequence& sequence, int& startmodifid, int& endmodifid, int& middlemodifid, string& errormessage) { - startmodifid = 0; - endmodifid = 0; - middlemodifid = 0; - errormessage = ""; - - if ((sequence.getPeptideType() == linear) || (sequence.getPeptideType() == branched) || (sequence.getPeptideType() == branchcyclic) || (sequence.getPeptideType() == linearpolyketide)) { +int cParameters::prepareLossesAndCompounds(bool& terminatecomputation) { + bool error = false; + string errormessage = ""; + int errtype; - if ((sequence.getPeptideType() == linear) || (sequence.getPeptideType() == branched) || (sequence.getPeptideType() == linearpolyketide)) { - startmodifid = -1; - endmodifid = -1; - } + + // calculate combinations of neutral losses or generate compounds + neutrallossesdefinitions.clear(); + neutrallossesfortheoreticalspectra.clear(); + numberofgeneratedneutrallosses = 0; + if (!error) { + if ((mode == denovoengine) || (mode == singlecomparison) || (mode == databasesearch) || (mode == dereplication)) { + errtype = calculateNeutralLosses(terminatecomputation, errormessage); + if (errtype == -1) { + error = true; + } + } + else if (mode == compoundsearch) { + errtype = generateCompounds(terminatecomputation, errormessage); // uses ionsfortheoreticalspectra + if (errtype == -1) { + error = true; + } + } + } + + + // report errors and return + if (error) { + if (os) { + *os << endl << endl; + *os << "Error: " << errormessage.c_str() << endl; + *os << endl; + *os << endl; + } + return -1; + } + + + return 0; +} + + +bool cParameters::checkModifications(cSequence& sequence, int& startmodifid, int& endmodifid, int& middlemodifid, string& errormessage) { + startmodifid = 0; + endmodifid = 0; + middlemodifid = 0; + errormessage = ""; + + if ((sequence.getPeptideType() == linear) || (sequence.getPeptideType() == branched) || (sequence.getPeptideType() == branchcyclic) || (sequence.getPeptideType() == linearpolyketide)) { + + if ((sequence.getPeptideType() == linear) || (sequence.getPeptideType() == branched) || (sequence.getPeptideType() == linearpolyketide)) { + startmodifid = -1; + endmodifid = -1; + } if ((sequence.getPeptideType() == branched) || (sequence.getPeptideType() == branchcyclic)) { middlemodifid = -1; @@ -835,20 +1102,23 @@ string cParameters::printToString() { s += "Mode: "; switch ((eModeType)mode) { - case denovoengine: - s += "De Novo Search Engine"; - break; - case singlecomparison: - s += "Compare Peaklist(s) with Spectrum of Searched Sequence"; - break; - case databasesearch: - s += "Compare Peaklist with Database - MS/MS data"; - break; - case dereplication: - s += "Compare Peaklist(s) with Database - MS or MSI data"; - break; - default: - break; + case denovoengine: + s += "De Novo Search Engine - MS/MS"; + break; + case singlecomparison: + s += "Compare Peaklist(s) with Spectrum of Searched Sequence - MS/MS"; + break; + case databasesearch: + s += "Compare Peaklist with Database - MS/MS"; + break; + case dereplication: + s += "Compare Peaklist(s) with Database - MS, LC-MS, MSI"; + break; + case compoundsearch: + s += "Compound Search - MS, LC-MS, MSI"; + break; + default: + break; } s += "\n"; @@ -897,6 +1167,7 @@ string cParameters::printToString() { s += "Minimum Threshold of Relative Intensity: " + to_string(minimumrelativeintensitythreshold) + "\n"; s += "Minimum Threshold of Absolute Intensity: " + to_string(minimumabsoluteintensitythreshold) + "\n"; s += "Minimum m/z Ratio: " + to_string(minimummz) + "\n"; + s += "Maximum m/z Ratio: " + to_string(maximummz) + "\n"; s += "FWHM: " + to_string(fwhm) + "\n"; s += "Building Blocks Database File: " + bricksdatabasefilename + "\n"; s += "Maximum Number of Combined Blocks (start, middle, end): " + to_string(maximumbricksincombinationbegin) + ", " + to_string(maximumbricksincombinationmiddle) + ", " + to_string(maximumbricksincombinationend) + "\n"; @@ -981,7 +1252,7 @@ string cParameters::printToString() { } s += "\n"; - s += "Neutral Losses: "; + s += "Neutral Losses / Chemical Elements: "; for (int i = 0; i < (int)originalneutrallossesfortheoreticalspectra.size(); i++) { s += originalneutrallossesdefinitions[originalneutrallossesfortheoreticalspectra[i]].summary; if (i < (int)originalneutrallossesfortheoreticalspectra.size() - 1) { @@ -990,7 +1261,7 @@ string cParameters::printToString() { } s += "\n"; - s += "Maximum Number of Combined Neutral Losses: " + to_string(maximumcombinedlosses) + "\n"; + s += "Maximum Number of Combined Neutral Losses/Elements: " + to_string(maximumcombinedlosses) + "\n"; //s += "Remove Hits of Fragments without Hits of Parent Fragments: "; //s += clearhitswithoutparent ? "on" : "off"; @@ -1004,18 +1275,33 @@ string cParameters::printToString() { s += generateisotopepattern ? "on" : "off"; s += "\n"; - s += "Minimum Pattern Size: " + to_string(minimumpatternsize) + "\n"; + s += "Minimum Number of Isotopic Peaks: " + to_string(minimumpatternsize) + "\n"; + + s += "Minimum Number of Spectra: " + to_string(minimumfeaturesize) + "\n"; + + s += "Minimum Number of Ion Types: " + to_string(minimumiontypes) + "\n"; - s += "Minimum Feature Size: " + to_string(minimumfeaturesize) + "\n"; + s += "Basic Formula Check: "; + s += basicformulacheck ? "on" : "off"; + s += "\n"; + + s += "Advanced Formula Check: "; + s += advancedformulacheck ? "on" : "off"; + s += "\n"; - s += "All Ions Must be Annotated: "; - s += allionsmustbepresent ? "on" : "off"; + s += "N/O Ratio Check: "; + s += noratiocheck ? "on" : "off"; s += "\n"; + s += "Isotope m/z Tolerance: " + to_string(mzdifftolerance) + "\n"; + + s += "Isotope Intensity Tolerance: " + to_string(intensitytolerance) + "\n"; + s += "Searched Sequence: " + originalsearchedsequence + "\n"; s += "N-terminal Modification: " + searchedsequenceNtermmodif + "\n"; s += "C-terminal Modification: " + searchedsequenceCtermmodif + "\n"; s += "Branch Modification: " + searchedsequenceTmodif + "\n"; + s += "Formula: " + searchedsequenceformula + "\n"; s += "\n"; @@ -1051,21 +1337,24 @@ int cParameters::calculateNeutralLosses(bool& terminatecomputation, string& erro cSummaryFormula tmpformula; string tmpstring; neutralLoss loss; - int i; cBricksDatabase neutrallossesbrickdatabase; cBrick tmpbrick; + string tmpstr; + vector valences; + bool validvalences = false; + + vector limitsofelements; + vector countsofelements; + vector massesofelements; + int numberofbasicbricks = 0; - string compositionname; - vector intcomposition; + + double sumofmasses; int compressionlimit = 100000; bool compressformulas; - bool undefinedelement; - int valence; - int atomscount; - //int stringsizeest = 0; //int mapsizeest = 0; //int doublesizeest = 0; @@ -1075,13 +1364,20 @@ int cParameters::calculateNeutralLosses(bool& terminatecomputation, string& erro *os << "Calculating combinations of neutral losses... " << endl; } - for (i = 0; i < (int)originalneutrallossesfortheoreticalspectra.size(); i++) { - tmpformula.setFormula(originalneutrallossesdefinitions[originalneutrallossesfortheoreticalspectra[i]].summary, false); + for (int i = 0; i < (int)originalneutrallossesfortheoreticalspectra.size(); i++) { + tmpstr = originalneutrallossesdefinitions[originalneutrallossesfortheoreticalspectra[i]].summary; + + if (tmpstr.rfind(':') != string::npos) { + tmpstr = tmpstr.substr(0, tmpstr.rfind(':')); + } + + tmpformula.setFormula(tmpstr, false); tmpbrick.clear(); + tmpbrick.setName(originalneutrallossesdefinitions[originalneutrallossesfortheoreticalspectra[i]].summary); tmpbrick.setComposition(to_string(numberofbasicbricks + 1), false); tmpbrick.setMass(tmpformula.getMass()); - tmpbrick.setSummary(originalneutrallossesdefinitions[originalneutrallossesfortheoreticalspectra[i]].summary); + tmpbrick.setSummary(tmpstr); tmpbrick.createSummaryMap(); neutrallossesbrickdatabase.push_back(tmpbrick); @@ -1091,75 +1387,168 @@ int cParameters::calculateNeutralLosses(bool& terminatecomputation, string& erro neutrallossesbrickdatabase.sortbyMass(); + for (int i = 0; i < neutrallossesbrickdatabase.size(); i++) { + countsofelements.push_back(0); + massesofelements.push_back(neutrallossesbrickdatabase[i].getMass()); + + tmpstr = neutrallossesbrickdatabase[i].getName(); + if (tmpstr.rfind(':') != string::npos) { + tmpstr = tmpstr.substr(tmpstr.rfind(':') + 1); + limitsofelements.push_back(QVariant(tmpstr.c_str()).toInt()); + } + else { + limitsofelements.push_back(0); + } + + tmpstr = neutrallossesbrickdatabase[i].getSummary(); + + if (tmpstr.compare("H") == 0) { + valences.push_back(1); + } + + if (tmpstr.compare("C") == 0) { + valences.push_back(4); + } + + if (tmpstr.compare("O") == 0) { + valences.push_back(2); + } + + if (tmpstr.compare("N") == 0) { + valences.push_back(3); + } + + if (tmpstr.compare("S") == 0) { + valences.push_back(6); + } + + if (tmpstr.compare("P") == 0) { + valences.push_back(5); + } + + if (tmpstr.compare("Li") == 0) { + valences.push_back(1); + } + + if (tmpstr.compare("Na") == 0) { + valences.push_back(1); + } + + if (tmpstr.compare("K") == 0) { + valences.push_back(1); + } + + if (tmpstr.compare("F") == 0) { + valences.push_back(1); + } + + if (tmpstr.compare("Cl") == 0) { + valences.push_back(1); + } + + if (tmpstr.compare("Br") == 0) { + valences.push_back(1); + } + + if (tmpstr.compare("I") == 0) { + valences.push_back(1); + } + + if (tmpstr.compare("Si") == 0) { + valences.push_back(4); + } + } + + if (basicformulacheck && (neutrallossesbrickdatabase.size() > 0) && (neutrallossesbrickdatabase.size() == valences.size())) { + validvalences = true; + + if (os) { + *os << "Filtering using Senior's rules has been enabled." << endl; + } + } + vector combarray; - for (i = 0; i < maximumcombinedlosses; i++) { + for (int i = 0; i < maximumcombinedlosses; i++) { combarray.push_back(0); } map atoms; - map counts; vector max_counts; bool skipcombination; bool bruteforce = false; - if (mode == singlecomparison) { + if ((mode == singlecomparison) || (mode == databasesearch)) { - bruteforce = true; - for (i = 0; i < neutrallossesbrickdatabase.size(); i++) { - if (neutrallossesbrickdatabase[i].getSummaryMap().size() == 1) { - auto it = neutrallossesbrickdatabase[i].getSummaryMap().begin(); - if (it->second != 1) { + if ((peptidetype == other) && (neutrallossesbrickdatabase.size() > 0)) { + + bruteforce = true; + for (int i = 0; i < neutrallossesbrickdatabase.size(); i++) { + if (neutrallossesbrickdatabase[i].getSummaryMap().size() == 1) { + auto it = neutrallossesbrickdatabase[i].getSummaryMap().begin(); + if (it->second != 1) { + bruteforce = false; + break; + } + } + else { bruteforce = false; break; } } - else { - bruteforce = false; - break; - } + } + } + + if (mode == singlecomparison) { + // calculate molecular formula of searched sequence if (bruteforce) { *os << "Brute force fragmentation enabled. Maximum numbers of elements: " << endl; - string upperboundsequence = searchedsequence; - - if (!checkRegex(peptidetype, upperboundsequence, errormessage)) { - return -1; + string formulastr; + if (peptidetype == other) { + formulastr = searchedsequenceformula; } + else { + string upperboundsequence = searchedsequence; - if (!bricksdatabase.replaceAcronymsByIDs(upperboundsequence, errormessage)) { - return -1; - } + //if (!checkRegex(peptidetype, upperboundsequence, errormessage)) { + // return -1; + //} - cSequence tmpsequence; - tmpsequence.setNTterminalModification(searchedsequenceNtermmodif); - tmpsequence.setCTterminalModification(searchedsequenceCtermmodif); - tmpsequence.setBranchModification(searchedsequenceTmodif); - tmpsequence.setPeptideType(peptidetype); + //if (!bricksdatabase.replaceAcronymsByIDs(upperboundsequence, errormessage)) { + // return -1; + //} - int startmodifid, endmodifid, middlemodifid; - if (!checkModifications(tmpsequence, startmodifid, endmodifid, middlemodifid, errormessage)) { - return -1; - } + cSequence tmpsequence; + tmpsequence.setNTterminalModification(searchedsequenceNtermmodif); + tmpsequence.setCTterminalModification(searchedsequenceCtermmodif); + tmpsequence.setBranchModification(searchedsequenceTmodif); + tmpsequence.setPeptideType(peptidetype); - int branchstart, branchend; - vector v; - cCandidate c; - vector netmp; + int startmodifid, endmodifid, middlemodifid; + if (!checkModifications(tmpsequence, startmodifid, endmodifid, middlemodifid, errormessage)) { + return -1; + } + + int branchstart, branchend; + vector v; + cCandidate c; + vector netmp; - parseBranch(peptidetype, upperboundsequence, v, branchstart, branchend); - // startmodifid, endmodifid and middlemodifid were filled up by checkModifications - c.setCandidate(v, netmp, fragmentIonTypeEnd, startmodifid, endmodifid, middlemodifid, branchstart, branchend); - cSummaryFormula formula = c.calculateSummaryFormula(*this, peptidetype, precursormass); + parseBranch(peptidetype, upperboundsequence, v, branchstart, branchend); + // startmodifid, endmodifid and middlemodifid were filled up by checkModifications + c.setCandidate(v, netmp, fragmentIonTypeEnd, startmodifid, endmodifid, middlemodifid, branchstart, branchend); + cSummaryFormula formula = c.calculateSummaryFormulaFromBricks(*this, peptidetype, precursormass); + + formulastr = formula.getSummary(); + } - string formulastr = formula.getSummary(); addStringFormulaToMap(formulastr, atoms); - string tmpstr; - for (i = 0; i < neutrallossesbrickdatabase.size(); i++) { + for (int i = 0; i < neutrallossesbrickdatabase.size(); i++) { tmpstr = neutrallossesbrickdatabase[i].getSummary(); if (atoms.count(tmpstr) == 1) { max_counts.push_back(atoms[tmpstr]); @@ -1174,9 +1563,73 @@ int cParameters::calculateNeutralLosses(bool& terminatecomputation, string& erro } - i = 0; + if ((mode == databasesearch) && (peptidetype == other)) { + + if (bruteforce) { + + *os << "Brute force fragmentation enabled. Maximum numbers of elements: " << endl; + + for (int j = 0; j < neutrallossesbrickdatabase.size(); j++) { + max_counts.push_back(0); + } + + int i = 0; + while (i < sequencedatabase.size()) { + tmpformula.setFormula(sequencedatabase[i].getSummaryFormula()); + tmpstr = "H+"; + tmpformula.addFormula(tmpstr); + tmpstr = (precursorcharge > 0) ? "" : "H-2+-2"; + tmpformula.addFormula(tmpstr); + tmpstr = precursoradduct.empty() ? "" : "H-1"; + tmpformula.addFormula(tmpstr); + tmpstr = precursoradduct; + tmpformula.addFormula(tmpstr); + + if (similaritysearch || isInPpmMassErrorTolerance(charge(uncharge(precursormass, precursorcharge), (precursorcharge > 0) ? 1 : -1), tmpformula.getMass(), precursormasserrortolerance)) { + atoms.clear(); + tmpstr = tmpformula.getSummary(); + tmpstr += (precursorcharge > 0) ? "H-1+-1" : "H+"; + addStringFormulaToMap(tmpstr, atoms); + + for (int j = 0; j < neutrallossesbrickdatabase.size(); j++) { + tmpstr = neutrallossesbrickdatabase[j].getSummary(); + if ((atoms.count(tmpstr) == 1) && (atoms[tmpstr] > max_counts[j])) { + max_counts[j] = atoms[tmpstr]; + } + } + + i++; + } + else { + sequencedatabase.erase(i); + } + } + + for (int j = 0; j < neutrallossesbrickdatabase.size(); j++) { + tmpstr = neutrallossesbrickdatabase[j].getSummary(); + *os << tmpstr << ": " << max_counts[j] << endl; + } + + } + + } + + // to do - change to unsigned long long + int ii = 0; compressformulas = false; - while (neutrallossesbrickdatabase.nextCombination(combarray, numberofbasicbricks, maximumcombinedlosses, 0, uncharge(precursormass, precursorcharge) - minimummz)) { + + if (bruteforce && (peptidetype == other) && ((mode == databasesearch) || (mode == singlecomparison))) { + compressionlimit = 0; + compressformulas = true; + } + + double crop = uncharge(precursormass, precursorcharge) - minimummz; + if (mode == dereplication) { + crop = 0; + } + + //while (neutrallossesbrickdatabase.nextCombination(combarray, numberofbasicbricks, maximumcombinedlosses, 0, uncharge(precursormass, precursorcharge) - minimummz)) { + while (neutrallossesbrickdatabase.nextCombinationFastLimited(combarray, countsofelements, limitsofelements, massesofelements, sumofmasses, numberofbasicbricks, maximumcombinedlosses, 0, crop)) { if (terminatecomputation) { neutrallossesdefinitions.clear(); neutrallossesfortheoreticalspectra.clear(); @@ -1186,23 +1639,9 @@ int cParameters::calculateNeutralLosses(bool& terminatecomputation, string& erro } if (bruteforce) { - counts.clear(); - int cnt = 0; - for (int j = 0; j < maximumcombinedlosses; j++) { - if (combarray[j] == 0) { - break; - } - if (counts.count(combarray[j]) > 0) { - counts[combarray[j]]++; - } - else { - counts[combarray[j]] = 1; - } - } - skipcombination = false; - for (auto& it : counts) { - if (it.second > max_counts[it.first - 1]) { + for (int j = 0; j < numberofbasicbricks; j++) { + if (countsofelements[j] > max_counts[j]) { skipcombination = true; break; } @@ -1213,92 +1652,57 @@ int cParameters::calculateNeutralLosses(bool& terminatecomputation, string& erro } } - getNameOfCompositionFromIntVector(compositionname, combarray); - - tmpbrick.clear(); - tmpbrick.setComposition(compositionname, true); - tmpbrick.setMass(neutrallossesbrickdatabase.getMassOfComposition(combarray, numberofbasicbricks)); - - loss.clear(); - loss.massdifference = -tmpbrick.getMass(); - - intcomposition.clear(); - tmpbrick.explodeToIntComposition(intcomposition); - for (int j = 0; j < (int)intcomposition.size(); j++) { - loss.summary += neutrallossesbrickdatabase[intcomposition[j] - 1].getSummary(); + if (validvalences) { + if (!checkSeniorRules(combarray, valences, 10)) { + continue; + } } - tmpformula.clear(); - tmpformula.addFormula(loss.summary, true); - tmpstring = tmpformula.getSummary(); - addStringFormulaToMap(tmpstring, loss.summarymap); + loss.clear(); + loss.massdifference = -sumofmasses; - undefinedelement = false; - for (auto it = loss.summarymap.begin(); it != loss.summarymap.end(); ++it) { - if ((it->first.compare("H") != 0) && (it->first.compare("C") != 0) && (it->first.compare("O") != 0) && (it->first.compare("N") != 0) && (it->first.compare("S") != 0)) { - undefinedelement = true; + for (int j = 0; j < (int)combarray.size(); j++) { + if ((combarray[j] > 0) && (combarray[j] <= numberofbasicbricks)) { + loss.summary += neutrallossesbrickdatabase[combarray[j] - 1].getSummary(); + } + else { break; } } - valence = 0; - atomscount = 0; - if (loss.summarymap.count("H") > 0) { - valence += -loss.summarymap["H"]; - atomscount += -loss.summarymap["H"]; - } - if (loss.summarymap.count("C") > 0) { - valence += -loss.summarymap["C"] * 4; - atomscount += -loss.summarymap["C"]; - } - if (loss.summarymap.count("O") > 0) { - valence += -loss.summarymap["O"] * 2; - atomscount += -loss.summarymap["O"]; - } - if (loss.summarymap.count("N") > 0) { - valence += -loss.summarymap["N"] * 3; - atomscount += -loss.summarymap["N"]; - } - if (loss.summarymap.count("S") > 0) { - valence += -loss.summarymap["S"] * 6; /* the maximum valence state is used */ - atomscount += -loss.summarymap["S"]; - } - - // SENIOR rule 1 - the sum of valences must be even - // SENIOR rule 3 - the sum of valences >= 2 * (atomscount - maximum number of allowed components in the graph); edges - nodes + components >= 0 - if (!undefinedelement && ((valence % 2 == 1) || (valence < 2 * (atomscount - 10)))) { - //pruned++; - continue; - } - if (compressformulas) { tmpformula.clear(); tmpformula.addFormula(loss.summary); loss.summary = tmpformula.getSummary(); } + tmpformula.clear(); + tmpformula.addFormula(loss.summary, true); + tmpstring = tmpformula.getSummary(); + addStringFormulaToMap(tmpstring, loss.summarymap); + //stringsizeest += sizeof(string) + loss.summary.size(); //mapsizeest += sizeof(loss.summarymap) + loss.summarymap.size() * (sizeof(string) /* the length of string is 1 for HCONS */ + sizeof(int)); //doublesizeest += sizeof(double); neutrallossesdefinitions.push_back(loss); - neutrallossesfortheoreticalspectra.push_back(i); + neutrallossesfortheoreticalspectra.push_back(ii); - i++; + ii++; - if (i == compressionlimit) { + if (ii == compressionlimit) { compressformulas = true; } - if (i % 100000 == 0) { + if (ii % 100000 == 0) { if (os) { - *os << i << " "; + *os << ii << " "; } - //cout << i << " " << pruned << " - " << stringsizeest << " " << mapsizeest << " " << doublesizeest << " " << stringsizeest + mapsizeest + doublesizeest << endl; + //cout << ii << " " << pruned << " - " << stringsizeest << " " << mapsizeest << " " << doublesizeest << " " << stringsizeest + mapsizeest + doublesizeest << endl; } - if (i % 1000000 == 0) { + if (ii % 1000000 == 0) { if (os) { *os << endl; } @@ -1332,6 +1736,701 @@ int cParameters::calculateNeutralLosses(bool& terminatecomputation, string& erro } +int cParameters::generateCompounds(bool& terminatecomputation, string& errormessage) { + sequencedatabase.clear(); + unsigned long long compoundsgenerated = 0; + unsigned long long compoundsused = 0; + unsigned long long compoundslimit = 5000000; + + errormessage = ""; + + if (maximumcombinedlosses == 0) { + return 0; + } + + cSequence seq; + cSummaryFormula tmpformula; + int size; + + cBricksDatabase elementsbrickdatabase; + cBrick tmpbrick; + string tmpstr, tmpstr2; + vector valences; + bool validvalences = false; + + vector limitsofelements; + vector countsofelements; + vector massesofelements; + vector namesofelements; + double elementsratio; + + int numberofbasicbricks = 0; + + double sumofmasses; + double tmpmzdifference; + bool alloutofmz; + int featureshint; + int compoundshint; + bool hintend; + + double minadd = 0; + //double maxadd = 0; + + int countH; + int countC; + int countO; + int countN; + int countS; + int countP; + int countF; + int countCl; + int countBr; + int countSi; + + bool lcms = (peaklistseries.size() > 1) && !((peaklistfileformat == mis) || (peaklistfileformat == imzML)); + + if (os) { + *os << "Generating compounds... " << endl; + } + + for (int i = 0; i < (int)originalneutrallossesfortheoreticalspectra.size(); i++) { + tmpstr = originalneutrallossesdefinitions[originalneutrallossesfortheoreticalspectra[i]].summary; + + if (tmpstr.rfind(':') != string::npos) { + tmpstr = tmpstr.substr(0, tmpstr.rfind(':')); + } + + tmpformula.setFormula(tmpstr, false); + + tmpbrick.clear(); + tmpbrick.setName(originalneutrallossesdefinitions[originalneutrallossesfortheoreticalspectra[i]].summary); + tmpbrick.setComposition(to_string(numberofbasicbricks + 1), false); + tmpbrick.setMass(tmpformula.getMass()); + tmpbrick.setSummary(tmpstr); + tmpbrick.createSummaryMap(); + + if ((tmpbrick.getSummaryMap().size() != 1)) { + errormessage = "Bad input element: " + tmpstr + ". Only single elements can be used in this mode e.g. H, C, O, N, P, S."; + return -1; + } + else { + auto it = tmpbrick.getSummaryMap().begin(); + if (it->second != 1) { + errormessage = "Bad input element: " + tmpstr + ". Only single elements can be used in this mode e.g. H, C, O, N, P, S."; + return -1; + } + } + + elementsbrickdatabase.push_back(tmpbrick); + + numberofbasicbricks++; + } + + elementsbrickdatabase.sortbyMass(); + + int carbonpos = -1; + //bool enablelimitfilter = false; + for (int i = 0; i < elementsbrickdatabase.size(); i++) { + countsofelements.push_back(0); + massesofelements.push_back(elementsbrickdatabase[i].getMass()); + + tmpstr = elementsbrickdatabase[i].getName(); + if (tmpstr.rfind(':') != string::npos) { + tmpstr = tmpstr.substr(tmpstr.rfind(':') + 1); + limitsofelements.push_back(QVariant(tmpstr.c_str()).toInt()); + //enablelimitfilter = true; + } + else { + limitsofelements.push_back(0); + } + + tmpstr = elementsbrickdatabase[i].getSummary(); + namesofelements.push_back(tmpstr); + + if (tmpstr.compare("C") == 0) { + carbonpos = i; + } + + if (tmpstr.compare("H") == 0) { + valences.push_back(1); + } + + if (tmpstr.compare("C") == 0) { + valences.push_back(4); + } + + if (tmpstr.compare("O") == 0) { + valences.push_back(2); + } + + if (tmpstr.compare("N") == 0) { + valences.push_back(3); + } + + if (tmpstr.compare("S") == 0) { + valences.push_back(6); + } + + if (tmpstr.compare("P") == 0) { + valences.push_back(5); + } + + if (tmpstr.compare("Li") == 0) { + valences.push_back(1); + } + + if (tmpstr.compare("Na") == 0) { + valences.push_back(1); + } + + if (tmpstr.compare("K") == 0) { + valences.push_back(1); + } + + if (tmpstr.compare("F") == 0) { + valences.push_back(1); + } + + if (tmpstr.compare("Cl") == 0) { + valences.push_back(1); + } + + if (tmpstr.compare("Br") == 0) { + valences.push_back(1); + } + + if (tmpstr.compare("I") == 0) { + valences.push_back(1); + } + + if (tmpstr.compare("Si") == 0) { + valences.push_back(4); + } + } + + if (basicformulacheck && (elementsbrickdatabase.size() > 0) && (elementsbrickdatabase.size() == valences.size())) { + validvalences = true; + } + + vector combarray; + for (int i = 0; i < maximumcombinedlosses; i++) { + combarray.push_back(0); + } + + if (ionsfortheoreticalspectra.size() > 0) { + minadd = iondefinitions[ionsfortheoreticalspectra[0]].massdifference; + //maxadd = iondefinitions[ionsfortheoreticalspectra[0]].massdifference; + for (int i = 1; i < (int)ionsfortheoreticalspectra.size(); i++) { + if (iondefinitions[ionsfortheoreticalspectra[i]].massdifference < minadd) { + minadd = iondefinitions[ionsfortheoreticalspectra[i]].massdifference; + } + //if (iondefinitions[ionsfortheoreticalspectra[i]].massdifference > maxadd) { + // maxadd = iondefinitions[ionsfortheoreticalspectra[i]].massdifference; + //} + } + } + + //bool skipcombination; + //while (elementsbrickdatabase.nextCombinationFast(combarray, countsofelements, massesofelements, sumofmasses, numberofbasicbricks, maximumcombinedlosses, 0, maximummz)) { + while (elementsbrickdatabase.nextCombinationFastLimited(combarray, countsofelements, limitsofelements, massesofelements, sumofmasses, numberofbasicbricks, maximumcombinedlosses, 0, maximummz - minadd)) { + if (terminatecomputation) { + sequencedatabase.clear(); + errormessage = "Aborted by user."; + return -1; + } + + /*if (enablelimitfilter) { + skipcombination = false; + size = (int)countsofelements.size(); + for (int j = 0; j < size; j++) { + if ((limitsofelements[j] > 0) && (countsofelements[j] > limitsofelements[j])) { + skipcombination = true; + break; + } + } + + if (skipcombination) { + continue; + } + }*/ + + if (validvalences) { + if (!checkSeniorRules(combarray, valences, 1)) { + continue; + } + } + + //sumofmasses = getMassAndCounts(combarray, countsofelements, massesofelements); + + alloutofmz = true; + for (auto& it : ionsfortheoreticalspectra) { + for (int j = 0; j < abs(precursorcharge); j++) { + tmpmzdifference = sumofmasses + iondefinitions[it].massdifference; + if (precursorcharge > 0) { + tmpmzdifference += j * (H - e); + } + else { + tmpmzdifference -= j * (H - e); + } + if (j > 0) { + tmpmzdifference /= (double)(j + 1); + } + if ((tmpmzdifference >= minimummz) && (tmpmzdifference <= maximummz)) { + alloutofmz = false; + } + } + } + + if (alloutofmz) { + continue; + } + + if (advancedformulacheck) { + + countH = 0; + countC = 0; + countO = 0; + countN = 0; + countS = 0; + countP = 0; + countF = 0; + countCl = 0; + countBr = 0; + countSi = 0; + + size = (int)countsofelements.size(); + for (int j = 0; j < size; j++) { + if (countsofelements[j] > 0) { + if (namesofelements[j].compare("H") == 0) { + countH = countsofelements[j]; + continue; + } + if (namesofelements[j].compare("C") == 0) { + countC = countsofelements[j]; + continue; + } + if (namesofelements[j].compare("O") == 0) { + countO = countsofelements[j]; + continue; + } + if (namesofelements[j].compare("N") == 0) { + countN = countsofelements[j]; + continue; + } + if (namesofelements[j].compare("S") == 0) { + countS = countsofelements[j]; + continue; + } + if (namesofelements[j].compare("P") == 0) { + countP = countsofelements[j]; + continue; + } + if (namesofelements[j].compare("F") == 0) { + countF = countsofelements[j]; + continue; + } + if (namesofelements[j].compare("Cl") == 0) { + countCl = countsofelements[j]; + continue; + } + if (namesofelements[j].compare("Br") == 0) { + countBr = countsofelements[j]; + continue; + } + if (namesofelements[j].compare("Si") == 0) { + countSi = countsofelements[j]; + continue; + } + } + } + + if ((countH == 0) || (countC == 0)) { + continue; + } + + if (noratiocheck) { + if (countN > countO) { + continue; + } + } + + if (sumofmasses < 500.0) { + + if (countC > 39) { + continue; + } + if (countH > 72) { + continue; + } + if (countN > 20) { + continue; + } + if (countO > 20) { + continue; + } + if (countP > 9) { + continue; + } + if (countS > 10) { + continue; + } + if (countF > 16) { + continue; + } + if (countCl > 10) { + continue; + } + if (countBr > 5) { + continue; + } + if (countSi > 8) { + continue; + } + + } + else if (sumofmasses < 1000.0) { + + if (countC > 78) { + continue; + } + if (countH > 126) { + continue; + } + if (countN > 25) { + continue; + } + if (countO > 27) { + continue; + } + if (countP > 9) { + continue; + } + if (countS > 14) { + continue; + } + if (countF > 34) { + continue; + } + if (countCl > 12) { + continue; + } + if (countBr > 8) { + continue; + } + if (countSi > 14) { + continue; + } + + } + else if (sumofmasses < 2000.0) { + + if (countC > 156) { + continue; + } + if (countH > 236) { + continue; + } + if (countN > 32) { + continue; + } + if (countO > 63) { + continue; + } + if (countP > 9) { + continue; + } + if (countS > 14) { + continue; + } + if (countF > 48) { + continue; + } + if (countCl > 12) { + continue; + } + if (countBr > 10) { + continue; + } + if (countSi > 15) { + continue; + } + + } + else if (sumofmasses < 3000.0) { + + if (countC > 162) { + continue; + } + if (countH > 208) { + continue; + } + if (countN > 48) { + continue; + } + if (countO > 78) { + continue; + } + if (countP > 9) { + continue; + } + if (countS > 14) { + continue; + } + if (countF > 48) { + continue; + } + if (countCl > 12) { + continue; + } + if (countBr > 10) { + continue; + } + if (countSi > 15) { + continue; + } + + } + + if ((countH > 0) && (countC >= 0)) { + if (countC == 0) { + continue; + } + elementsratio = ((double)(countH)) / ((double)(countC)); + if ((elementsratio < 0.2) || (elementsratio > 3.1)) { + continue; + } + } + + if ((countN > 0) && (countC >= 0)) { + if (countC == 0) { + continue; + } + elementsratio = ((double)(countN)) / ((double)(countC)); + if (elementsratio > 1.3) { + continue; + } + } + + if ((countO > 0) && (countC >= 0)) { + if (countC == 0) { + continue; + } + elementsratio = ((double)(countO)) / ((double)(countC)); + if (elementsratio > 1.2) { + continue; + } + } + + if ((countP > 0) && (countC >= 0)) { + if (countC == 0) { + continue; + } + elementsratio = ((double)(countP)) / ((double)(countC)); + if (elementsratio > 0.3) { + continue; + } + } + + if ((countS > 0) && (countC >= 0)) { + if (countC == 0) { + continue; + } + elementsratio = ((double)(countS)) / ((double)(countC)); + if (elementsratio > 0.8) { + continue; + } + } + + if ((countF > 0) && (countC >= 0)) { + if (countC == 0) { + continue; + } + elementsratio = ((double)(countF)) / ((double)(countC)); + if (elementsratio > 1.5) { + continue; + } + } + + if ((countCl > 0) && (countC >= 0)) { + if (countC == 0) { + continue; + } + elementsratio = ((double)(countCl)) / ((double)(countC)); + if (elementsratio > 0.8) { + continue; + } + } + + if ((countBr > 0) && (countC >= 0)) { + if (countC == 0) { + continue; + } + elementsratio = ((double)(countBr)) / ((double)(countC)); + if (elementsratio > 0.8) { + continue; + } + } + + if ((countSi > 0) && (countC >= 0)) { + if (countC == 0) { + continue; + } + elementsratio = ((double)(countSi)) / ((double)(countC)); + if (elementsratio > 0.5) { + continue; + } + } + + if ((countN > 1) && (countO > 1) && (countP > 1) && (countS > 1)) { + if ((countN >= 10) || (countO >= 20) || (countP >= 4) || (countS >= 3)) { + continue; + } + } + + if ((countN > 3) && (countO > 3) && (countP > 3)) { + if ((countN >= 11) || (countO >= 22) || (countP >= 6)) { + continue; + } + } + + if ((countO > 1) && (countP > 1) && (countS > 1)) { + if ((countO >= 14) || (countP >= 3) || (countS >= 3)) { + continue; + } + } + + if ((countP > 1) && (countS > 1) && (countN > 1)) { + if ((countP >= 3) || (countS >= 3) || (countN >= 4)) { + continue; + } + } + + if ((countN > 6) && (countO > 6) && (countS > 6)) { + if ((countN >= 19) || (countO >= 14) || (countS >= 8)) { + continue; + } + } + + } + + compoundsgenerated++; + + if (!reportunmatchedtheoreticalpeaks) { + + compoundshint = 0; + + for (auto& it : ionsfortheoreticalspectra) { + + for (int j = 0; j < abs(precursorcharge); j++) { + + tmpmzdifference = sumofmasses + iondefinitions[it].massdifference; + if (precursorcharge > 0) { + tmpmzdifference += j * (H - e); + } + else { + tmpmzdifference -= j * (H - e); + } + if (j > 0) { + tmpmzdifference /= (double)(j + 1); + } + + featureshint = 0; + + size = peaklistseries.size(); + for (int k = 0; k < size; k++) { + + if (searchHint(tmpmzdifference, peaklistseries[k], fragmentmasserrortolerance)) { + featureshint++; + } + else { + if (lcms) { + featureshint = 0; + } + } + + hintend = false; + if (lcms || (peaklistfileformat == imzML) || (peaklistfileformat == mis)) { + if (featureshint >= minimumfeaturesize) { + compoundshint++; + hintend = true; + } + } + else { + if (featureshint > 0) { + compoundshint++; + hintend = true; + } + } + + if (hintend) { + break; + } + + } + + if (compoundshint >= minimumiontypes) { + break; + } + + } + + if (compoundshint >= minimumiontypes) { + break; + } + + } + + if (compoundshint < minimumiontypes) { + continue; + } + + } + + tmpstr.clear(); + tmpstr2.clear(); + size = (int)countsofelements.size(); + for (int j = 0; j < size; j++) { + if (countsofelements[j] > 0) { + if (j == carbonpos) { + tmpstr2 = namesofelements[j] + to_string(countsofelements[j]); + } + else { + tmpstr += namesofelements[j] + to_string(countsofelements[j]); + } + } + } + tmpstr = tmpstr2 + tmpstr; + + seq.setName(tmpstr); + seq.setSummaryFormula(tmpstr); + if (compoundsused <= compoundslimit) { + sequencedatabase.push_back(seq); + } + compoundsused++; + + if (compoundsused % 100000 == 0) { + if (os) { + *os << compoundsused << " "; + } + } + + if (compoundsused % 1000000 == 0) { + if (os) { + *os << endl; + } + } + } + + if (os) { + *os << "ok" << endl; + *os << "Number of generated compounds: " << compoundsgenerated << endl; + *os << "Number of used compounds: " << compoundsused << endl << endl; + } + + return 0; +} + + void cParameters::store(ofstream& os) { int size; string s; @@ -1361,6 +2460,7 @@ void cParameters::store(ofstream& os) { os.write((char *)&minimumrelativeintensitythreshold, sizeof(double)); os.write((char *)&minimumabsoluteintensitythreshold, sizeof(unsigned)); os.write((char *)&minimummz, sizeof(double)); + os.write((char *)&maximummz, sizeof(double)); os.write((char *)&fwhm, sizeof(double)); storeString(bricksdatabasefilename, os); @@ -1388,7 +2488,12 @@ void cParameters::store(ofstream& os) { os.write((char *)&generateisotopepattern, sizeof(bool)); os.write((char *)&minimumpatternsize, sizeof(int)); os.write((char *)&minimumfeaturesize, sizeof(int)); - os.write((char *)&allionsmustbepresent, sizeof(bool)); + os.write((char *)&minimumiontypes, sizeof(int)); + os.write((char *)&basicformulacheck, sizeof(bool)); + os.write((char *)&advancedformulacheck, sizeof(bool)); + os.write((char *)&noratiocheck, sizeof(bool)); + os.write((char *)&mzdifftolerance, sizeof(double)); + os.write((char *)&intensitytolerance, sizeof(double)); os.write((char *)&cyclicnterminus, sizeof(bool)); os.write((char *)&cycliccterminus, sizeof(bool)); os.write((char *)&internalfragments, sizeof(bool)); @@ -1404,6 +2509,7 @@ void cParameters::store(ofstream& os) { storeString(searchedsequenceNtermmodif, os); storeString(searchedsequenceCtermmodif, os); storeString(searchedsequenceTmodif, os); + storeString(searchedsequenceformula, os); os.write((char *)&maximumnumberofcandidates, sizeof(int)); os.write((char *)&blindedges, sizeof(int)); @@ -1491,6 +2597,7 @@ void cParameters::load(ifstream& is) { is.read((char *)&minimumrelativeintensitythreshold, sizeof(double)); is.read((char *)&minimumabsoluteintensitythreshold, sizeof(unsigned)); is.read((char *)&minimummz, sizeof(double)); + is.read((char *)&maximummz, sizeof(double)); is.read((char *)&fwhm, sizeof(double)); loadString(bricksdatabasefilename, is); @@ -1518,7 +2625,12 @@ void cParameters::load(ifstream& is) { is.read((char *)&generateisotopepattern, sizeof(bool)); is.read((char *)&minimumpatternsize, sizeof(int)); is.read((char *)&minimumfeaturesize, sizeof(int)); - is.read((char *)&allionsmustbepresent, sizeof(bool)); + is.read((char *)&minimumiontypes, sizeof(int)); + is.read((char *)&basicformulacheck, sizeof(bool)); + is.read((char *)&advancedformulacheck, sizeof(bool)); + is.read((char *)&noratiocheck, sizeof(bool)); + is.read((char *)&mzdifftolerance, sizeof(double)); + is.read((char *)&intensitytolerance, sizeof(double)); is.read((char *)&cyclicnterminus, sizeof(bool)); is.read((char *)&cycliccterminus, sizeof(bool)); is.read((char *)&internalfragments, sizeof(bool)); @@ -1534,6 +2646,7 @@ void cParameters::load(ifstream& is) { loadString(searchedsequenceNtermmodif, is); loadString(searchedsequenceCtermmodif, is); loadString(searchedsequenceTmodif, is); + loadString(searchedsequenceformula, is); is.read((char *)&maximumnumberofcandidates, sizeof(int)); is.read((char *)&blindedges, sizeof(int)); diff --git a/CycloBranch/core/cParameters.h b/CycloBranch/core/cParameters.h index e1c9606..30f6811 100644 --- a/CycloBranch/core/cParameters.h +++ b/CycloBranch/core/cParameters.h @@ -58,6 +58,13 @@ class cParameters { cMainThread* os; + void fixIntensities(cPeaksList& centroidspectrum, cPeaksList& profilespectrum); + + bool checkSeniorRules(vector& combarray, vector& valences, int maxcomponents); + + //double getMassAndCounts(vector& combarray, vector& countsofelements, vector& massesofelements); + + public: @@ -164,11 +171,17 @@ class cParameters { /** - \brief Minimum mz. + \brief Minimum m/z ratio. */ double minimummz; + /** + \brief Maximum m/z ratio. + */ + double maximummz; + + /** \brief FWHM. */ @@ -278,9 +291,39 @@ class cParameters { /** - \brief If true, all ions must be annotated in a spectrum for a compound to be reported. + \brief The minimum number of ion types which must be matched to report a given compound. + */ + int minimumiontypes; + + + /** + \brief Apply Senior's filtering rules. */ - bool allionsmustbepresent; + bool basicformulacheck; + + + /** + \brief Advanced filtering rules are aplied if compounds are generated in MS mode. + */ + bool advancedformulacheck; + + + /** + \brief Check N/O ratio. + */ + bool noratiocheck; + + + /** + \brief Maximum m/z tolerance of matched isotopes. + */ + double mzdifftolerance; + + + /** + \brief Maximum tolerance of intensities of matched isotopes. + */ + double intensitytolerance; /** @@ -367,6 +410,12 @@ class cParameters { string searchedsequenceTmodif; + /** + \brief Formula of searched sequence. + */ + string searchedsequenceformula; + + /** \brief Maximum number of peptide sequence candidates. */ @@ -501,6 +550,14 @@ class cParameters { int checkAndPrepare(bool& terminatecomputation); + /** + \brief Prepare neutral losses and compounds. + \param terminatecomputation reference to a variable determining that the computation must be stopped + \retval int -1 when an error occurred, 0 otherwise + */ + int prepareLossesAndCompounds(bool& terminatecomputation); + + /** \brief Check if the names of modifications used in a sequence are correct. \param sequence an input sequence @@ -542,6 +599,15 @@ class cParameters { int calculateNeutralLosses(bool& terminatecomputation, string& errormessage); + /** + \brief Generate compounds. + \param terminatecomputation reference to a variable determining that the computation must be stopped + \param errormessage an error message if failed + \retval int -1 when an error occurred, 0 otherwise + */ + int generateCompounds(bool& terminatecomputation, string& errormessage); + + /** \brief Store the structure into an output stream. \param os an output stream diff --git a/CycloBranch/core/cPeakListSeries.cpp b/CycloBranch/core/cPeakListSeries.cpp index a415483..5c4b937 100644 --- a/CycloBranch/core/cPeakListSeries.cpp +++ b/CycloBranch/core/cPeakListSeries.cpp @@ -106,7 +106,7 @@ int cPeakListSeries::loadFromProfileApexStream(string& filename, ifstream &strea mgfofstream << "BEGIN IONS" << endl; mgfofstream << "TITLE=" << title << endl; - mgfofstream << "SCAN=" << to_string(count + 1) << endl; + mgfofstream << "SCANS=" << to_string(count + 1) << endl; mgfofstream << "PEPMASS=1" << endl; mgfofstream << "RTINSECONDS=1" << endl; mgfofstream << "CHARGE=1+" << endl << endl; @@ -186,7 +186,7 @@ int cPeakListSeries::loadFromMZMLStream(string& mzmlfilename, ifstream &mzmlstre *os << "Loading the mzML file, spectrum no. : "; cMzML mzml; - int resultcode = mzml.parse(mzmlfilename, peaklists, mode, os, terminatecomputation); + int resultcode = mzml.parse(mzmlfilename, peaklists, -1, mode, os, terminatecomputation); if (resultcode != 0) { peaklists.clear(); return resultcode; @@ -199,7 +199,7 @@ int cPeakListSeries::loadFromMZMLStream(string& mzmlfilename, ifstream &mzmlstre string mgfname = mzmlfilename.substr(0, (int)mzmlfilename.size() - 4); *os << "ok" << endl; - if (mode == dereplication) { + if ((mode == dereplication) || (mode == compoundsearch)) { *os << "Total number of MS spectra: "; } else { @@ -253,7 +253,7 @@ int cPeakListSeries::loadFromMZMLStream(string& mzmlfilename, ifstream &mzmlstre else { *os << "ok" << endl; - if (mode == dereplication) { + if ((mode == dereplication) || (mode == compoundsearch)) { *os << "Total number of MS spectra: "; } else { @@ -312,7 +312,7 @@ int cPeakListSeries::loadFromIMZMLStream(string& imzmlfilename, ifstream &ibdstr if (rawdata) { mgfofstream << "BEGIN IONS" << endl; mgfofstream << "TITLE=" << endl; - mgfofstream << "SCAN=" << to_string(i + 1) << endl; + mgfofstream << "SCANS=" << to_string(i + 1) << endl; mgfofstream << "PEPMASS=1" << endl; mgfofstream << "RTINSECONDS=1" << endl; mgfofstream << "CHARGE=1+" << endl << endl; diff --git a/CycloBranch/core/cPeaksList.cpp b/CycloBranch/core/cPeaksList.cpp index 22af4e8..548d059 100644 --- a/CycloBranch/core/cPeaksList.cpp +++ b/CycloBranch/core/cPeaksList.cpp @@ -18,6 +18,28 @@ double ppmError(double experimentalmass, double theoreticalmass) { } +bool searchHint(double mzratio, cPeaksList& experimentalpeaks, double fragmentmasserrortolerance) { + int left, right, middle; + int experimentalpeakssize = experimentalpeaks.size(); + + left = 0; + right = experimentalpeakssize - 1; + while (left <= right) { + middle = (left + right) / 2; + if (isInPpmMassErrorTolerance(experimentalpeaks[middle].mzratio, mzratio, fragmentmasserrortolerance)) { + return true; + } + if (mzratio < experimentalpeaks[middle].mzratio) { + right = middle - 1; + } + else { + left = middle + 1; + } + } + return false; +} + + cPeaksList::cPeaksList() { clear(); } @@ -30,6 +52,7 @@ cPeaksList::cPeaksList(const cPeaksList& peakslist) { cPeaksList& cPeaksList::operator=(const cPeaksList& peakslist) { peaks = peakslist.peaks; + rt = peakslist.rt; x = peakslist.x; y = peakslist.y; title = peakslist.title; @@ -39,6 +62,7 @@ cPeaksList& cPeaksList::operator=(const cPeaksList& peakslist) { void cPeaksList::clear() { peaks.clear(); + rt = 0; x = 0; y = 0; title = ""; @@ -203,7 +227,7 @@ void cPeaksList::storeToIBDStream(ofstream &ibdstream, bool use_64bit_float_mz_p void cPeaksList::loadFromMGFStream(ifstream &stream) { - string s; + string s, tmps; cPeak p; size_t pos; @@ -222,6 +246,17 @@ void cPeaksList::loadFromMGFStream(ifstream &stream) { if (s.substr(0, 6).compare("TITLE=") == 0) { title = s.substr(6); } + if (s.substr(0, 11).compare("RTINSECONDS") == 0) { + pos = s.find('='); + if (pos != string::npos) { + tmps = s.substr(pos + 1); + pos = tmps.find('-'); + if (pos != string::npos) { + tmps = tmps.substr(0, pos); + } + rt = atof(tmps.c_str()); + } + } } while (stream.good() && !(strstr(s.c_str(),"END IONS"))) { @@ -729,6 +764,17 @@ double cPeaksList::getMaximumAbsoluteIntensity() { } +void cPeaksList::setRetentionTime(double rt) { + this->rt = rt; +} + + + +double cPeaksList::getRetentionTime() { + return rt; +} + + void cPeaksList::setCoordinates(int x, int y) { this->x = x; this->y = y; @@ -755,6 +801,8 @@ void cPeaksList::store(ofstream& os) { peaks[i].store(os); } + os.write((char *)&rt, sizeof(double)); + os.write((char *)&x, sizeof(int)); os.write((char *)&y, sizeof(int)); @@ -772,6 +820,8 @@ void cPeaksList::load(ifstream& is) { peaks[i].load(is); } + is.read((char *)&rt, sizeof(double)); + is.read((char *)&x, sizeof(int)); is.read((char *)&y, sizeof(int)); diff --git a/CycloBranch/core/cPeaksList.h b/CycloBranch/core/cPeaksList.h index 28280d4..a8bb2c8 100644 --- a/CycloBranch/core/cPeaksList.h +++ b/CycloBranch/core/cPeaksList.h @@ -52,13 +52,27 @@ bool isInPpmMassErrorTolerance(double experimentalmass, double theoreticalmass, double ppmError(double experimentalmass, double theoreticalmass); +/** + \brief Check if an m/z ratio exists in an experimental spectrum. + \param mzratio theoretical m/z ratio + \param experimentalpeaks an input experimental spectrum (sorted in ascending order) + \param fragmentmasserrortolerance m/z error tolerance + \retval true if the theoretical m/z ratio was mathed; false otherwise +*/ +bool searchHint(double mzratio, cPeaksList& experimentalpeaks, double fragmentmasserrortolerance); + + /** \brief The class representing a peak list. */ class cPeaksList { vector peaks; + + double rt; + int x, y; + string title; public: @@ -359,6 +373,20 @@ class cPeaksList { double getMaximumAbsoluteIntensity(); + /** + \brief Set the retention time. + \param rt retention time + */ + void setRetentionTime(double rt); + + + /** + \brief Get the retention time. + \retval double retention time + */ + double getRetentionTime(); + + /** \brief Set the coordinates. \param x X coordinate diff --git a/CycloBranch/core/cSequence.cpp b/CycloBranch/core/cSequence.cpp index 872f63c..f9a002e 100644 --- a/CycloBranch/core/cSequence.cpp +++ b/CycloBranch/core/cSequence.cpp @@ -117,8 +117,16 @@ string& cSequence::getBranchModification() { string cSequence::getNameWithReferenceAsHTMLString() { - regex rx; + // performance improvement - quick return without regex_search string s = ""; + if (reference.empty()) { + s += ""; + s += name; + s += ""; + return s; + } + + regex rx; bool correctreference = false; try { @@ -127,7 +135,7 @@ string cSequence::getNameWithReferenceAsHTMLString() { if (!correctreference) { rx = "^CSID: [0-9]+$"; if (regex_search(reference, rx)) { - s += ""; + s += ""; s += name; s += ""; correctreference = true; @@ -138,7 +146,18 @@ string cSequence::getNameWithReferenceAsHTMLString() { if (!correctreference) { rx = "^CID: [0-9]+$"; if (regex_search(reference, rx)) { - s += ""; + s += ""; + s += name; + s += ""; + correctreference = true; + } + } + + // ChEBI + if (!correctreference) { + rx = "^CHEBI: [0-9]+$"; + if (regex_search(reference, rx)) { + s += ""; s += name; s += ""; correctreference = true; @@ -149,7 +168,7 @@ string cSequence::getNameWithReferenceAsHTMLString() { if (!correctreference) { rx = "^NOR[0-9]+$"; if (regex_search(reference, rx)) { - s += ""; + s += ""; s += name; s += ""; correctreference = true; @@ -160,7 +179,7 @@ string cSequence::getNameWithReferenceAsHTMLString() { if (!correctreference) { rx = "^LM([A-Z]|[0-9])+$"; if (regex_search(reference, rx)) { - s += ""; + s += ""; s += name; s += ""; correctreference = true; @@ -171,7 +190,7 @@ string cSequence::getNameWithReferenceAsHTMLString() { if (!correctreference) { rx = "^C[0-9]{5}$"; if (regex_search(reference, rx)) { - s += ""; + s += ""; s += name; s += ""; correctreference = true; @@ -200,6 +219,28 @@ string cSequence::getNameWithReferenceAsHTMLString() { } } + // Siderophore Base (undocumented) + if (!correctreference) { + rx = "^SB: [0-9]+$"; + if (regex_search(reference, rx)) { + s += ""; + s += name; + s += ""; + correctreference = true; + } + } + + // MIBIG (undocumented) + if (!correctreference) { + rx = "^MIBIG: BGC[0-9]+$"; + if (regex_search(reference, rx)) { + s += ""; + s += name; + s += ""; + correctreference = true; + } + } + // DOI if (!correctreference) { rx = "^DOI: "; @@ -217,7 +258,9 @@ string cSequence::getNameWithReferenceAsHTMLString() { } if (!correctreference) { - s = name; + s += ""; + s += name; + s += ""; } return s; diff --git a/CycloBranch/core/cSequenceDatabase.cpp b/CycloBranch/core/cSequenceDatabase.cpp index a547ade..e0472df 100644 --- a/CycloBranch/core/cSequenceDatabase.cpp +++ b/CycloBranch/core/cSequenceDatabase.cpp @@ -157,6 +157,13 @@ void cSequenceDatabase::push_back(cSequence& sequence) { } +void cSequenceDatabase::erase(int index) { + if ((index >= 0) && (index < (int)sequences.size())) { + sequences.erase(sequences.begin() + index); + } +} + + void cSequenceDatabase::store(ofstream& os) { int size; diff --git a/CycloBranch/core/cSequenceDatabase.h b/CycloBranch/core/cSequenceDatabase.h index 217f1b9..5d7e7bd 100644 --- a/CycloBranch/core/cSequenceDatabase.h +++ b/CycloBranch/core/cSequenceDatabase.h @@ -79,6 +79,13 @@ class cSequenceDatabase { void push_back(cSequence& sequence); + /** + \brief Erase a sequence. + \param index index of a sequence + */ + void erase(int index); + + /** \brief Store the structure into an output stream. \param os an output stream diff --git a/CycloBranch/core/cSummaryFormula.cpp b/CycloBranch/core/cSummaryFormula.cpp index e2cdfc5..c558dd7 100644 --- a/CycloBranch/core/cSummaryFormula.cpp +++ b/CycloBranch/core/cSummaryFormula.cpp @@ -139,10 +139,11 @@ void rechargeMap(int charge, map& atoms) { } -void cSummaryFormula::combineAtoms(cPeakListSeries& peaklistseries, cPeaksList& isotopeprofile, int depth, double mass, double intensity, int charge, string description, double minimumabsoluteintensity) { - if (depth < peaklistseries.size()) { - for (int i = 0; i < peaklistseries[depth].size(); i++) { - combineAtoms(peaklistseries, isotopeprofile, depth + 1, mass + peaklistseries[depth][i].mzratio, intensity * peaklistseries[depth][i].absoluteintensity, charge, description + peaklistseries[depth][i].description, minimumabsoluteintensity); +void cSummaryFormula::combineAtoms(cPeakListSeries& peaklistseries, int peaklistseriessize, vector& peaklistseriessizes, cPeaksList& isotopeprofile, vector& depthvector, int depth, double mass, double intensity, int charge, double minimumabsoluteintensity) { + if (depth < peaklistseriessize) { + for (int i = 0; i < peaklistseriessizes[depth]; i++) { + depthvector[depth] = i; + combineAtoms(peaklistseries, peaklistseriessize, peaklistseriessizes, isotopeprofile, depthvector, depth + 1, mass + peaklistseries[depth][i].mzratio, intensity * peaklistseries[depth][i].absoluteintensity, charge, minimumabsoluteintensity); } } else { @@ -150,7 +151,9 @@ void cSummaryFormula::combineAtoms(cPeakListSeries& peaklistseries, cPeaksList& cPeak p; p.mzratio = mass/(double)charge; p.absoluteintensity = intensity; - p.description = description; + for (int i = 0; i < peaklistseriessize; i++) { + p.description += peaklistseries[i][depthvector[i]].description; + } isotopeprofile.add(p); } } @@ -216,7 +219,9 @@ void cSummaryFormula::getIsotopeSummary(string& description, cBricksDatabase& br if (isotopesummary[i] != 0) { description += bricks[i].getSummary(); if ((isotopesummary[i] != 1)) { - description += "" + to_string(isotopesummary[i]) + ""; + //description += ""; + description += to_string(isotopesummary[i]); + //description += ""; } description += " "; } @@ -579,8 +584,19 @@ cPeaksList cSummaryFormula::getIsotopePattern(double fwhm, int charge, bool posi peaklistseries.addPeakList(peaklist); } + int peaklistseriessize = peaklistseries.size(); + + vector peaklistseriessizes; + peaklistseriessizes.resize(peaklistseriessize); + for (int i = 0; i < peaklistseriessize; i++) { + peaklistseriessizes[i] = peaklistseries[i].size(); + } + + vector depthvector; + depthvector.resize(peaklistseriessize); + cPeaksList isotopeprofile; - combineAtoms(peaklistseries, isotopeprofile, 0, 0, 1, charge, "", 0.00001); + combineAtoms(peaklistseries, peaklistseriessize, peaklistseriessizes, isotopeprofile, depthvector, 0, 0, 1, charge, 0.00001); isotopeprofile.normalizeIntenzity(); isotopeprofile.cropRelativeIntenzity(0.1); diff --git a/CycloBranch/core/cSummaryFormula.h b/CycloBranch/core/cSummaryFormula.h index 17676d8..420d717 100644 --- a/CycloBranch/core/cSummaryFormula.h +++ b/CycloBranch/core/cSummaryFormula.h @@ -62,7 +62,7 @@ class cSummaryFormula { string formula; - void combineAtoms(cPeakListSeries& peaklistseries, cPeaksList& isotopeprofile, int depth, double mass, double intensity, int charge, string description, double minimumabsoluteintensity); + void combineAtoms(cPeakListSeries& peaklistseries, int peaklistseriessize, vector& peaklistseriessizes, cPeaksList& isotopeprofile, vector& depthvector, int depth, double mass, double intensity, int charge, double minimumabsoluteintensity); double getIntensity(cBricksDatabase& bricksprobabilities, vector& combarray, int mostintenseid, int mostintenseatomscount, int isotopecount); diff --git a/CycloBranch/core/cTheoreticalSpectrum.cpp b/CycloBranch/core/cTheoreticalSpectrum.cpp index 543dccd..d456eac 100644 --- a/CycloBranch/core/cTheoreticalSpectrum.cpp +++ b/CycloBranch/core/cTheoreticalSpectrum.cpp @@ -34,7 +34,7 @@ int getNumberOfScoreHits(vector& scores, double value) { } -void visualSeries::store(ofstream& os) { +void matchedSeries::store(ofstream& os) { int size; size = (int)series.size(); @@ -47,7 +47,7 @@ void visualSeries::store(ofstream& os) { } -void visualSeries::load(ifstream& is) { +void matchedSeries::load(ifstream& is) { int size; is.read((char *)&size, sizeof(int)); @@ -132,28 +132,6 @@ void cTheoreticalSpectrum::searchForPeakPairs(cPeaksList& theoreticalpeaks, int } -bool cTheoreticalSpectrum::searchHint(double mzratio, cPeaksList& experimentalpeaks, double fragmentmasserrortolerance) { - int left, right, middle; - int experimentalpeakssize = experimentalpeaks.size(); - - left = 0; - right = experimentalpeakssize - 1; - while (left <= right) { - middle = (left + right) / 2; - if (isInPpmMassErrorTolerance(experimentalpeaks[middle].mzratio, mzratio, fragmentmasserrortolerance)) { - return true; - } - if (mzratio < experimentalpeaks[middle].mzratio) { - right = middle - 1; - } - else { - left = middle + 1; - } - } - return false; -} - - void cTheoreticalSpectrum::computeStatistics(bool writedescription) { experimentalpeaksmatched = 0; scrambledpeaksmatched = 0; @@ -263,11 +241,16 @@ void cTheoreticalSpectrum::generateChargedFragments(cPeak& peak, map& intcomposition, cBricksDatabase& bricksdatabasewithcombinations, int& theoreticalpeaksrealsize, bool writedescription) { cPeak peak; int starttype, endtype; + set usedmodifications; usedmodifications.insert(0); map atoms, tempmap; - atoms.clear(); + + vector currentlosses; + vector fragmentlossmass; + vector fragmentlosssummary; + vector< map > fragmentlossmap; bool disablesummary = false; if ((parameters->mode == denovoengine) && (parameters->blindedges == 2)) { @@ -281,70 +264,69 @@ void cTheoreticalSpectrum::generatePrecursorIon(vector& intcomposition, cBr peak.isotope = false; - switch (parameters->peptidetype) - { - case linear: - peak.mzratio = parameters->searchedmodifications[candidate.getStartModifID()].massdifference + parameters->searchedmodifications[candidate.getEndModifID()].massdifference; - if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { - addStringFormulaToMap(parameters->searchedmodifications[candidate.getStartModifID()].summary, atoms); - addStringFormulaToMap(parameters->searchedmodifications[candidate.getEndModifID()].summary, atoms); - } - peak.seriesid = 0; - starttype = (int)precursor_ion; - endtype = (int)precursor_ion; - usedmodifications.insert(candidate.getStartModifID()); - usedmodifications.insert(candidate.getEndModifID()); - break; - case cyclic: - peak.mzratio = 0; - peak.seriesid = (int)intcomposition.size() - 1; - starttype = (int)cyclic_precursor_ion; - endtype = (int)cyclic_precursor_ion; - break; - case branched: - peak.mzratio = parameters->searchedmodifications[candidate.getStartModifID()].massdifference + parameters->searchedmodifications[candidate.getEndModifID()].massdifference + parameters->searchedmodifications[candidate.getMiddleModifID()].massdifference; - if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { - addStringFormulaToMap(parameters->searchedmodifications[candidate.getStartModifID()].summary, atoms); - addStringFormulaToMap(parameters->searchedmodifications[candidate.getEndModifID()].summary, atoms); - addStringFormulaToMap(parameters->searchedmodifications[candidate.getMiddleModifID()].summary, atoms); - } - peak.seriesid = 0; - starttype = (int)precursor_ion; - endtype = (int)precursor_ion; - usedmodifications.insert(candidate.getStartModifID()); - usedmodifications.insert(candidate.getEndModifID()); - usedmodifications.insert(candidate.getMiddleModifID()); - break; - case branchcyclic: - peak.mzratio = parameters->searchedmodifications[candidate.getMiddleModifID()].massdifference; - if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { - addStringFormulaToMap(parameters->searchedmodifications[candidate.getMiddleModifID()].summary, atoms); - } - peak.seriesid = 0; - starttype = (int)cyclic_precursor_ion; - endtype = (int)cyclic_precursor_ion; - usedmodifications.insert(candidate.getMiddleModifID()); - break; - case linearpolyketide: - peak.mzratio = parameters->searchedmodifications[candidate.getStartModifID()].massdifference + parameters->searchedmodifications[candidate.getEndModifID()].massdifference; - if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { - addStringFormulaToMap(parameters->searchedmodifications[candidate.getStartModifID()].summary, atoms); - addStringFormulaToMap(parameters->searchedmodifications[candidate.getEndModifID()].summary, atoms); - } - peak.seriesid = 0; - usedmodifications.insert(candidate.getStartModifID()); - usedmodifications.insert(candidate.getEndModifID()); - break; - case cyclicpolyketide: - peak.mzratio = 0; - peak.seriesid = (int)intcomposition.size() - 1; - starttype = (int)cyclic_polyketide_precursor_ion; - endtype = (int)cyclic_polyketide_precursor_ion; - break; - case other: - break; - default: - break; + switch (parameters->peptidetype) { + case linear: + peak.mzratio = parameters->searchedmodifications[candidate.getStartModifID()].massdifference + parameters->searchedmodifications[candidate.getEndModifID()].massdifference; + if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { + addStringFormulaToMap(parameters->searchedmodifications[candidate.getStartModifID()].summary, atoms); + addStringFormulaToMap(parameters->searchedmodifications[candidate.getEndModifID()].summary, atoms); + } + peak.seriesid = 0; + starttype = (int)precursor_ion; + endtype = (int)precursor_ion; + usedmodifications.insert(candidate.getStartModifID()); + usedmodifications.insert(candidate.getEndModifID()); + break; + case cyclic: + peak.mzratio = 0; + peak.seriesid = (int)intcomposition.size() - 1; + starttype = (int)cyclic_precursor_ion; + endtype = (int)cyclic_precursor_ion; + break; + case branched: + peak.mzratio = parameters->searchedmodifications[candidate.getStartModifID()].massdifference + parameters->searchedmodifications[candidate.getEndModifID()].massdifference + parameters->searchedmodifications[candidate.getMiddleModifID()].massdifference; + if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { + addStringFormulaToMap(parameters->searchedmodifications[candidate.getStartModifID()].summary, atoms); + addStringFormulaToMap(parameters->searchedmodifications[candidate.getEndModifID()].summary, atoms); + addStringFormulaToMap(parameters->searchedmodifications[candidate.getMiddleModifID()].summary, atoms); + } + peak.seriesid = 0; + starttype = (int)precursor_ion; + endtype = (int)precursor_ion; + usedmodifications.insert(candidate.getStartModifID()); + usedmodifications.insert(candidate.getEndModifID()); + usedmodifications.insert(candidate.getMiddleModifID()); + break; + case branchcyclic: + peak.mzratio = parameters->searchedmodifications[candidate.getMiddleModifID()].massdifference; + if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { + addStringFormulaToMap(parameters->searchedmodifications[candidate.getMiddleModifID()].summary, atoms); + } + peak.seriesid = 0; + starttype = (int)cyclic_precursor_ion; + endtype = (int)cyclic_precursor_ion; + usedmodifications.insert(candidate.getMiddleModifID()); + break; + case linearpolyketide: + peak.mzratio = parameters->searchedmodifications[candidate.getStartModifID()].massdifference + parameters->searchedmodifications[candidate.getEndModifID()].massdifference; + if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { + addStringFormulaToMap(parameters->searchedmodifications[candidate.getStartModifID()].summary, atoms); + addStringFormulaToMap(parameters->searchedmodifications[candidate.getEndModifID()].summary, atoms); + } + peak.seriesid = 0; + usedmodifications.insert(candidate.getStartModifID()); + usedmodifications.insert(candidate.getEndModifID()); + break; + case cyclicpolyketide: + peak.mzratio = 0; + peak.seriesid = (int)intcomposition.size() - 1; + starttype = (int)cyclic_polyketide_precursor_ion; + endtype = (int)cyclic_polyketide_precursor_ion; + break; + case other: + break; + default: + break; } for (int i = 0; i < (int)intcomposition.size(); i++) { @@ -352,6 +334,9 @@ void cTheoreticalSpectrum::generatePrecursorIon(vector& intcomposition, cBr if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { mergeMaps(bricksdatabasewithcombinations[intcomposition[i] - 1].getSummaryMap(), atoms); } + + // to do - performance optimization - no need to recalculate everything in every iteration + updateListOfNeutralLosses(bricksdatabasewithcombinations, bricksdatabasewithcombinations[intcomposition[i] - 1], currentlosses, fragmentlossmass, fragmentlosssummary, fragmentlossmap, writedescription, disablesummary); } if (parameters->peptidetype == linearpolyketide) { @@ -390,132 +375,317 @@ void cTheoreticalSpectrum::generatePrecursorIon(vector& intcomposition, cBr endtype = (int)linear_polyketide_precursor_ion_h_h; } } - + double tempratio = peak.mzratio; + for (int i = starttype; i <= endtype; i++) { + for (int j = -1; j < (int)parameters->neutrallossesfortheoreticalspectra.size(); j++) { - for (set::iterator it = usedmodifications.begin(); it != usedmodifications.end(); ++it) { - for (int k = 1; k <= abs(parameters->precursorcharge); k++) { - peak.iontype = (eFragmentIonType)i; - peak.neutrallosstype = (j == -1) ? -1 : parameters->neutrallossesfortheoreticalspectra[j]; - peak.mzratio = tempratio + parameters->iondefinitions[(eFragmentIonType)i].massdifference - parameters->searchedmodifications[*it].massdifference; - if (j >= 0) { - peak.mzratio += parameters->neutrallossesdefinitions[peak.neutrallosstype].massdifference; - } - peak.mzratio = charge(uncharge(peak.mzratio, 1), (parameters->precursorcharge > 0) ? k : -k); - peak.charge = (parameters->precursorcharge > 0) ? k : -k; - if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { - tempmap = atoms; - mergeMaps(parameters->iondefinitions[(eFragmentIonType)i].summarymap, tempmap); - if (j >= 0) { - mergeMaps(parameters->neutrallossesdefinitions[peak.neutrallosstype].summarymap, tempmap); - } - rechargeMap(peak.charge, tempmap); - peak.formula.setFromMap(tempmap, false); - peak.formula.addFormula(parameters->searchedmodifications[*it].summary, true); - } + for (auto it = usedmodifications.begin(); it != usedmodifications.end(); ++it) { - if (writedescription) { - string str; + for (int k = -1; k < (int)fragmentlossmass.size(); k++) { + + for (int m = 1; m <= abs(parameters->precursorcharge); m++) { - peak.description = parameters->iondefinitions[(eFragmentIonType)i].name; + peak.iontype = (eFragmentIonType)i; + peak.neutrallosstype = (j == -1) ? -1 : parameters->neutrallossesfortheoreticalspectra[j]; + peak.mzratio = tempratio + parameters->iondefinitions[(eFragmentIonType)i].massdifference - parameters->searchedmodifications[*it].massdifference; if (j >= 0) { - peak.description += "-" + parameters->neutrallossesdefinitions[peak.neutrallosstype].summary; + peak.mzratio += parameters->neutrallossesdefinitions[peak.neutrallosstype].massdifference; + } + if (k >= 0) { + peak.mzratio += fragmentlossmass[k]; } - if (*it > 0) { - peak.description += " (" + parameters->searchedmodifications[*it].name + " loss)"; + peak.mzratio = charge(uncharge(peak.mzratio, 1), (parameters->precursorcharge > 0) ? m : -m); + peak.charge = (parameters->precursorcharge > 0) ? m : -m; + + if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { + tempmap = atoms; + mergeMaps(parameters->iondefinitions[(eFragmentIonType)i].summarymap, tempmap); + if (j >= 0) { + mergeMaps(parameters->neutrallossesdefinitions[peak.neutrallosstype].summarymap, tempmap); + } + if (k >= 0) { + mergeMaps(fragmentlossmap[k], tempmap); + } + rechargeMap(peak.charge, tempmap); + peak.formula.setFromMap(tempmap, false); + peak.formula.addFormula(parameters->searchedmodifications[*it].summary, true); } - peak.description += ":"; - - if (parameters->precursorcharge > 0) { - if (!parameters->precursoradduct.empty()) { - str = "+" + parameters->precursoradduct; - if (k > 1) { - str += "+"; - if (k > 2) { - str += to_string(k - 1); + + if (writedescription) { + string str; + + peak.description = parameters->iondefinitions[(eFragmentIonType)i].name; + if ((k >= 0) || (j >= 0)) { + peak.description += " -"; + if (k >= 0) { + peak.description += fragmentlosssummary[k]; + } + if (j >= 0) { + peak.description += parameters->neutrallossesdefinitions[peak.neutrallosstype].summary; + } + } + if (*it > 0) { + peak.description += " (" + parameters->searchedmodifications[*it].name + " loss)"; + } + peak.description += ":"; + + if (parameters->precursorcharge > 0) { + if (!parameters->precursoradduct.empty()) { + str = "+" + parameters->precursoradduct; + if (m > 1) { + str += "+"; + if (m > 2) { + str += to_string(m - 1); + } + str += "H"; + } + peak.description.replace(peak.description.find("+zH"), 3, str); + } + else { + str = "+"; + if (m > 1) { + str += to_string(m); } str += "H"; + peak.description.replace(peak.description.find("+zH"), 3, str); + } + + str = "]"; + if (m > 1) { + str += to_string(m); } - peak.description.replace(peak.description.find("+zH"), 3, str); + str += "+"; + peak.description.replace(peak.description.find("]+"), 2, str); } else { - str = "+"; - if (k > 1) { - str += to_string(k); + if (!parameters->precursoradduct.empty()) { + str = "-" + parameters->precursoradduct; + if (m > 1) { + str += "-"; + if (m > 2) { + str += to_string(m - 1); + } + str += "H"; + } + peak.description.replace(peak.description.find("+zH"), 3, str); + } + else { + str = "-"; + if (m > 1) { + str += to_string(m); + } + str += "H"; + peak.description.replace(peak.description.find("+zH"), 3, str); + } + + str = "]"; + if (m > 1) { + str += to_string(m); } - str += "H"; - peak.description.replace(peak.description.find("+zH"), 3, str); + str += "-"; + peak.description.replace(peak.description.find("]+"), 2, str); } + } - str = "]"; - if (k > 1) { - str += to_string(k); + if (writedescription) { + if (peak.formula.hasAllElementsPositive()) { + if (parameters->reportunmatchedtheoreticalpeaks || searchHint(peak.mzratio, experimentalpeaks, parameters->fragmentmasserrortolerance)) { + addPeakToList(peak, theoreticalpeaksrealsize); + } + if (!parameters->generateisotopepattern) { + addMetalPeaks(peak, parameters->metaladducts, theoreticalpeaksrealsize, m, writedescription); + } } - str += "+"; - peak.description.replace(peak.description.find("]+"), 2, str); } else { - if (!parameters->precursoradduct.empty()) { - str = "-" + parameters->precursoradduct; - if (k > 1) { - str += "-"; - if (k > 2) { - str += to_string(k - 1); + if (parameters->generateisotopepattern) { + if (peak.formula.hasAllElementsPositive()) { + if (searchHint(peak.mzratio, experimentalpeaks, parameters->fragmentmasserrortolerance)) { + addPeakToList(peak, theoreticalpeaksrealsize); } - str += "H"; } - peak.description.replace(peak.description.find("+zH"), 3, str); } else { - str = "-"; - if (k > 1) { - str += to_string(k); + if (searchHint(peak.mzratio, experimentalpeaks, parameters->fragmentmasserrortolerance)) { + addPeakToList(peak, theoreticalpeaksrealsize); } - str += "H"; - peak.description.replace(peak.description.find("+zH"), 3, str); - } - - str = "]"; - if (k > 1) { - str += to_string(k); + addMetalPeaks(peak, parameters->metaladducts, theoreticalpeaksrealsize, m, writedescription); } - str += "-"; - peak.description.replace(peak.description.find("]+"), 2, str); } + } - if (writedescription) { - if (peak.formula.hasAllElementsPositive()) { - if (parameters->reportunmatchedtheoreticalpeaks || searchHint(peak.mzratio, experimentalpeaks, parameters->fragmentmasserrortolerance)) { - addPeakToList(peak, theoreticalpeaksrealsize); - } - if (!parameters->generateisotopepattern) { - addMetalPeaks(peak, parameters->metaladducts, theoreticalpeaksrealsize, k, writedescription); + } + + } + + } + + } + +} + + +void cTheoreticalSpectrum::generatePrecursorIonForOther(int& theoreticalpeaksrealsize, bool writedescription) { + cPeak peak; + string formula; + + map atoms, tempmap; + + peak.isotope = false; + peak.seriesid = 0; + peak.iontype = fragmentIonTypeEnd; + + peak.mzratio = candidate.getSummaryFormula().getMass() + H - e; + + if (parameters->generateisotopepattern || writedescription) { + formula = "H+"; + addStringFormulaToMap(formula, atoms); + formula = candidate.getSummaryFormula().getSummary(); + addStringFormulaToMap(formula, atoms); + } + + /* + if (parameters->precursoradduct.compare("") != 0) { + cSummaryFormula adduct; + adduct.setFormula(parameters->precursoradduct); + + peak.mzratio += adduct.getMass() - H; + + if (parameters->generateisotopepattern || writedescription) { + formula = "H-1"; + addStringFormulaToMap(formula, atoms); + addStringFormulaToMap(parameters->precursoradduct, atoms); + } + } + */ + + double tempratio = peak.mzratio; + + for (int i = -1; i < (int)parameters->neutrallossesfortheoreticalspectra.size(); i++) { + + for (int j = 1; j <= abs(parameters->precursorcharge); j++) { + + peak.neutrallosstype = (i == -1) ? -1 : parameters->neutrallossesfortheoreticalspectra[i]; + peak.mzratio = tempratio; + if (i >= 0) { + peak.mzratio += parameters->neutrallossesdefinitions[peak.neutrallosstype].massdifference; + } + peak.mzratio = charge(uncharge(peak.mzratio, 1), (parameters->precursorcharge > 0) ? j : -j); + peak.charge = (parameters->precursorcharge > 0) ? j : -j; + + if (parameters->generateisotopepattern || writedescription) { + tempmap = atoms; + if (i >= 0) { + mergeMaps(parameters->neutrallossesdefinitions[peak.neutrallosstype].summarymap, tempmap); + } + rechargeMap(peak.charge, tempmap); + peak.formula.setFromMap(tempmap, false); + } + + if (writedescription) { + string str; + + peak.description = "[M+zH]+"; + if (i >= 0) { + peak.description += " -"; + if (i >= 0) { + peak.description += parameters->neutrallossesdefinitions[peak.neutrallosstype].summary; + } + } + peak.description += ":"; + + if (parameters->precursorcharge > 0) { + if (!parameters->precursoradduct.empty()) { + str = "+" + parameters->precursoradduct; + if (j > 1) { + str += "+"; + if (j > 2) { + str += to_string(j - 1); } + str += "H"; } + peak.description.replace(peak.description.find("+zH"), 3, str); } else { - if (parameters->generateisotopepattern) { - if (peak.formula.hasAllElementsPositive()) { - if (searchHint(peak.mzratio, experimentalpeaks, parameters->fragmentmasserrortolerance)) { - addPeakToList(peak, theoreticalpeaksrealsize); - } - } + str = "+"; + if (j > 1) { + str += to_string(j); } - else { - if (searchHint(peak.mzratio, experimentalpeaks, parameters->fragmentmasserrortolerance)) { - addPeakToList(peak, theoreticalpeaksrealsize); + str += "H"; + peak.description.replace(peak.description.find("+zH"), 3, str); + } + + str = "]"; + if (j > 1) { + str += to_string(j); + } + str += "+"; + peak.description.replace(peak.description.find("]+"), 2, str); + } + else { + if (!parameters->precursoradduct.empty()) { + str = "-" + parameters->precursoradduct; + if (j > 1) { + str += "-"; + if (j > 2) { + str += to_string(j - 1); } - addMetalPeaks(peak, parameters->metaladducts, theoreticalpeaksrealsize, k, writedescription); + str += "H"; + } + peak.description.replace(peak.description.find("+zH"), 3, str); + } + else { + str = "-"; + if (j > 1) { + str += to_string(j); } + str += "H"; + peak.description.replace(peak.description.find("+zH"), 3, str); + } + + str = "]"; + if (j > 1) { + str += to_string(j); } + str += "-"; + peak.description.replace(peak.description.find("]+"), 2, str); + } + } + if (writedescription) { + if (peak.formula.hasAllElementsPositive()) { + if (parameters->reportunmatchedtheoreticalpeaks || searchHint(peak.mzratio, experimentalpeaks, parameters->fragmentmasserrortolerance)) { + addPeakToList(peak, theoreticalpeaksrealsize); + } + if (!parameters->generateisotopepattern) { + addMetalPeaks(peak, parameters->metaladducts, theoreticalpeaksrealsize, j, writedescription); + } + } + } + else { + if (parameters->generateisotopepattern) { + if (peak.formula.hasAllElementsPositive()) { + if (searchHint(peak.mzratio, experimentalpeaks, parameters->fragmentmasserrortolerance)) { + addPeakToList(peak, theoreticalpeaksrealsize); + } + } + } + else { + if (searchHint(peak.mzratio, experimentalpeaks, parameters->fragmentmasserrortolerance)) { + addPeakToList(peak, theoreticalpeaksrealsize); + } + addMetalPeaks(peak, parameters->metaladducts, theoreticalpeaksrealsize, j, writedescription); } } + } + } + } @@ -577,6 +747,11 @@ void cTheoreticalSpectrum::generateScrambledIons(cBricksDatabase& bricksdatabase double tempmzratio; map tempmap; bool tempmapready, disablesummary; + + vector currentlosses; + vector fragmentlossmass; + vector fragmentlosssummary; + vector< map > fragmentlossmap; // generate scrambled peaks from sequences for (auto it = scrambledsequences.begin(); it != scrambledsequences.end(); ++it) { @@ -585,11 +760,6 @@ void cTheoreticalSpectrum::generateScrambledIons(cBricksDatabase& bricksdatabase intcomposition.clear(); b.explodeToIntComposition(intcomposition); - tempmzratio = 0; - for (int i = 0; i < (int)intcomposition.size(); i++) { - tempmzratio += bricksdatabase[intcomposition[i] - 1].getMass(); - } - disablesummary = false; if ((parameters->mode == denovoengine) && (parameters->blindedges == 2)) { for (int i = 0; i < (int)intcomposition.size(); i++) { @@ -600,101 +770,126 @@ void cTheoreticalSpectrum::generateScrambledIons(cBricksDatabase& bricksdatabase } } + tempmzratio = 0; + currentlosses.clear(); + for (int i = 0; i < (int)intcomposition.size(); i++) { + tempmzratio += bricksdatabase[intcomposition[i] - 1].getMass(); + + // to do - possible performance optimization + updateListOfNeutralLosses(bricksdatabase, bricksdatabase[intcomposition[i] - 1], currentlosses, fragmentlossmass, fragmentlosssummary, fragmentlossmap, writedescription, disablesummary); + } + tempmapready = false; for (int i = 0; i < (int)parameters->ionsfortheoreticalspectra.size(); i++) { for (int j = -1; j < (int)parameters->neutrallossesfortheoreticalspectra.size(); j++) { - peak.clear(); - peak.iontype = (eFragmentIonType)parameters->ionsfortheoreticalspectra[i]; - if (j >= 0) { - peak.neutrallosstype = parameters->neutrallossesfortheoreticalspectra[j]; - } - else { - peak.neutrallosstype = -1; - } - peak.mzratio = parameters->iondefinitions[peak.iontype].massdifference; - if (peak.neutrallosstype >= 0) { - peak.mzratio += parameters->neutrallossesdefinitions[peak.neutrallosstype].massdifference; - } - peak.mzratio += tempmzratio; + for (int k = -1; k < (int)fragmentlossmass.size(); k++) { - peak.charge = 1; - if (parameters->precursorcharge < 0) { - peak.mzratio = charge(uncharge(peak.mzratio, 1), -1); - peak.charge = -1; - } + peak.clear(); + peak.iontype = (eFragmentIonType)parameters->ionsfortheoreticalspectra[i]; + if (j >= 0) { + peak.neutrallosstype = parameters->neutrallossesfortheoreticalspectra[j]; + } + else { + peak.neutrallosstype = -1; + } + peak.mzratio = parameters->iondefinitions[peak.iontype].massdifference; + if (peak.neutrallosstype >= 0) { + peak.mzratio += parameters->neutrallossesdefinitions[peak.neutrallosstype].massdifference; + } + if (k >= 0) { + peak.mzratio += fragmentlossmass[k]; + } + peak.mzratio += tempmzratio; - // skip scrambled peaks whose m/z ratios collide with common fragment ions - if (theoreticalmzratios.find((unsigned long long)(peak.mzratio*(double)1000000)) != theoreticalmzratios.end()) { - continue; - } + peak.charge = 1; + if (parameters->precursorcharge < 0) { + peak.mzratio = charge(uncharge(peak.mzratio, 1), -1); + peak.charge = -1; + } - if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { + // skip scrambled peaks whose m/z ratios collide with common fragment ions + if (theoreticalmzratios.find((unsigned long long)(peak.mzratio*(double)1000000)) != theoreticalmzratios.end()) { + continue; + } - if (!tempmapready) { - tempmap.clear(); + if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { + + if (!tempmapready) { + tempmap.clear(); + + for (int m = 0; m < (int)intcomposition.size(); m++) { + mergeMaps(bricksdatabase[intcomposition[m] - 1].getSummaryMap(), tempmap); + } - for (int k = 0; k < (int)intcomposition.size(); k++) { - mergeMaps(bricksdatabase[intcomposition[k] - 1].getSummaryMap(), tempmap); + tempmapready = true; } - tempmapready = true; - } + atoms = tempmap; + mergeMaps(parameters->iondefinitions[peak.iontype].summarymap, atoms); + if (peak.neutrallosstype >= 0) { + mergeMaps(parameters->neutrallossesdefinitions[peak.neutrallosstype].summarymap, atoms); + } + if (k >= 0) { + mergeMaps(fragmentlossmap[k], atoms); + } - atoms = tempmap; - mergeMaps(parameters->iondefinitions[peak.iontype].summarymap, atoms); - if (peak.neutrallosstype >= 0) { - mergeMaps(parameters->neutrallossesdefinitions[peak.neutrallosstype].summarymap, atoms); - } + if (peak.charge == -1) { + rechargeMap(-1, atoms); + } - if (peak.charge == -1) { - rechargeMap(-1, atoms); + peak.formula.setFromMap(atoms, false); } - peak.formula.setFromMap(atoms, false); - } + peak.scrambled = true; - peak.scrambled = true; + if (writedescription) { - if (writedescription) { + if (parameters->precursorcharge < 0) { + peak.description = "1- "; + } + else { + peak.description = "1+ "; + } - if (parameters->precursorcharge < 0) { - peak.description = "1- "; - } - else { - peak.description = "1+ "; - } + peak.description += "scrambled "; + peak.description += parameters->iondefinitions[peak.iontype].name.substr(0, 1) + to_string((int)intcomposition.size()); + if (parameters->iondefinitions[peak.iontype].name.size() > 1) { + peak.description += parameters->iondefinitions[peak.iontype].name.substr(1, parameters->iondefinitions[peak.iontype].name.length() - 1); + } + if ((k >= 0) || (peak.neutrallosstype >= 0)) { + peak.description += " -"; + if (k >= 0) { + peak.description += fragmentlosssummary[k]; + } + if (peak.neutrallosstype >= 0) { + peak.description += parameters->neutrallossesdefinitions[peak.neutrallosstype].summary; + } + } + + addAdductToDescription(peak.description, parameters->metaladducts); + peak.description += ": "; + for (int m = 0; m < (int)intcomposition.size(); m++) { + peak.description += "[" + bricksdatabase[intcomposition[m] - 1].getAcronymsAsString() + "]"; + if (m < (int)intcomposition.size() - 1) { + peak.description += '-'; + } + } - peak.description += "scrambled "; - peak.description += parameters->iondefinitions[peak.iontype].name.substr(0, 1) + to_string((int)intcomposition.size()); - if (parameters->iondefinitions[peak.iontype].name.size() > 1) { - peak.description += parameters->iondefinitions[peak.iontype].name.substr(1, parameters->iondefinitions[peak.iontype].name.length() - 1); - } - if (peak.neutrallosstype >= 0) { - peak.description += "-" + parameters->neutrallossesdefinitions[peak.neutrallosstype].summary; } - addAdductToDescription(peak.description, parameters->metaladducts); - peak.description += ": "; - for (int k = 0; k < (int)intcomposition.size(); k++) { - peak.description += "[" + bricksdatabase[intcomposition[k] - 1].getAcronymsAsString() + "]"; - if (k < (int)intcomposition.size() - 1) { - peak.description += '-'; - } + if (scrambledpeaks.size() > scrambledspeaksrealsize) { + scrambledpeaks[scrambledspeaksrealsize] = peak; + } + else { + scrambledpeaks.add(peak); } + scrambledspeaksrealsize++; } - if (scrambledpeaks.size() > scrambledspeaksrealsize) { - scrambledpeaks[scrambledspeaksrealsize] = peak; - } - else { - scrambledpeaks.add(peak); - } - scrambledspeaksrealsize++; - } } @@ -735,6 +930,190 @@ void cTheoreticalSpectrum::generateScrambledIons(cBricksDatabase& bricksdatabase } +void cTheoreticalSpectrum::updateListOfNeutralLosses(cBricksDatabase& bricksdatabase, cBrick& block, vector& currentlosses, vector& fragmentlossmass, vector& fragmentlosssummary, vector< map >& fragmentlossmap, bool writedescription, bool disablesummary) { + set< vector > fragmentlossset; + map fmap; + + const unsigned max_losses = 25; + + vector tmplossvector; + tmplossvector.reserve(max_losses); + + unsigned binary, binarypos, currsize, loopend; + + // the data are updated only if the block contains a list of losses + if (block.getLossIDs().size() > 0) { + currentlosses.reserve(currentlosses.size() + block.getLossIDs().size()); + currentlosses.insert(currentlosses.end(), block.getLossIDs().begin(), block.getLossIDs().end()); + sort(currentlosses.begin(), currentlosses.end()); + + fragmentlossset.clear(); + + fragmentlossmass.clear(); + if (writedescription) { + fragmentlosssummary.clear(); + } + if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { + fragmentlossmap.clear(); + } + + currsize = (unsigned)currentlosses.size(); + if (currsize < max_losses) { + loopend = 1 << currsize; + for (unsigned j = 1; j < loopend; j++) { + binary = j; + binarypos = 0; + tmplossvector.clear(); + while ((binary > 0) && (binarypos < currsize)) { + if ((binary & 1) == 1) { + tmplossvector.push_back(currentlosses[binarypos]); + } + binary = binary >> 1; + binarypos++; + } + fragmentlossset.insert(tmplossvector); + } + + fragmentlossmass.reserve(fragmentlossset.size()); + if (writedescription) { + fragmentlosssummary.reserve(fragmentlossset.size()); + } + if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { + fragmentlossmap.reserve(fragmentlossset.size()); + } + + for (auto& it : fragmentlossset) { + fragmentlossmass.push_back(bricksdatabase.getMassOfNeutralLosses((vector&)it)); + if (writedescription) { + fragmentlosssummary.push_back(bricksdatabase.getSummaryFormulaOfNeutralLosses((vector&)it)); + } + if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { + bricksdatabase.getMapOfNeutralLosses((vector&)it, fmap); + fragmentlossmap.push_back(fmap); + } + } + } + } + +} + + +void cTheoreticalSpectrum::generateInternalFragments(cBricksDatabase& bricksdatabase, cPeak& peak, int maxcharge, int& peaklistrealsize, vector& intcomposition, int pos, map& atoms, vector& currentlosses, eFragmentIonType fragmentiontype, ePeptideType peptidetype, TRotationInfo* trotation, bool writedescription, bool disablesummary) { + + vector internalcurrentlosses = currentlosses; + + vector fragmentlossmass; + vector fragmentlosssummary; + vector< map > fragmentlossmap; + + vector internalcomposition; + + double tmpmz1; + map tmpmap1; + + double tmpmz2; + map tmpmap2; + + int tmprotationid; + int tmpseriesid; + + if ((peptidetype == branchcyclic) && trotation && (trotation->id == 0)) { + + if ((pos >= trotation->middlebranchstart) && (pos < trotation->middlebranchend)) { + + internalcomposition.clear(); + for (int i = 0; i <= pos; i++) { + internalcomposition.push_back(intcomposition[i]); + } + + tmpmz1 = peak.mzratio; + if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { + tmpmap1 = atoms; + } + + tmprotationid = peak.rotationid; + tmpseriesid = peak.seriesid; + + peak.rotationid = -1; + peak.seriesid = -1; + + for (int i = trotation->middlebranchend + 1; i < (int)intcomposition.size() - 1; i++) { + internalcomposition.push_back(intcomposition[i]); + + peak.mzratio += bricksdatabase[intcomposition[i] - 1].getMass(); + if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { + mergeMaps(bricksdatabase[intcomposition[i] - 1].getSummaryMap(), tmpmap1); + } + + updateListOfNeutralLosses(bricksdatabase, bricksdatabase[intcomposition[pos] - 1], internalcurrentlosses, fragmentlossmass, fragmentlosssummary, fragmentlossmap, writedescription, disablesummary); + + tmpmz2 = peak.mzratio; + if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { + tmpmap2 = tmpmap1; + } + + for (int j = -1; j < (int)fragmentlossmass.size(); j++) { + + if (writedescription) { + peak.description = "internal "; + + peak.description += parameters->iondefinitions[fragmentiontype].name.substr(0, 1) + to_string((int)internalcomposition.size()); + // to do - polyketides + // if (parameters->iondefinitions[fragmentiontype].name.size() > 1) { + // peak.description += parameters->iondefinitions[fragmentiontype].name.substr(1, parameters->iondefinitions[fragmentiontype].name.length() - 1); + // } + + if ((peak.neutrallosstype >= 0) || (j >= 0)) { + peak.description += " -"; + if (j >= 0) { + peak.description += fragmentlosssummary[j]; + } + if (peak.neutrallosstype >= 0) { + peak.description += parameters->neutrallossesdefinitions[peak.neutrallosstype].summary; + } + } + + addAdductToDescription(peak.description, parameters->metaladducts); + peak.description += ": "; + + for (int k = 0; k < (int)internalcomposition.size(); k++) { + peak.description += "[" + bricksdatabase[internalcomposition[k] - 1].getAcronymsAsString() + "]"; + if (k < (int)internalcomposition.size() - 1) { + peak.description += '-'; + } + } + } + + if (j >= 0) { + peak.mzratio += fragmentlossmass[j]; + if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { + mergeMaps(fragmentlossmap[j], tmpmap2); + } + } + + generateChargedFragments(peak, tmpmap2, peaklistrealsize, maxcharge, writedescription, disablesummary); + + peak.mzratio = tmpmz2; + if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { + tmpmap2 = tmpmap1; + } + + } + + } + + peak.mzratio = tmpmz1; + + peak.rotationid = tmprotationid; + peak.seriesid = tmpseriesid; + + } + + } + +} + + void cTheoreticalSpectrum::selectAndNormalizeScrambledSequences(unordered_set& scrambledsequences) { unordered_set temp = scrambledsequences; scrambledsequences.clear(); @@ -850,7 +1229,7 @@ void cTheoreticalSpectrum::addMetalPeaks(cPeak& peak, vector& metals, in tmppeak.description.replace(tmppeak.description.find(metals[i]), metals[i].size(), isotopename); } - if ((parameters->mode == dereplication) || (writedescription && parameters->reportunmatchedtheoreticalpeaks) || searchHint(tmppeak.mzratio, experimentalpeaks, parameters->fragmentmasserrortolerance)) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch) || (writedescription && parameters->reportunmatchedtheoreticalpeaks) || searchHint(tmppeak.mzratio, experimentalpeaks, parameters->fragmentmasserrortolerance)) { addPeakToList(tmppeak, peaklistrealsize); } } @@ -938,7 +1317,7 @@ void cTheoreticalSpectrum::removeUnmatchedIsotopePatterns(cPeaksList& theoretica // copy unmatched theoretical peaks in matched envelopes into the output if (storeunmatchedpeaks && !theoreticalpeaks[j].decoy && (theoreticalpeaks[j].matched == 0)) { if ((theoreticalpeaks[j].relativeintensity*maximumexperimentalintensity / 100.0 >= parameters->minimumrelativeintensitythreshold) || - ((parameters->mode == dereplication) && parameters->generateisotopepattern && parameters->reportunmatchedtheoreticalpeaks)) { + (((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) && parameters->generateisotopepattern && parameters->reportunmatchedtheoreticalpeaks)) { outputtheoreticalpeaks.add(theoreticalpeaks[j]); } } @@ -954,7 +1333,7 @@ void cTheoreticalSpectrum::removeUnmatchedIsotopePatterns(cPeaksList& theoretica theoreticalpeaks[j].matched--; theoreticalpeaks[j].matchedid = -1; } - if (storeunmatchedpeaks && !theoreticalpeaks[j].decoy && (parameters->mode == dereplication) && parameters->generateisotopepattern && parameters->reportunmatchedtheoreticalpeaks) { + if (storeunmatchedpeaks && !theoreticalpeaks[j].decoy && ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) && parameters->generateisotopepattern && parameters->reportunmatchedtheoreticalpeaks) { outputtheoreticalpeaks.add(theoreticalpeaks[j]); } } @@ -994,7 +1373,7 @@ void cTheoreticalSpectrum::removeUnmatchedIsotopePatterns(cPeaksList& theoretica if (storeunmatchedpeaks && !theoreticalpeaks[j].decoy && (theoreticalpeaks[j].matched == 0)) { if ((theoreticalpeaks[j].relativeintensity*maximumexperimentalintensity / 100.0 >= parameters->minimumrelativeintensitythreshold) || - ((parameters->mode == dereplication) && parameters->generateisotopepattern && parameters->reportunmatchedtheoreticalpeaks)) { + (((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) && parameters->generateisotopepattern && parameters->reportunmatchedtheoreticalpeaks)) { outputtheoreticalpeaks.add(theoreticalpeaks[j]); } } @@ -1009,7 +1388,7 @@ void cTheoreticalSpectrum::removeUnmatchedIsotopePatterns(cPeaksList& theoretica theoreticalpeaks[j].matched--; theoreticalpeaks[j].matchedid = -1; } - if (storeunmatchedpeaks && !theoreticalpeaks[j].decoy && (parameters->mode == dereplication) && parameters->generateisotopepattern && parameters->reportunmatchedtheoreticalpeaks) { + if (storeunmatchedpeaks && !theoreticalpeaks[j].decoy && ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) && parameters->generateisotopepattern && parameters->reportunmatchedtheoreticalpeaks) { outputtheoreticalpeaks.add(theoreticalpeaks[j]); } } @@ -1017,73 +1396,31 @@ void cTheoreticalSpectrum::removeUnmatchedIsotopePatterns(cPeaksList& theoretica } -void cTheoreticalSpectrum::removeUnmatchedFeatures(cPeaksList& theoreticalpeaks, int theoreticalpeaksrealsize, cPeaksList& experimentalpeaks, int id) { - int requestedfeaturesize; - bool clearfeature; - int k; - - for (int i = 0; i < theoreticalpeaksrealsize; i++) { - if (theoreticalpeaks[i].isotope || (theoreticalpeaks[i].matched == 0)) { - continue; - } - - requestedfeaturesize = parameters->minimumfeaturesize; - - k = id - 1; - while ((k >= 0) && (requestedfeaturesize > 1)) { - if (!searchHint(theoreticalpeaks[i].mzratio, parameters->peaklistseries[k], parameters->fragmentmasserrortolerance)) { - break; - } - requestedfeaturesize--; - k--; - } - - clearfeature = false; - if (id + requestedfeaturesize > parameters->peaklistseries.size()) { - clearfeature = true; - } - else { - for (int j = id + 1; j < id + requestedfeaturesize; j++) { - if (!searchHint(theoreticalpeaks[i].mzratio, parameters->peaklistseries[j], parameters->fragmentmasserrortolerance)) { - clearfeature = true; - break; - } - } - } +int cTheoreticalSpectrum::removeUnmatchedFeatures(bool lcms, cPeaksList& theoreticalpeaks, int theoreticalpeaksrealsize, cPeaksList& experimentalpeaks, vector< vector >& hintsindex/*, int id*/) { + if (theoreticalpeaksrealsize == 0) { + return 0; + } - if (clearfeature) { - experimentalmatches[theoreticalpeaks[i].matchedid].erase(experimentalmatches[theoreticalpeaks[i].matchedid].find(i)); - experimentalpeaks[theoreticalpeaks[i].matchedid].matched--; + int size = parameters->peaklistseries.size(); + int k; - theoreticalpeaks[i].matched--; - theoreticalpeaks[i].matchedid = -1; - } - } -} + int peaksremoved = 0; + int featuresize; + int maxfeaturesize; -void cTheoreticalSpectrum::removeUnmatchedFeaturesAndCompounds(cPeaksList& theoreticalpeaks, int theoreticalpeaksrealsize, cPeaksList& experimentalpeaks, int id) { - if (theoreticalpeaksrealsize == 0) { - return; - } + int patternsize; int start = 0; int stop = 0; int currid = theoreticalpeaks[0].compoundid; - bool matched = true; - int featurestart = 0; - int featureend = parameters->peaklistseries.size() - 1; - int k; + int compoundsize = 0; + int msize; for (int i = 0; i < theoreticalpeaksrealsize; i++) { - if (currid != theoreticalpeaks[i].compoundid) { - if (matched) { - if (featureend - featurestart + 1 < parameters->minimumfeaturesize) { - matched = false; - } - } - if (!matched) { + if (currid != theoreticalpeaks[i].compoundid) { + if (compoundsize < parameters->minimumiontypes) { for (int j = start; j <= stop; j++) { if (theoreticalpeaks[j].matched > 0) { experimentalmatches[theoreticalpeaks[j].matchedid].erase(experimentalmatches[theoreticalpeaks[j].matchedid].find(j)); @@ -1091,58 +1428,87 @@ void cTheoreticalSpectrum::removeUnmatchedFeaturesAndCompounds(cPeaksList& theor theoreticalpeaks[j].matched--; theoreticalpeaks[j].matchedid = -1; + + peaksremoved++; } } } currid = theoreticalpeaks[i].compoundid; start = i; - matched = true; - featurestart = 0; - featureend = parameters->peaklistseries.size() - 1; + compoundsize = 0; } - if (!theoreticalpeaks[i].isotope) { - if (theoreticalpeaks[i].matched == 0) { - matched = false; - } - else { + stop = i; + + // ok, matched and unmatched peaks are searched (except isotopes) to calculate compoundsize correctly + if ((theoreticalpeaks[i].isotope) /*|| (theoreticalpeaks[i].matched == 0)*/) { + continue; + } - if (matched) { + if ((int)hintsindex[i].size() >= parameters->minimumfeaturesize) { - k = id - 1; - while (k >= 0) { - if (!searchHint(theoreticalpeaks[i].mzratio, parameters->peaklistseries[k], parameters->fragmentmasserrortolerance)) { - break; + featuresize = 0; + maxfeaturesize = 0; + + for (int j = 0; j < (int)hintsindex[i].size(); j++) { + + if (lcms) { + if ((j > 0) && (hintsindex[i][j - 1] + 1 != hintsindex[i][j])) { + if (featuresize > maxfeaturesize) { + maxfeaturesize = featuresize; } + featuresize = 0; + } + } + + if (parameters->generateisotopepattern) { + k = i; + while ((k >= 0) && (theoreticalpeaks[k].groupid == theoreticalpeaks[i].groupid)) { k--; } - featurestart = max(featurestart, k + 1); + k++; + + patternsize = 0; + while ((k < theoreticalpeaksrealsize) && (theoreticalpeaks[k].groupid == theoreticalpeaks[i].groupid)) { + msize = (int)hintsindex[k].size(); + for (int m = 0; m < msize; m++) { + if (hintsindex[k][m] == hintsindex[i][j]) { + patternsize++; + break; + } + } - k = id + 1; - while (k < parameters->peaklistseries.size()) { - if (!searchHint(theoreticalpeaks[i].mzratio, parameters->peaklistseries[k], parameters->fragmentmasserrortolerance)) { + if (patternsize >= parameters->minimumpatternsize) { break; } + k++; } - featureend = min(featureend, k - 1); + if (patternsize >= parameters->minimumpatternsize) { + featuresize++; + } + } + else { + featuresize++; } } - } - stop = i; - } + if (featuresize > maxfeaturesize) { + maxfeaturesize = featuresize; + } + + if (maxfeaturesize >= parameters->minimumfeaturesize) { + compoundsize++; + } - if (matched) { - if (featureend - featurestart + 1 < parameters->minimumfeaturesize) { - matched = false; } + } - if (!matched) { + if (compoundsize < parameters->minimumiontypes) { for (int j = start; j <= stop; j++) { if (theoreticalpeaks[j].matched > 0) { experimentalmatches[theoreticalpeaks[j].matchedid].erase(experimentalmatches[theoreticalpeaks[j].matchedid].find(j)); @@ -1150,24 +1516,30 @@ void cTheoreticalSpectrum::removeUnmatchedFeaturesAndCompounds(cPeaksList& theor theoreticalpeaks[j].matched--; theoreticalpeaks[j].matchedid = -1; + + peaksremoved++; } } } + + return peaksremoved; } -void cTheoreticalSpectrum::removeUnmatchedCompounds(cPeaksList& theoreticalpeaks, int theoreticalpeaksrealsize, cPeaksList& experimentalpeaks) { +int cTheoreticalSpectrum::removeUnmatchedCompounds(cPeaksList& theoreticalpeaks, int theoreticalpeaksrealsize, cPeaksList& experimentalpeaks, int minimumiontypes) { if (theoreticalpeaksrealsize == 0) { - return; + return 0; } + int peaksremoved = 0; + int start = 0; int stop = 0; int currid = theoreticalpeaks[0].compoundid; - bool matched = true; + int matched = 0; for (int i = 0; i < theoreticalpeaksrealsize; i++) { if (currid != theoreticalpeaks[i].compoundid) { - if (!matched) { + if (matched < minimumiontypes) { for (int j = start; j <= stop; j++) { if (theoreticalpeaks[j].matched > 0) { experimentalmatches[theoreticalpeaks[j].matchedid].erase(experimentalmatches[theoreticalpeaks[j].matchedid].find(j)); @@ -1175,22 +1547,24 @@ void cTheoreticalSpectrum::removeUnmatchedCompounds(cPeaksList& theoreticalpeaks theoreticalpeaks[j].matched--; theoreticalpeaks[j].matchedid = -1; + + peaksremoved++; } } } currid = theoreticalpeaks[i].compoundid; start = i; - matched = true; + matched = 0; } - if (!theoreticalpeaks[i].isotope && (theoreticalpeaks[i].matched == 0)) { - matched = false; + if (!theoreticalpeaks[i].isotope && (theoreticalpeaks[i].matched > 0)) { + matched++; } stop = i; } - if (!matched) { + if (matched < minimumiontypes) { for (int j = start; j <= stop; j++) { if (theoreticalpeaks[j].matched > 0) { experimentalmatches[theoreticalpeaks[j].matchedid].erase(experimentalmatches[theoreticalpeaks[j].matchedid].find(j)); @@ -1198,6 +1572,545 @@ void cTheoreticalSpectrum::removeUnmatchedCompounds(cPeaksList& theoreticalpeaks theoreticalpeaks[j].matched--; theoreticalpeaks[j].matchedid = -1; + + peaksremoved++; + } + } + } + + return peaksremoved; +} + + +void cTheoreticalSpectrum::removeUnmatchedPatternsFineSpectra(cPeaksList& theoreticalpeaks, int theoreticalpeaksrealsize, cPeaksList& experimentalpeaks) { + if (theoreticalpeaksrealsize == 0) { + return; + } + + int groupid = theoreticalpeaks[0].groupid; + int start = 0; + int stop = 0; + int maximumintensityid = 0; + double maximumintensity = theoreticalpeaks[0].relativeintensity; + bool cleargroup = false; + + int langle = 0; + int rangle = 0; + double fwhmthreshold = 0.001; + double mzdiff; + string subdesc; + + bool hasS = false; + bool hasK = false; + bool hasFe = false; + + int posS = -1; + int posK = -1; + int posFe = -1; + + double maximumexperimentalintensity; + if (theoreticalpeaks[maximumintensityid].matched) { + maximumexperimentalintensity = experimentalpeaks[theoreticalpeaks[maximumintensityid].matchedid].relativeintensity; + } + + langle = (int)parameters->peakidtodesc[theoreticalpeaks[start].descriptionid].rfind('('); + rangle = (int)parameters->peakidtodesc[theoreticalpeaks[start].descriptionid].rfind(')'); + if ((langle != string::npos) && (rangle != string::npos)) { + subdesc = parameters->peakidtodesc[theoreticalpeaks[start].descriptionid].substr(langle + 1, rangle - langle - 1); + if (subdesc.find("Fe") != string::npos) { + hasFe = true; + } + if (parameters->fwhm <= fwhmthreshold) { + if (subdesc.find("S") != string::npos) { + hasS = true; + } + if (subdesc.find("K") != string::npos) { + hasK = true; + } + } + } + + /* + if (parameters->fwhm <= fwhmthreshold) { + langle = (int)parameters->peakidtodesc[theoreticalpeaks[start].descriptionid].rfind('('); + rangle = (int)parameters->peakidtodesc[theoreticalpeaks[start].descriptionid].rfind(')'); + if ((langle != string::npos) && (rangle != string::npos)) { + subdesc = parameters->peakidtodesc[theoreticalpeaks[start].descriptionid].substr(langle + 1, rangle - langle - 1); + if (subdesc.find("Fe") != string::npos) { + hasFe = true; + } + if (subdesc.find("S") != string::npos) { + hasS = true; + } + if (subdesc.find("K") != string::npos) { + hasK = true; + } + } + } + else { + if ((theoreticalpeaks[start].iontype == ms_MFe2H) + || (theoreticalpeaks[start].iontype == ms_MFe3HNa) + || (theoreticalpeaks[start].iontype == ms_MFe3HK) + || (theoreticalpeaks[start].iontype == ms_2MFe2H) + || (theoreticalpeaks[start].iontype == ms_2MFe3HNa) + || (theoreticalpeaks[start].iontype == ms_2MFe3HK) + || (theoreticalpeaks[start].iontype == ms_3MFe2H) + || (theoreticalpeaks[start].iontype == ms_3MFe3HNa) + || (theoreticalpeaks[start].iontype == ms_3MFe3HK) + //|| (theoreticalpeaks[start].iontype == ms_3M2Fe5H) + //|| (theoreticalpeaks[start].iontype == ms_3M2Fe6HNa) + //|| (theoreticalpeaks[start].iontype == ms_3M2Fe6HK) + || (theoreticalpeaks[start].iontype == ms_MFe4H) + || (theoreticalpeaks[start].iontype == ms_2MFe4H) + || (theoreticalpeaks[start].iontype == ms_3MFe4H) + //|| (theoreticalpeaks[start].iontype == ms_3M2Fe7H) + ) { + hasFe = true; + } + } + */ + + for (int i = 0; i < theoreticalpeaksrealsize; i++) { + + if (groupid == theoreticalpeaks[i].groupid) { + if (theoreticalpeaks[i].relativeintensity > maximumintensity) { + maximumintensityid = i; + maximumintensity = theoreticalpeaks[i].relativeintensity; + if (theoreticalpeaks[i].matched) { + maximumexperimentalintensity = experimentalpeaks[theoreticalpeaks[i].matchedid].relativeintensity; + } + } + + stop = i; + } + + if ((groupid != theoreticalpeaks[i].groupid) || (i == theoreticalpeaksrealsize - 1)) { + + /* + if ((theoreticalpeaks[start].iontype == ms_MFe2H) || (theoreticalpeaks[start].iontype == ms_MFe3HNa) || (theoreticalpeaks[start].iontype == ms_MFe3HK)) { + + if ((theoreticalpeaks[start].matched == 0) && (theoreticalpeaks[maximumintensityid].matched > 0)) { + cleargroup = true; + } + + if ((theoreticalpeaks[start].matched > 0) && (theoreticalpeaks[maximumintensityid].matched > 0)) { + if (maximumexperimentalintensity >= parameters->minimumrelativeintensitythreshold) { + if (theoreticalpeaks[start].relativeintensity*maximumexperimentalintensity / 100.0 >= parameters->minimumrelativeintensitythreshold) { + if (experimentalpeaks[theoreticalpeaks[start].matchedid].relativeintensity > 0.1 * maximumexperimentalintensity) { + cleargroup = true; + } + } + else { + cleargroup = true; + } + } + } + + } + */ + + if (hasFe) { + if (theoreticalpeaks[maximumintensityid].matched > 0) { + if (maximumexperimentalintensity >= parameters->minimumrelativeintensitythreshold) { + for (int j = start; j <= stop; j++) { + if (theoreticalpeaks[j].matched > 0) { + mzdiff = fabs(uncharge(theoreticalpeaks[j].mzratio, theoreticalpeaks[j].charge) - uncharge(theoreticalpeaks[maximumintensityid].mzratio, theoreticalpeaks[maximumintensityid].charge) - Fe54 + Fe56); + if (mzdiff < 0.1) { + if (parameters->peakidtodesc[theoreticalpeaks[j].descriptionid].find("\\[") == string::npos) { + if (parameters->peakidtodesc[theoreticalpeaks[j].descriptionid].find(" 54Fe ") != string::npos) { + posFe = j; + break; + } + } + } + } + } + } + } + + if (posFe == -1) { + cleargroup = true; + } + else { + if ((theoreticalpeaks[posFe].matched > 0) && (theoreticalpeaks[maximumintensityid].matched > 0)) { + if (maximumexperimentalintensity >= parameters->minimumrelativeintensitythreshold) { + if (theoreticalpeaks[posFe].relativeintensity*maximumexperimentalintensity / 100.0 >= parameters->minimumrelativeintensitythreshold) { + if (experimentalpeaks[theoreticalpeaks[posFe].matchedid].relativeintensity > 0.1 * maximumexperimentalintensity) { + cleargroup = true; + } + } + else { + cleargroup = true; + } + } + } + } + } + + if (parameters->fwhm <= fwhmthreshold) { + + if (hasS) { + if (theoreticalpeaks[maximumintensityid].matched > 0) { + if (maximumexperimentalintensity >= parameters->minimumrelativeintensitythreshold) { + for (int j = start; j <= stop; j++) { + if (theoreticalpeaks[j].matched > 0) { + mzdiff = fabs(uncharge(theoreticalpeaks[j].mzratio, theoreticalpeaks[j].charge) - uncharge(theoreticalpeaks[maximumintensityid].mzratio, theoreticalpeaks[maximumintensityid].charge) - S34 + S32); + if (mzdiff < 0.1) { + if (parameters->peakidtodesc[theoreticalpeaks[j].descriptionid].find("\\[") == string::npos) { + if (parameters->peakidtodesc[theoreticalpeaks[j].descriptionid].find(" 34S ") != string::npos) { + posS = j; + break; + } + } + } + } + } + } + } + + if (posS == -1) { + cleargroup = true; + } + else { + if ((theoreticalpeaks[posS].matched > 0) && (theoreticalpeaks[maximumintensityid].matched > 0)) { + if (maximumexperimentalintensity >= parameters->minimumrelativeintensitythreshold) { + if (theoreticalpeaks[posS].relativeintensity*maximumexperimentalintensity / 100.0 >= parameters->minimumrelativeintensitythreshold) { + if (experimentalpeaks[theoreticalpeaks[posS].matchedid].relativeintensity > 0.1 * maximumexperimentalintensity) { + cleargroup = true; + } + } + else { + cleargroup = true; + } + } + } + } + } + + if (hasK) { + if (theoreticalpeaks[maximumintensityid].matched > 0) { + if (maximumexperimentalintensity >= parameters->minimumrelativeintensitythreshold) { + for (int j = start; j <= stop; j++) { + if (theoreticalpeaks[j].matched > 0) { + mzdiff = fabs(uncharge(theoreticalpeaks[j].mzratio, theoreticalpeaks[j].charge) - uncharge(theoreticalpeaks[maximumintensityid].mzratio, theoreticalpeaks[maximumintensityid].charge) - K41 + K39); + if (mzdiff < 0.1) { + if (parameters->peakidtodesc[theoreticalpeaks[j].descriptionid].find("\\[") == string::npos) { + if (parameters->peakidtodesc[theoreticalpeaks[j].descriptionid].find(" 41K ") != string::npos) { + posK = j; + break; + } + } + } + } + } + } + } + + if (posK == -1) { + cleargroup = true; + } + else { + if ((theoreticalpeaks[posK].matched > 0) && (theoreticalpeaks[maximumintensityid].matched > 0)) { + if (maximumexperimentalintensity >= parameters->minimumrelativeintensitythreshold) { + if (theoreticalpeaks[posK].relativeintensity*maximumexperimentalintensity / 100.0 >= parameters->minimumrelativeintensitythreshold) { + if (experimentalpeaks[theoreticalpeaks[posK].matchedid].relativeintensity > 0.1 * maximumexperimentalintensity) { + cleargroup = true; + } + } + else { + cleargroup = true; + } + } + } + } + } + + } + + if (cleargroup) { + for (int j = start; j <= stop; j++) { + if (theoreticalpeaks[j].matched > 0) { + experimentalmatches[theoreticalpeaks[j].matchedid].erase(experimentalmatches[theoreticalpeaks[j].matchedid].find(j)); + experimentalpeaks[theoreticalpeaks[j].matchedid].matched--; + + theoreticalpeaks[j].matched--; + theoreticalpeaks[j].matchedid = -1; + } + } + } + + groupid = theoreticalpeaks[i].groupid; + start = i; + stop = i; + maximumintensityid = i; + maximumintensity = theoreticalpeaks[i].relativeintensity; + cleargroup = false; + + hasS = false; + hasK = false; + hasFe = false; + + posS = -1; + posK = -1; + posFe = -1; + + if (theoreticalpeaks[i].matched) { + maximumexperimentalintensity = experimentalpeaks[theoreticalpeaks[i].matchedid].relativeintensity; + } + + langle = (int)parameters->peakidtodesc[theoreticalpeaks[start].descriptionid].rfind('('); + rangle = (int)parameters->peakidtodesc[theoreticalpeaks[start].descriptionid].rfind(')'); + if ((langle != string::npos) && (rangle != string::npos)) { + subdesc = parameters->peakidtodesc[theoreticalpeaks[start].descriptionid].substr(langle + 1, rangle - langle - 1); + if (subdesc.find("Fe") != string::npos) { + hasFe = true; + } + if (parameters->fwhm <= fwhmthreshold) { + if (subdesc.find("S") != string::npos) { + hasS = true; + } + if (subdesc.find("K") != string::npos) { + hasK = true; + } + } + } + + /* + if (parameters->fwhm <= fwhmthreshold) { + langle = (int)parameters->peakidtodesc[theoreticalpeaks[start].descriptionid].rfind('('); + rangle = (int)parameters->peakidtodesc[theoreticalpeaks[start].descriptionid].rfind(')'); + if ((langle != string::npos) && (rangle != string::npos)) { + subdesc = parameters->peakidtodesc[theoreticalpeaks[start].descriptionid].substr(langle + 1, rangle - langle - 1); + if (subdesc.find("Fe") != string::npos) { + hasFe = true; + } + if (subdesc.find("S") != string::npos) { + hasS = true; + } + if (subdesc.find("K") != string::npos) { + hasK = true; + } + } + } + else { + if ((theoreticalpeaks[start].iontype == ms_MFe2H) + || (theoreticalpeaks[start].iontype == ms_MFe3HNa) + || (theoreticalpeaks[start].iontype == ms_MFe3HK) + || (theoreticalpeaks[start].iontype == ms_2MFe2H) + || (theoreticalpeaks[start].iontype == ms_2MFe3HNa) + || (theoreticalpeaks[start].iontype == ms_2MFe3HK) + || (theoreticalpeaks[start].iontype == ms_3MFe2H) + || (theoreticalpeaks[start].iontype == ms_3MFe3HNa) + || (theoreticalpeaks[start].iontype == ms_3MFe3HK) + //|| (theoreticalpeaks[start].iontype == ms_3M2Fe5H) + //|| (theoreticalpeaks[start].iontype == ms_3M2Fe6HNa) + //|| (theoreticalpeaks[start].iontype == ms_3M2Fe6HK) + || (theoreticalpeaks[start].iontype == ms_MFe4H) + || (theoreticalpeaks[start].iontype == ms_2MFe4H) + || (theoreticalpeaks[start].iontype == ms_3MFe4H) + //|| (theoreticalpeaks[start].iontype == ms_3M2Fe7H) + ) { + hasFe = true; + } + } + */ + + } + + } + +} + + +void cTheoreticalSpectrum::removeUnmatchedPatternsByIntensityRatio(cPeaksList& theoreticalpeaks, int theoreticalpeaksrealsize, cPeaksList& experimentalpeaks) { + if (theoreticalpeaksrealsize == 0) { + return; + } + + int groupid = theoreticalpeaks[0].groupid; + int start = 0; + int stop = 0; + int maximumintensityid = 0; + double maximumintensity = theoreticalpeaks[0].relativeintensity; + //int minimummatchedintensityid = 0; + double minimummatchedintensity = DBL_MAX; + bool cleargroup = false; + + double maximumexperimentalintensity; + if (theoreticalpeaks[maximumintensityid].matched) { + maximumexperimentalintensity = experimentalpeaks[theoreticalpeaks[maximumintensityid].matchedid].relativeintensity; + } + + double thratio, expratio; + + for (int i = 0; i < theoreticalpeaksrealsize; i++) { + if (groupid == theoreticalpeaks[i].groupid) { + if (theoreticalpeaks[i].relativeintensity > maximumintensity) { + maximumintensityid = i; + maximumintensity = theoreticalpeaks[i].relativeintensity; + if (theoreticalpeaks[i].matched) { + maximumexperimentalintensity = experimentalpeaks[theoreticalpeaks[i].matchedid].relativeintensity; + } + } + + stop = i; + } + + if ((groupid != theoreticalpeaks[i].groupid) || (i == theoreticalpeaksrealsize - 1)) { + + if (theoreticalpeaks[maximumintensityid].matched > 0) { + if (maximumexperimentalintensity >= parameters->minimumrelativeintensitythreshold) { + for (int j = start; j <= stop; j++) { + if ((theoreticalpeaks[j].matched > 0) + && (theoreticalpeaks[j].relativeintensity*maximumexperimentalintensity / 100.0 >= parameters->minimumrelativeintensitythreshold) + && (theoreticalpeaks[j].relativeintensity < minimummatchedintensity)) { + //minimummatchedintensityid = j; + minimummatchedintensity = theoreticalpeaks[j].relativeintensity; + } + } + + for (int j = start; j <= stop; j++) { + if (j == maximumintensityid) { + continue; + } + + if (theoreticalpeaks[j].matched > 0) { + if (theoreticalpeaks[j].relativeintensity*maximumexperimentalintensity / 100.0 >= parameters->minimumrelativeintensitythreshold) { + thratio = theoreticalpeaks[j].relativeintensity / theoreticalpeaks[maximumintensityid].relativeintensity; + expratio = experimentalpeaks[theoreticalpeaks[j].matchedid].relativeintensity / experimentalpeaks[theoreticalpeaks[maximumintensityid].matchedid].relativeintensity; + + if (fabs(thratio - expratio) * 100.0 > parameters->intensitytolerance) { + cleargroup = true; + break; + } + } + } + else { + if ((parameters->fwhm >= 0.01) && (theoreticalpeaks[j].relativeintensity > minimummatchedintensity)) { + cleargroup = true; + break; + } + } + } + } + else { + cleargroup = true; + } + } + else { + cleargroup = true; + } + + if (cleargroup) { + for (int j = start; j <= stop; j++) { + if (theoreticalpeaks[j].matched > 0) { + experimentalmatches[theoreticalpeaks[j].matchedid].erase(experimentalmatches[theoreticalpeaks[j].matchedid].find(j)); + experimentalpeaks[theoreticalpeaks[j].matchedid].matched--; + + theoreticalpeaks[j].matched--; + theoreticalpeaks[j].matchedid = -1; + } + } + } + + groupid = theoreticalpeaks[i].groupid; + start = i; + stop = i; + maximumintensityid = i; + maximumintensity = theoreticalpeaks[i].relativeintensity; + //minimummatchedintensityid = i; + minimummatchedintensity = DBL_MAX; + cleargroup = false; + if (theoreticalpeaks[i].matched) { + maximumexperimentalintensity = experimentalpeaks[theoreticalpeaks[i].matchedid].relativeintensity; + } + } + } +} + + +void cTheoreticalSpectrum::removeUnmatchedPatternsByMZDifference(cPeaksList& theoreticalpeaks, int theoreticalpeaksrealsize, cPeaksList& experimentalpeaks) { + if (theoreticalpeaksrealsize == 0) { + return; + } + + int groupid = theoreticalpeaks[0].groupid; + int start = 0; + int stop = 0; + int maximumintensityid = 0; + double maximumintensity = theoreticalpeaks[0].relativeintensity; + bool cleargroup = false; + + double maximumexperimentalintensity; + if (theoreticalpeaks[maximumintensityid].matched) { + maximumexperimentalintensity = experimentalpeaks[theoreticalpeaks[maximumintensityid].matchedid].relativeintensity; + } + + double thdiff, expdiff; + + for (int i = 0; i < theoreticalpeaksrealsize; i++) { + if (groupid == theoreticalpeaks[i].groupid) { + if (theoreticalpeaks[i].relativeintensity > maximumintensity) { + maximumintensityid = i; + maximumintensity = theoreticalpeaks[i].relativeintensity; + if (theoreticalpeaks[i].matched) { + maximumexperimentalintensity = experimentalpeaks[theoreticalpeaks[i].matchedid].relativeintensity; + } + } + + stop = i; + } + + if ((groupid != theoreticalpeaks[i].groupid) || (i == theoreticalpeaksrealsize - 1)) { + + if (theoreticalpeaks[maximumintensityid].matched > 0) { + if (maximumexperimentalintensity >= parameters->minimumrelativeintensitythreshold) { + for (int j = start; j <= stop; j++) { + if (j == maximumintensityid) { + continue; + } + + if (theoreticalpeaks[j].matched > 0) { + if (theoreticalpeaks[j].relativeintensity*maximumexperimentalintensity / 100.0 >= parameters->minimumrelativeintensitythreshold) { + thdiff = fabs(theoreticalpeaks[maximumintensityid].mzratio - theoreticalpeaks[j].mzratio); + expdiff = fabs(experimentalpeaks[theoreticalpeaks[maximumintensityid].matchedid].mzratio - experimentalpeaks[theoreticalpeaks[j].matchedid].mzratio); + + if (fabs(thdiff - expdiff) / theoreticalpeaks[maximumintensityid].mzratio * 1000000.0 > parameters->mzdifftolerance) { + cleargroup = true; + break; + } + } + } + } + } + else { + cleargroup = true; + } + } + else { + cleargroup = true; + } + + if (cleargroup) { + for (int j = start; j <= stop; j++) { + if (theoreticalpeaks[j].matched > 0) { + experimentalmatches[theoreticalpeaks[j].matchedid].erase(experimentalmatches[theoreticalpeaks[j].matchedid].find(j)); + experimentalpeaks[theoreticalpeaks[j].matchedid].matched--; + + theoreticalpeaks[j].matched--; + theoreticalpeaks[j].matchedid = -1; + } + } + } + + groupid = theoreticalpeaks[i].groupid; + start = i; + stop = i; + maximumintensityid = i; + maximumintensity = theoreticalpeaks[i].relativeintensity; + cleargroup = false; + if (theoreticalpeaks[i].matched) { + maximumexperimentalintensity = experimentalpeaks[theoreticalpeaks[i].matchedid].relativeintensity; } } } @@ -1770,7 +2683,7 @@ void cTheoreticalSpectrum::clear(bool clearpeaklist) { coveragebyseries = ""; valid = false; sumofrelativeintensities = 0; - visualcoverage.clear(); + rotationslabels.clear(); validposition = -1; reversevalidposition = -1; @@ -1873,7 +2786,7 @@ int cTheoreticalSpectrum::compareBranched(cPeaksList& sortedpeaklist, cBricksDat // coverage of series - vector > > > series; + /*vector > > > series; series.resize(trotations.size()); for (int i = 0; i < (int)series.size(); i++) { @@ -1895,12 +2808,12 @@ int cTheoreticalSpectrum::compareBranched(cPeaksList& sortedpeaklist, cBricksDat } for (int i = 0; i < theoreticalpeaksrealsize; i++) { - if (!theoreticalpeaks[i].isotope && (theoreticalpeaks[i].matched > 0) && (theoreticalpeaks[i].rotationid >= 0) + if (!theoreticalpeaks[i].isotope && (theoreticalpeaks[i].matched > 0) && (theoreticalpeaks[i].rotationid >= 0) && (theoreticalpeaks[i].seriesid >= 0) && (series[theoreticalpeaks[i].rotationid].count(theoreticalpeaks[i].iontype) == 1) && (series[theoreticalpeaks[i].rotationid][theoreticalpeaks[i].iontype].count(theoreticalpeaks[i].neutrallosstype) == 1)) { series[theoreticalpeaks[i].rotationid][theoreticalpeaks[i].iontype][theoreticalpeaks[i].neutrallosstype][theoreticalpeaks[i].seriesid]++; } - } + }*/ // peak hits without parents are removed @@ -1941,16 +2854,15 @@ int cTheoreticalSpectrum::compareBranched(cPeaksList& sortedpeaklist, cBricksDat normalizeTheoreticalIntensities(theoreticalpeaks, theoreticalpeaksrealsize); } - visualcoverage.clear(); - visualSeries tempseries; - bool reportrow; - coveragebyseries = "Linearized sequences:
"; for (int i = 0; i < (int)trotations.size(); i++) { coveragebyseries += to_string(i + 1) + " ~ " + bricksdatabasewithcombinations.getAcronymNameOfTPeptide(trotations[i].tcomposition, false) + "
"; } coveragebyseries += "
"; + /*matchedSeries tempseries; + bool reportrow; + if (parameters->ionsfortheoreticalspectra.size() > 0) { coveragebyseries += "Series of matched peaks:"; coveragebyseries += ""; @@ -1987,13 +2899,12 @@ int cTheoreticalSpectrum::compareBranched(cPeaksList& sortedpeaklist, cBricksDat if (reportrow) { coveragebyseries += ""; } - visualcoverage.push_back(tempseries); } } coveragebyseries += ""; } coveragebyseries += "
ionsfortheoreticalspectra[0]][-1].size()) + "\"> 
"; - } + }*/ } @@ -2071,7 +2982,7 @@ int cTheoreticalSpectrum::compareLinear(cPeaksList& sortedpeaklist, cBricksDatab // coverage of series - map > > series; + /*map > > series; for (int i = 0; i < (int)parameters->ionsfortheoreticalspectra.size(); i++) { for (int j = -1; j < (int)parameters->neutrallossesfortheoreticalspectra.size(); j++) { @@ -2088,12 +2999,12 @@ int cTheoreticalSpectrum::compareLinear(cPeaksList& sortedpeaklist, cBricksDatab } for (int i = 0; i < theoreticalpeaksrealsize; i++) { - if (!theoreticalpeaks[i].isotope && (theoreticalpeaks[i].matched > 0) + if (!theoreticalpeaks[i].isotope && (theoreticalpeaks[i].matched > 0) && (theoreticalpeaks[i].seriesid >= 0) && (series.count(theoreticalpeaks[i].iontype) == 1) && (series[theoreticalpeaks[i].iontype].count(theoreticalpeaks[i].neutrallosstype) == 1)) { series[theoreticalpeaks[i].iontype][theoreticalpeaks[i].neutrallosstype][theoreticalpeaks[i].seriesid]++; } - } + }*/ // peak hits without parents are removed @@ -2132,8 +3043,7 @@ int cTheoreticalSpectrum::compareLinear(cPeaksList& sortedpeaklist, cBricksDatab normalizeTheoreticalIntensities(theoreticalpeaks, theoreticalpeaksrealsize); } - visualcoverage.clear(); - visualSeries tempseries; + /*matchedSeries tempseries; bool reportrow; if (parameters->ionsfortheoreticalspectra.size() > 0) { @@ -2170,11 +3080,10 @@ int cTheoreticalSpectrum::compareLinear(cPeaksList& sortedpeaklist, cBricksDatab if (reportrow) { coveragebyseries += ""; } - visualcoverage.push_back(tempseries); } } coveragebyseries += ""; - } + }*/ } @@ -2310,7 +3219,7 @@ int cTheoreticalSpectrum::compareCyclic(cPeaksList& sortedpeaklist, cBricksDatab // coverage of series - vector > > > series; + /*vector > > > series; series.resize(rotations.size()); for (int i = 0; i < (int)series.size(); i++) { @@ -2332,12 +3241,12 @@ int cTheoreticalSpectrum::compareCyclic(cPeaksList& sortedpeaklist, cBricksDatab } for (int i = 0; i < theoreticalpeaksrealsize; i++) { - if (!theoreticalpeaks[i].isotope && (theoreticalpeaks[i].matched > 0) && (theoreticalpeaks[i].rotationid >= 0) + if (!theoreticalpeaks[i].isotope && (theoreticalpeaks[i].matched > 0) && (theoreticalpeaks[i].rotationid >= 0) && (theoreticalpeaks[i].seriesid >= 0) && (series[theoreticalpeaks[i].rotationid].count(theoreticalpeaks[i].iontype) == 1) && (series[theoreticalpeaks[i].rotationid][theoreticalpeaks[i].iontype].count(theoreticalpeaks[i].neutrallosstype) == 1)) { series[theoreticalpeaks[i].rotationid][theoreticalpeaks[i].iontype][theoreticalpeaks[i].neutrallosstype][theoreticalpeaks[i].seriesid]++; } - } + }*/ // peak hits without parents are removed @@ -2433,19 +3342,23 @@ int cTheoreticalSpectrum::compareCyclic(cPeaksList& sortedpeaklist, cBricksDatab normalizeTheoreticalIntensities(theoreticalpeaks, theoreticalpeaksrealsize); } - visualcoverage.clear(); - visualSeries tempseries; - bool reportrow; + string rotationlabel; + rotationslabels.clear(); coveragebyseries = "Linearized sequences from all ring break up points:
"; for (int i = 0; i < (int)rotations.size(); i++) { if (i == r) { coveragebyseries += "
"; } - coveragebyseries += to_string(splittingsites[i].first + 1) + "-" + to_string(splittingsites[i].second + 1) + " " + bricksdatabasewithcombinations.getAcronymName(rotations[i], false) + "
"; + rotationlabel = to_string(splittingsites[i].first + 1) + "-" + to_string(splittingsites[i].second + 1); + rotationslabels.push_back(rotationlabel); + coveragebyseries += rotationlabel + " " + bricksdatabasewithcombinations.getAcronymName(rotations[i], false) + "
"; } coveragebyseries += "
"; + /*matchedSeries tempseries; + bool reportrow; + if (parameters->ionsfortheoreticalspectra.size() > 0) { coveragebyseries += "Series of matched peaks:"; coveragebyseries += ""; @@ -2482,13 +3395,12 @@ int cTheoreticalSpectrum::compareCyclic(cPeaksList& sortedpeaklist, cBricksDatab if (reportrow) { coveragebyseries += ""; } - visualcoverage.push_back(tempseries); } } coveragebyseries += ""; } coveragebyseries += "
ionsfortheoreticalspectra[0]][-1].size()) + "\"> 
"; - } + }*/ } @@ -2653,7 +3565,7 @@ int cTheoreticalSpectrum::compareBranchCyclic(cPeaksList& sortedpeaklist, cBrick // coverage of series - vector > > > > series; + /*vector > > > > series; series.resize(branchcyclicrotations.size()); for (int i = 0; i < (int)branchcyclicrotations.size(); i++) { series[i].resize(6); @@ -2679,7 +3591,7 @@ int cTheoreticalSpectrum::compareBranchCyclic(cPeaksList& sortedpeaklist, cBrick } for (int j = 0; j < theoreticalpeaksrealsize; j++) { - if (!theoreticalpeaks[j].isotope && (theoreticalpeaks[j].matched > 0) && (theoreticalpeaks[j].rotationid >= 0) + if (!theoreticalpeaks[j].isotope && (theoreticalpeaks[j].matched > 0) && (theoreticalpeaks[j].rotationid >= 0) && (theoreticalpeaks[j].seriesid >= 0) && (series[i][theoreticalpeaks[j].rotationid % 6].count(theoreticalpeaks[j].iontype) == 1) && (series[i][theoreticalpeaks[j].rotationid % 6][theoreticalpeaks[j].iontype].count(theoreticalpeaks[j].neutrallosstype) == 1)) { if (i == theoreticalpeaks[j].rotationid / 6) { @@ -2687,7 +3599,7 @@ int cTheoreticalSpectrum::compareBranchCyclic(cPeaksList& sortedpeaklist, cBrick } } } - } + }*/ // peak hits without parents are removed @@ -2730,14 +3642,15 @@ int cTheoreticalSpectrum::compareBranchCyclic(cPeaksList& sortedpeaklist, cBrick normalizeTheoreticalIntensities(theoreticalpeaks, theoreticalpeaksrealsize); } - visualcoverage.clear(); - visualSeries tempseries; - bool reportrow; + string rotationlabel; + rotationslabels.clear(); coveragebyseries = "Linearized sequences from all ring break up points:
"; for (int i = 0; i < (int)branchcyclicrotations.size(); i++) { + rotationlabel = to_string(splittingsites[i].first + 1) + "-" + to_string(splittingsites[i].second + 1); + rotationslabels.push_back(rotationlabel); for (int j = 0; j < (int)trotationsofbranchcyclicrotations[i].size(); j++) { - coveragebyseries += to_string(splittingsites[i].first + 1) + "-" + to_string(splittingsites[i].second + 1) + "_"; + coveragebyseries += rotationlabel + "_"; coveragebyseries += to_string(j + 1) + " ~ "; coveragebyseries += bricksdatabasewithcombinations.getAcronymNameOfTPeptide(trotationsofbranchcyclicrotations[i][j].tcomposition, false); coveragebyseries += "
"; @@ -2745,6 +3658,9 @@ int cTheoreticalSpectrum::compareBranchCyclic(cPeaksList& sortedpeaklist, cBrick coveragebyseries += "
"; } + /*matchedSeries tempseries; + bool reportrow; + if (parameters->ionsfortheoreticalspectra.size() > 0) { coveragebyseries += "Series of matched peaks:"; coveragebyseries += ""; @@ -2783,14 +3699,13 @@ int cTheoreticalSpectrum::compareBranchCyclic(cPeaksList& sortedpeaklist, cBrick if (reportrow) { coveragebyseries += ""; } - visualcoverage.push_back(tempseries); } } coveragebyseries += ""; } } coveragebyseries += "
ionsfortheoreticalspectra[0]][-1].size()) + "\"> 
"; - } + }*/ } @@ -2898,7 +3813,7 @@ int cTheoreticalSpectrum::compareLinearPolyketide(cPeaksList& sortedpeaklist, cB // coverage of series - map > > series; + /*map > > series; for (int i = 0; i < (int)parameters->ionsfortheoreticalspectra.size(); i++) { for (int j = -1; j < (int)parameters->neutrallossesfortheoreticalspectra.size(); j++) { @@ -2915,12 +3830,12 @@ int cTheoreticalSpectrum::compareLinearPolyketide(cPeaksList& sortedpeaklist, cB } for (int i = 0; i < theoreticalpeaksrealsize; i++) { - if (!theoreticalpeaks[i].isotope && (theoreticalpeaks[i].matched > 0) + if (!theoreticalpeaks[i].isotope && (theoreticalpeaks[i].matched > 0) && (theoreticalpeaks[i].seriesid >= 0) && (series.count(theoreticalpeaks[i].iontype) == 1) && (series[theoreticalpeaks[i].iontype].count(theoreticalpeaks[i].neutrallosstype) == 1)) { series[theoreticalpeaks[i].iontype][theoreticalpeaks[i].neutrallosstype][theoreticalpeaks[i].seriesid]++; } - } + }*/ // peak hits without parents are removed @@ -2959,8 +3874,7 @@ int cTheoreticalSpectrum::compareLinearPolyketide(cPeaksList& sortedpeaklist, cB normalizeTheoreticalIntensities(theoreticalpeaks, theoreticalpeaksrealsize); } - visualcoverage.clear(); - visualSeries tempseries; + /*matchedSeries tempseries; bool reportrow; if (parameters->ionsfortheoreticalspectra.size() > 0) { @@ -2997,11 +3911,10 @@ int cTheoreticalSpectrum::compareLinearPolyketide(cPeaksList& sortedpeaklist, cB if (reportrow) { coveragebyseries += ""; } - visualcoverage.push_back(tempseries); } } coveragebyseries += ""; - } + }*/ } @@ -3023,7 +3936,54 @@ int cTheoreticalSpectrum::compareCyclicPolyketide(cPeaksList& sortedpeaklist, cB } -void cTheoreticalSpectrum::generateMSSpectrum(bool writedescription) { +int cTheoreticalSpectrum::compareOther(cPeaksList& sortedpeaklist, bool writedescription, cPeaksList& unmatchedpeaksinmatchedpatterns, unordered_map* isotopeformuladesctoid) { + + int theoreticalpeaksrealsize = 0; + + // initialize the experimental peaklist + experimentalpeaks = sortedpeaklist; + + generatePrecursorIonForOther(theoreticalpeaksrealsize, writedescription); + + if (parameters->generateisotopepattern) { + generateFragmentIsotopePatterns(theoreticalpeaksrealsize, writedescription, isotopeformuladesctoid); + } + + // search the theoretical peaks in the experimental peak list + experimentalmatches.clear(); + searchForPeakPairs(theoreticalpeaks, theoreticalpeaksrealsize, experimentalpeaks, parameters->fragmentmasserrortolerance); + + if (parameters->generateisotopepattern) { + removeUnmatchedIsotopePatterns(theoreticalpeaks, theoreticalpeaksrealsize, experimentalpeaks, unmatchedpeaksinmatchedpatterns, writedescription && !parameters->reportunmatchedtheoreticalpeaks); + } + + if (!parameters->generateisotopepattern) { + removeUnmatchedMetalIsotopes(theoreticalpeaks, theoreticalpeaksrealsize, experimentalpeaks); + } + + fillExperimentalAnnotationsAndRemoveUnmatchedTheoreticalPeaks(theoreticalpeaksrealsize, other, unmatchedpeaksinmatchedpatterns, parameters->reportunmatchedtheoreticalpeaks, writedescription); + + if (writedescription) { + + theoreticalpeaks.fillOrderIDs(); + + if (parameters->generateisotopepattern) { + if (!parameters->reportunmatchedtheoreticalpeaks) { + theoreticalpeaks.sortbyGroupId(); + } + normalizeTheoreticalIntensities(theoreticalpeaks, theoreticalpeaksrealsize); + } + + } + + computeStatistics(writedescription); + + return theoreticalpeaksrealsize; + +} + + +void cTheoreticalSpectrum::generateMSSpectrum(bool& terminatecomputation, bool writedescription) { cPeak peak; cSummaryFormula formula; regex rx; @@ -3045,6 +4005,12 @@ void cTheoreticalSpectrum::generateMSSpectrum(bool writedescription) { int theoreticalpeaksrealsize = 0; for (int i = 0; i < parameters->sequencedatabase.size(); i++) { + if (terminatecomputation) { + theoreticalpeaks.clear(); + theoreticalpeaksrealsize = 0; + return; + } + peak.clear(); peak.compoundid = i; peak.isotope = false; @@ -3058,6 +4024,10 @@ void cTheoreticalSpectrum::generateMSSpectrum(bool writedescription) { for (int m = 0; m < abs(parameters->precursorcharge); m++) { + peak.iontype = parameters->ionsfortheoreticalspectra[j]; + peak.neutrallosstype = (k >= 0) ? parameters->neutrallossesfortheoreticalspectra[k] : -1; + peak.charge = (parameters->precursorcharge > 0) ? m + 1 : -(m + 1); + peak.mzratio = (double)parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].multiplier*formula.getMass() + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].massdifference; if (parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].positive) { peak.mzratio += (double)m*(H - e); @@ -3100,7 +4070,7 @@ void cTheoreticalSpectrum::generateMSSpectrum(bool writedescription) { } -void cTheoreticalSpectrum::generateFineMSSpectrum() { +void cTheoreticalSpectrum::generateFineMSSpectrum(bool& terminatecomputation) { cSummaryFormula formula; string proton = "H+"; string description; @@ -3118,6 +4088,11 @@ void cTheoreticalSpectrum::generateFineMSSpectrum() { sequence.setDecoy(true); for (int i = 0; i < seqdbsize; i++) { + if (terminatecomputation) { + parameters->sequencedatabase.clear(); + return; + } + summary = parameters->sequencedatabase[i].getSummaryFormula() + "H"; sequence.setSummaryFormula(summary); parameters->sequencedatabase.push_back(sequence); @@ -3125,6 +4100,12 @@ void cTheoreticalSpectrum::generateFineMSSpectrum() { for (int i = 0; i < parameters->sequencedatabase.size(); i++) { + if (terminatecomputation) { + theoreticalpeaks.clear(); + theoreticalpeaksrealsize = 0; + return; + } + formula.clear(); formula.setFormula(parameters->sequencedatabase[i].getSummaryFormula()); @@ -3176,6 +4157,9 @@ void cTheoreticalSpectrum::generateFineMSSpectrum() { cPeaksList isotopepattern = chargedformula.getIsotopePattern(parameters->fwhm, n + 1, parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].positive, true); for (int p = 0; p < isotopepattern.size(); p++) { isotopepattern[p].description = description + isotopepattern[p].description + "): "; + isotopepattern[p].iontype = parameters->ionsfortheoreticalspectra[j]; + isotopepattern[p].neutrallosstype = (k >= 0) ? parameters->neutrallossesfortheoreticalspectra[k] : -1; + isotopepattern[p].charge = (parameters->precursorcharge > 0) ? n + 1 : -(n + 1); isotopepattern[p].groupid = groupid; isotopepattern[p].compoundid = i; isotopepattern[p].decoy = parameters->sequencedatabase[i].isDecoy(); @@ -3195,7 +4179,51 @@ void cTheoreticalSpectrum::generateFineMSSpectrum() { } -void cTheoreticalSpectrum::compareMSSpectrum(int id, cTheoreticalSpectrum& tsfull, cPeaksList& unmatchedpeaksinmatchedpatterns) { +void cTheoreticalSpectrum::getHintsIndex(int id, cTheoreticalSpectrum& tsfull, cPeaksList& unmatchedpeaksinmatchedpatterns, vector< vector >& hintsindex) { + experimentalpeaks = parameters->peaklistseries[id]; + + cPeaksList* tsfullpeaklist = tsfull.getTheoreticalPeaks(); + + experimentalmatches.clear(); + searchForPeakPairs(*tsfullpeaklist, tsfull.getNumberOfPeaks(), experimentalpeaks, parameters->fragmentmasserrortolerance); + + if (parameters->generateisotopepattern) { + if (parameters->minimumpatternsize > 1) { + removeUnmatchedPatternsFineSpectra(*tsfullpeaklist, tsfull.getNumberOfPeaks(), experimentalpeaks); + } + if (parameters->intensitytolerance > 0) { + removeUnmatchedPatternsByIntensityRatio(*tsfullpeaklist, tsfull.getNumberOfPeaks(), experimentalpeaks); + } + if (parameters->mzdifftolerance > 0) { + removeUnmatchedPatternsByMZDifference(*tsfullpeaklist, tsfull.getNumberOfPeaks(), experimentalpeaks); + } + } + + // clear matched isotopes of unmatched monoisotopic peaks + unmatchedpeaksinmatchedpatterns.clear(); + if (parameters->generateisotopepattern) { + removeUnmatchedIsotopePatterns(*tsfullpeaklist, tsfull.getNumberOfPeaks(), experimentalpeaks, unmatchedpeaksinmatchedpatterns, false); + } + else { + removeUnmatchedMetalIsotopes(*tsfullpeaklist, tsfull.getNumberOfPeaks(), experimentalpeaks); + } + + if (parameters->generateisotopepattern) { + removeDecoyPeakMatches(*tsfullpeaklist, tsfull.getNumberOfPeaks(), experimentalpeaks); + } + + for (int i = 0; i < (int)experimentalpeaks.size(); i++) { + for (auto it = experimentalmatches[i].begin(); it != experimentalmatches[i].end(); ++it) { + hintsindex[*it].push_back(id); + + (*tsfullpeaklist)[*it].matched = 0; + (*tsfullpeaklist)[*it].matchedid = -1; + } + } +} + + +void cTheoreticalSpectrum::compareMSSpectrum(int id, cTheoreticalSpectrum& tsfull, cPeaksList& unmatchedpeaksinmatchedpatterns, vector< vector >& hintsindex) { experimentalpeaks = parameters->peaklistseries[id]; cPeaksList* tsfullpeaklist = tsfull.getTheoreticalPeaks(); @@ -3203,48 +4231,48 @@ void cTheoreticalSpectrum::compareMSSpectrum(int id, cTheoreticalSpectrum& tsful experimentalmatches.clear(); searchForPeakPairs(*tsfullpeaklist, tsfull.getNumberOfPeaks(), experimentalpeaks, parameters->fragmentmasserrortolerance); + if (parameters->generateisotopepattern) { + if (parameters->minimumpatternsize > 1) { + removeUnmatchedPatternsFineSpectra(*tsfullpeaklist, tsfull.getNumberOfPeaks(), experimentalpeaks); + } + if (parameters->intensitytolerance > 0) { + removeUnmatchedPatternsByIntensityRatio(*tsfullpeaklist, tsfull.getNumberOfPeaks(), experimentalpeaks); + } + if (parameters->mzdifftolerance > 0) { + removeUnmatchedPatternsByMZDifference(*tsfullpeaklist, tsfull.getNumberOfPeaks(), experimentalpeaks); + } + } + bool lcms = (parameters->peaklistseries.size() > 1) && !((parameters->peaklistfileformat == mis) || (parameters->peaklistfileformat == imzML)); // pre-cleaning (relative intensity threshold, minimumpatternsize) if (parameters->generateisotopepattern) { - if (parameters->allionsmustbepresent || (lcms && (parameters->minimumfeaturesize > 1))) { + if ((parameters->minimumiontypes > 1) || (lcms && (parameters->minimumfeaturesize > 1))) { removeUnmatchedIsotopePatterns(*tsfullpeaklist, tsfull.getNumberOfPeaks(), experimentalpeaks, unmatchedpeaksinmatchedpatterns, false); } } // mark isotopes if (parameters->generateisotopepattern) { - if ((parameters->allionsmustbepresent) || (lcms && (parameters->minimumfeaturesize > 1))) { + if ((parameters->minimumiontypes > 1) || (lcms && (parameters->minimumfeaturesize > 1))) { tsfullpeaklist->markIsotopes(); } } - // LC-MS data - if (lcms) { - if (parameters->minimumfeaturesize > 1) { - if (parameters->allionsmustbepresent) { - removeUnmatchedFeaturesAndCompounds(*tsfullpeaklist, tsfull.getNumberOfPeaks(), experimentalpeaks, id); - } - else { - removeUnmatchedFeatures(*tsfullpeaklist, tsfull.getNumberOfPeaks(), experimentalpeaks, id); - } - } - else { - if (parameters->allionsmustbepresent) { - removeUnmatchedCompounds(*tsfullpeaklist, tsfull.getNumberOfPeaks(), experimentalpeaks); - } - } + // LC-MS data or MSI data + if (lcms || (parameters->peaklistfileformat == mis) || (parameters->peaklistfileformat == imzML)) { + removeUnmatchedFeatures(lcms, *tsfullpeaklist, tsfull.getNumberOfPeaks(), experimentalpeaks, hintsindex/*, id*/); } - // direct MS or MSI data + // direct MS else { - if (parameters->allionsmustbepresent) { - removeUnmatchedCompounds(*tsfullpeaklist, tsfull.getNumberOfPeaks(), experimentalpeaks); + if (parameters->minimumiontypes > 1) { + removeUnmatchedCompounds(*tsfullpeaklist, tsfull.getNumberOfPeaks(), experimentalpeaks, parameters->minimumiontypes); } } // clear marks of isotopes if (parameters->generateisotopepattern) { - if ((parameters->allionsmustbepresent) || (lcms && (parameters->minimumfeaturesize > 1))) { + if ((parameters->minimumiontypes > 1) || (lcms && (parameters->minimumfeaturesize > 1))) { tsfullpeaklist->setIsotopeFlags(false); } } @@ -3252,7 +4280,6 @@ void cTheoreticalSpectrum::compareMSSpectrum(int id, cTheoreticalSpectrum& tsful // clear matched isotopes of unmatched monoisotopic peaks unmatchedpeaksinmatchedpatterns.clear(); if (parameters->generateisotopepattern) { - // performs also an additional cleaning of isotopes if removeUnmatchedFeatures is used removeUnmatchedIsotopePatterns(*tsfullpeaklist, tsfull.getNumberOfPeaks(), experimentalpeaks, unmatchedpeaksinmatchedpatterns, true); } else { @@ -3423,12 +4450,19 @@ double cTheoreticalSpectrum::getRatioOfMatchedPeaks() { void cTheoreticalSpectrum::generateNTerminalFragmentIons(int maxcharge, int& peaklistrealsize, vector& intcomposition, eFragmentIonType fragmentiontype, int neutrallosstype, cBricksDatabase& bricksdatabase, bool writedescription, int rotationid, vector& splittingsites, vector& searchedmodifications, ePeptideType peptidetype, bool regularblocksorder, TRotationInfo* trotation, eResidueLossType leftresiduelosstype, bool hasfirstblockartificial) { cPeak peak; map atoms; - atoms.clear(); - vector internalcomposition; - map tmpmap; + vector currentlosses; + vector fragmentlossmass; + vector fragmentlosssummary; + vector< map > fragmentlossmap; + double tmpmz; - int tmprotationid; + map tmpmap; + + //int tmprotationid; + //int tmpseriesid; + + bool skipcommonfragments; bool disablesummary = false; if ((parameters->mode == denovoengine) && (parameters->blindedges == 2) && bricksdatabase[intcomposition[0] - 1].isArtificial()) { @@ -3511,6 +4545,8 @@ void cTheoreticalSpectrum::generateNTerminalFragmentIons(int maxcharge, int& pea disablesummary = true; } + updateListOfNeutralLosses(bricksdatabase, bricksdatabase[intcomposition[i] - 1], currentlosses, fragmentlossmass, fragmentlosssummary, fragmentlossmap, writedescription, disablesummary); + if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { mergeMaps(bricksdatabase[intcomposition[i] - 1].getSummaryMap(), atoms); } @@ -3524,7 +4560,12 @@ void cTheoreticalSpectrum::generateNTerminalFragmentIons(int maxcharge, int& pea } if ((i >= trotation->middlebranchstart) && (i < trotation->middlebranchend)) { - if (!(parameters->internalfragments && (peptidetype == branchcyclic) && (trotation->id == 0))) { + if (parameters->internalfragments) { + if (!((peptidetype == branchcyclic) && (trotation->id == 0))) { + continue; + } + } + else { continue; } } @@ -3601,92 +4642,88 @@ void cTheoreticalSpectrum::generateNTerminalFragmentIons(int maxcharge, int& pea peak.seriesid = i; - if (writedescription) { - - peak.description = ""; - if ((peptidetype == cyclic) || (peptidetype == cyclicpolyketide) || (peptidetype == branched) || (peptidetype == branchcyclic)) { - peak.description += prefixstr; - } - if ((peptidetype == linearpolyketide) || (peptidetype == cyclicpolyketide)) { - peak.description += parameters->iondefinitions[fragmentiontype].name.substr(0, 2) + to_string(i + 1); - if (parameters->iondefinitions[fragmentiontype].name.size() > 2) { - peak.description += parameters->iondefinitions[fragmentiontype].name.substr(2, parameters->iondefinitions[fragmentiontype].name.length() - 2); - } - } - else { - peak.description += parameters->iondefinitions[fragmentiontype].name.substr(0, 1) + to_string(i + 1); - if (parameters->iondefinitions[fragmentiontype].name.size() > 1) { - peak.description += parameters->iondefinitions[fragmentiontype].name.substr(1, parameters->iondefinitions[fragmentiontype].name.length() - 1); - } - } - if (peak.neutrallosstype >= 0) { - peak.description += "-" + parameters->neutrallossesdefinitions[peak.neutrallosstype].summary; - } - addAdductToDescription(peak.description, parameters->metaladducts); - peak.description += ": "; - for (int j = 0; j <= i; j++) { - peak.description += "[" + bricksdatabase[intcomposition[j] - 1].getAcronymsAsString() + "]"; - if (j < i) { - peak.description += '-'; - } - } - - } - - generateChargedFragments(peak, atoms, peaklistrealsize, maxcharge, writedescription, disablesummary); + skipcommonfragments = (trotation && (i >= trotation->middlebranchstart) && (i < trotation->middlebranchend) && (peptidetype == branchcyclic) && (trotation->id == 0)); - if (parameters->internalfragments && (peptidetype == branchcyclic) && (trotation->id == 0)) { - if ((i >= trotation->middlebranchstart) && (i < trotation->middlebranchend)) { - internalcomposition.clear(); - for (int j = 0; j <= i; j++) { - internalcomposition.push_back(intcomposition[j]); - } + if (!skipcommonfragments) { + tmpmz = peak.mzratio; + if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { tmpmap = atoms; - tmpmz = peak.mzratio; - tmprotationid = peak.rotationid; - - peak.rotationid = -1; - peak.seriesid = -1; - - for (int j = trotation->middlebranchend + 1; j < (int)intcomposition.size() - 1; j++) { - internalcomposition.push_back(intcomposition[j]); + } - peak.mzratio += bricksdatabase[intcomposition[j] - 1].getMass(); - if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { - mergeMaps(bricksdatabase[intcomposition[j] - 1].getSummaryMap(), tmpmap); - } + //tmprotationid = peak.rotationid; + //tmpseriesid = peak.seriesid; - if (writedescription) { - peak.description = "internal "; + for (int j = -1; j < (int)fragmentlossmass.size(); j++) { - peak.description += parameters->iondefinitions[fragmentiontype].name.substr(0, 1) + to_string((int)internalcomposition.size()); - //if (parameters->iondefinitions[fragmentiontype].name.size() > 1) { - // peak.description += parameters->iondefinitions[fragmentiontype].name.substr(1, parameters->iondefinitions[fragmentiontype].name.length() - 1); - //} + if (writedescription) { + peak.description = ""; + if ((peptidetype == cyclic) || (peptidetype == cyclicpolyketide) || (peptidetype == branched) || (peptidetype == branchcyclic)) { + peak.description += prefixstr; + } + if ((peptidetype == linearpolyketide) || (peptidetype == cyclicpolyketide)) { + peak.description += parameters->iondefinitions[fragmentiontype].name.substr(0, 2) + to_string(i + 1); + if (parameters->iondefinitions[fragmentiontype].name.size() > 2) { + peak.description += parameters->iondefinitions[fragmentiontype].name.substr(2, parameters->iondefinitions[fragmentiontype].name.length() - 2); + } + } + else { + peak.description += parameters->iondefinitions[fragmentiontype].name.substr(0, 1) + to_string(i + 1); + if (parameters->iondefinitions[fragmentiontype].name.size() > 1) { + peak.description += parameters->iondefinitions[fragmentiontype].name.substr(1, parameters->iondefinitions[fragmentiontype].name.length() - 1); + } + } + if ((peak.neutrallosstype >= 0) || (j >= 0)) { + peak.description += " -"; + if (j >= 0) { + peak.description += fragmentlosssummary[j]; + } if (peak.neutrallosstype >= 0) { - peak.description += "-" + parameters->neutrallossesdefinitions[peak.neutrallosstype].summary; + peak.description += parameters->neutrallossesdefinitions[peak.neutrallosstype].summary; + } + } + addAdductToDescription(peak.description, parameters->metaladducts); + peak.description += ": "; + for (int k = 0; k <= i; k++) { + peak.description += "[" + bricksdatabase[intcomposition[k] - 1].getAcronymsAsString() + "]"; + if (k < i) { + peak.description += '-'; } + } - addAdductToDescription(peak.description, parameters->metaladducts); - peak.description += ": "; + } - for (int k = 0; k < (int)internalcomposition.size(); k++) { - peak.description += "[" + bricksdatabase[internalcomposition[k] - 1].getAcronymsAsString() + "]"; - if (k < (int)internalcomposition.size() - 1) { - peak.description += '-'; - } - } + if (j >= 0) { + peak.mzratio += fragmentlossmass[j]; + if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { + mergeMaps(fragmentlossmap[j], tmpmap); } - generateChargedFragments(peak, tmpmap, peaklistrealsize, maxcharge, writedescription, disablesummary); + //peak.rotationid = -1; + //peak.seriesid = -1; + } + else { + //peak.rotationid = tmprotationid; + //peak.seriesid = tmpseriesid; } + generateChargedFragments(peak, tmpmap, peaklistrealsize, maxcharge, writedescription, disablesummary); + peak.mzratio = tmpmz; - peak.rotationid = tmprotationid; + if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { + tmpmap = atoms; + } } + + //peak.rotationid = tmprotationid; + //peak.seriesid = tmpseriesid; + + } + + if (parameters->internalfragments) { + generateInternalFragments(bricksdatabase, peak, maxcharge, peaklistrealsize, intcomposition, i, atoms, currentlosses, fragmentiontype, peptidetype, trotation, writedescription, disablesummary); } } @@ -3697,7 +4734,19 @@ void cTheoreticalSpectrum::generateNTerminalFragmentIons(int maxcharge, int& pea void cTheoreticalSpectrum::generateCTerminalFragmentIons(int maxcharge, int& peaklistrealsize, vector& intcomposition, eFragmentIonType fragmentiontype, int neutrallosstype, cBricksDatabase& bricksdatabase, bool writedescription, int rotationid, vector& splittingsites, vector& searchedmodifications, ePeptideType peptidetype, bool regularblocksorder, TRotationInfo* trotation, eResidueLossType rightresiduelosstype, bool haslastblockartificial) { cPeak peak; map atoms; - atoms.clear(); + + vector currentlosses; + vector fragmentlossmass; + vector fragmentlosssummary; + vector< map > fragmentlossmap; + + double tmpmz; + map tmpmap; + + //int tmprotationid; + //int tmpseriesid; + + bool skipcommonfragments; bool disablesummary = false; if ((parameters->mode == denovoengine) && (parameters->blindedges == 2) && bricksdatabase[intcomposition[intcomposition.size() - 1] - 1].isArtificial()) { @@ -3784,6 +4833,8 @@ void cTheoreticalSpectrum::generateCTerminalFragmentIons(int maxcharge, int& pea disablesummary = true; } + updateListOfNeutralLosses(bricksdatabase, bricksdatabase[intcomposition[i] - 1], currentlosses, fragmentlossmass, fragmentlosssummary, fragmentlossmap, writedescription, disablesummary); + if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { mergeMaps(bricksdatabase[intcomposition[i] - 1].getSummaryMap(), atoms); } @@ -3798,7 +4849,13 @@ void cTheoreticalSpectrum::generateCTerminalFragmentIons(int maxcharge, int& pea } if ((i > trotation->middlebranchstart) && (i <= trotation->middlebranchend)) { - continue; + if (parameters->internalfragments) { + // to do where applicable + continue; + } + else { + continue; + } } // redundant short c-term fragments are not generated @@ -3846,39 +4903,90 @@ void cTheoreticalSpectrum::generateCTerminalFragmentIons(int maxcharge, int& pea peak.seriesid = (int)intcomposition.size() - i - 1; - if (writedescription) { + // to do where applicable + skipcommonfragments = false; - peak.description = ""; - if ((peptidetype == cyclicpolyketide) /* || (peptidetype == cyclic) */ || (peptidetype == branched) || (peptidetype == branchcyclic)) { - peak.description += prefixstr; + if (!skipcommonfragments) { + + tmpmz = peak.mzratio; + if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { + tmpmap = atoms; } - if ((peptidetype == linearpolyketide) || (peptidetype == cyclicpolyketide)) { - peak.description += parameters->iondefinitions[fragmentiontype].name.substr(0, 2) + to_string((int)intcomposition.size() - i); - if (parameters->iondefinitions[fragmentiontype].name.size() > 2) { - peak.description += parameters->iondefinitions[fragmentiontype].name.substr(2, parameters->iondefinitions[fragmentiontype].name.length() - 2); + + //tmprotationid = peak.rotationid; + //tmpseriesid = peak.seriesid; + + for (int j = -1; j < (int)fragmentlossmass.size(); j++) { + + if (writedescription) { + + peak.description = ""; + if ((peptidetype == cyclicpolyketide) /* || (peptidetype == cyclic) */ || (peptidetype == branched) || (peptidetype == branchcyclic)) { + peak.description += prefixstr; + } + if ((peptidetype == linearpolyketide) || (peptidetype == cyclicpolyketide)) { + peak.description += parameters->iondefinitions[fragmentiontype].name.substr(0, 2) + to_string((int)intcomposition.size() - i); + if (parameters->iondefinitions[fragmentiontype].name.size() > 2) { + peak.description += parameters->iondefinitions[fragmentiontype].name.substr(2, parameters->iondefinitions[fragmentiontype].name.length() - 2); + } + } + else { + peak.description += parameters->iondefinitions[fragmentiontype].name.substr(0, 1) + to_string((int)intcomposition.size() - i); + if (parameters->iondefinitions[fragmentiontype].name.size() > 1) { + peak.description += parameters->iondefinitions[fragmentiontype].name.substr(1, parameters->iondefinitions[fragmentiontype].name.length() - 1); + } + } + if ((peak.neutrallosstype >= 0) || (j >= 0)) { + peak.description += " -"; + if (j >= 0) { + peak.description += fragmentlosssummary[j]; + } + if (peak.neutrallosstype >= 0) { + peak.description += parameters->neutrallossesdefinitions[peak.neutrallosstype].summary; + } + } + addAdductToDescription(peak.description, parameters->metaladducts); + peak.description += ": "; + for (int k = (int)intcomposition.size() - 1; k >= i; k--) { + peak.description += "[" + bricksdatabase[intcomposition[k] - 1].getAcronymsAsString() + "]"; + if (k > i) { + peak.description += '-'; + } + } + } - } - else { - peak.description += parameters->iondefinitions[fragmentiontype].name.substr(0, 1) + to_string((int)intcomposition.size() - i); - if (parameters->iondefinitions[fragmentiontype].name.size() > 1) { - peak.description += parameters->iondefinitions[fragmentiontype].name.substr(1, parameters->iondefinitions[fragmentiontype].name.length() - 1); + + if (j >= 0) { + peak.mzratio += fragmentlossmass[j]; + if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { + mergeMaps(fragmentlossmap[j], tmpmap); + } + + //peak.rotationid = -1; + //peak.seriesid = -1; } - } - if (peak.neutrallosstype >= 0) { - peak.description += "-" + parameters->neutrallossesdefinitions[peak.neutrallosstype].summary; - } - addAdductToDescription(peak.description, parameters->metaladducts); - peak.description += ": "; - for (int j = (int)intcomposition.size() - 1; j >= i; j--) { - peak.description += "[" + bricksdatabase[intcomposition[j] - 1].getAcronymsAsString() + "]"; - if (j > i) { - peak.description += '-'; + else { + //peak.rotationid = tmprotationid; + //peak.seriesid = tmpseriesid; + } + + generateChargedFragments(peak, tmpmap, peaklistrealsize, maxcharge, writedescription, disablesummary); + + peak.mzratio = tmpmz; + if (!disablesummary && (parameters->generateisotopepattern || writedescription)) { + tmpmap = atoms; } + } + //peak.rotationid = tmprotationid; + //peak.seriesid = tmpseriesid; + } - generateChargedFragments(peak, atoms, peaklistrealsize, maxcharge, writedescription, disablesummary); + if (parameters->internalfragments) { + // to do where applicable + } } @@ -4080,8 +5188,8 @@ void cTheoreticalSpectrum::setValidSequence(regex& searchedsequence) { } -vector& cTheoreticalSpectrum::getVisualCoverage() { - return visualcoverage; +vector& cTheoreticalSpectrum::getLabelsOfRotations() { + return rotationslabels; } @@ -4222,11 +5330,7 @@ void cTheoreticalSpectrum::store(ofstream& os) { os.write((char *)&valid, sizeof(bool)); os.write((char *)&sumofrelativeintensities, sizeof(double)); - size = (int)visualcoverage.size(); - os.write((char *)&size, sizeof(int)); - for (int i = 0; i < (int)visualcoverage.size(); i++) { - visualcoverage[i].store(os); - } + storeStringVector(rotationslabels, os); os.write((char *)&validposition, sizeof(int)); os.write((char *)&reversevalidposition, sizeof(int)); @@ -4308,11 +5412,7 @@ void cTheoreticalSpectrum::load(ifstream& is) { is.read((char *)&valid, sizeof(bool)); is.read((char *)&sumofrelativeintensities, sizeof(double)); - is.read((char *)&size, sizeof(int)); - visualcoverage.resize(size); - for (int i = 0; i < (int)visualcoverage.size(); i++) { - visualcoverage[i].load(is); - } + loadStringVector(rotationslabels, is); is.read((char *)&validposition, sizeof(int)); is.read((char *)&reversevalidposition, sizeof(int)); diff --git a/CycloBranch/core/cTheoreticalSpectrum.h b/CycloBranch/core/cTheoreticalSpectrum.h index 5a225fc..05e775b 100644 --- a/CycloBranch/core/cTheoreticalSpectrum.h +++ b/CycloBranch/core/cTheoreticalSpectrum.h @@ -59,9 +59,9 @@ struct splitSite { /** - \brief An auxiliary structure for visualisation of matched series of a cyclic peptide. + \brief An auxiliary structure for visualisation of matched series of fragment ions. */ -struct visualSeries { +struct matchedSeries { /** \brief A vector of matched peaks in a series. @@ -78,7 +78,7 @@ struct visualSeries { /** \brief The constructor. */ - visualSeries() { + matchedSeries() { series.clear(); name = ""; } @@ -119,7 +119,7 @@ class cTheoreticalSpectrum { string coveragebyseries; bool valid; double sumofrelativeintensities; - vector visualcoverage; + vector rotationslabels; int validposition; int reversevalidposition; int seriescompleted; @@ -134,9 +134,6 @@ class cTheoreticalSpectrum { // search for matches of experimental and theoretical peaks void searchForPeakPairs(cPeaksList& theoreticalpeaks, int theoreticalpeaksrealsize, cPeaksList& experimentalpeaks, double fragmentmasserrortolerance); - // search a m/z ratio in the experimental spectrum to decide whether its description should be generated - bool searchHint(double mzratio, cPeaksList& experimentalpeaks, double fragmentmasserrortolerance); - // compute additional scores void computeStatistics(bool writedescription); @@ -146,9 +143,18 @@ class cTheoreticalSpectrum { // generate precursor ion and its variants void generatePrecursorIon(vector& intcomposition, cBricksDatabase& bricksdatabasewithcombinations, int& theoreticalpeaksrealsize, bool writedescription); + // generate precursor ion and its variants for other type + void generatePrecursorIonForOther(int& theoreticalpeaksrealsize, bool writedescription); + // generate scrambled sequences void generateScrambledIons(cBricksDatabase& bricksdatabase, bool writedescription, int& theoreticalpeaksrealsize); + // update the list of losses + void updateListOfNeutralLosses(cBricksDatabase& bricksdatabase, cBrick& block, vector& currentlosses, vector& fragmentlossmass, vector& fragmentlosssummary, vector< map >& fragmentlossmap, bool writedescription, bool disablesummary); + + // generate internal fragments + void generateInternalFragments(cBricksDatabase& bricksdatabase, cPeak& peak, int maxcharge, int& peaklistrealsize, vector& intcomposition, int pos, map& atoms, vector& currentlosses, eFragmentIonType fragmentiontype, ePeptideType peptidetype, TRotationInfo* trotation, bool writedescription, bool disablesummary); + // select and normalize scrambled sequences void selectAndNormalizeScrambledSequences(unordered_set& scrambledsequences); @@ -171,13 +177,19 @@ class cTheoreticalSpectrum { void removeUnmatchedIsotopePatterns(cPeaksList& theoreticalpeaks, int theoreticalpeaksrealsize, cPeaksList& experimentalpeaks, cPeaksList& outputtheoreticalpeaks, bool storeunmatchedpeaks); // remove unmatched features - void removeUnmatchedFeatures(cPeaksList& theoreticalpeaks, int theoreticalpeaksrealsize, cPeaksList& experimentalpeaks, int id); - - // remove unmatched features - void removeUnmatchedFeaturesAndCompounds(cPeaksList& theoreticalpeaks, int theoreticalpeaksrealsize, cPeaksList& experimentalpeaks, int id); + int removeUnmatchedFeatures(bool lcms, cPeaksList& theoreticalpeaks, int theoreticalpeaksrealsize, cPeaksList& experimentalpeaks, vector< vector >& hintsindex/*, int id*/); // remove unmatched compounds - void removeUnmatchedCompounds(cPeaksList& theoreticalpeaks, int theoreticalpeaksrealsize, cPeaksList& experimentalpeaks); + int removeUnmatchedCompounds(cPeaksList& theoreticalpeaks, int theoreticalpeaksrealsize, cPeaksList& experimentalpeaks, int minimumiontypes); + + // remove unmatched patterns in fine isotopic patterns + void removeUnmatchedPatternsFineSpectra(cPeaksList& theoreticalpeaks, int theoreticalpeaksrealsize, cPeaksList& experimentalpeaks); + + // remove unmatched pattern by intensity ratio + void removeUnmatchedPatternsByIntensityRatio(cPeaksList& theoreticalpeaks, int theoreticalpeaksrealsize, cPeaksList& experimentalpeaks); + + // remove unmatched pattern by m/z difference + void removeUnmatchedPatternsByMZDifference(cPeaksList& theoreticalpeaks, int theoreticalpeaksrealsize, cPeaksList& experimentalpeaks); // calculate envelope scores void calculateEnvelopeScores(cPeaksList& theoreticalpeaks, int theoreticalpeaksrealsize, cPeaksList& experimentalpeaks); @@ -338,17 +350,40 @@ class cTheoreticalSpectrum { int compareCyclicPolyketide(cPeaksList& sortedpeaklist, cBricksDatabase& bricksdatabasewithcombinations, bool writedescription, regex& sequencetag, regex& searchedsequence, cPeaksList& unmatchedpeaksinmatchedpatterns, unordered_map* isotopeformuladesctoid); + /** + \brief Compare the theoretical spectrum of a metabolite with an experimental spectrum. + \param sortedpeaklist reference to an experimental peaklist + \param writedescription if true then string descriptions of peaks are filled + \param unmatchedpeaksinmatchedpatterns unmatched peaks in matched isotope patterns + \param isotopeformuladesctoid a map of isotope descriptions + \retval int number theoretical peaks generated + */ + int compareOther(cPeaksList& sortedpeaklist, bool writedescription, cPeaksList& unmatchedpeaksinmatchedpatterns, unordered_map* isotopeformuladesctoid); + + /** \brief Generate a simple mass spectrum. + \param terminatecomputation reference to a variable determining that the computation must be stopped \param writedescription if true then string descriptions of peaks are filled */ - void generateMSSpectrum(bool writedescription); + void generateMSSpectrum(bool& terminatecomputation, bool writedescription); /** \brief Generate a simple mass spectrum with fine isotopic patterns. + \param terminatecomputation reference to a variable determining that the computation must be stopped */ - void generateFineMSSpectrum(); + void generateFineMSSpectrum(bool& terminatecomputation); + + + /** + \brief Get a map of search hints to identify features in LC-MS data. + \param id identifier of an experimental spectrum + \param tsfull theoretical spectrum + \param unmatchedpeaksinmatchedpatterns unmatched peaks in matched isotope patterns + \param hintsindex index of experimental spectra for every matched theoretical peak + */ + void getHintsIndex(int id, cTheoreticalSpectrum& tsfull, cPeaksList& unmatchedpeaksinmatchedpatterns, vector< vector >& hintsindex); /** @@ -356,8 +391,9 @@ class cTheoreticalSpectrum { \param id identifier of an experimental spectrum \param tsfull theoretical spectrum with descriptions of peaks \param unmatchedpeaksinmatchedpatterns unmatched peaks in matched isotope patterns + \param hintsindex index of experimental spectra for every matched theoretical peak */ - void compareMSSpectrum(int id, cTheoreticalSpectrum& tsfull, cPeaksList& unmatchedpeaksinmatchedpatterns); + void compareMSSpectrum(int id, cTheoreticalSpectrum& tsfull, cPeaksList& unmatchedpeaksinmatchedpatterns, vector< vector >& hintsindex); /** @@ -554,10 +590,10 @@ class cTheoreticalSpectrum { /** - \brief Get a vector of fragment ion series for visualization. - \retval vector vector of fragment ion series for visualisation - */ - vector& getVisualCoverage(); + \brief Get the labels of cyclic rotations. + \retval vector a vector of labels + */ + vector& getLabelsOfRotations(); /** diff --git a/CycloBranch/core/cTheoreticalSpectrumList.cpp b/CycloBranch/core/cTheoreticalSpectrumList.cpp index e150c56..13ffe8b 100644 --- a/CycloBranch/core/cTheoreticalSpectrumList.cpp +++ b/CycloBranch/core/cTheoreticalSpectrumList.cpp @@ -116,48 +116,52 @@ int cTheoreticalSpectrumList::parallelCompareAndStore(cCandidateSet& candidates, int theoreticalpeaksrealsize = 0; currentworstscore = 0; - stmp = parameters->sequencetag; - fixRegularExpression(stmp); + if (parameters->peptidetype != other) { - /* - pos = (int)stmp.find("("); - if (pos != string::npos) { - stmp.replace(pos, 1, "\\("); - } - pos = (int)stmp.find(")"); - if (pos != string::npos) { - stmp.replace(pos, 1, "\\)"); - } - */ + stmp = parameters->sequencetag; + fixRegularExpression(stmp); - try { - rxsequencetag = stmp; - } - catch (regex_error& e) { - *os << endl << endl << "Error: Bad Regular Expression in Peptide Sequence Tag." << endl << e.what() << endl; - return -1; - } + /* + pos = (int)stmp.find("("); + if (pos != string::npos) { + stmp.replace(pos, 1, "\\("); + } + pos = (int)stmp.find(")"); + if (pos != string::npos) { + stmp.replace(pos, 1, "\\)"); + } + */ - stmp = parameters->searchedsequence; - fixRegularExpression(stmp); + try { + rxsequencetag = stmp; + } + catch (regex_error& e) { + *os << endl << endl << "Error: Bad Regular Expression in Peptide Sequence Tag." << endl << e.what() << endl; + return -1; + } - /* - pos = (int)stmp.find("("); - if (pos != string::npos) { - stmp.replace(pos, 1, "\\("); - } - pos = (int)stmp.find(")"); - if (pos != string::npos) { - stmp.replace(pos, 1, "\\)"); - } - */ + stmp = parameters->searchedsequence; + fixRegularExpression(stmp); + + /* + pos = (int)stmp.find("("); + if (pos != string::npos) { + stmp.replace(pos, 1, "\\("); + } + pos = (int)stmp.find(")"); + if (pos != string::npos) { + stmp.replace(pos, 1, "\\)"); + } + */ + + try { + rxsearchedsequence = stmp; + } + catch (regex_error& e) { + *os << endl << endl << "Error: Bad Regular Expression in the field 'Searched Sequence'." << endl << e.what() << endl; + return -1; + } - try { - rxsearchedsequence = stmp; - } - catch (regex_error& e) { - *os << endl << endl << "Error: Bad Regular Expression in the field 'Searched Sequence'." << endl << e.what() << endl; - return -1; } if ((parameters->mode == denovoengine) || (parameters->mode == databasesearch)) { @@ -289,6 +293,7 @@ int cTheoreticalSpectrumList::parallelCompareAndStore(cCandidateSet& candidates, theoreticalpeaksrealsize = tsp.compareCyclicPolyketide(tmppeaklist, *bricksdb, true, rxsequencetag, rxsearchedsequence, unmatchedpeaksinmatchedpatterns, &isotopeformuladesctoid); break; case other: + theoreticalpeaksrealsize = tsp.compareOther(tmppeaklist, true, unmatchedpeaksinmatchedpatterns, &isotopeformuladesctoid); break; default: break; @@ -336,9 +341,11 @@ int cTheoreticalSpectrumList::parallelCompareAndStore(cCandidateSet& candidates, string tmps; for (int i = 0; i < (int)theoreticalspectra.size(); i++) { theoreticalspectra[i].sortByMass(); - theoreticalspectra[i].getCandidate().setRealPeptideName(*bricksdb, parameters->peptidetype); - theoreticalspectra[i].getCandidate().setAcronymPeptideNameWithHTMLReferences(*bricksdb, parameters->peptidetype); - theoreticalspectra[i].getCandidate().setAcronyms(*bricksdb); + if (parameters->peptidetype != other) { + theoreticalspectra[i].getCandidate().setRealPeptideName(*bricksdb, parameters->peptidetype); + theoreticalspectra[i].getCandidate().setAcronymPeptideNameWithHTMLReferences(*bricksdb, parameters->peptidetype); + theoreticalspectra[i].getCandidate().setAcronyms(*bricksdb); + } if ((parameters->peptidetype == branched) || (parameters->peptidetype == branchcyclic)) { theoreticalspectra[i].getCandidate().setBackboneAcronyms(*bricksdb); theoreticalspectra[i].getCandidate().setBranchAcronyms(*bricksdb); diff --git a/CycloBranch/core/utilities.cpp b/CycloBranch/core/utilities.cpp index 7013a33..523efc3 100644 --- a/CycloBranch/core/utilities.cpp +++ b/CycloBranch/core/utilities.cpp @@ -4,7 +4,7 @@ QString appname = "CycloBranch"; -QString appversion = "v. 1.3.7 (64-bit)"; +QString appversion = "v. 2.0.0 (64-bit)"; #if OS_TYPE == UNX @@ -16,6 +16,44 @@ QString appversion = "v. 1.3.7 (64-bit)"; #endif +void storeIntVector(vector& v, ofstream& os) { + int size = (int)v.size(); + os.write((char *)&size, sizeof(int)); + for (int i = 0; i < (int)v.size(); i++) { + os.write((char *)&(v[i]), sizeof(int)); + } +} + + +void loadIntVector(vector& v, ifstream& is) { + int size; + is.read((char *)&size, sizeof(int)); + v.resize(size); + for (int i = 0; i < (int)v.size(); i++) { + is.read((char *)&(v[i]), sizeof(int)); + } +} + + +void storeDoubleVector(vector& v, ofstream& os) { + int size = (int)v.size(); + os.write((char *)&size, sizeof(int)); + for (int i = 0; i < (int)v.size(); i++) { + os.write((char *)&(v[i]), sizeof(double)); + } +} + + +void loadDoubleVector(vector& v, ifstream& is) { + int size; + is.read((char *)&size, sizeof(int)); + v.resize(size); + for (int i = 0; i < (int)v.size(); i++) { + is.read((char *)&(v[i]), sizeof(double)); + } +} + + void storeString(string& s, ofstream& os) { int size = (int)s.size(); os.write((char *)&size, sizeof(int)); @@ -78,6 +116,25 @@ void loadStringIntMap(map& map, ifstream& is) { } +void storeStringIntMapVector(vector< map >& vector, ofstream& os) { + int size = (int)vector.size(); + os.write((char *)&size, sizeof(int)); + for (int i = 0; i < (int)vector.size(); i++) { + storeStringIntMap(vector[i], os); + } +} + + +void loadStringIntMapVector(vector< map >& vector, ifstream& is) { + int size; + is.read((char *)&size, sizeof(int)); + vector.resize(size); + for (int i = 0; i < (int)vector.size(); i++) { + loadStringIntMap(vector[i], is); + } +} + + void storeIntStringMap(map& map, ofstream& os) { int size = (int)map.size(); os.write((char *)&size, sizeof(int)); @@ -113,6 +170,11 @@ void convertStringIntUnorderedMapToStringVector(unordered_map& map, } +bool isWhiteSpace(char c) { + return isspace(c); +} + + bool isWhiteSpaceExceptSpace(char c) { return isspace(c) && (c != ' '); } @@ -134,26 +196,25 @@ bool checkRegex(ePeptideType peptidetype, string& sequence, string& errormessage regex rx; // [^\\[\\]]+ is used instead of .+ to prevent from a too complex regex error - switch (peptidetype) - { - case linear: - case linearpolyketide: - rx = "^\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*$"; - break; - case cyclic: - case cyclicpolyketide: - rx = "^\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])+$"; - break; - case branched: - rx = "^\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*\\\\\\(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])+\\\\\\)\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*$"; - break; - case branchcyclic: - rx = "(^(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*)?\\\\\\(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])+\\\\\\)\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*$|^\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*\\\\\\(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])+\\\\\\)(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*)?$)"; - break; - case other: - default: - rx = ".*"; - break; + switch (peptidetype) { + case linear: + case linearpolyketide: + rx = "^\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*$"; + break; + case cyclic: + case cyclicpolyketide: + rx = "^\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])+$"; + break; + case branched: + rx = "^\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*\\\\\\(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])+\\\\\\)\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*$"; + break; + case branchcyclic: + rx = "(^(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*)?\\\\\\(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])+\\\\\\)\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*$|^\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*\\\\\\(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])+\\\\\\)(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*)?$)"; + break; + case other: + default: + rx = ".*"; + break; } try { @@ -171,6 +232,12 @@ bool checkRegex(ePeptideType peptidetype, string& sequence, string& errormessage } +bool checkFile(string filename) { + ifstream f(filename.c_str()); + return f.good(); +} + + void parseBranch(ePeptideType peptidetype, string& composition, vector& vectorcomposition, int& branchstart, int& branchend) { string s = composition; cBrick b; @@ -259,31 +326,23 @@ ePeptideType getPeptideTypeFromString(string& s) { string getStringFromPeptideType(ePeptideType peptidetype) { - switch (peptidetype) - { - case linear: - return "linear"; - break; - case cyclic: - return "cyclic"; - break; - case branched: - return "branched"; - break; - case branchcyclic: - return "branch-cyclic"; - break; - case linearpolyketide: - return "linear-polyketide"; - break; - case cyclicpolyketide: - return "cyclic-polyketide"; - break; - case other: - return "other"; - break; - default: - break; + switch (peptidetype) { + case linear: + return "linear"; + case cyclic: + return "cyclic"; + case branched: + return "branched"; + case branchcyclic: + return "branch-cyclic"; + case linearpolyketide: + return "linear-polyketide"; + case cyclicpolyketide: + return "cyclic-polyketide"; + case other: + return "other"; + default: + break; } return "other"; @@ -411,3 +470,112 @@ void stripIsomersFromStringVector(vector& acronyms) { } } + +bool proxyModelCheckInt(QAbstractItemModel* model, int index, int row, int column, QString str, const QModelIndex& parent) { + switch (index) { + case 0: + if (model->data(model->index(row, column, parent)).toInt() == str.toInt()) { + return true; + } + break; + case 1: + if (model->data(model->index(row, column, parent)).toInt() < str.toInt()) { + return true; + } + break; + case 2: + if (model->data(model->index(row, column, parent)).toInt() <= str.toInt()) { + return true; + } + break; + case 3: + if (model->data(model->index(row, column, parent)).toInt() > str.toInt()) { + return true; + } + break; + case 4: + if (model->data(model->index(row, column, parent)).toInt() >= str.toInt()) { + return true; + } + break; + default: + break; + } + return false; +} + + +bool proxyModelCheckDouble(QAbstractItemModel* model, int index, int row, int column, QString str, const QModelIndex& parent) { + switch (index) { + case 0: + if (model->data(model->index(row, column, parent)).toDouble() == str.toDouble()) { + return true; + } + break; + case 1: + if (model->data(model->index(row, column, parent)).toDouble() < str.toDouble()) { + return true; + } + break; + case 2: + if (model->data(model->index(row, column, parent)).toDouble() <= str.toDouble()) { + return true; + } + break; + case 3: + if (model->data(model->index(row, column, parent)).toDouble() > str.toDouble()) { + return true; + } + break; + case 4: + if (model->data(model->index(row, column, parent)).toDouble() >= str.toDouble()) { + return true; + } + break; + default: + break; + } + return false; +} + + +bool proxyModelCheckString(QAbstractItemModel* model, int index, int row, int column, QString& itemstr, QString str, const QModelIndex& parent, bool wholeword, Qt::CaseSensitivity casesensitive) { + string tmpstr = itemstr.toStdString(); + QString qstr = stripHTML(tmpstr).c_str(); + switch (index) { + case 0: + if (wholeword) { + if (qstr.compare(str, casesensitive) == 0) { + return true; + } + } + else { + return qstr.contains(str, casesensitive); + } + break; + case 1: + if (qstr.compare(str, casesensitive) < 0) { + return true; + } + break; + case 2: + if (qstr.compare(str, casesensitive) <= 0) { + return true; + } + break; + case 3: + if (qstr.compare(str, casesensitive) > 0) { + return true; + } + break; + case 4: + if (qstr.compare(str, casesensitive) >= 0) { + return true; + } + break; + default: + break; + } + return false; +} + diff --git a/CycloBranch/core/utilities.h b/CycloBranch/core/utilities.h index c1a8757..69c9139 100644 --- a/CycloBranch/core/utilities.h +++ b/CycloBranch/core/utilities.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -20,6 +21,8 @@ #include #include #include +#include +#include #include class cBrick; @@ -58,6 +61,18 @@ using namespace boost; const double pi = 3.141592653589793; +/** + \brief Default window size x. +*/ +const int defaultwinsizex = 1350; + + +/** + \brief Default window size y. +*/ +const int defaultwinsizey = 875; + + /** \brief Vendor types. */ @@ -75,7 +90,8 @@ enum eModeType { denovoengine = 0, singlecomparison = 1, databasesearch = 2, - dereplication = 3 + dereplication = 3, + compoundsearch = 4 }; @@ -111,6 +127,38 @@ extern QString appversion; extern QString installdir; +/** + \brief Store a vector of integers into an output stream. + \param v reference to a vector of integers + \param os reference to an output stream +*/ +void storeIntVector(vector& v, ofstream& os); + + +/** + \brief Load a vector of integers from an input stream. + \param v reference to a vector of integers + \param is reference to an input stream +*/ +void loadIntVector(vector& v, ifstream& is); + + +/** + \brief Store a vector of doubles into an output stream. + \param v reference to a vector of doubles + \param os reference to an output stream +*/ +void storeDoubleVector(vector& v, ofstream& os); + + +/** + \brief Load a vector of doubles from an input stream. + \param v reference to a vector of doubles + \param is reference to an input stream +*/ +void loadDoubleVector(vector& v, ifstream& is); + + /** \brief Store a string into an output stream. \param s reference to a string @@ -159,6 +207,22 @@ void storeStringIntMap(map& map, ofstream& os); void loadStringIntMap(map& map, ifstream& is); +/** + \brief Store a vector of map into an output stream. + \param vector reference to a vector + \param os reference to an output stream +*/ +void storeStringIntMapVector(vector< map >& vector, ofstream& os); + + +/** + \brief Load a vector of map from an input stream. + \param vector reference to a vector + \param is reference to an input stream +*/ +void loadStringIntMapVector(vector< map >& vector, ifstream& is); + + /** \brief Store a map into an output stream. \param map reference to a map @@ -183,6 +247,14 @@ void loadIntStringMap(map& map, ifstream& is); void convertStringIntUnorderedMapToStringVector(unordered_map& map, vector& vector); +/** + \brief Check if \a c is a white space. + \param c char + \retval bool true if \a c is a white space; false otherwise. +*/ +bool isWhiteSpace(char c); + + /** \brief Check if \a c is a white space (except normal space). \param c char @@ -209,6 +281,14 @@ string& removeWhiteSpacesExceptSpaces(string& s); bool checkRegex(ePeptideType peptidetype, string& sequence, string& errormessage); +/** + \brief Check if a file exists. + \param filename filename + \retval bool true if the file exists, false otherwise +*/ +bool checkFile(string filename); + + /** \brief Parse a position of a branch from a peptide sequence. \param peptidetype peptide type @@ -429,5 +509,73 @@ void stripIsomers(string& peptidesequence); void stripIsomersFromStringVector(vector& acronyms); +/** + \brief Compare items in a string vector by size. +*/ +struct compareStringBySize { + + /** + \brief Comparison function. + \param first first string + \param second second string + \retval bool true if the first string is shorter + */ + bool operator()(const std::string& first, const std::string& second) { + size_t size1 = first.size(); + size_t size2 = second.size(); + if (first.size() < second.size()) { + return true; + } + if (first.size() > second.size()) { + return false; + } + return first.compare(second) < 0; + } + +}; + + +/** + \brief Proxy model - int comparator. + \param model model + \param index index + \param row row + \param column column + \param str query string + \param parent parent + \retval bool true if the item is valid +*/ +bool proxyModelCheckInt(QAbstractItemModel* model, int index, int row, int column, QString str, const QModelIndex& parent); + + +/** + \brief Proxy model - double comparator. + \param model model + \param index index + \param row row + \param column column + \param str query string + \param parent parent + \retval bool true if the item is valid +*/ +bool proxyModelCheckDouble(QAbstractItemModel* model, int index, int row, int column, QString str, const QModelIndex& parent); + + +/** + \brief Proxy model - string comparator. + \param model model + \param index index + \param row row + \param column column + \param itemstr string of current item + \param str query string + \param parent parent + \param wholeword wholeword + \param casesensitive casesensitive + \retval bool true if the item is valid +*/ +bool proxyModelCheckString(QAbstractItemModel* model, int index, int row, int column, QString& itemstr, QString str, const QModelIndex& parent, bool wholeword, Qt::CaseSensitivity casesensitive); + + #endif diff --git a/CycloBranch/docs/cyclobranch_bba_bib.txt b/CycloBranch/docs/cyclobranch_bba_bib.txt index 639452f..b9815d3 100644 --- a/CycloBranch/docs/cyclobranch_bba_bib.txt +++ b/CycloBranch/docs/cyclobranch_bba_bib.txt @@ -6,5 +6,5 @@ volume={1865}, number={7}, year={2017}, pages={768--775}, -doi={10.1016/j.bbapap.2016.12.003.} +doi={10.1016/j.bbapap.2016.12.003} } diff --git a/CycloBranch/docs/cyclobranch_jms_bib.txt b/CycloBranch/docs/cyclobranch_jms_bib.txt new file mode 100644 index 0000000..a4cd115 --- /dev/null +++ b/CycloBranch/docs/cyclobranch_jms_bib.txt @@ -0,0 +1,10 @@ +@ARTICLE{CycloBranch-JMS-2018, +author={Novak, Jiri and Skriba, Anton and Zapal, Jakub and Kuzma, Marek and Havlicek, Vladimir}, +title={CycloBranch: An open tool for fine isotope structures in conventional and product ion mass spectra}, +journal={J. Mass Spectrom.}, +volume={53}, +number={11}, +year={2018}, +pages={1097--1103}, +doi={10.1002/jms.4285} +} diff --git a/CycloBranch/docs/cyclobranch_jms_ris.txt b/CycloBranch/docs/cyclobranch_jms_ris.txt new file mode 100644 index 0000000..67cf1ea --- /dev/null +++ b/CycloBranch/docs/cyclobranch_jms_ris.txt @@ -0,0 +1,16 @@ +TY - JOUR +TI - CycloBranch: An open tool for fine isotope structures in conventional and product ion mass spectra +T2 - J. Mass Spectrom. +VL - 53 +IS - 11 +SP - 1097-1103 +PY - 2018 +AU - Novak,Jiri +AU - Skriba,Anton +AU - Zapal,Jakub +AU - Kuzma,Marek +AU - Havlicek,Vladimir +N1 - +DB - +DO - 10.1002/jms.4285 +ER - diff --git a/CycloBranch/gui/cAboutWidget.cpp b/CycloBranch/gui/cAboutWidget.cpp index 80dd06e..79bb351 100644 --- a/CycloBranch/gui/cAboutWidget.cpp +++ b/CycloBranch/gui/cAboutWidget.cpp @@ -16,33 +16,33 @@ cAboutWidget::cAboutWidget(QWidget* parent) { layout = new QVBoxLayout(); - QString homepage = "http://ms.biomed.cas.cz/cyclobranch/
http://github.com/novak-jiri/cyclobranch/

"; + QString homepage = "https://ms.biomed.cas.cz/cyclobranch/
https://github.com/novak-jiri/cyclobranch/

"; QString citations = "Any work based on CycloBranch shall cite any of the following references:

"; citations += "Jiri Novak, Karel Lemr, Kevin A. Schug, Vladimir Havlicek:
"; citations += "CycloBranch: De Novo Sequencing of Nonribosomal Peptides from Accurate Product Ion Mass Spectra,
"; citations += "J. Am. Soc. Mass Spectrom., vol. 26, no. 10, pp. 1780-1786, 2015. DOI: 10.1007/s13361-015-1211-1.
"; - citations += "Download citation: [ ris ], [ bib ]

"; + citations += "Download citation: [ ris ], [ bib ]

"; citations += "Jiri Novak, Lucie Sokolova, Karel Lemr, Tomas Pluhacek, Andrea Palyzova, Vladimir Havlicek:
"; citations += "Batch-processing of Imaging or Liquid-chromatography Mass Spectrometry Datasets and De Novo Sequencing of Polyketide Siderophores,
"; citations += "BBA - Proteins Proteom., vol. 1865, no. 7, pp. 768-775, 2017. DOI: 10.1016/j.bbapap.2016.12.003.
"; - citations += "Download citation: [ ris ], [ bib ]

"; + citations += "Download citation: [ ris ], [ bib ]

"; citations += "Jiri Novak, Anton Skriba, Jakub Zapal, Marek Kuzma, Vladimir Havlicek:
"; citations += "CycloBranch: an Open Tool for Fine Isotope Structures in Conventional and Product Ion Mass Spectra,
"; citations += "J. Mass Spectrom., vol. 53, no. 11, pp. 1097-1103, 2018. DOI: 10.1002/jms.4285.
"; - citations += "Download citation: [ ris ], [ bib ]


"; + citations += "Download citation: [ ris ], [ bib ]


"; QString licence = "Licence:

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

"; licence += "This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

"; - licence += "You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.


"; + licence += "You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/.


"; - QString developers = "Developers:

Jiri Novak
Laboratory of Molecular Structure Characterization
Institute of Microbiology
Czech Academy of Sciences
Videnska 1083
142 20 Prague
Czech Republic
jiri.novak@biomed.cas.cz

(C) 2013 - 2018


"; + QString developers = "Developers:

Jiri Novak
Laboratory of Molecular Structure Characterization
Institute of Microbiology
Czech Academy of Sciences
Videnska 1083
142 20 Prague
Czech Republic
jiri.novak@biomed.cas.cz

(C) 2013 - 2019


"; QString splash = "



"; - QString acknowledgement = "Acknowledgements:

Thanks to Aha-soft and Icons8 for icons.


"; + QString acknowledgement = "Acknowledgements:

This application uses Qt library under LGPLv3 license. Thanks to Aha-soft and Icons8 for icons.


"; message = new QTextBrowser(); message->setReadOnly(true); diff --git a/CycloBranch/gui/cBranchCyclicWidget.cpp b/CycloBranch/gui/cBranchCyclicWidget.cpp index 43efad1..19fe19a 100644 --- a/CycloBranch/gui/cBranchCyclicWidget.cpp +++ b/CycloBranch/gui/cBranchCyclicWidget.cpp @@ -10,53 +10,62 @@ void generateBranchLabelsDown(bool nterminal, int rotationid, unordered_set& labels, cParameters* parameters, cTheoreticalSpectrum* theoreticalspectrum, int centerx, int topmargin, int horizontalstep, int verticalstep, string visibleionseries, string visibleneutralloss, int visiblerotationid, int branchstart) { - string name; - int k; - int coverageindex = rotationid * (int)parameters->ionsfortheoreticalspectra.size() * (parameters->numberofgeneratedneutrallosses + 1); - bool skipiontype, skipneutralloss; - if ((visiblerotationid == -1) || (visiblerotationid == rotationid/6)) { + cPeaksList* thpeaks = theoreticalspectrum->getTheoreticalPeaks(); + string description; + size_t pos; + int rotid, serid; + for (int i = 0; i < thpeaks->size(); i++) { - for (int i = 0; i < (int)parameters->ionsfortheoreticalspectra.size(); i++) { + if (((*thpeaks)[i].matched > 0) && ((*thpeaks)[i].rotationid == rotationid)) { - skipiontype = false; - if ((visibleionseries.compare("") != 0) && (parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name.compare(visibleionseries) != 0)) { - skipiontype = true; - } - - for (int j = -1; j < (int)parameters->neutrallossesfortheoreticalspectra.size(); j++) { + description = (*thpeaks)[i].description; + description = description.substr(0, description.find(':')); - skipneutralloss = false; - if (visibleneutralloss.compare("all") != 0) { - if ((j == -1) && (visibleneutralloss.compare("none") != 0)) { - skipneutralloss = true; + if (description.find('[') == string::npos) { + if (parameters->precursorcharge > 0) { + pos = description.find("+ "); + if (pos != string::npos) { + description = description.substr(pos + 2); + } + else { + continue; + } + } + else { + pos = description.find("- "); + if (pos != string::npos) { + description = description.substr(pos + 2); } - if ((j >= 0) && (parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[j]].summary.compare(visibleneutralloss) != 0)) { - skipneutralloss = true; + else { + continue; } } - if (!skipiontype && !skipneutralloss) { + if (visibleionseries.empty() || (!visibleionseries.empty() && (parameters->iondefinitions[(*thpeaks)[i].iontype].name.compare(visibleionseries) == 0))) { + + if ((visibleneutralloss.compare("all") == 0) + || ((visibleneutralloss.compare("none") == 0) && (description.find(" -") == string::npos)) + || ((visibleneutralloss.compare("all") != 0) && (visibleneutralloss.compare("none") != 0) && (description.substr(description.find(" -") + 2).compare(visibleneutralloss) == 0))) { + + rotid = (*thpeaks)[i].rotationid; + if ((rotid >= 0) && ((visiblerotationid == -1) || (visiblerotationid == rotid / 6))) { + + if ((nterminal && parameters->iondefinitions[(*thpeaks)[i].iontype].nterminal) || (!nterminal && parameters->iondefinitions[(*thpeaks)[i].iontype].cterminal)) { - if ((nterminal && parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].nterminal) || (!nterminal && parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].cterminal)) { - k = 0; - while (k < branchstart) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[k] > 0) { - name = theoreticalspectrum->getVisualCoverage()[coverageindex].name.substr(0, theoreticalspectrum->getVisualCoverage()[coverageindex].name.rfind('_') + 1); - name += parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name[0] + to_string(k + 1) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name.substr(1); - if (j >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[j]].summary; + serid = (*thpeaks)[i].seriesid; + if ((serid >= 0) && (serid < branchstart)) { + insertLabel(labels, centerx + 40, topmargin + verticalstep * serid + verticalstep / 2 - verticalstep / 8, description, false); } - insertLabel(labels, centerx + 40, topmargin + verticalstep * k + verticalstep / 2 - verticalstep / 8, name, false); + } - k++; + } + } } - coverageindex++; - } } @@ -66,56 +75,63 @@ void generateBranchLabelsDown(bool nterminal, int rotationid, unordered_set& labels, cParameters* parameters, cTheoreticalSpectrum* theoreticalspectrum, int centerx, int topmargin, int horizontalstep, int verticalstep, string visibleionseries, string visibleneutralloss, int visiblerotationid, int branchend) { - string name; - int k; - int count; - int coverageindex = rotationid * (int)parameters->ionsfortheoreticalspectra.size() * (parameters->numberofgeneratedneutrallosses + 1); - bool skipiontype, skipneutralloss; +void generateBranchLabelsUp(bool nterminal, int rotationid, unordered_set& labels, cParameters* parameters, cTheoreticalSpectrum* theoreticalspectrum, int centerx, int topmargin, int horizontalstep, int verticalstep, string visibleionseries, string visibleneutralloss, int visiblerotationid, int branchend, int fragmentend) { - if ((visiblerotationid == -1) || (visiblerotationid == rotationid / 6)) { + cPeaksList* thpeaks = theoreticalspectrum->getTheoreticalPeaks(); + string description; + size_t pos; + int rotid, serid; + for (int i = 0; i < thpeaks->size(); i++) { - for (int i = 0; i < (int)parameters->ionsfortheoreticalspectra.size(); i++) { + if (((*thpeaks)[i].matched > 0) && ((*thpeaks)[i].rotationid == rotationid)) { - skipiontype = false; - if ((visibleionseries.compare("") != 0) && (parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name.compare(visibleionseries) != 0)) { - skipiontype = true; - } - - for (int j = -1; j < (int)parameters->neutrallossesfortheoreticalspectra.size(); j++) { + description = (*thpeaks)[i].description; + description = description.substr(0, description.find(':')); - skipneutralloss = false; - if (visibleneutralloss.compare("all") != 0) { - if ((j == -1) && (visibleneutralloss.compare("none") != 0)) { - skipneutralloss = true; + if (description.find('[') == string::npos) { + if (parameters->precursorcharge > 0) { + pos = description.find("+ "); + if (pos != string::npos) { + description = description.substr(pos + 2); + } + else { + continue; + } + } + else { + pos = description.find("- "); + if (pos != string::npos) { + description = description.substr(pos + 2); } - if ((j >= 0) && (parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[j]].summary.compare(visibleneutralloss) != 0)) { - skipneutralloss = true; + else { + continue; } } - if (!skipiontype && !skipneutralloss) { - - if ((nterminal && parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].nterminal) || (!nterminal && parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].cterminal)) { - k = 0; - count = (int)theoreticalspectrum->getVisualCoverage()[coverageindex].series.size() - branchend; - while (k < count) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[k + branchend] > 0) { - name = theoreticalspectrum->getVisualCoverage()[coverageindex].name.substr(0, theoreticalspectrum->getVisualCoverage()[coverageindex].name.rfind('_') + 1); - name += parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name[0] + to_string(k + branchend + 1) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name.substr(1); - if (j >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[j]].summary; + if (visibleionseries.empty() || (!visibleionseries.empty() && (parameters->iondefinitions[(*thpeaks)[i].iontype].name.compare(visibleionseries) == 0))) { + + if ((visibleneutralloss.compare("all") == 0) + || ((visibleneutralloss.compare("none") == 0) && (description.find(" -") == string::npos)) + || ((visibleneutralloss.compare("all") != 0) && (visibleneutralloss.compare("none") != 0) && (description.substr(description.find(" -") + 2).compare(visibleneutralloss) == 0))) { + + rotid = (*thpeaks)[i].rotationid; + if ((rotid >= 0) && ((visiblerotationid == -1) || (visiblerotationid == rotid / 6))) { + + if ((nterminal && parameters->iondefinitions[(*thpeaks)[i].iontype].nterminal) || (!nterminal && parameters->iondefinitions[(*thpeaks)[i].iontype].cterminal)) { + + serid = (*thpeaks)[i].seriesid; + if ((serid >= 0) && (serid >= branchend) && (serid < fragmentend)) { + insertLabel(labels, centerx - 40, topmargin + verticalstep * (fragmentend - serid - 1) + verticalstep / 2, description, true); } - insertLabel(labels, centerx - 40, topmargin + verticalstep * (count - k - 1) + verticalstep / 2, name, true); + } - k++; + } + } } - coverageindex++; - } } @@ -284,7 +300,7 @@ void cBranchCyclicWidget::paint(QPainter& painter) { int linesize = 20; int cornerlinesize = horizontalstep/8; - paintCircle(painter, backboneacronyms, centerx, centery, radius, angle, horizontalstep, linesize, cornerlinesize, theoreticalspectrum->getVisualCoverage().size() > 0, visiblerotationid, labels); + paintCircle(painter, backboneacronyms, centerx, centery, radius, angle, horizontalstep, linesize, cornerlinesize, theoreticalspectrum->getTheoreticalPeaks()->size() > 0, visiblerotationid, labels); // paint the branch @@ -297,7 +313,7 @@ void cBranchCyclicWidget::paint(QPainter& painter) { painter.drawText(centerx - horizontalstep/3, topmargin + verticalstep*i, horizontalstep*2/3, 20, Qt::AlignCenter, branchacronyms[branchsize - i - 1].c_str()); } - if (theoreticalspectrum->getVisualCoverage().size() > 0) { + if (theoreticalspectrum->getTheoreticalPeaks()->size() > 0) { painter.drawText(centerx - horizontalstep/3, topmargin + verticalstep*i - 20, horizontalstep*2/3, 20, Qt::AlignLeft, to_string(backbonesize + branchsize - i).c_str()); } @@ -307,7 +323,7 @@ void cBranchCyclicWidget::paint(QPainter& painter) { painter.setPen(QPen(Qt::black, 2, Qt::SolidLine)); painter.drawLine(centerx, topmargin + verticalstep*i + 20, centerx, topmargin + verticalstep*i + verticalstep); - if (theoreticalspectrum->getVisualCoverage().size() > 0) { + if (theoreticalspectrum->getTheoreticalPeaks()->size() > 0) { painter.setPen(QPen(Qt::black, 2, Qt::DashLine)); painter.drawLine(centerx - 20, topmargin + verticalstep*i + (verticalstep + 10)/2, centerx + 20, topmargin + verticalstep*i + (verticalstep + 10)/2); painter.drawLine(centerx - 20, topmargin + verticalstep*i + (verticalstep + 10)/2, centerx - 20, topmargin + verticalstep*i + (verticalstep + 10)/2 + verticalstep/8); @@ -321,7 +337,7 @@ void cBranchCyclicWidget::paint(QPainter& painter) { } - if (parameters && !hidelabels && (theoreticalspectrum->getVisualCoverage().size() > 0)) { + if (parameters && !hidelabels && (theoreticalspectrum->getTheoreticalPeaks()->size() > 0)) { // get branch-cyclic rotations vector branchcyclicrotations; @@ -335,13 +351,13 @@ void cBranchCyclicWidget::paint(QPainter& painter) { } int rotationid; - int half = (int)theoreticalspectrum->getVisualCoverage().size() / (int)parameters->ionsfortheoreticalspectra.size() / (parameters->numberofgeneratedneutrallosses + 1) / 2; + int half = backbonesize * 6; for (int i = 0; i < half; i++) { - + if ((visibletrotationid != -1) && (visibletrotationid != i % 6)) { continue; } - + if (i/6 == 0) { rotationid = half/6; } @@ -349,36 +365,35 @@ void cBranchCyclicWidget::paint(QPainter& painter) { rotationid = 2*half/6 - i/6; } - switch (i % 6) - { - case 0: - generateCyclicLabelsToRight(true, i, i/6, 0, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][0].middlebranchstart, trotationsofbranchcyclicrotations[i/6][0].middlebranchend); - break; - case 1: - generateBranchLabelsDown(true, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][1].middlebranchstart); - generateCyclicLabelsToRight(true, i, -1, trotationsofbranchcyclicrotations[i/6][1].middlebranchend, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][1].middlebranchstart, trotationsofbranchcyclicrotations[i/6][1].middlebranchend); - break; - case 2: - generateCyclicLabelsToRight(true, rotationid*6 + 2, i/6, 0, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[rotationid][2].middlebranchstart, trotationsofbranchcyclicrotations[rotationid][2].middlebranchend); - break; - case 3: - generateCyclicLabelsToRight(true, i, i/6, 0, trotationsofbranchcyclicrotations[i/6][3].middlebranchstart, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][3].middlebranchstart, trotationsofbranchcyclicrotations[i/6][3].middlebranchend); - generateBranchLabelsUp(true, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][3].middlebranchend); - generateBranchLabelsDown(false, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][4].middlebranchstart); - generateCyclicLabelsToLeft(false, i, 0, trotationsofbranchcyclicrotations[i/6][4].middlebranchend, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][4].middlebranchstart, trotationsofbranchcyclicrotations[i/6][4].middlebranchend); - break; - case 4: - generateBranchLabelsDown(true, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][4].middlebranchstart); - generateCyclicLabelsToLeft(true, i, 0, trotationsofbranchcyclicrotations[i/6][4].middlebranchend, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][4].middlebranchstart, trotationsofbranchcyclicrotations[i/6][4].middlebranchend); - break; - case 5: - generateCyclicLabelsToRight(true, rotationid*6 + 5, i/6, 0, trotationsofbranchcyclicrotations[rotationid][5].middlebranchstart, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[rotationid][5].middlebranchstart, trotationsofbranchcyclicrotations[rotationid][5].middlebranchend); - generateBranchLabelsUp(true, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][5].middlebranchend); - generateBranchLabelsDown(false, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][1].middlebranchstart); - generateCyclicLabelsToRight(false, i, -1, trotationsofbranchcyclicrotations[i/6][1].middlebranchend, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][1].middlebranchstart, trotationsofbranchcyclicrotations[i/6][1].middlebranchend); - break; - default: - break; + switch (i % 6) { + case 0: + generateCyclicLabelsToRight(true, i, i/6, 0, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][0].middlebranchstart, trotationsofbranchcyclicrotations[i/6][0].middlebranchend); + break; + case 1: + generateBranchLabelsDown(true, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][1].middlebranchstart); + generateCyclicLabelsToRight(true, i, -1, trotationsofbranchcyclicrotations[i/6][1].middlebranchend, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][1].middlebranchstart, trotationsofbranchcyclicrotations[i/6][1].middlebranchend); + break; + case 2: + generateCyclicLabelsToRight(true, rotationid*6 + 2, i/6, 0, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[rotationid][2].middlebranchstart, trotationsofbranchcyclicrotations[rotationid][2].middlebranchend); + break; + case 3: + generateCyclicLabelsToRight(true, i, i/6, 0, trotationsofbranchcyclicrotations[i/6][3].middlebranchstart, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][3].middlebranchstart, trotationsofbranchcyclicrotations[i/6][3].middlebranchend); + generateBranchLabelsUp(true, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][3].middlebranchend, backbonesize + branchsize - 1); + generateBranchLabelsDown(false, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][4].middlebranchstart); + generateCyclicLabelsToLeft(false, i, 0, trotationsofbranchcyclicrotations[i/6][4].middlebranchend, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][4].middlebranchstart, trotationsofbranchcyclicrotations[i/6][4].middlebranchend); + break; + case 4: + generateBranchLabelsDown(true, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][4].middlebranchstart); + generateCyclicLabelsToLeft(true, i, 0, trotationsofbranchcyclicrotations[i/6][4].middlebranchend, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][4].middlebranchstart, trotationsofbranchcyclicrotations[i/6][4].middlebranchend); + break; + case 5: + generateCyclicLabelsToRight(true, rotationid*6 + 5, i/6, 0, trotationsofbranchcyclicrotations[rotationid][5].middlebranchstart, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[rotationid][5].middlebranchstart, trotationsofbranchcyclicrotations[rotationid][5].middlebranchend); + generateBranchLabelsUp(true, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][5].middlebranchend, backbonesize + branchsize - 1); + generateBranchLabelsDown(false, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][1].middlebranchstart); + generateCyclicLabelsToRight(false, i, -1, trotationsofbranchcyclicrotations[i/6][1].middlebranchend, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][1].middlebranchstart, trotationsofbranchcyclicrotations[i/6][1].middlebranchend); + break; + default: + break; } } @@ -396,49 +411,40 @@ void cBranchCyclicWidget::paint(QPainter& painter) { rotationid = 2*half/6 - i/6; } - switch (i % 6) - { - case 0: - generateCyclicLabelsToLeft(true, i, i/6, 0, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][0].middlebranchstart, trotationsofbranchcyclicrotations[i/6][0].middlebranchend); - break; - case 1: - generateBranchLabelsDown(true, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][1].middlebranchstart); - generateCyclicLabelsToLeft(true, i, 0, trotationsofbranchcyclicrotations[i/6][1].middlebranchend, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][1].middlebranchstart, trotationsofbranchcyclicrotations[i/6][1].middlebranchend); - break; - case 2: - generateCyclicLabelsToLeft(true, rotationid*6 + 2, i/6, 0, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[rotationid][2].middlebranchstart, trotationsofbranchcyclicrotations[rotationid][2].middlebranchend); - break; - case 3: - generateCyclicLabelsToLeft(true, i, i/6, 0, trotationsofbranchcyclicrotations[i/6][3].middlebranchstart, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][3].middlebranchstart, trotationsofbranchcyclicrotations[i/6][3].middlebranchend); - generateBranchLabelsUp(true, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][3].middlebranchend); - generateBranchLabelsDown(false, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][4].middlebranchstart); - generateCyclicLabelsToRight(false, i, -1, trotationsofbranchcyclicrotations[i/6][4].middlebranchend, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][4].middlebranchstart, trotationsofbranchcyclicrotations[i/6][4].middlebranchend); - break; - case 4: - generateBranchLabelsDown(true, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][4].middlebranchstart); - generateCyclicLabelsToRight(true, i, -1, trotationsofbranchcyclicrotations[i/6][4].middlebranchend, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][4].middlebranchstart, trotationsofbranchcyclicrotations[i/6][4].middlebranchend); - break; - case 5: - generateCyclicLabelsToLeft(true, rotationid*6 + 5, i/6, 0, trotationsofbranchcyclicrotations[rotationid][5].middlebranchstart, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[rotationid][5].middlebranchstart, trotationsofbranchcyclicrotations[rotationid][5].middlebranchend); - generateBranchLabelsUp(true, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][5].middlebranchend); - generateBranchLabelsDown(false, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][1].middlebranchstart); - generateCyclicLabelsToLeft(false, i, 0, trotationsofbranchcyclicrotations[i/6][1].middlebranchend, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][1].middlebranchstart, trotationsofbranchcyclicrotations[i/6][1].middlebranchend); - break; - default: - break; + switch (i % 6) { + case 0: + generateCyclicLabelsToLeft(true, i, i/6, 0, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][0].middlebranchstart, trotationsofbranchcyclicrotations[i/6][0].middlebranchend); + break; + case 1: + generateBranchLabelsDown(true, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][1].middlebranchstart); + generateCyclicLabelsToLeft(true, i, 0, trotationsofbranchcyclicrotations[i/6][1].middlebranchend, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][1].middlebranchstart, trotationsofbranchcyclicrotations[i/6][1].middlebranchend); + break; + case 2: + generateCyclicLabelsToLeft(true, rotationid*6 + 2, i/6, 0, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[rotationid][2].middlebranchstart, trotationsofbranchcyclicrotations[rotationid][2].middlebranchend); + break; + case 3: + generateCyclicLabelsToLeft(true, i, i/6, 0, trotationsofbranchcyclicrotations[i/6][3].middlebranchstart, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][3].middlebranchstart, trotationsofbranchcyclicrotations[i/6][3].middlebranchend); + generateBranchLabelsUp(true, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][3].middlebranchend, backbonesize + branchsize - 1); + generateBranchLabelsDown(false, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][4].middlebranchstart); + generateCyclicLabelsToRight(false, i, -1, trotationsofbranchcyclicrotations[i/6][4].middlebranchend, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][4].middlebranchstart, trotationsofbranchcyclicrotations[i/6][4].middlebranchend); + break; + case 4: + generateBranchLabelsDown(true, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][4].middlebranchstart); + generateCyclicLabelsToRight(true, i, -1, trotationsofbranchcyclicrotations[i/6][4].middlebranchend, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][4].middlebranchstart, trotationsofbranchcyclicrotations[i/6][4].middlebranchend); + break; + case 5: + generateCyclicLabelsToLeft(true, rotationid*6 + 5, i/6, 0, trotationsofbranchcyclicrotations[rotationid][5].middlebranchstart, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[rotationid][5].middlebranchstart, trotationsofbranchcyclicrotations[rotationid][5].middlebranchend); + generateBranchLabelsUp(true, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][5].middlebranchend, backbonesize + branchsize - 1); + generateBranchLabelsDown(false, i, labels, parameters, theoreticalspectrum, centerx, topmargin, horizontalstep, verticalstep, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][1].middlebranchstart); + generateCyclicLabelsToLeft(false, i, 0, trotationsofbranchcyclicrotations[i/6][1].middlebranchend, backbonesize + branchsize - 1, backbonesize, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, trotationsofbranchcyclicrotations[i/6][1].middlebranchstart, trotationsofbranchcyclicrotations[i/6][1].middlebranchend); + break; + default: + break; } } - painter.setPen(QPen(Qt::red, 2, Qt::SolidLine)); - for (auto it = labels.begin(); it != labels.end(); ++it) { - if (it->alignright) { - painter.drawText(it->x - fm.width(it->label.c_str()), it->y, fm.width(it->label.c_str()), 20, Qt::AlignLeft, it->label.c_str()); - } - else { - painter.drawText(it->x, it->y, width(), 20, Qt::AlignLeft, it->label.c_str()); - } - } + drawLabels(painter, labels, width()); } diff --git a/CycloBranch/gui/cBranchCyclicWidget.h b/CycloBranch/gui/cBranchCyclicWidget.h index 605d6a7..c4d3d04 100644 --- a/CycloBranch/gui/cBranchCyclicWidget.h +++ b/CycloBranch/gui/cBranchCyclicWidget.h @@ -54,8 +54,9 @@ void generateBranchLabelsDown(bool nterminal, int rotationid, unordered_set& labels, cParameters* parameters, cTheoreticalSpectrum* theoreticalspectrum, int centerx, int topmargin, int horizontalstep, int verticalstep, string visibleionseries, string visibleneutralloss, int visiblerotationid, int branchend); +void generateBranchLabelsUp(bool nterminal, int rotationid, unordered_set& labels, cParameters* parameters, cTheoreticalSpectrum* theoreticalspectrum, int centerx, int topmargin, int horizontalstep, int verticalstep, string visibleionseries, string visibleneutralloss, int visiblerotationid, int branchend, int fragmentend); /** diff --git a/CycloBranch/gui/cBranchedWidget.cpp b/CycloBranch/gui/cBranchedWidget.cpp index 443bbae..d88701d 100644 --- a/CycloBranch/gui/cBranchedWidget.cpp +++ b/CycloBranch/gui/cBranchedWidget.cpp @@ -170,7 +170,7 @@ void cBranchedWidget::paint(QPainter& painter) { if (i < backbonesize - 1) { painter.setPen(QPen(Qt::black, 2, Qt::SolidLine)); painter.drawLine(leftmargin + horizontalstep/4 + horizontalstep*i + horizontalstep/2, topmargin + verticalstep*branchsize + 11, leftmargin + horizontalstep/4 + horizontalstep*(i + 1), topmargin + verticalstep*branchsize + 11); - if (theoreticalspectrum->getVisualCoverage().size() > 0) { + if (theoreticalspectrum->getTheoreticalPeaks()->size() > 0) { painter.setPen(QPen(Qt::black, 2, Qt::DashLine)); painter.drawLine(leftmargin + horizontalstep*(i + 1), topmargin + verticalstep*branchsize - 10, leftmargin + horizontalstep*(i + 1), topmargin + verticalstep*branchsize + 30); painter.drawLine(leftmargin + horizontalstep/4 + horizontalstep/8 + horizontalstep*i + horizontalstep/2, topmargin + verticalstep*branchsize - 10, leftmargin + horizontalstep*(i + 1), topmargin + verticalstep*branchsize - 10); @@ -193,7 +193,7 @@ void cBranchedWidget::paint(QPainter& painter) { painter.setPen(QPen(Qt::black, 2, Qt::SolidLine)); painter.drawLine(leftmargin + horizontalstep/2 + horizontalstep*tpermutations[0].middlebranchstart, topmargin + verticalstep*i + 20, leftmargin + horizontalstep/2 + horizontalstep*tpermutations[0].middlebranchstart, topmargin + verticalstep*i + verticalstep); - if (theoreticalspectrum->getVisualCoverage().size() > 0) { + if (theoreticalspectrum->getTheoreticalPeaks()->size() > 0) { painter.setPen(QPen(Qt::black, 2, Qt::DashLine)); painter.drawLine(leftmargin + horizontalstep/2 + horizontalstep*tpermutations[0].middlebranchstart - 20, topmargin + verticalstep*i + (verticalstep + 10)/2, leftmargin + horizontalstep/2 + horizontalstep*tpermutations[0].middlebranchstart + 20, topmargin + verticalstep*i + (verticalstep + 10)/2); painter.drawLine(leftmargin + horizontalstep/2 + horizontalstep*tpermutations[0].middlebranchstart - 20, topmargin + verticalstep*i + (verticalstep + 10)/2, leftmargin + horizontalstep/2 + horizontalstep*tpermutations[0].middlebranchstart - 20, topmargin + verticalstep*i + (verticalstep + 10)/2 + verticalstep/8); @@ -201,303 +201,180 @@ void cBranchedWidget::paint(QPainter& painter) { } } - if (parameters && !hidelabels && (theoreticalspectrum->getVisualCoverage().size() > 0)) { + if (parameters && !hidelabels && theoreticalspectrum->getTheoreticalPeaks()) { unordered_set labels; labels.clear(); - int position; - string name; - int len = (int)theoreticalspectrum->getVisualCoverage()[0].series.size(); - int coverageindex; - bool skipiontype, skipneutralloss; + cPeaksList* thpeaks = theoreticalspectrum->getTheoreticalPeaks(); + string description; + size_t pos; + int rotid, serid; + for (int i = 0; i < thpeaks->size(); i++) { - for (int i = 0; i < 6; i++) { + if ((*thpeaks)[i].matched > 0) { - if ((visibletrotationid != -1) && (visibletrotationid != i)) { - continue; - } - - coverageindex = i * (int)parameters->ionsfortheoreticalspectra.size() * (parameters->numberofgeneratedneutrallosses + 1); + description = (*thpeaks)[i].description; + description = description.substr(0, description.find(':')); - for (int j = 0; j < (int)parameters->ionsfortheoreticalspectra.size(); j++) { - - skipiontype = false; - if ((visibleionseries.compare("") != 0) && (parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name.compare(visibleionseries) != 0)) { - skipiontype = true; - } - - for (int k = -1; k < (int)parameters->neutrallossesfortheoreticalspectra.size(); k++) { - - skipneutralloss = false; - if (visibleneutralloss.compare("all") != 0) { - if ((k == -1) && (visibleneutralloss.compare("none") != 0)) { - skipneutralloss = true; + if (description.find('[') == string::npos) { + if (parameters->precursorcharge > 0) { + pos = description.find("+ "); + if (pos != string::npos) { + description = description.substr(pos + 2); } - if ((k >= 0) && (parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[k]].summary.compare(visibleneutralloss) != 0)) { - skipneutralloss = true; + else { + continue; } } - - if (!skipiontype && !skipneutralloss) { - - position = 0; - if (parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].nterminal) { - for (int m = 0; m < len; m++) { - switch (i) - { - case 0: - if ((m < tpermutations[i].middlebranchstart) || (m >= tpermutations[i].middlebranchend)) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[m] > 0) { - name = to_string(i + 1) + "_" + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name[0] + to_string(m + 1) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name.substr(1); - if (k >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[k]].summary; - } - insertLabel(labels, leftmargin + horizontalstep / 4 + horizontalstep / 8 + horizontalstep * position + horizontalstep / 2, topmargin + verticalstep * branchsize - 35, name, false); - } - position++; - } - break; - case 1: - if (m < tpermutations[i].middlebranchstart) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[m] > 0) { - name = to_string(i + 1) + "_" + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name[0] + to_string(m + 1) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name.substr(1); - if (k >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[k]].summary; - } - insertLabel(labels, leftmargin + horizontalstep / 2 + horizontalstep * tpermutations[0].middlebranchstart + 25, topmargin + verticalstep * m + verticalstep / 2 - verticalstep / 8, name, false); - } - } - if (m >= tpermutations[i].middlebranchend) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[m] > 0) { - name = to_string(i + 1) + "_" + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name[0] + to_string(m + 1) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name.substr(1); - if (k >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[k]].summary; - } - insertLabel(labels, leftmargin + horizontalstep / 4 + horizontalstep / 8 + horizontalstep * (position + tpermutations[i].middlebranchend - tpermutations[i].middlebranchstart) + horizontalstep / 2, topmargin + verticalstep * branchsize - 35, name, false); - } - position++; - } - break; - case 2: - if ((m < tpermutations[i].middlebranchstart) || (m >= tpermutations[i].middlebranchend)) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[m] > 0) { - name = to_string(i + 1) + "_" + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name[0] + to_string(m + 1) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name.substr(1); - if (k >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[k]].summary; - } - insertLabel(labels, leftmargin + horizontalstep * (backbonesize - position - 2 + 1), topmargin + verticalstep * branchsize + 35, name, false); - } - position++; - } - break; - case 3: - if (m < tpermutations[i].middlebranchstart) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[m] > 0) { - name = to_string(i + 1) + "_" + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name[0] + to_string(m + 1) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name.substr(1); - if (k >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[k]].summary; - } - insertLabel(labels, leftmargin + horizontalstep / 4 + horizontalstep / 8 + horizontalstep * position + horizontalstep / 2, topmargin + verticalstep * branchsize - 35, name, false); - } - position++; - } - if (m >= tpermutations[i].middlebranchend) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[m] > 0) { - name = to_string(i + 1) + "_" + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name[0] + to_string(m + 1) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name.substr(1); - if (k >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[k]].summary; - } - insertLabel(labels, leftmargin + horizontalstep / 2 + horizontalstep * tpermutations[0].middlebranchstart - 25, topmargin + verticalstep * (branchsize - m - 2 + backbonesize) + verticalstep / 2, name, true); - } - } - break; - case 4: - if (m < tpermutations[i].middlebranchstart) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[m] > 0) { - name = to_string(i + 1) + "_" + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name[0] + to_string(m + 1) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name.substr(1); - if (k >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[k]].summary; - } - insertLabel(labels, leftmargin + horizontalstep / 2 + horizontalstep * tpermutations[0].middlebranchstart + 25, topmargin + verticalstep * m + verticalstep / 2 - verticalstep / 8, name, false); - } - } - if (m >= tpermutations[i].middlebranchend) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[m] > 0) { - name = to_string(i + 1) + "_" + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name[0] + to_string(m + 1) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name.substr(1); - if (k >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[k]].summary; - } - insertLabel(labels, leftmargin + horizontalstep * (backbonesize - tpermutations[i].middlebranchend + tpermutations[i].middlebranchstart - position - 2 + 1), topmargin + verticalstep * branchsize + 35, name, false); - } - position++; - } - break; - case 5: - if (m < tpermutations[i].middlebranchstart) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[m] > 0) { - name = to_string(i + 1) + "_" + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name[0] + to_string(m + 1) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name.substr(1); - if (k >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[k]].summary; - } - insertLabel(labels, leftmargin + horizontalstep * (backbonesize - position - 2 + 1), topmargin + verticalstep * branchsize + 35, name, false); - } - position++; - } - if (m >= tpermutations[i].middlebranchend) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[m] > 0) { - name = to_string(i + 1) + "_" + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name[0] + to_string(m + 1) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name.substr(1); - if (k >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[k]].summary; - } - insertLabel(labels, leftmargin + horizontalstep / 2 + horizontalstep * tpermutations[0].middlebranchstart - 25, topmargin + verticalstep * (branchsize - m - 2 + backbonesize) + verticalstep / 2, name, true); - } - } - break; - default: - break; - } - } + else { + pos = description.find("- "); + if (pos != string::npos) { + description = description.substr(pos + 2); } + else { + continue; + } + } - position = 0; - if (parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].cterminal) { - for (int m = len - 1; m >= 0; m--) { - switch (i) - { - case 0: - if ((m < tpermutations[i].middlebranchstart) || (m >= tpermutations[i].middlebranchend)) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[len - m - 1] > 0) { - name = to_string(i + 1) + "_" + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name[0] + to_string(len - m) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name.substr(1); - if (k >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[k]].summary; - } - insertLabel(labels, leftmargin + horizontalstep * (backbonesize - position - 1), topmargin + verticalstep * branchsize + 35, name, false); - } - position++; - } - break; - case 1: - if (m < tpermutations[i].middlebranchstart) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[len - m - 1] > 0) { - name = to_string(i + 1) + "_" + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name[0] + to_string(len - m) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name.substr(1); - if (k >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[k]].summary; - } - insertLabel(labels, leftmargin + horizontalstep / 2 + horizontalstep * tpermutations[0].middlebranchstart - 25, topmargin + verticalstep * m + verticalstep / 2, name, true); - } - } - if (m >= tpermutations[i].middlebranchend) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[len - m - 1] > 0) { - name = to_string(i + 1) + "_" + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name[0] + to_string(len - m) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name.substr(1); - if (k >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[k]].summary; - } - insertLabel(labels, leftmargin + horizontalstep * (backbonesize - position - 1), topmargin + verticalstep * branchsize + 35, name, false); - } - position++; - } - break; - case 2: - if ((m < tpermutations[i].middlebranchstart) || (m >= tpermutations[i].middlebranchend)) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[len - m - 1] > 0) { - name = to_string(i + 1) + "_" + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name[0] + to_string(len - m) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name.substr(1); - if (k >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[k]].summary; - } - insertLabel(labels, leftmargin + horizontalstep * position + horizontalstep / 2 + horizontalstep / 4 + horizontalstep / 8, topmargin + verticalstep * branchsize - 35, name, false); - } - position++; - } - break; - case 3: - if (m < tpermutations[i].middlebranchstart) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[len - m - 1] > 0) { - name = to_string(i + 1) + "_" + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name[0] + to_string(len - m) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name.substr(1); - if (k >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[k]].summary; - } - insertLabel(labels, leftmargin + horizontalstep * (backbonesize - position - tpermutations[i].middlebranchend + tpermutations[i].middlebranchstart - 1), topmargin + verticalstep * branchsize + 35, name, false); - } - position++; - } - if (m >= tpermutations[i].middlebranchend) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[len - m - 1] > 0) { - name = to_string(i + 1) + "_" + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name[0] + to_string(len - m) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name.substr(1); - if (k >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[k]].summary; - } - insertLabel(labels, leftmargin + horizontalstep / 2 + horizontalstep * tpermutations[0].middlebranchstart + 25, topmargin + verticalstep * (branchsize - m - 2 + backbonesize) + verticalstep / 2 - verticalstep / 8, name, false); - } - } - break; - case 4: - if (m < tpermutations[i].middlebranchstart) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[len - m - 1] > 0) { - name = to_string(i + 1) + "_" + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name[0] + to_string(len - m) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name.substr(1); - if (k >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[k]].summary; - } - insertLabel(labels, leftmargin + horizontalstep / 2 + horizontalstep * tpermutations[0].middlebranchstart - 25, topmargin + verticalstep * m + verticalstep / 2, name, true); + if (visibleionseries.empty() || (!visibleionseries.empty() && (parameters->iondefinitions[(*thpeaks)[i].iontype].name.compare(visibleionseries) == 0))) { + + if ((visibleneutralloss.compare("all") == 0) + || ((visibleneutralloss.compare("none") == 0) && (description.find(" -") == string::npos)) + || ((visibleneutralloss.compare("all") != 0) && (visibleneutralloss.compare("none") != 0) && (description.substr(description.find(" -") + 2).compare(visibleneutralloss) == 0))) { + + rotid = (*thpeaks)[i].rotationid; + if ((rotid >= 0) && ((visibletrotationid == -1) || (visibletrotationid == rotid))) { + + serid = (*thpeaks)[i].seriesid; + if (serid >= 0) { + + if (parameters->iondefinitions[(*thpeaks)[i].iontype].nterminal) { + switch (rotid) { + case 0: + if (serid < tpermutations[0].middlebranchstart) { + insertLabel(labels, leftmargin + horizontalstep / 4 + horizontalstep / 8 + horizontalstep * serid + horizontalstep / 2, topmargin + verticalstep * branchsize - 35, description, false); + } + if (serid >= tpermutations[0].middlebranchend) { + insertLabel(labels, leftmargin + horizontalstep / 4 + horizontalstep / 8 + horizontalstep * (serid - branchsize) + horizontalstep / 2, topmargin + verticalstep * branchsize - 35, description, false); + } + break; + case 1: + if (serid < tpermutations[1].middlebranchstart) { + insertLabel(labels, leftmargin + horizontalstep / 2 + horizontalstep * tpermutations[0].middlebranchstart + 25, topmargin + verticalstep * serid + verticalstep / 2 - verticalstep / 8, description, false); + } + if (serid >= tpermutations[1].middlebranchend) { + insertLabel(labels, leftmargin + horizontalstep / 4 + horizontalstep / 8 + horizontalstep * (serid - branchsize) + horizontalstep / 2, topmargin + verticalstep * branchsize - 35, description, false); + } + break; + case 2: + if (serid < tpermutations[2].middlebranchstart) { + insertLabel(labels, leftmargin + horizontalstep * (backbonesize - serid - 1), topmargin + verticalstep * branchsize + 35, description, false); + } + if (serid >= tpermutations[2].middlebranchend) { + insertLabel(labels, leftmargin + horizontalstep * (backbonesize - serid + branchsize - 1), topmargin + verticalstep * branchsize + 35, description, false); + } + break; + case 3: + if (serid < tpermutations[3].middlebranchstart) { + insertLabel(labels, leftmargin + horizontalstep / 4 + horizontalstep / 8 + horizontalstep * serid + horizontalstep / 2, topmargin + verticalstep * branchsize - 35, description, false); + } + if (serid >= tpermutations[3].middlebranchend) { + insertLabel(labels, leftmargin + horizontalstep / 2 + horizontalstep * tpermutations[0].middlebranchstart - 25, topmargin + verticalstep * (branchsize - serid - 2 + backbonesize) + verticalstep / 2, description, true); + } + break; + case 4: + if (serid < tpermutations[4].middlebranchstart) { + insertLabel(labels, leftmargin + horizontalstep / 2 + horizontalstep * tpermutations[0].middlebranchstart + 25, topmargin + verticalstep * serid + verticalstep / 2 - verticalstep / 8, description, false); + } + if (serid >= tpermutations[4].middlebranchend) { + insertLabel(labels, leftmargin + horizontalstep * (backbonesize - serid + branchsize - 1), topmargin + verticalstep * branchsize + 35, description, false); + } + break; + case 5: + if (serid < tpermutations[5].middlebranchstart) { + insertLabel(labels, leftmargin + horizontalstep * (backbonesize - serid - 1), topmargin + verticalstep * branchsize + 35, description, false); + } + if (serid >= tpermutations[5].middlebranchend) { + insertLabel(labels, leftmargin + horizontalstep / 2 + horizontalstep * tpermutations[0].middlebranchstart - 25, topmargin + verticalstep * (branchsize - serid - 2 + backbonesize) + verticalstep / 2, description, true); + } + break; + default: + break; } } - if (m >= tpermutations[i].middlebranchend) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[len - m - 1] > 0) { - name = to_string(i + 1) + "_" + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name[0] + to_string(len - m) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name.substr(1); - if (k >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[k]].summary; - } - insertLabel(labels, leftmargin + horizontalstep * position + horizontalstep / 2 + horizontalstep / 4 + horizontalstep / 8, topmargin + verticalstep * branchsize - 35, name, false); - } - position++; - } - break; - case 5: - if (m < tpermutations[i].middlebranchstart) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[len - m - 1] > 0) { - name = to_string(i + 1) + "_" + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name[0] + to_string(len - m) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name.substr(1); - if (k >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[k]].summary; - } - insertLabel(labels, leftmargin + horizontalstep * (position + tpermutations[i].middlebranchend - tpermutations[i].middlebranchstart) + horizontalstep / 2 + horizontalstep / 4 + horizontalstep / 8, topmargin + verticalstep * branchsize - 35, name, false); - } - position++; - } - if (m >= tpermutations[i].middlebranchend) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[len - m - 1] > 0) { - name = to_string(i + 1) + "_" + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name[0] + to_string(len - m) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[j]].name.substr(1); - if (k >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[k]].summary; - } - insertLabel(labels, leftmargin + horizontalstep / 2 + horizontalstep * tpermutations[0].middlebranchstart + 25, topmargin + verticalstep * (branchsize - m - 2 + backbonesize) + verticalstep / 2 - verticalstep / 8, name, false); + + if (parameters->iondefinitions[(*thpeaks)[i].iontype].cterminal) { + switch (rotid) { + case 0: + if (serid < tpermutations[2].middlebranchstart) { + insertLabel(labels, leftmargin + horizontalstep * (backbonesize - serid - 1), topmargin + verticalstep * branchsize + 35, description, false); + } + if (serid >= tpermutations[2].middlebranchend) { + insertLabel(labels, leftmargin + horizontalstep * (backbonesize - serid + branchsize - 1), topmargin + verticalstep * branchsize + 35, description, false); + } + break; + case 1: + if (serid < tpermutations[5].middlebranchstart) { + insertLabel(labels, leftmargin + horizontalstep * (backbonesize - serid - 1), topmargin + verticalstep * branchsize + 35, description, false); + } + if (serid >= tpermutations[5].middlebranchend) { + insertLabel(labels, leftmargin + horizontalstep / 2 + horizontalstep * tpermutations[0].middlebranchstart - 25, topmargin + verticalstep * (branchsize - serid - 2 + backbonesize) + verticalstep / 2, description, true); + } + break; + case 2: + if (serid < tpermutations[0].middlebranchstart) { + insertLabel(labels, leftmargin + horizontalstep * serid + horizontalstep / 2 + horizontalstep / 4 + horizontalstep / 8, topmargin + verticalstep * branchsize - 35, description, false); + } + if (serid >= tpermutations[0].middlebranchend) { + insertLabel(labels, leftmargin + horizontalstep * (serid - branchsize) + horizontalstep / 2 + horizontalstep / 4 + horizontalstep / 8, topmargin + verticalstep * branchsize - 35, description, false); + } + break; + case 3: + if (serid < tpermutations[4].middlebranchstart) { + insertLabel(labels, leftmargin + horizontalstep / 2 + horizontalstep * tpermutations[0].middlebranchstart + 25, topmargin + verticalstep * serid + verticalstep / 2 - verticalstep / 8, description, false); + } + if (serid >= tpermutations[4].middlebranchend) { + insertLabel(labels, leftmargin + horizontalstep * (backbonesize - serid + branchsize - 1), topmargin + verticalstep * branchsize + 35, description, false); + } + break; + case 4: + if (serid < tpermutations[3].middlebranchstart) { + insertLabel(labels, leftmargin + horizontalstep / 4 + horizontalstep / 8 + horizontalstep * serid + horizontalstep / 2, topmargin + verticalstep * branchsize - 35, description, false); + } + if (serid >= tpermutations[3].middlebranchend) { + insertLabel(labels, leftmargin + horizontalstep / 2 + horizontalstep * tpermutations[0].middlebranchstart - 25, topmargin + verticalstep * (branchsize - serid - 2 + backbonesize) + verticalstep / 2, description, true); + } + break; + case 5: + if (serid < tpermutations[1].middlebranchstart) { + insertLabel(labels, leftmargin + horizontalstep / 2 + horizontalstep * tpermutations[0].middlebranchstart + 25, topmargin + verticalstep * serid + verticalstep / 2 - verticalstep / 8, description, false); + } + if (serid >= tpermutations[1].middlebranchend) { + insertLabel(labels, leftmargin + horizontalstep / 4 + horizontalstep / 8 + horizontalstep * (serid - branchsize) + horizontalstep / 2, topmargin + verticalstep * branchsize - 35, description, false); + } + break; + default: + break; } } - break; - default: - break; + } + } + } } - coverageindex++; - } } - } - painter.setPen(QPen(Qt::red, 2, Qt::SolidLine)); - for (auto it = labels.begin(); it != labels.end(); ++it) { - if (it->alignright) { - painter.drawText(it->x - fm.width(it->label.c_str()), it->y, fm.width(it->label.c_str()), 20, Qt::AlignLeft, it->label.c_str()); - } - else { - painter.drawText(it->x, it->y, width(), 20, Qt::AlignLeft, it->label.c_str()); - } } + drawLabels(painter, labels, width()); + } } diff --git a/CycloBranch/gui/cBricksDatabaseProxyModel.cpp b/CycloBranch/gui/cBricksDatabaseProxyModel.cpp index 71ea697..3fcf08f 100644 --- a/CycloBranch/gui/cBricksDatabaseProxyModel.cpp +++ b/CycloBranch/gui/cBricksDatabaseProxyModel.cpp @@ -6,9 +6,14 @@ cBricksDatabaseProxyModel::cBricksDatabaseProxyModel(QObject *parent) : QSortFil } -void cBricksDatabaseProxyModel::initialize(QComboBox* rowsfiltercombobox, QComboBox* rowsfiltercomparatorcombobox) { - this->rowsfiltercombobox = rowsfiltercombobox; - this->rowsfiltercomparatorcombobox = rowsfiltercomparatorcombobox; +void cBricksDatabaseProxyModel::initialize(QComboBox* rowsfilteroperator, QComboBox* rowsfiltercombobox1, QComboBox* rowsfiltercomparatorcombobox1, QLineEdit* rowsfilterline1, QComboBox* rowsfiltercombobox2, QComboBox* rowsfiltercomparatorcombobox2, QLineEdit* rowsfilterline2) { + filteroperator = rowsfilteroperator; + filtercombobox1 = rowsfiltercombobox1; + filtercomparatorcombobox1 = rowsfiltercomparatorcombobox1; + filterline1 = rowsfilterline1; + filtercombobox2 = rowsfiltercombobox2; + filtercomparatorcombobox2 = rowsfiltercomparatorcombobox2; + filterline2 = rowsfilterline2; } @@ -18,121 +23,64 @@ void cBricksDatabaseProxyModel::setWholeWord(bool wholeword) { bool cBricksDatabaseProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { - if (filterRegExp().isEmpty()) { + if (filterline1->text().isEmpty() && filterline2->text().isEmpty()) { return true; } - int col = rowsfiltercombobox->currentIndex() + 1; - - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).type() == QVariant::ByteArray) { - switch (rowsfiltercomparatorcombobox->currentIndex()) { - case 0: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() == filterRegExp().pattern().toDouble()) { - return true; - } - break; - case 1: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() < filterRegExp().pattern().toDouble()) { - return true; - } - break; - case 2: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() <= filterRegExp().pattern().toDouble()) { - return true; - } - break; - case 3: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() > filterRegExp().pattern().toDouble()) { - return true; - } - break; - case 4: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() >= filterRegExp().pattern().toDouble()) { - return true; - } - break; - default: - break; + int col1 = filtercombobox1->currentIndex() + 1; + int col2 = filtercombobox2->currentIndex() + 1; + + bool result1 = false; + bool result2 = false; + + if (!filterline1->text().isEmpty()) { + if (sourceModel()->data(sourceModel()->index(sourceRow, col1, sourceParent)).type() == QVariant::ByteArray) { + result1 = proxyModelCheckDouble(sourceModel(), filtercomparatorcombobox1->currentIndex(), sourceRow, col1, filterline1->text(), sourceParent); + } + + if (sourceModel()->data(sourceModel()->index(sourceRow, col1, sourceParent)).type() == QVariant::String) { + QString qstr = sourceModel()->data(sourceModel()->index(sourceRow, col1, sourceParent)).toString(); + result1 = proxyModelCheckString(sourceModel(), filtercomparatorcombobox1->currentIndex(), sourceRow, col1, qstr, filterline1->text(), sourceParent, wholeword, filterCaseSensitivity()); } - } - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).type() == QVariant::String) { - switch (rowsfiltercomparatorcombobox->currentIndex()) { - case 0: - if (wholeword) { - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().compare(filterRegExp().pattern(), filterCaseSensitivity()) == 0) { - return true; - } - } - else { - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().contains(filterRegExp())) { - return true; - } - } - break; - case 1: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().compare(filterRegExp().pattern(), filterCaseSensitivity()) < 0) { - return true; - } - break; - case 2: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().compare(filterRegExp().pattern(), filterCaseSensitivity()) <= 0) { - return true; - } - break; - case 3: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().compare(filterRegExp().pattern(), filterCaseSensitivity()) > 0) { - return true; - } - break; - case 4: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().compare(filterRegExp().pattern(), filterCaseSensitivity()) >= 0) { - return true; - } - break; - default: - break; + if (sourceModel()->data(sourceModel()->index(sourceRow, col1, sourceParent)).type() == QVariant::Int) { + result1 = proxyModelCheckInt(sourceModel(), filtercomparatorcombobox1->currentIndex(), sourceRow, col1, filterline1->text(), sourceParent); } } - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).type() == QVariant::Int) { - switch (rowsfiltercomparatorcombobox->currentIndex()) { - case 0: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() == filterRegExp().pattern().toInt()) { - return true; - } - break; - case 1: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() < filterRegExp().pattern().toInt()) { - return true; - } - break; - case 2: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() <= filterRegExp().pattern().toInt()) { - return true; - } - break; - case 3: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() > filterRegExp().pattern().toInt()) { - return true; - } - break; - case 4: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() >= filterRegExp().pattern().toInt()) { - return true; - } - break; - default: - break; + if (!filterline2->text().isEmpty()) { + if (sourceModel()->data(sourceModel()->index(sourceRow, col2, sourceParent)).type() == QVariant::ByteArray) { + result2 = proxyModelCheckDouble(sourceModel(), filtercomparatorcombobox2->currentIndex(), sourceRow, col2, filterline2->text(), sourceParent); + } + + if (sourceModel()->data(sourceModel()->index(sourceRow, col2, sourceParent)).type() == QVariant::String) { + QString qstr = sourceModel()->data(sourceModel()->index(sourceRow, col2, sourceParent)).toString(); + result2 = proxyModelCheckString(sourceModel(), filtercomparatorcombobox2->currentIndex(), sourceRow, col2, qstr, filterline2->text(), sourceParent, wholeword, filterCaseSensitivity()); } + + if (sourceModel()->data(sourceModel()->index(sourceRow, col2, sourceParent)).type() == QVariant::Int) { + result2 = proxyModelCheckInt(sourceModel(), filtercomparatorcombobox2->currentIndex(), sourceRow, col2, filterline2->text(), sourceParent); + } + } + + if (!filterline1->text().isEmpty() && filterline2->text().isEmpty()) { + return result1; + } + + if (filterline1->text().isEmpty() && !filterline2->text().isEmpty()) { + return result2; + } + + if (filteroperator->currentIndex() == 0) { + return result1 || result2; } - return false; + return result1 && result2; } bool cBricksDatabaseProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const { - if (left.column() == 6) { + if (left.column() == 7) { return false; } diff --git a/CycloBranch/gui/cBricksDatabaseProxyModel.h b/CycloBranch/gui/cBricksDatabaseProxyModel.h index 230b366..32cb2e6 100644 --- a/CycloBranch/gui/cBricksDatabaseProxyModel.h +++ b/CycloBranch/gui/cBricksDatabaseProxyModel.h @@ -11,7 +11,8 @@ #include #include #include -#include "core/cFragmentIons.h" +#include +#include "core/utilities.h" /** @@ -23,8 +24,13 @@ class cBricksDatabaseProxyModel : public QSortFilterProxyModel { private: - QComboBox* rowsfiltercombobox; - QComboBox* rowsfiltercomparatorcombobox; + QComboBox* filteroperator; + QComboBox* filtercombobox1; + QComboBox* filtercomparatorcombobox1; + QLineEdit* filterline1; + QComboBox* filtercombobox2; + QComboBox* filtercomparatorcombobox2; + QLineEdit* filterline2; bool wholeword; public: @@ -39,10 +45,15 @@ class cBricksDatabaseProxyModel : public QSortFilterProxyModel { /** \brief Initialize the model. - \param rowsfiltercombobox reference to the combobox with selection of columns - \param rowsfiltercomparatorcombobox reference to the combobox with selection of comparator + \param rowsfilteroperator reference to the combobox with operator selection + \param rowsfiltercombobox1 reference to the combobox with selection of columns + \param rowsfiltercomparatorcombobox1 reference to the combobox with selection of comparator + \param rowsfilterline1 reference to a text field + \param rowsfiltercombobox2 reference to the combobox with selection of columns + \param rowsfiltercomparatorcombobox2 reference to the combobox with selection of comparator + \param rowsfilterline2 reference to a text field */ - void initialize(QComboBox* rowsfiltercombobox, QComboBox* rowsfiltercomparatorcombobox); + void initialize(QComboBox* rowsfilteroperator, QComboBox* rowsfiltercombobox1, QComboBox* rowsfiltercomparatorcombobox1, QLineEdit* rowsfilterline1, QComboBox* rowsfiltercombobox2, QComboBox* rowsfiltercomparatorcombobox2, QLineEdit* rowsfilterline2); /** diff --git a/CycloBranch/gui/cBricksDatabaseWidget.cpp b/CycloBranch/gui/cBricksDatabaseWidget.cpp index 3001632..3eaf009 100644 --- a/CycloBranch/gui/cBricksDatabaseWidget.cpp +++ b/CycloBranch/gui/cBricksDatabaseWidget.cpp @@ -42,22 +42,45 @@ cBricksDatabaseWidget::cBricksDatabaseWidget(QWidget* parent) { menuEdit = new QMenu(tr("&Edit"), this); menuHelp = new QMenu(tr("&Help"), this); - rowsfiltercombobox = new QComboBox(); - rowsfiltercombobox->setToolTip("Column to be Searched"); - rowsfiltercombobox->setSizeAdjustPolicy(QComboBox::AdjustToContents); - - rowsfiltercomparatorcombobox = new QComboBox(); - rowsfiltercomparatorcombobox->setToolTip("Type of Comparison"); - rowsfiltercomparatorcombobox->addItem("="); - rowsfiltercomparatorcombobox->addItem("<"); - rowsfiltercomparatorcombobox->addItem("<="); - rowsfiltercomparatorcombobox->addItem(">"); - rowsfiltercomparatorcombobox->addItem(">="); - rowsfiltercomparatorcombobox->setSizeAdjustPolicy(QComboBox::AdjustToContents); - - rowsfilterline = new QLineEdit(); - rowsfilterline->setMinimumWidth(300); - rowsfilterline->setToolTip("Text to Find"); + rowsfilteroperator = new QComboBox(); + rowsfilteroperator->setToolTip("OR = any condition must be met; AND = all conditions must be met."); + rowsfilteroperator->addItem("OR"); + rowsfilteroperator->addItem("AND"); + rowsfilteroperator->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfiltercombobox1 = new QComboBox(); + rowsfiltercombobox1->setToolTip("Column to be Searched"); + rowsfiltercombobox1->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfiltercomparatorcombobox1 = new QComboBox(); + rowsfiltercomparatorcombobox1->setToolTip("Type of Comparison"); + rowsfiltercomparatorcombobox1->addItem("="); + rowsfiltercomparatorcombobox1->addItem("<"); + rowsfiltercomparatorcombobox1->addItem("<="); + rowsfiltercomparatorcombobox1->addItem(">"); + rowsfiltercomparatorcombobox1->addItem(">="); + rowsfiltercomparatorcombobox1->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfilterline1 = new QLineEdit(); + rowsfilterline1->setMinimumWidth(150); + rowsfilterline1->setToolTip("Text to Find"); + + rowsfiltercombobox2 = new QComboBox(); + rowsfiltercombobox2->setToolTip("Column to be Searched"); + rowsfiltercombobox2->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfiltercomparatorcombobox2 = new QComboBox(); + rowsfiltercomparatorcombobox2->setToolTip("Type of Comparison"); + rowsfiltercomparatorcombobox2->addItem("="); + rowsfiltercomparatorcombobox2->addItem("<"); + rowsfiltercomparatorcombobox2->addItem("<="); + rowsfiltercomparatorcombobox2->addItem(">"); + rowsfiltercomparatorcombobox2->addItem(">="); + rowsfiltercomparatorcombobox2->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfilterline2 = new QLineEdit(); + rowsfilterline2->setMinimumWidth(150); + rowsfilterline2->setToolTip("Text to Find"); rowsfiltercasesensitive = new QCheckBox(); rowsfiltercasesensitive->setToolTip("Case Sensitive"); @@ -75,11 +98,19 @@ cBricksDatabaseWidget::cBricksDatabaseWidget(QWidget* parent) { rowsfilterclearbutton->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_R)); rowsfilterhbox = new QHBoxLayout(); - rowsfilterhbox->addWidget(rowsfiltercombobox); + rowsfilterhbox->addWidget(rowsfiltercombobox1); rowsfilterhbox->addSpacing(10); - rowsfilterhbox->addWidget(rowsfiltercomparatorcombobox); + rowsfilterhbox->addWidget(rowsfiltercomparatorcombobox1); rowsfilterhbox->addSpacing(10); - rowsfilterhbox->addWidget(rowsfilterline); + rowsfilterhbox->addWidget(rowsfilterline1); + rowsfilterhbox->addSpacing(10); + rowsfilterhbox->addWidget(rowsfilteroperator); + rowsfilterhbox->addSpacing(10); + rowsfilterhbox->addWidget(rowsfiltercombobox2); + rowsfilterhbox->addSpacing(10); + rowsfilterhbox->addWidget(rowsfiltercomparatorcombobox2); + rowsfilterhbox->addSpacing(10); + rowsfilterhbox->addWidget(rowsfilterline2); rowsfilterhbox->addSpacing(10); rowsfilterhbox->addWidget(rowsfiltercasesensitive); rowsfilterhbox->addSpacing(10); @@ -97,7 +128,7 @@ cBricksDatabaseWidget::cBricksDatabaseWidget(QWidget* parent) { proxymodel = new cBricksDatabaseProxyModel(this); proxymodel->setSourceModel(databasemodel); proxymodel->setDynamicSortFilter(false); - proxymodel->initialize(rowsfiltercombobox, rowsfiltercomparatorcombobox); + proxymodel->initialize(rowsfilteroperator, rowsfiltercombobox1, rowsfiltercomparatorcombobox1, rowsfilterline1, rowsfiltercombobox2, rowsfiltercomparatorcombobox2, rowsfilterline2); database->setModel(proxymodel); database->setSortingEnabled(true); @@ -127,7 +158,7 @@ cBricksDatabaseWidget::cBricksDatabaseWidget(QWidget* parent) { actionSaveDatabase->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_S)); actionSaveDatabase->setToolTip("Save Database... (Ctrl + S)"); toolbarFile->addAction(actionSaveDatabase); - connect(actionSaveDatabase, SIGNAL(triggered()), this, SLOT(saveDatabase())); + connect(actionSaveDatabase, SIGNAL(triggered()), this, SLOT(saveDatabaseCheck())); actionSaveDatabaseAs = new QAction(QIcon(":/images/icons/86.png"), tr("Save &Database As..."), this); actionSaveDatabaseAs->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_D)); @@ -180,6 +211,8 @@ cBricksDatabaseWidget::cBricksDatabaseWidget(QWidget* parent) { actionHTMLDocumentation->setToolTip("Show HTML Documentation (F1)"); toolbarHelp->addAction(actionHTMLDocumentation); connect(actionHTMLDocumentation, SIGNAL(triggered()), this, SLOT(showHTMLDocumentation())); + + addToolBarBreak(); toolbarFilter = addToolBar(tr("Filter")); toolbarFilter->addWidget(rowsfilterwidget); @@ -215,7 +248,7 @@ cBricksDatabaseWidget::cBricksDatabaseWidget(QWidget* parent) { setCentralWidget(mainwidget); - resize(1280, 780); + resize(defaultwinsizex, defaultwinsizey); databasefile = ""; @@ -238,9 +271,13 @@ cBricksDatabaseWidget::~cBricksDatabaseWidget() { delete proxymodel; delete database; - delete rowsfiltercombobox; - delete rowsfiltercomparatorcombobox; - delete rowsfilterline; + delete rowsfilteroperator; + delete rowsfiltercombobox1; + delete rowsfiltercomparatorcombobox1; + delete rowsfilterline1; + delete rowsfiltercombobox2; + delete rowsfiltercomparatorcombobox2; + delete rowsfilterline2; delete rowsfiltercasesensitive; delete rowsfilterwholeword; delete rowsfilterbutton; @@ -290,7 +327,7 @@ void cBricksDatabaseWidget::deleteTable() { void cBricksDatabaseWidget::resetHeader() { - databasemodel->setColumnCount(7); + databasemodel->setColumnCount(8); databasemodel->setHorizontalHeaderItem(0, new QStandardItem()); database->setItemDelegateForColumn(0, new cCheckBoxDelegate()); @@ -298,13 +335,16 @@ void cBricksDatabaseWidget::resetHeader() { databasemodel->setHorizontalHeaderItem(2, new QStandardItem("Acronym(s)")); databasemodel->setHorizontalHeaderItem(3, new QStandardItem("Residue Summary")); databasemodel->setHorizontalHeaderItem(4, new QStandardItem("Monoisotopic Residue Mass")); - databasemodel->setHorizontalHeaderItem(5, new QStandardItem("Reference(s)")); - databasemodel->setHorizontalHeaderItem(6, new QStandardItem("Preview")); - database->setItemDelegateForColumn(6, new cMultipleButtonDelegate()); + databasemodel->setHorizontalHeaderItem(5, new QStandardItem("Neutral Loss(es)")); + databasemodel->setHorizontalHeaderItem(6, new QStandardItem("Reference(s)")); + databasemodel->setHorizontalHeaderItem(7, new QStandardItem("Preview")); + database->setItemDelegateForColumn(7, new cMultipleButtonDelegate()); - rowsfiltercombobox->clear(); + rowsfiltercombobox1->clear(); + rowsfiltercombobox2->clear(); for (int i = 1; i < databasemodel->columnCount() - 1; i++) { - rowsfiltercombobox->addItem(databasemodel->horizontalHeaderItem(i)->text()); + rowsfiltercombobox1->addItem(databasemodel->horizontalHeaderItem(i)->text()); + rowsfiltercombobox2->addItem(databasemodel->horizontalHeaderItem(i)->text()); } database->horizontalHeader()->setStretchLastSection(true); @@ -313,7 +353,7 @@ void cBricksDatabaseWidget::resetHeader() { } database->setColumnWidth(1, 400); database->setColumnWidth(2, 400); - database->setColumnWidth(5, 400); + database->setColumnWidth(6, 400); } @@ -322,20 +362,52 @@ bool cBricksDatabaseWidget::checkTable() { int checkslash; for (int i = 0; i < databasemodel->rowCount(); i++) { checkslash = numberOfOccurrences(databasemodel->item(i, 1)->text().toStdString(),'/'); - if ((checkslash != numberOfOccurrences(databasemodel->item(i, 2)->text().toStdString(),'/')) || (checkslash != numberOfOccurrences(databasemodel->item(i, 5)->text().toStdString(),'/'))) { + if ((checkslash != numberOfOccurrences(databasemodel->item(i, 2)->text().toStdString(),'/')) || (checkslash != numberOfOccurrences(databasemodel->item(i, 6)->text().toStdString(), '/'))) { QMessageBox msgBox; QString errstr = "Syntax error in the row no. "; errstr += to_string(i + 1).c_str(); - errstr += ":\nThe number of '/' must be equal in the fields Name(s), Acronym(s) and Reference(s) !\n\nNote: The symbol '/' separates izomers of a building block."; + errstr += ":\nThe number of '/' must be equal in the fields Name(s), Acronym(s), Neutral Loss(es), and Reference(s) !\n\nNote: The symbol '/' separates izomers of a building block."; msgBox.setText(errstr); msgBox.exec(); return false; } } - // check summary formulas + cSummaryFormula formula; + string tmpstr; + + // check molecular formulas for (int i = 0; i < databasemodel->rowCount(); i++) { - if (!checkFormula(i, databasemodel->item(i, 3)->text().toStdString())) { + tmpstr = databasemodel->item(i, 3)->text().toStdString(); + formula.setFormula(tmpstr); + if (!checkFormula(i, formula)) { + return false; + } + else { + if (databasemodel->item(i, 4)) { + databasemodel->item(i, 4)->setData(QVariant::fromValue(cropPrecisionToSixDecimalsByteArray(formula.getMass())), Qt::DisplayRole); + } + } + } + + // check neutral losses + string lossstr; + size_t last, next; + for (int i = 0; i < databasemodel->rowCount(); i++) { + lossstr = databasemodel->item(i, 5)->text().toStdString(); + last = 0; + next = 0; + while ((next = lossstr.find(";", last)) != string::npos) { + tmpstr = lossstr.substr(last, next - last); + formula.setFormula(tmpstr); + if (!checkFormula(i, formula)) { + return false; + } + last = next + 1; + } + tmpstr = lossstr.substr(last); + formula.setFormula(tmpstr); + if (!checkFormula(i, formula)) { return false; } } @@ -344,10 +416,8 @@ bool cBricksDatabaseWidget::checkTable() { } -bool cBricksDatabaseWidget::checkFormula(int row, const string& summary) { - cSummaryFormula formula; +bool cBricksDatabaseWidget::checkFormula(int row, cSummaryFormula& formula) { string errmsg; - formula.setFormula(summary); if (!formula.isValid(errmsg)) { QMessageBox msgBox; QString errstr = "Syntax error in the row no. "; @@ -358,9 +428,6 @@ bool cBricksDatabaseWidget::checkFormula(int row, const string& summary) { msgBox.exec(); return false; } - if (databasemodel->item(row, 4)) { - databasemodel->item(row, 4)->setData(QVariant::fromValue(cropPrecisionToSixDecimalsByteArray(formula.getMass())), Qt::DisplayRole); - } return true; } @@ -385,13 +452,13 @@ void cBricksDatabaseWidget::setDataModified(bool datamodified) { void cBricksDatabaseWidget::keyPressEvent(QKeyEvent *event) { if ((event->key() == Qt::Key_Enter) || (event->key() == Qt::Key_Return)) { - if (rowsfilterline->hasFocus()) { + if (rowsfilterline1->hasFocus() || rowsfilterline2->hasFocus()) { filterRows(); } } if ((event->modifiers() == Qt::ControlModifier) && (event->key() == Qt::Key_F)) { - rowsfilterline->setFocus(); + rowsfilterline1->setFocus(); } if ((event->modifiers() == Qt::ControlModifier) && (event->key() == Qt::Key_T)) { @@ -478,10 +545,13 @@ void cBricksDatabaseWidget::openDatabase() { databasemodel->item(i, 4)->setData(QVariant::fromValue(cropPrecisionToSixDecimalsByteArray(bricks[i].getMass())), Qt::DisplayRole); databasemodel->setItem(i, 5, new QStandardItem()); - databasemodel->item(i, 5)->setText(bricks[i].getReferencesAsString().c_str()); + databasemodel->item(i, 5)->setText(bricks[i].getLosses().c_str()); + + databasemodel->setItem(i, 6, new QStandardItem()); + databasemodel->item(i, 6)->setText(bricks[i].getReferencesAsString().c_str()); - databasemodel->setItem(i, 6, new QStandardItem()); - databasemodel->item(i, 6)->setText(bricks[i].getAcronymsWithReferencesAsHTMLString().c_str()); + databasemodel->setItem(i, 7, new QStandardItem()); + databasemodel->item(i, 7)->setText(bricks[i].getAcronymsWithReferencesAsHTMLString().c_str()); progress.setValue(i); if (progress.wasCanceled()) { @@ -505,7 +575,7 @@ void cBricksDatabaseWidget::openDatabase() { } database->setColumnWidth(1, 400); database->setColumnWidth(2, 400); - database->setColumnWidth(5, 400); + database->setColumnWidth(6, 400); progress.setValue(bricks.size()); @@ -574,6 +644,10 @@ bool cBricksDatabaseWidget::saveDatabase() { b.setMass(proxymodel->index(i, j).data(Qt::DisplayRole).toDouble()); break; case 5: + s = proxymodel->index(i, j).data(Qt::DisplayRole).toString().toStdString(); + b.setLosses(removeWhiteSpacesExceptSpaces(s)); + break; + case 6: s = proxymodel->index(i, j).data(Qt::DisplayRole).toString().toStdString(); b.setReferences(removeWhiteSpacesExceptSpaces(s)); break; @@ -620,6 +694,18 @@ bool cBricksDatabaseWidget::saveDatabaseAs() { } +void cBricksDatabaseWidget::saveDatabaseCheck() { + QMessageBox::StandardButton reply; + reply = QMessageBox::question(this, appname, "Save changes ?", QMessageBox::Yes | QMessageBox::No); + + if (reply == QMessageBox::No) { + return; + } + + saveDatabase(); +} + + void cBricksDatabaseWidget::addRow() { resetFilter(); @@ -635,6 +721,7 @@ void cBricksDatabaseWidget::addRow() { databasemodel->setItem(row, 4, new QStandardItem()); databasemodel->setItem(row, 5, new QStandardItem()); databasemodel->setItem(row, 6, new QStandardItem()); + databasemodel->setItem(row, 7, new QStandardItem()); database->scrollToBottom(); } @@ -661,17 +748,24 @@ void cBricksDatabaseWidget::itemChanged(QStandardItem* item) { // recalculate mass when formula is changed if (item->column() == 3) { - checkFormula(item->row(), item->text().toStdString()); + string tmpstr = item->text().toStdString(); + cSummaryFormula formula; + formula.setFormula(tmpstr); + if (checkFormula(item->row(), formula)) { + if (databasemodel->item(item->row(), 4)) { + databasemodel->item(item->row(), 4)->setData(QVariant::fromValue(cropPrecisionToSixDecimalsByteArray(formula.getMass())), Qt::DisplayRole); + } + } } // update references preview - if (((item->column() == 2) || (item->column() == 5)) && databasemodel->item(item->row(), 6)) { + if (((item->column() == 2) || (item->column() == 6)) && databasemodel->item(item->row(), 7)) { cBrick b; b.setAcronyms(databasemodel->item(item->row(), 2)->text().toStdString()); - b.setReferences(databasemodel->item(item->row(), 5)->text().toStdString()); + b.setReferences(databasemodel->item(item->row(), 6)->text().toStdString()); - databasemodel->item(item->row(), 6)->setText(b.getAcronymsWithReferencesAsHTMLString().c_str()); + databasemodel->item(item->row(), 7)->setText(b.getAcronymsWithReferencesAsHTMLString().c_str()); } if (item->column() > 0) { @@ -689,12 +783,13 @@ void cBricksDatabaseWidget::filterRows() { proxymodel->setWholeWord(rowsfilterwholeword->isChecked()); proxymodel->setFilterKeyColumn(-1); proxymodel->setFilterCaseSensitivity(rowsfiltercasesensitive->isChecked()?Qt::CaseSensitive:Qt::CaseInsensitive); - proxymodel->setFilterFixedString(rowsfilterline->text()); + proxymodel->setFilterFixedString(""); } void cBricksDatabaseWidget::resetFilter() { - rowsfilterline->setText(""); + rowsfilterline1->setText(""); + rowsfilterline2->setText(""); database->horizontalHeader()->setSortIndicator(-1, Qt::AscendingOrder); proxymodel->sort(-1); @@ -779,10 +874,13 @@ void cBricksDatabaseWidget::importDatabase() { databasemodel->item(i + originalrowcount, 4)->setData(QVariant::fromValue(cropPrecisionToSixDecimalsByteArray(importedbricks[i].getMass())), Qt::DisplayRole); databasemodel->setItem(i + originalrowcount, 5, new QStandardItem()); - databasemodel->item(i + originalrowcount, 5)->setText(importedbricks[i].getReferencesAsString().c_str()); + databasemodel->item(i + originalrowcount, 5)->setText(importedbricks[i].getLosses().c_str()); + + databasemodel->setItem(i + originalrowcount, 6, new QStandardItem()); + databasemodel->item(i + originalrowcount, 6)->setText(importedbricks[i].getReferencesAsString().c_str()); - databasemodel->setItem(i + originalrowcount, 6, new QStandardItem()); - databasemodel->item(i + originalrowcount, 6)->setText(importedbricks[i].getAcronymsWithReferencesAsHTMLString().c_str()); + databasemodel->setItem(i + originalrowcount, 7, new QStandardItem()); + databasemodel->item(i + originalrowcount, 7)->setText(importedbricks[i].getAcronymsWithReferencesAsHTMLString().c_str()); bricks.push_back(importedbricks[i]); @@ -808,7 +906,7 @@ void cBricksDatabaseWidget::importDatabase() { } database->setColumnWidth(1, 400); database->setColumnWidth(2, 400); - database->setColumnWidth(5, 400); + database->setColumnWidth(6, 400); if (progress.wasCanceled()) { setDataModified(false); diff --git a/CycloBranch/gui/cBricksDatabaseWidget.h b/CycloBranch/gui/cBricksDatabaseWidget.h index e6d2f8c..7108f16 100644 --- a/CycloBranch/gui/cBricksDatabaseWidget.h +++ b/CycloBranch/gui/cBricksDatabaseWidget.h @@ -105,9 +105,13 @@ class cBricksDatabaseWidget : public QMainWindow QToolBar* toolbarFilter; QWidget* rowsfilterwidget; QHBoxLayout* rowsfilterhbox; - QComboBox* rowsfiltercombobox; - QComboBox* rowsfiltercomparatorcombobox; - QLineEdit* rowsfilterline; + QComboBox* rowsfilteroperator; + QComboBox* rowsfiltercombobox1; + QComboBox* rowsfiltercomparatorcombobox1; + QLineEdit* rowsfilterline1; + QComboBox* rowsfiltercombobox2; + QComboBox* rowsfiltercomparatorcombobox2; + QLineEdit* rowsfilterline2; QCheckBox* rowsfiltercasesensitive; QCheckBox* rowsfilterwholeword; QPushButton* rowsfilterbutton; @@ -133,7 +137,7 @@ class cBricksDatabaseWidget : public QMainWindow bool checkTable(); - bool checkFormula(int row, const string& summary); + bool checkFormula(int row, cSummaryFormula& formula); void setDataModified(bool datamodified); @@ -157,6 +161,8 @@ private slots: bool saveDatabaseAs(); + void saveDatabaseCheck(); + void addRow(); void removeSelectedRows(); diff --git a/CycloBranch/gui/cChromatogramWindow.cpp b/CycloBranch/gui/cChromatogramWindow.cpp index ef6fc1e..f151a71 100644 --- a/CycloBranch/gui/cChromatogramWindow.cpp +++ b/CycloBranch/gui/cChromatogramWindow.cpp @@ -16,6 +16,7 @@ cChromatogramWindow::cChromatogramWindow(cTheoreticalSpectrumList& theoreticalsp menuHelp = new QMenu(tr("&Help"), this); chromatogramwindowwidget = new cChromatogramWindowWidget(theoreticalspectrumlist, this); + connect(chromatogramwindowwidget, SIGNAL(chromatogramWidgetDoubleClicked(int)), this, SLOT(chromatogramDoubleClickedSlot(int))); toolbarFile = addToolBar(tr("File")); @@ -55,6 +56,23 @@ cChromatogramWindow::cChromatogramWindow(cTheoreticalSpectrumList& theoreticalsp toolbarView->addSeparator(); + actionMouseSelection = new QAction(QIcon(":/images/icons/64.png"), tr("Mouse Selection Tool"), this); + actionMouseSelection->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_T)); + actionMouseSelection->setToolTip("Mouse Selection Tool (Ctrl + T)"); + actionMouseSelection->setCheckable(true); + actionMouseSelection->setChecked(true); + actionMouseSelection->setEnabled(true); + toolbarView->addAction(actionMouseSelection); + connect(actionMouseSelection, SIGNAL(toggled(bool)), chromatogramwindowwidget, SLOT(enableMouseSelectionTool(bool))); + + actionRetentionTime = new QAction(QIcon(":/images/icons/12.png"), tr("Retention Ti&me"), this); + actionRetentionTime->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_M)); + actionRetentionTime->setToolTip("Retention Time (Ctrl + M)"); + actionRetentionTime->setCheckable(true); + actionRetentionTime->setChecked(true); + toolbarView->addAction(actionRetentionTime); + connect(actionRetentionTime, SIGNAL(toggled(bool)), chromatogramwindowwidget, SLOT(retentionTimeStateChanged(bool))); + actionAbsoluteIntensity = new QAction(QIcon(":/images/icons/11.png"), tr("&Absolute Intensity"), this); actionAbsoluteIntensity->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_I)); actionAbsoluteIntensity->setToolTip("Absolute Intensity (Ctrl + I)"); @@ -89,24 +107,70 @@ cChromatogramWindow::cChromatogramWindow(cTheoreticalSpectrumList& theoreticalsp connect(actionHTMLDocumentation, SIGNAL(triggered()), this, SLOT(showHTMLDocumentation())); + toolbarTime = addToolBar(tr("Time and Spectrum ID")); + + labelretentiontime = new QLabel(tr("Time: ")); + + minretentiontime = new QDoubleSpinBox(); + minretentiontime->setToolTip("Minimum time"); + minretentiontime->setDecimals(6); + minretentiontime->setRange(0, 10000000); + minretentiontime->setSingleStep(1); + + labelseparatorretentiontime = new QLabel(tr("-")); + + maxretentiontime = new QDoubleSpinBox(); + maxretentiontime->setToolTip("Maximum time"); + maxretentiontime->setDecimals(6); + maxretentiontime->setRange(0, 10000000); + maxretentiontime->setSingleStep(1); + + setretentiontimeinterval = new QPushButton("Set Time"); + setretentiontimeinterval->setMinimumWidth(75); + connect(setretentiontimeinterval, SIGNAL(released()), this, SLOT(setRetentionTimeInterval())); + connect(this, SIGNAL(emitRetentionTimeInterval(double, double)), chromatogramwindowwidget, SLOT(setRetentionTimeInterval(double, double))); + + resetretentiontimeinterval = new QPushButton("Reset Time"); + resetretentiontimeinterval->setMinimumWidth(75); + connect(resetretentiontimeinterval, SIGNAL(released()), chromatogramwindowwidget, SLOT(resetRetentionTimeInterval())); + connect(chromatogramwindowwidget, SIGNAL(updateRetentionTimeInterval(double, double)), this, SLOT(updateRetentionTimeInterval(double, double))); + + hboxretentiontime = new QHBoxLayout(); + hboxretentiontime->addWidget(labelretentiontime); + hboxretentiontime->addWidget(minretentiontime); + hboxretentiontime->addWidget(labelseparatorretentiontime); + hboxretentiontime->addWidget(maxretentiontime); + hboxretentiontime->addSpacing(5); + hboxretentiontime->addWidget(setretentiontimeinterval); + hboxretentiontime->addSpacing(5); + hboxretentiontime->addWidget(resetretentiontimeinterval); + + widgetretentiontime = new QWidget(); + widgetretentiontime->setLayout(hboxretentiontime); + + toolbarTime->addWidget(widgetretentiontime); + toolbarTime->addSeparator(); + labelscanid = new QLabel(tr("Spectrum ID: ")); minscanid = new QSpinBox(); + minscanid->setToolTip("Minimum spectrum ID"); minscanid->setRange(1, 1000000); minscanid->setSingleStep(1); - labelseparator = new QLabel(tr("-")); + labelseparatorscanid = new QLabel(tr("-")); maxscanid = new QSpinBox(); + maxscanid->setToolTip("Maximum spectrum ID"); maxscanid->setRange(1, 1000000); maxscanid->setSingleStep(1); - setscanidinterval = new QPushButton("Set"); + setscanidinterval = new QPushButton("Set ID"); setscanidinterval->setMinimumWidth(75); connect(setscanidinterval, SIGNAL(released()), this, SLOT(setScanIDInterval())); connect(this, SIGNAL(emitScanIDInterval(int, int)), chromatogramwindowwidget, SLOT(setScanIDInterval(int, int))); - resetscanidinterval = new QPushButton("Reset"); + resetscanidinterval = new QPushButton("Reset ID"); resetscanidinterval->setMinimumWidth(75); connect(resetscanidinterval, SIGNAL(released()), chromatogramwindowwidget, SLOT(resetScanIDInterval())); connect(chromatogramwindowwidget, SIGNAL(updateScanIDInterval(int, int)), this, SLOT(updateScanIDInterval(int, int))); @@ -114,7 +178,7 @@ cChromatogramWindow::cChromatogramWindow(cTheoreticalSpectrumList& theoreticalsp hboxscanid = new QHBoxLayout(); hboxscanid->addWidget(labelscanid); hboxscanid->addWidget(minscanid); - hboxscanid->addWidget(labelseparator); + hboxscanid->addWidget(labelseparatorscanid); hboxscanid->addWidget(maxscanid); hboxscanid->addSpacing(5); hboxscanid->addWidget(setscanidinterval); @@ -124,18 +188,7 @@ cChromatogramWindow::cChromatogramWindow(cTheoreticalSpectrumList& theoreticalsp widgetscanid = new QWidget(); widgetscanid->setLayout(hboxscanid); - toolbarScanID = addToolBar(tr("Spectrum ID")); - - actionMouseSelection = new QAction(QIcon(":/images/icons/64.png"), tr("Mouse Spectrum ID Selection Tool"), this); - actionMouseSelection->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_T)); - actionMouseSelection->setToolTip("Mouse Spectrum ID Selection Tool (Ctrl + T)"); - actionMouseSelection->setCheckable(true); - actionMouseSelection->setChecked(true); - actionMouseSelection->setEnabled(true); - toolbarScanID->addAction(actionMouseSelection); - connect(actionMouseSelection, SIGNAL(toggled(bool)), chromatogramwindowwidget, SLOT(enableMouseSelectionTool(bool))); - - toolbarScanID->addWidget(widgetscanid); + toolbarTime->addWidget(widgetscanid); menuFile->addAction(actionExportImage); @@ -146,6 +199,8 @@ cChromatogramWindow::cChromatogramWindow(cTheoreticalSpectrumList& theoreticalsp menuView->addAction(actionZoomOut); menuView->addAction(actionZoomReset); menuView->addSeparator(); + menuView->addAction(actionMouseSelection); + menuView->addAction(actionRetentionTime); menuView->addAction(actionAbsoluteIntensity); menuView->addSeparator(); menuView->addAction(actionHideTIC); @@ -162,17 +217,25 @@ cChromatogramWindow::cChromatogramWindow(cTheoreticalSpectrumList& theoreticalsp setCentralWidget(chromatogramwindowwidget); centralWidget()->setContentsMargins(0, 0, 0, 0); - resize(1280, 780); - + resize(defaultwinsizex, defaultwinsizey); } cChromatogramWindow::~cChromatogramWindow() { delete chromatogramwindowwidget; + delete labelretentiontime; + delete minretentiontime; + delete labelseparatorretentiontime; + delete maxretentiontime; + delete setretentiontimeinterval; + delete resetretentiontimeinterval; + delete hboxretentiontime; + delete widgetretentiontime; + delete labelscanid; delete minscanid; - delete labelseparator; + delete labelseparatorscanid; delete maxscanid; delete setscanidinterval; delete resetscanidinterval; @@ -184,11 +247,12 @@ cChromatogramWindow::~cChromatogramWindow() { delete actionZoomIn; delete actionZoomOut; delete actionZoomReset; + delete actionMouseSelection; + delete actionRetentionTime; delete actionAbsoluteIntensity; delete actionHideTIC; delete actionHideEIC; delete actionHTMLDocumentation; - delete actionMouseSelection; delete menuFile; delete menuView; @@ -204,9 +268,19 @@ void cChromatogramWindow::closeEvent(QCloseEvent *event) { } +void cChromatogramWindow::recalculateTICChromatogram() { + chromatogramwindowwidget->recalculateTICChromatogram(); +} + + void cChromatogramWindow::keyPressEvent(QKeyEvent *event) { if ((event->key() == Qt::Key_Enter) || (event->key() == Qt::Key_Return)) { - setScanIDInterval(); + if (minscanid->hasFocus() || maxscanid->hasFocus()) { + setScanIDInterval(); + } + if (minretentiontime->hasFocus() || maxretentiontime->hasFocus()) { + setRetentionTimeInterval(); + } } event->accept(); @@ -264,6 +338,17 @@ void cChromatogramWindow::closeWindow() { } +void cChromatogramWindow::updateRetentionTimeInterval(double mintime, double maxtime) { + this->minretentiontime->setValue(mintime); + this->maxretentiontime->setValue(maxtime); +} + + +void cChromatogramWindow::setRetentionTimeInterval() { + emit emitRetentionTimeInterval(minretentiontime->value(), maxretentiontime->value()); +} + + void cChromatogramWindow::updateScanIDInterval(int minid, int maxid) { this->minscanid->setValue(minid); this->maxscanid->setValue(maxid); @@ -288,3 +373,8 @@ void cChromatogramWindow::showHTMLDocumentation() { #endif } + +void cChromatogramWindow::chromatogramDoubleClickedSlot(int scanid) { + emit doubleClickedScanIDSignal(scanid); +} + diff --git a/CycloBranch/gui/cChromatogramWindow.h b/CycloBranch/gui/cChromatogramWindow.h index 427f14a..2d3018c 100644 --- a/CycloBranch/gui/cChromatogramWindow.h +++ b/CycloBranch/gui/cChromatogramWindow.h @@ -53,6 +53,12 @@ class cChromatogramWindow : public QMainWindow void closeEvent(QCloseEvent *event); + /** + \brief Recalculate TIC chromatogram. + */ + void recalculateTICChromatogram(); + + private: QWidget* parent; @@ -71,18 +77,28 @@ class cChromatogramWindow : public QMainWindow QAction* actionZoomIn; QAction* actionZoomOut; QAction* actionZoomReset; + QAction* actionMouseSelection; + QAction* actionRetentionTime; QAction* actionAbsoluteIntensity; QAction* actionHideTIC; QAction* actionHideEIC; - QToolBar* toolbarScanID; - QAction* actionMouseSelection; + QToolBar* toolbarTime; + + QWidget* widgetretentiontime; + QHBoxLayout* hboxretentiontime; + QLabel* labelretentiontime; + QDoubleSpinBox* minretentiontime; + QLabel* labelseparatorretentiontime; + QDoubleSpinBox* maxretentiontime; + QPushButton* setretentiontimeinterval; + QPushButton* resetretentiontimeinterval; QWidget* widgetscanid; QHBoxLayout* hboxscanid; QLabel* labelscanid; QSpinBox* minscanid; - QLabel* labelseparator; + QLabel* labelseparatorscanid; QSpinBox* maxscanid; QPushButton* setscanidinterval; QPushButton* resetscanidinterval; @@ -107,13 +123,28 @@ class cChromatogramWindow : public QMainWindow /** - \brief The signal is emitted when the range of scans has been changed. + \brief The signal is emitted when the range of retention time has been changed. + \param mintime minimum retention time + \param maxtime maximum retention time + */ + void emitRetentionTimeInterval(double mintime, double maxtime); + + + /** + \brief The signal is emitted when the range of scan numbers has been changed. \param minid minimum scan id \param maxid maximum scan id */ void emitScanIDInterval(int minid, int maxid); + /** + \brief The signal is emitted a chromatographic peak was double clicked. + \param scanid scan id + */ + void doubleClickedScanIDSignal(int scanid); + + private slots: @@ -123,6 +154,12 @@ private slots: void closeWindow(); + void updateRetentionTimeInterval(double mintime, double maxtime); + + + void setRetentionTimeInterval(); + + void updateScanIDInterval(int minid, int maxid); @@ -135,6 +172,8 @@ private slots: void showHTMLDocumentation(); + void chromatogramDoubleClickedSlot(int scanid); + }; #endif diff --git a/CycloBranch/gui/cChromatogramWindowWidget.cpp b/CycloBranch/gui/cChromatogramWindowWidget.cpp index f632c17..49fc20f 100644 --- a/CycloBranch/gui/cChromatogramWindowWidget.cpp +++ b/CycloBranch/gui/cChromatogramWindowWidget.cpp @@ -7,6 +7,7 @@ cChromatogramWindowWidget::cChromatogramWindowWidget(cTheoreticalSpectrumList& t ticchromatogram.clear(); eicchromatogram.clear(); + rtimes.clear(); currentscale = 1; factor = 0.2; @@ -15,6 +16,8 @@ cChromatogramWindowWidget::cChromatogramWindowWidget(cTheoreticalSpectrumList& t pressedy = -1; currentx = 0; currenty = 0; + mintime = 0; + maxtime = 0; minscan = 0; maxscan = 0; @@ -26,6 +29,7 @@ cChromatogramWindowWidget::cChromatogramWindowWidget(cTheoreticalSpectrumList& t firstshow = true; enablemouseselection = true; + retentiontime = true; absoluteintensity = true; hidetic = false; hideeic = false; @@ -135,6 +139,8 @@ void cChromatogramWindowWidget::recalculateTICChromatogram() { ticchromatogram.clear(); spectrumcount = theoreticalspectrumlist->size(); + + rtimes.clear(); QProgressDialog progress("Updating...", /*"Cancel"*/0, 0, spectrumcount, this); progress.setMinimumWidth(250); @@ -142,6 +148,8 @@ void cChromatogramWindowWidget::recalculateTICChromatogram() { progress.installEventFilter(&filter); progress.setMinimumDuration(0); progress.setWindowModality(Qt::ApplicationModal); + + rtimes.resize(spectrumcount); for (int i = 0; i < spectrumcount; i++) { intensity = 0; @@ -154,18 +162,22 @@ void cChromatogramWindowWidget::recalculateTICChromatogram() { chromatogrampeak.absoluteintensity = intensity; ticchromatogram.add(chromatogrampeak); + rtimes[i] = (*theoreticalspectrumlist)[i].getExperimentalSpectrum().getRetentionTime(); + progress.setValue(i); } + if ((spectrumcount > 0) && (rtimes[rtimes.size() - 1] == 0)) { + for (int i = 0; i < spectrumcount; i++) { + rtimes[i] = i + 1; + } + } + ticchromatogram.normalizeIntenzity(); progress.setValue(spectrumcount); - minscan = 1; - maxscan = max(1, ticchromatogram.size()); - emit updateScanIDInterval(minscan, maxscan); - - redrawScene(); + resetScanIDInterval(); } @@ -191,7 +203,16 @@ void cChromatogramWindowWidget::wheelEvent(QWheelEvent *event) { if (newmin < newmax) { minscan = newmin; maxscan = newmax; + emit updateScanIDInterval(minscan, maxscan); + + if ((rtimes.size() > 0) && (rtimes.size() == ticchromatogram.size())) { + mintime = rtimes[minscan - 1]; + maxtime = rtimes[maxscan - 1]; + emit updateRetentionTimeInterval(mintime, maxtime); + } + + redrawScene(); } @@ -215,6 +236,12 @@ void cChromatogramWindowWidget::mouseMoveEvent(QMouseEvent *event) { emit updateScanIDInterval(minscan, maxscan); + if ((rtimes.size() > 0) && (rtimes.size() == ticchromatogram.size())) { + mintime = rtimes[minscan - 1]; + maxtime = rtimes[maxscan - 1]; + emit updateRetentionTimeInterval(mintime, maxtime); + } + pressedx = currentx; pressedy = currenty; @@ -241,6 +268,12 @@ void cChromatogramWindowWidget::mouseReleaseEvent(QMouseEvent *event) { emit updateScanIDInterval(minscan, maxscan); + if ((rtimes.size() > 0) && (rtimes.size() == ticchromatogram.size())) { + mintime = rtimes[minscan - 1]; + maxtime = rtimes[maxscan - 1]; + emit updateRetentionTimeInterval(mintime, maxtime); + } + pressedx = -1; pressedy = -1; @@ -289,11 +322,35 @@ void cChromatogramWindowWidget::mousePressEvent(QMouseEvent *event) { } +void cChromatogramWindowWidget::mouseDoubleClickEvent(QMouseEvent *event) { + QGraphicsView::mouseDoubleClickEvent(event); + int currentscan; + + if (event->button() == Qt::LeftButton) { + QPointF p = mapToScene(event->x(), event->y()); + pressedx = (int)p.x(); + pressedy = (int)p.y(); + + currentx = pressedx; + currenty = pressedy; + + currentscan = getScanIDFromXPosition(currentx + origwidth / max(1, 2 * (maxscan - minscan + 1)), origwidth); + + emit chromatogramWidgetDoubleClicked(currentscan - 1); + + pressedx = -1; + currentx = -1; + + redrawScene(); + } + + event->accept(); +} + + void cChromatogramWindowWidget::showEvent(QShowEvent *event) { QGraphicsView::showEvent(event); - recalculateTICChromatogram(); - if (firstshow) { normalSize(); firstshow = false; @@ -317,7 +374,7 @@ void cChromatogramWindowWidget::resizeEvent(QResizeEvent *event) { int cChromatogramWindowWidget::getScanIDFromXPosition(int x, int w) { int scanid = (double)(x - leftmargin) / (double)(w - leftmargin - rightmargin)*(maxscan - minscan + 1) + minscan - 1; - return max(1, scanid); + return min(max(1, scanid), (int)ticchromatogram.size()); } @@ -351,6 +408,9 @@ void cChromatogramWindowWidget::redrawScene() { int peakscount = 0; + int printscan; + bool printintensity; + if (!hidetic) { if (absoluteintensity) { maxintensitytic = ticchromatogram.getMaximumAbsoluteIntensityFromMZInterval((double)minscan, (double)maxscan, false, false, other, false); @@ -398,18 +458,51 @@ void cChromatogramWindowWidget::redrawScene() { } scene->addLine(w - rightmargin, h - bottommargin, w - rightmargin, h - bottommargin + 10, QPen(Qt::black, 2, Qt::SolidLine)); - simpletext = scene->addSimpleText(QString::number(minscan - 1), myFont); + printscan = minscan - 1; + if (retentiontime) { + if (printscan - 1 >= 0) { + simpletext = scene->addSimpleText(QString::number(rtimes[printscan - 1]), myFont); + } + else { + simpletext = scene->addSimpleText(QString::number(0), myFont); + } + } + else { + simpletext = scene->addSimpleText(QString::number(printscan), myFont); + } simpletext->setPos(QPointF(leftmargin - simpletext->boundingRect().width() / 2, h - bottommargin + 12)); if (maxscan - minscan > rulergranularity) { xstep = (w - leftmargin - rightmargin) / rulergranularity; for (int i = 1; i < rulergranularity; i++) { - simpletext = scene->addSimpleText(QString::number(minscan + (maxscan - minscan) / rulergranularity * i), myFont); + printscan = minscan + (maxscan - minscan) / rulergranularity * i; + if (retentiontime) { + if (printscan - 1 >= 0) { + simpletext = scene->addSimpleText(QString::number(rtimes[printscan - 1]), myFont); + } + else { + simpletext = scene->addSimpleText(QString::number(0), myFont); + } + } + else { + simpletext = scene->addSimpleText(QString::number(printscan), myFont); + } simpletext->setPos(QPointF(leftmargin + xstep * i - simpletext->boundingRect().width() / 2, h - bottommargin + 12)); } } - simpletext = scene->addSimpleText(QString::number(maxscan), myFont); + printscan = maxscan; + if (retentiontime) { + if (printscan - 1 >= 0) { + simpletext = scene->addSimpleText(QString::number(rtimes[printscan - 1]), myFont); + } + else { + simpletext = scene->addSimpleText(QString::number(0), myFont); + } + } + else { + simpletext = scene->addSimpleText(QString::number(printscan), myFont); + } simpletext->setPos(QPointF(w - rightmargin - simpletext->boundingRect().width() / 2, h - bottommargin + 12)); // y axis @@ -467,15 +560,24 @@ void cChromatogramWindowWidget::redrawScene() { x = getXPositionFromScanID((int)ticchromatogram[i].mzratio, w); + printintensity = true; if (absoluteintensity) { y = ticchromatogram[i].absoluteintensity / maxintensity * (h - topmargin - bottommargin); + if (ticchromatogram[i].absoluteintensity == 0) { + printintensity = false; + } } else { y = ticchromatogram[i].relativeintensity / maxintensity * (h - topmargin - bottommargin); + if (ticchromatogram[i].relativeintensity == 0) { + printintensity = false; + } } - line = scene->addLine(x, h - bottommargin - 2, x, h - bottommargin - std::max((int)y, 2), QPen(Qt::black, 2, Qt::SolidLine)); - peakscount++; + if (printintensity) { + line = scene->addLine(x, h - bottommargin - 2, x, h - bottommargin - std::max((int)y, 2), QPen(Qt::black, 2, Qt::SolidLine)); + peakscount++; + } } @@ -492,16 +594,25 @@ void cChromatogramWindowWidget::redrawScene() { x = getXPositionFromScanID((int)eicchromatogram[i].mzratio, w); + printintensity = true; if (absoluteintensity) { y = eicchromatogram[i].absoluteintensity / maxintensity * (h - topmargin - bottommargin); + if (eicchromatogram[i].absoluteintensity == 0) { + printintensity = false; + } } else { y = eicchromatogram[i].relativeintensity / maxintensity * (h - topmargin - bottommargin); + if (eicchromatogram[i].relativeintensity == 0) { + printintensity = false; + } } - line = scene->addLine(x, h - bottommargin - 2, x, h - bottommargin - std::max((int)y, 2), QPen(Qt::red, 2, Qt::SolidLine)); - line->setZValue(1); - peakscount++; + if (printintensity) { + line = scene->addLine(x, h - bottommargin - 2, x, h - bottommargin - std::max((int)y, 2), QPen(Qt::red, 2, Qt::SolidLine)); + line->setZValue(1); + peakscount++; + } } @@ -518,21 +629,37 @@ void cChromatogramWindowWidget::redrawScene() { x = getXPositionFromScanID((int)ticchromatogram[i].mzratio, w); + printintensity = true; if (absoluteintensity) { y = ticchromatogram[i].absoluteintensity / maxintensity * (h - topmargin - bottommargin); + if (ticchromatogram[i].absoluteintensity == 0) { + printintensity = false; + } } else { y = ticchromatogram[i].relativeintensity / maxintensity * (h - topmargin - bottommargin); + if (ticchromatogram[i].relativeintensity == 0) { + printintensity = false; + } } - simpletext = scene->addSimpleText(QString::number((int)ticchromatogram[i].mzratio) + " ", myFont); - tx = x - 2; - ty = h - bottommargin - std::max((int)y, 2) - simpletext->boundingRect().height() - 1 - 4; - simpletext->setPos(tx, ty); - simpletext->setBrush(Qt::black); + if (printintensity) { + + if (retentiontime) { + simpletext = scene->addSimpleText(QString::number(rtimes[i]) + " ", myFont); + } + else { + simpletext = scene->addSimpleText(QString::number((int)ticchromatogram[i].mzratio) + " ", myFont); + } + tx = x - 2; + ty = h - bottommargin - std::max((int)y, 2) - simpletext->boundingRect().height() - 1 - 4; + simpletext->setPos(tx, ty); + simpletext->setBrush(Qt::black); + + if (scene->collidingItems(simpletext, Qt::IntersectsItemBoundingRect).size() > 0) { + scene->removeItem(simpletext); + } - if (scene->collidingItems(simpletext, Qt::IntersectsItemBoundingRect).size() > 0) { - scene->removeItem(simpletext); } } @@ -550,22 +677,38 @@ void cChromatogramWindowWidget::redrawScene() { x = getXPositionFromScanID((int)eicchromatogram[i].mzratio, w); + printintensity = true; if (absoluteintensity) { y = eicchromatogram[i].absoluteintensity / maxintensity * (h - topmargin - bottommargin); + if (eicchromatogram[i].absoluteintensity == 0) { + printintensity = false; + } } else { y = eicchromatogram[i].relativeintensity / maxintensity * (h - topmargin - bottommargin); + if (eicchromatogram[i].relativeintensity == 0) { + printintensity = false; + } } - simpletext = scene->addSimpleText(QString::number((int)eicchromatogram[i].mzratio) + " ", myFont); - tx = x - 2; - ty = h - bottommargin - std::max((int)y, 2) - simpletext->boundingRect().height() - 1 - 4; - simpletext->setPos(tx, ty); - simpletext->setBrush(Qt::red); - simpletext->setZValue(1); + if (printintensity) { + + if (retentiontime) { + simpletext = scene->addSimpleText(QString::number(rtimes[i]) + " ", myFont); + } + else { + simpletext = scene->addSimpleText(QString::number((int)eicchromatogram[i].mzratio) + " ", myFont); + } + tx = x - 2; + ty = h - bottommargin - std::max((int)y, 2) - simpletext->boundingRect().height() - 1 - 4; + simpletext->setPos(tx, ty); + simpletext->setBrush(Qt::red); + simpletext->setZValue(1); + + if (scene->collidingItems(simpletext, Qt::IntersectsItemBoundingRect).size() > 0) { + scene->removeItem(simpletext); + } - if (scene->collidingItems(simpletext, Qt::IntersectsItemBoundingRect).size() > 0) { - scene->removeItem(simpletext); } } @@ -619,12 +762,29 @@ void cChromatogramWindowWidget::updateZoomGroup() { zoomrect->setPen(QPen(Qt::black, 1, Qt::DashLine)); zoomrect->setRect(QRectF(QPointF(rx1, ry1), QPointF(rx2, ry2))); - QString qstr = "Spectrum ID: "; - qstr += QString::number(getScanIDFromXPosition((pressedx < currentx) ? pressedx : currentx, origwidth)); - qstr += "-"; - qstr += QString::number(getScanIDFromXPosition((pressedx < currentx) ? currentx : pressedx, origwidth)); - qstr += "\ndiff: "; - qstr += QString::number(getScanIDFromXPosition((pressedx < currentx) ? currentx : pressedx, origwidth) - getScanIDFromXPosition((pressedx < currentx) ? pressedx : currentx, origwidth)); + int from = getScanIDFromXPosition((pressedx < currentx) ? pressedx : currentx, origwidth); + int to = getScanIDFromXPosition((pressedx < currentx) ? currentx : pressedx, origwidth); + + QString qstr; + + if (retentiontime) { + if ((from > 0) && (from <= (int)rtimes.size()) && (to > 0) && (to <= (int)rtimes.size())) { + qstr += "Time: "; + qstr += QString::number(rtimes[from - 1]); + qstr += "-"; + qstr += QString::number(rtimes[to - 1]); + qstr += "\ndiff: "; + qstr += QString::number(rtimes[to - 1] - rtimes[from - 1]); + } + } + else { + qstr += "Spectrum ID: "; + qstr += QString::number(from); + qstr += "-"; + qstr += QString::number(to); + qstr += "\ndiff: "; + qstr += QString::number(to - from); + } zoomsimpletextitem->setFont(myFont); zoomsimpletextitem->setText(qstr); @@ -700,15 +860,48 @@ void cChromatogramWindowWidget::normalSize() { } +void cChromatogramWindowWidget::retentionTimeStateChanged(bool state) { + retentiontime = state; + redrawScene(); +} + + void cChromatogramWindowWidget::absoluteIntensityStateChanged(bool state) { absoluteintensity = state; redrawScene(); } +void cChromatogramWindowWidget::setRetentionTimeInterval(double mintime, double maxtime) { + if (rtimes.size() == 0) { + return; + } + + int minid = 0; + int maxid = 0; + + int size = (int)rtimes.size(); + for (int i = 0; i < size; i++) { + if (fabs(rtimes[i] - mintime) < fabs(rtimes[minid] - mintime)) { + minid = i; + } + if (fabs(rtimes[i] - maxtime) < fabs(rtimes[maxid] - maxtime)) { + maxid = i; + } + } + + setScanIDInterval(minid + 1, maxid + 1); +} + + +void cChromatogramWindowWidget::resetRetentionTimeInterval() { + resetScanIDInterval(); +} + + void cChromatogramWindowWidget::setScanIDInterval(int minid, int maxid) { if (maxid < minid) { - double tmp = maxid; + int tmp = maxid; maxid = minid; minid = tmp; } @@ -717,6 +910,12 @@ void cChromatogramWindowWidget::setScanIDInterval(int minid, int maxid) { maxscan = min(maxid, ticchromatogram.size()); emit updateScanIDInterval(minscan, maxscan); + if ((rtimes.size() > 0) && (rtimes.size() == ticchromatogram.size())) { + mintime = rtimes[minscan - 1]; + maxtime = rtimes[maxscan - 1]; + emit updateRetentionTimeInterval(mintime, maxtime); + } + redrawScene(); } @@ -726,6 +925,12 @@ void cChromatogramWindowWidget::resetScanIDInterval() { maxscan = max(1, ticchromatogram.size()); emit updateScanIDInterval(minscan, maxscan); + if (rtimes.size() > 0) { + mintime = rtimes[0]; + maxtime = rtimes[rtimes.size() - 1]; + emit updateRetentionTimeInterval(mintime, maxtime); + } + redrawScene(); } diff --git a/CycloBranch/gui/cChromatogramWindowWidget.h b/CycloBranch/gui/cChromatogramWindowWidget.h index 5b9917f..49b56d1 100644 --- a/CycloBranch/gui/cChromatogramWindowWidget.h +++ b/CycloBranch/gui/cChromatogramWindowWidget.h @@ -114,6 +114,13 @@ class cChromatogramWindowWidget : public QGraphicsView void mousePressEvent(QMouseEvent *event); + /** + \brief Handle the mouse double click event. + \param event pointer to QMouseEvent + */ + void mouseDoubleClickEvent(QMouseEvent *event); + + /** \brief Handle the widget show event. \param event pointer to QShowEvent @@ -133,6 +140,7 @@ class cChromatogramWindowWidget : public QGraphicsView cTheoreticalSpectrumList* theoreticalspectrumlist; cPeaksList ticchromatogram; cPeaksList eicchromatogram; + vector rtimes; QWidget* parent; QGraphicsScene* scene; @@ -154,6 +162,9 @@ class cChromatogramWindowWidget : public QGraphicsView int currentx; int currenty; + double mintime; + double maxtime; + int minscan; int maxscan; @@ -165,6 +176,7 @@ class cChromatogramWindowWidget : public QGraphicsView bool firstshow; bool enablemouseselection; + bool retentiontime; bool absoluteintensity; bool hidetic; bool hideeic; @@ -187,15 +199,28 @@ class cChromatogramWindowWidget : public QGraphicsView signals: + /** + \brief The signal is emitted when the range of retention time has been changed. + \param mintime minimum retention time + \param maxtime maximum retention time + */ + void updateRetentionTimeInterval(double mintime, double maxtime); + /** - \brief The signal is emitted when the range of scans has been changed. + \brief The signal is emitted when the range of scan numbers has been changed. \param minid minimum scan id \param maxid maximum scan id */ void updateScanIDInterval(int minid, int maxid); + /** + \brief A chromatographic peak was double clicked. + \param scanid id of a scan + */ + void chromatogramWidgetDoubleClicked(int scanid); + private slots: @@ -209,9 +234,18 @@ private slots: void normalSize(); + void retentionTimeStateChanged(bool state); + + void absoluteIntensityStateChanged(bool state); + void setRetentionTimeInterval(double mintime, double maxtime); + + + void resetRetentionTimeInterval(); + + void setScanIDInterval(int minid, int maxid); diff --git a/CycloBranch/gui/cCyclicWidget.cpp b/CycloBranch/gui/cCyclicWidget.cpp index 4c0ef4e..084570d 100644 --- a/CycloBranch/gui/cCyclicWidget.cpp +++ b/CycloBranch/gui/cCyclicWidget.cpp @@ -207,171 +207,201 @@ void paintCircle(QPainter& painter, vector& acronymsofblocks, int center void generateCyclicLabelsToRight(bool nterminal, int rotationid, int rotationstart, int fragmentstart, int fragmentend, int numberofringblocks, unordered_set& labels, cParameters* parameters, cTheoreticalSpectrum* theoreticalspectrum, int centerx, int centery, int radius, double angle, int linesize, int cornerlinesize, string visibleionseries, string visibleneutralloss, int visiblerotationid, int branchstart, int branchend) { double cumulativeangle; - string name; - int m; - int coverageindex = rotationid * (int)parameters->ionsfortheoreticalspectra.size() * (parameters->numberofgeneratedneutrallosses + 1); - bool skipiontype, skipneutralloss; + int j; - if ((visiblerotationid == -1) || ((parameters->peptidetype == cyclic) && (visiblerotationid == rotationid)) || ((parameters->peptidetype == cyclicpolyketide) && (visiblerotationid == rotationid)) || ((parameters->peptidetype == branchcyclic) && (visiblerotationid == rotationid/6))) { - - for (int i = 0; i < (int)parameters->ionsfortheoreticalspectra.size(); i++) { + cPeaksList* thpeaks = theoreticalspectrum->getTheoreticalPeaks(); + string description; + size_t pos; + int rotid, serid; + for (int i = 0; i < thpeaks->size(); i++) { - skipiontype = false; - if ((visibleionseries.compare("") != 0) && (parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name.compare(visibleionseries) != 0)) { - skipiontype = true; - } + if (((*thpeaks)[i].matched > 0) && ((*thpeaks)[i].scrambled == false) && ((*thpeaks)[i].rotationid == rotationid)) { - for (int j = -1; j < (int)parameters->neutrallossesfortheoreticalspectra.size(); j++) { + description = (*thpeaks)[i].description; + description = description.substr(0, description.find(':')); - skipneutralloss = false; - if (visibleneutralloss.compare("all") != 0) { - if ((j == -1) && (visibleneutralloss.compare("none") != 0)) { - skipneutralloss = true; + if (description.find('[') == string::npos) { + if (parameters->precursorcharge > 0) { + pos = description.find("+ "); + if (pos != string::npos) { + description = description.substr(pos + 2); + } + else { + continue; + } + } + else { + pos = description.find("- "); + if (pos != string::npos) { + description = description.substr(pos + 2); } - if ((j >= 0) && (parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[j]].summary.compare(visibleneutralloss) != 0)) { - skipneutralloss = true; + else { + continue; } } - if (!skipiontype && !skipneutralloss) { + if (visibleionseries.empty() || (!visibleionseries.empty() && (parameters->iondefinitions[(*thpeaks)[i].iontype].name.compare(visibleionseries) == 0))) { - if ((nterminal && parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].nterminal) || (!nterminal && parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].cterminal) || (parameters->peptidetype == cyclicpolyketide)) { + if ((visibleneutralloss.compare("all") == 0) + || ((visibleneutralloss.compare("none") == 0) && (description.find(" -") == string::npos)) + || ((visibleneutralloss.compare("all") != 0) && (visibleneutralloss.compare("none") != 0) && (description.substr(description.find(" -") + 2).compare(visibleneutralloss) == 0))) { - m = 0; - for (int k = fragmentstart; k < fragmentend; k++) { - if ((branchstart == -1) || (branchend == -1) || ((branchstart >= 0) && (k < branchstart)) || ((branchend >= 0) && (k >= branchend))) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[k] > 0) { - name = theoreticalspectrum->getVisualCoverage()[coverageindex].name.substr(0, theoreticalspectrum->getVisualCoverage()[coverageindex].name.rfind('_') + 1); + rotid = (*thpeaks)[i].rotationid; + if ((rotid >= 0) && ((visiblerotationid == -1) || ((parameters->peptidetype == cyclic) && (visiblerotationid == rotid)) || ((parameters->peptidetype == cyclicpolyketide) && (visiblerotationid == rotid)) || ((parameters->peptidetype == branchcyclic) && (visiblerotationid == rotid / 6)))) { - if (parameters->peptidetype == cyclicpolyketide) { - name += parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name.substr(0, 2) + to_string(k + 1) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name.substr(2); - } - else { - name += parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name[0] + to_string(k + 1) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name.substr(1); - } + serid = (*thpeaks)[i].seriesid; + if (serid >= 0) { + + if ((nterminal && parameters->iondefinitions[(*thpeaks)[i].iontype].nterminal) || (!nterminal && parameters->iondefinitions[(*thpeaks)[i].iontype].cterminal) || (parameters->peptidetype == cyclicpolyketide)) { - if (j >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[j]].summary; - } + j = 0; + for (int k = fragmentstart; k < fragmentend; k++) { + + if ((branchstart == -1) || (branchend == -1) || ((branchstart >= 0) && (k < branchstart)) || ((branchend >= 0) && (k >= branchend))) { + + if (k == serid) { + + cumulativeangle = angle * (double)((rotationstart + j + 1) % numberofringblocks) + angle / (double)2; + if (cumulativeangle < pi / 2) { + QPoint p(centerx + sin(cumulativeangle)*(radius + linesize) - sin(pi / 2 - cumulativeangle)*cornerlinesize, centery - sin(pi / 2 - cumulativeangle)*(radius + linesize) - sin(cumulativeangle)*cornerlinesize); + insertLabel(labels, p.x() + 10, p.y() - 10, description, false); + } + else if ((cumulativeangle >= pi / 2) && (cumulativeangle <= pi)) { + QPoint p(centerx + sin(pi - cumulativeangle)*(radius + linesize) + sin(cumulativeangle - pi / 2)*cornerlinesize, centery + sin(cumulativeangle - pi / 2)*(radius + linesize) - sin(pi - cumulativeangle)*cornerlinesize); + insertLabel(labels, p.x() + 10, p.y() - 10, description, false); + } + else if ((cumulativeangle >= pi) && (cumulativeangle <= 3 * pi / 2)) { + QPoint p(centerx - sin(cumulativeangle - pi)*(radius + linesize) + sin(3 * pi / 2 - cumulativeangle)*cornerlinesize, centery + sin(3 * pi / 2 - cumulativeangle)*(radius + linesize) + sin(cumulativeangle - pi)*cornerlinesize); + insertLabel(labels, p.x() - 10, p.y() - 10, description, true); + } + else { + QPoint p(centerx - sin(2 * pi - cumulativeangle)*(radius + linesize) - sin(cumulativeangle - 3 * pi / 2)*cornerlinesize, centery - sin(cumulativeangle - 3 * pi / 2)*(radius + linesize) + sin(2 * pi - cumulativeangle)*cornerlinesize); + insertLabel(labels, p.x() - 10, p.y() - 10, description, true); + } + + } + + j++; + } - cumulativeangle = angle * (double)((rotationstart + m + 1) % numberofringblocks) + angle / (double)2; - if (cumulativeangle < pi / 2) { - QPoint p3(centerx + sin(cumulativeangle)*(radius + linesize) - sin(pi / 2 - cumulativeangle)*cornerlinesize, centery - sin(pi / 2 - cumulativeangle)*(radius + linesize) - sin(cumulativeangle)*cornerlinesize); - insertLabel(labels, p3.x() + 10, p3.y() - 10, name, false); - } - else if ((cumulativeangle >= pi / 2) && (cumulativeangle <= pi)) { - QPoint p3(centerx + sin(pi - cumulativeangle)*(radius + linesize) + sin(cumulativeangle - pi / 2)*cornerlinesize, centery + sin(cumulativeangle - pi / 2)*(radius + linesize) - sin(pi - cumulativeangle)*cornerlinesize); - insertLabel(labels, p3.x() + 10, p3.y() - 10, name, false); - } - else if ((cumulativeangle >= pi) && (cumulativeangle <= 3 * pi / 2)) { - QPoint p3(centerx - sin(cumulativeangle - pi)*(radius + linesize) + sin(3 * pi / 2 - cumulativeangle)*cornerlinesize, centery + sin(3 * pi / 2 - cumulativeangle)*(radius + linesize) + sin(cumulativeangle - pi)*cornerlinesize); - insertLabel(labels, p3.x() - 10, p3.y() - 10, name, true); - } - else { - QPoint p3(centerx - sin(2 * pi - cumulativeangle)*(radius + linesize) - sin(cumulativeangle - 3 * pi / 2)*cornerlinesize, centery - sin(cumulativeangle - 3 * pi / 2)*(radius + linesize) + sin(2 * pi - cumulativeangle)*cornerlinesize); - insertLabel(labels, p3.x() - 10, p3.y() - 10, name, true); } + } - m++; + } + } } } - coverageindex++; - } } } + } void generateCyclicLabelsToLeft(bool nterminal, int rotationid, int rotationstart, int fragmentstart, int fragmentend, int numberofringblocks, unordered_set& labels, cParameters* parameters, cTheoreticalSpectrum* theoreticalspectrum, int centerx, int centery, int radius, double angle, int linesize, int cornerlinesize, string visibleionseries, string visibleneutralloss, int visiblerotationid, int branchstart, int branchend) { double cumulativeangle; - string name; - int m; - int coverageindex = rotationid * (int)parameters->ionsfortheoreticalspectra.size() * (parameters->numberofgeneratedneutrallosses + 1); - bool skipiontype, skipneutralloss; + int j; - if ((visiblerotationid == -1) || ((parameters->peptidetype == cyclic) && (visiblerotationid == rotationid)) || ((parameters->peptidetype == cyclicpolyketide) && (visiblerotationid == rotationid)) || ((parameters->peptidetype == branchcyclic) && (visiblerotationid == rotationid/6))) { + cPeaksList* thpeaks = theoreticalspectrum->getTheoreticalPeaks(); + string description; + size_t pos; + int rotid, serid; + for (int i = 0; i < thpeaks->size(); i++) { - for (int i = 0; i < (int)parameters->ionsfortheoreticalspectra.size(); i++) { + if (((*thpeaks)[i].matched > 0) && ((*thpeaks)[i].scrambled == false) && ((*thpeaks)[i].rotationid == rotationid)) { - skipiontype = false; - if ((visibleionseries.compare("") != 0) && (parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name.compare(visibleionseries) != 0)) { - skipiontype = true; - } - - for (int j = -1; j < (int)parameters->neutrallossesfortheoreticalspectra.size(); j++) { + description = (*thpeaks)[i].description; + description = description.substr(0, description.find(':')); - skipneutralloss = false; - if (visibleneutralloss.compare("all") != 0) { - if ((j == -1) && (visibleneutralloss.compare("none") != 0)) { - skipneutralloss = true; + if (description.find('[') == string::npos) { + if (parameters->precursorcharge > 0) { + pos = description.find("+ "); + if (pos != string::npos) { + description = description.substr(pos + 2); } - if ((j >= 0) && (parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[j]].summary.compare(visibleneutralloss) != 0)) { - skipneutralloss = true; + else { + continue; + } + } + else { + pos = description.find("- "); + if (pos != string::npos) { + description = description.substr(pos + 2); + } + else { + continue; } } - if (!skipiontype && !skipneutralloss) { + if (visibleionseries.empty() || (!visibleionseries.empty() && (parameters->iondefinitions[(*thpeaks)[i].iontype].name.compare(visibleionseries) == 0))) { - if ((nterminal && parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].nterminal) || (!nterminal && parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].cterminal) || (parameters->peptidetype == cyclicpolyketide)) { + if ((visibleneutralloss.compare("all") == 0) + || ((visibleneutralloss.compare("none") == 0) && (description.find(" -") == string::npos)) + || ((visibleneutralloss.compare("all") != 0) && (visibleneutralloss.compare("none") != 0) && (description.substr(description.find(" -") + 2).compare(visibleneutralloss) == 0))) { - m = 0; - for (int k = fragmentstart; k < fragmentend; k++) { - if ((branchstart == -1) || (branchend == -1) || ((branchstart >= 0) && (k < branchstart)) || ((branchend >= 0) && (k >= branchend))) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[k] > 0) { - name = theoreticalspectrum->getVisualCoverage()[coverageindex].name.substr(0, theoreticalspectrum->getVisualCoverage()[coverageindex].name.rfind('_') + 1); + rotid = (*thpeaks)[i].rotationid; + if ((rotid >= 0) && ((visiblerotationid == -1) || ((parameters->peptidetype == cyclic) && (visiblerotationid == rotid)) || ((parameters->peptidetype == cyclicpolyketide) && (visiblerotationid == rotid)) || ((parameters->peptidetype == branchcyclic) && (visiblerotationid == rotid / 6)))) { - if (parameters->peptidetype == cyclicpolyketide) { - name += parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name.substr(0, 2) + to_string(k + 1) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name.substr(2); - } - else { - name += parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name[0] + to_string(k + 1) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name.substr(1); - } + serid = (*thpeaks)[i].seriesid; + if (serid >= 0) { - if (j >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[j]].summary; - } + if ((nterminal && parameters->iondefinitions[(*thpeaks)[i].iontype].nterminal) || (!nterminal && parameters->iondefinitions[(*thpeaks)[i].iontype].cterminal) || (parameters->peptidetype == cyclicpolyketide)) { + + j = 0; + for (int k = fragmentstart; k < fragmentend; k++) { + + if ((branchstart == -1) || (branchend == -1) || ((branchstart >= 0) && (k < branchstart)) || ((branchend >= 0) && (k >= branchend))) { + + if (k == serid) { + + cumulativeangle = angle * (double)((2 * numberofringblocks - rotationstart + numberofringblocks - j - 1) % numberofringblocks) + angle / (double)2; + if (cumulativeangle < pi / 2) { + QPoint p(centerx + sin(cumulativeangle)*(radius - linesize) + sin(pi / 2 - cumulativeangle)*cornerlinesize, centery - sin(pi / 2 - cumulativeangle)*(radius - linesize) + sin(cumulativeangle)*cornerlinesize); + insertLabel(labels, p.x() - 5, p.y() - 5, description, true); + } + else if ((cumulativeangle >= pi / 2) && (cumulativeangle <= pi)) { + QPoint p(centerx + sin(pi - cumulativeangle)*(radius - linesize) - sin(cumulativeangle - pi / 2)*cornerlinesize, centery + sin(cumulativeangle - pi / 2)*(radius - linesize) + sin(pi - cumulativeangle)*cornerlinesize); + insertLabel(labels, p.x() - 5, p.y() - 5, description, true); + } + else if ((cumulativeangle >= pi) && (cumulativeangle <= 3 * pi / 2)) { + QPoint p(centerx - sin(cumulativeangle - pi)*(radius - linesize) - sin(3 * pi / 2 - cumulativeangle)*cornerlinesize, centery + sin(3 * pi / 2 - cumulativeangle)*(radius - linesize) - sin(cumulativeangle - pi)*cornerlinesize); + insertLabel(labels, p.x() + 10, p.y() - 10, description, false); + } + else { + QPoint p(centerx - sin(2 * pi - cumulativeangle)*(radius - linesize) + sin(cumulativeangle - 3 * pi / 2)*cornerlinesize, centery - sin(cumulativeangle - 3 * pi / 2)*(radius - linesize) - sin(2 * pi - cumulativeangle)*cornerlinesize); + insertLabel(labels, p.x() + 10, p.y() - 10, description, false); + } + + } + + j++; + } - cumulativeangle = angle * (double)((2 * numberofringblocks - rotationstart + numberofringblocks - m - 1) % numberofringblocks) + angle / (double)2; - if (cumulativeangle < pi / 2) { - QPoint p4(centerx + sin(cumulativeangle)*(radius - linesize) + sin(pi / 2 - cumulativeangle)*cornerlinesize, centery - sin(pi / 2 - cumulativeangle)*(radius - linesize) + sin(cumulativeangle)*cornerlinesize); - insertLabel(labels, p4.x() - 5, p4.y() - 5, name, true); - } - else if ((cumulativeangle >= pi / 2) && (cumulativeangle <= pi)) { - QPoint p4(centerx + sin(pi - cumulativeangle)*(radius - linesize) - sin(cumulativeangle - pi / 2)*cornerlinesize, centery + sin(cumulativeangle - pi / 2)*(radius - linesize) + sin(pi - cumulativeangle)*cornerlinesize); - insertLabel(labels, p4.x() - 5, p4.y() - 5, name, true); - } - else if ((cumulativeangle >= pi) && (cumulativeangle <= 3 * pi / 2)) { - QPoint p4(centerx - sin(cumulativeangle - pi)*(radius - linesize) - sin(3 * pi / 2 - cumulativeangle)*cornerlinesize, centery + sin(3 * pi / 2 - cumulativeangle)*(radius - linesize) - sin(cumulativeangle - pi)*cornerlinesize); - insertLabel(labels, p4.x() + 10, p4.y() - 10, name, false); - } - else { - QPoint p4(centerx - sin(2 * pi - cumulativeangle)*(radius - linesize) + sin(cumulativeangle - 3 * pi / 2)*cornerlinesize, centery - sin(cumulativeangle - 3 * pi / 2)*(radius - linesize) - sin(2 * pi - cumulativeangle)*cornerlinesize); - insertLabel(labels, p4.x() + 10, p4.y() - 10, name, false); } + } - m++; + } + } } } - coverageindex++; - } } } + } @@ -522,27 +552,18 @@ void cCyclicWidget::paint(QPainter& painter) { int linesize = 20; int cornerlinesize = horizontalstep/8; - paintCircle(painter, acronyms, centerx, centery, radius, angle, horizontalstep, linesize, cornerlinesize, theoreticalspectrum->getVisualCoverage().size() > 0, visiblerotationid, labels); + paintCircle(painter, acronyms, centerx, centery, radius, angle, horizontalstep, linesize, cornerlinesize, theoreticalspectrum->getTheoreticalPeaks()->size() > 0, visiblerotationid, labels); - if (parameters && !hidelabels && (theoreticalspectrum->getVisualCoverage().size() > 0)) { + if (parameters && !hidelabels && (theoreticalspectrum->getTheoreticalPeaks()->size() > 0)) { - int half = (int)theoreticalspectrum->getVisualCoverage().size() / (int)parameters->ionsfortheoreticalspectra.size() / (parameters->numberofgeneratedneutrallosses + 1) / 2; - for (int i = 0; i < half; i++) { + for (int i = 0; i < size; i++) { generateCyclicLabelsToRight(true, i, i, 0, size - 1, size, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, -1, -1); } - for (int i = half; i < 2*half; i++) { + for (int i = size; i < 2*size; i++) { generateCyclicLabelsToLeft(true, i, i, 0, size - 1, size, labels, parameters, theoreticalspectrum, centerx, centery, radius, angle, linesize, cornerlinesize, visibleionseries, visibleneutralloss, visiblerotationid, -1, -1); } - painter.setPen(QPen(Qt::red, 2, Qt::SolidLine)); - for (auto it = labels.begin(); it != labels.end(); ++it) { - if (it->alignright) { - painter.drawText(it->x - fm.width(it->label.c_str()), it->y, fm.width(it->label.c_str()), 20, Qt::AlignLeft, it->label.c_str()); - } - else { - painter.drawText(it->x, it->y, width(), 20, Qt::AlignLeft, it->label.c_str()); - } - } + drawLabels(painter, labels, width()); } diff --git a/CycloBranch/gui/cDrawPeptideWidget.cpp b/CycloBranch/gui/cDrawPeptideWidget.cpp index 6c2b273..16f141c 100644 --- a/CycloBranch/gui/cDrawPeptideWidget.cpp +++ b/CycloBranch/gui/cDrawPeptideWidget.cpp @@ -151,7 +151,7 @@ cDrawPeptideWidget::cDrawPeptideWidget(QWidget* parent) { mainbox->addLayout(vbox); setLayout(mainbox); - resize(1280, 780); + resize(defaultwinsizex, defaultwinsizey); connect(sequenceline, SIGNAL(textEdited(const QString&)), this, SLOT(sequenceChanged())); connect(sequenceactioncopy, SIGNAL(triggered()), this, SLOT(sequenceCopy())); diff --git a/CycloBranch/gui/cGraphWidget.cpp b/CycloBranch/gui/cGraphWidget.cpp index d71416b..4492fb5 100644 --- a/CycloBranch/gui/cGraphWidget.cpp +++ b/CycloBranch/gui/cGraphWidget.cpp @@ -25,7 +25,7 @@ cGraphWidget::cGraphWidget() { setLayout(layout); - resize(1280, 780); + resize(defaultwinsizex, defaultwinsizey); } diff --git a/CycloBranch/gui/cImageWindow.cpp b/CycloBranch/gui/cImageWindow.cpp index 5f17711..19083bd 100644 --- a/CycloBranch/gui/cImageWindow.cpp +++ b/CycloBranch/gui/cImageWindow.cpp @@ -295,8 +295,10 @@ cImageWindow::cImageWindow(QWidget* parent) { layerslayout = new QGridLayout(); layerslayout->setAlignment(Qt::AlignTop); + connect(this, SIGNAL(layerChanged(int, bool, int, int)), imagewindowwidget, SLOT(changeLayer(int, bool, int, int))); connect(this, SIGNAL(activeLayerChanged(int)), imagewindowwidget, SLOT(changeActiveLayer(int))); + connect(imagewindowwidget, SIGNAL(imageWidgetDoubleClicked(int)), this, SLOT(imageDoubleClickedSlot(int))); layerscount = 0; activelayer = 0; @@ -507,7 +509,7 @@ cImageWindow::cImageWindow(QWidget* parent) { connect(imagewindowwidget, SIGNAL(updateHistologyPosition(int, int, int, int, double)), this, SLOT(updateHistologySlot(int, int, int, int, double))); connect(imagewindowwidget, SIGNAL(updateMicroscopyPosition(double, double, double, double, double)), this, SLOT(updateMicroscopySlot(double, double, double, double, double))); - resize(1280, 780); + resize(defaultwinsizex, defaultwinsizey); lastimagedir = "./"; @@ -1072,8 +1074,8 @@ void cImageWindow::saveImage() { } -void cImageWindow::setFilterOptionsSlot(vector coordinates, string columnname, string comparatorname, string filterstring, bool casesensitive, bool wholeword) { - imagewindowwidget->setFilterOptions(coordinates, columnname, comparatorname, filterstring, casesensitive, wholeword); +void cImageWindow::setFilterOptionsSlot(vector coordinates, bool operatortype, string columnname1, string comparatorname1, string filterstring1, string columnname2, string comparatorname2, string filterstring2, bool casesensitive, bool wholeword) { + imagewindowwidget->setFilterOptions(coordinates, operatortype, columnname1, comparatorname1, filterstring1, columnname2, comparatorname2, filterstring2, casesensitive, wholeword); } @@ -1381,3 +1383,8 @@ void cImageWindow::updateRulerSlot(double value) { rulerValue->setValue(value); } + +void cImageWindow::imageDoubleClickedSlot(int spectrumid) { + emit doubleClickedSpectrumIDSignal(spectrumid); +} + diff --git a/CycloBranch/gui/cImageWindow.h b/CycloBranch/gui/cImageWindow.h index 8cf3ba8..9846255 100644 --- a/CycloBranch/gui/cImageWindow.h +++ b/CycloBranch/gui/cImageWindow.h @@ -342,7 +342,7 @@ private slots: void saveImage(); - void setFilterOptionsSlot(vector coordinates, string columnname, string comparatorname, string filterstring, bool casesensitive, bool wholeword); + void setFilterOptionsSlot(vector coordinates, bool operatortype, string columnname1, string comparatorname1, string filterstring1, string columnname2, string comparatorname2, string filterstring2, bool casesensitive, bool wholeword); void setMaxButtonReleased(); @@ -414,6 +414,9 @@ private slots: void updateRulerSlot(double value); + void imageDoubleClickedSlot(int spectrumid); + + signals: @@ -444,6 +447,13 @@ private slots: void activeLayerChanged(int layerid); + /** + \brief The signal is emitted the image is double clicked. + \param spectrumid id of a spectrum + */ + void doubleClickedSpectrumIDSignal(int spectrumid); + + }; #endif diff --git a/CycloBranch/gui/cImageWindowWidget.cpp b/CycloBranch/gui/cImageWindowWidget.cpp index 554bc01..f6efe22 100644 --- a/CycloBranch/gui/cImageWindowWidget.cpp +++ b/CycloBranch/gui/cImageWindowWidget.cpp @@ -13,9 +13,13 @@ cImageWindowWidget::cImageWindowWidget() { setScene(scene); coordinates.clear(); - columnname = ""; - comparatorname = ""; - filteredstring = ""; + operatortype = 0; + columnname1 = ""; + comparatorname1 = ""; + filterstring1 = ""; + columnname2 = ""; + comparatorname2 = ""; + filterstring2 = ""; casesensitive = false; wholeword = false; @@ -137,11 +141,15 @@ QImage cImageWindowWidget::getImage() { } -void cImageWindowWidget::setFilterOptions(vector& coordinates, string& columnname, string& comparatorname, string& filteredstring, bool casesensitive, bool wholeword) { +void cImageWindowWidget::setFilterOptions(vector& coordinates, bool operatortype, string& columnname1, string& comparatorname1, string& filterstring1, string& columnname2, string& comparatorname2, string& filterstring2, bool casesensitive, bool wholeword) { this->coordinates = coordinates; - this->columnname = columnname; - this->comparatorname = comparatorname; - this->filteredstring = filteredstring; + this->operatortype = operatortype; + this->columnname1 = columnname1; + this->comparatorname1 = comparatorname1; + this->filterstring1 = filterstring1; + this->columnname2 = columnname2; + this->comparatorname2 = comparatorname2; + this->filterstring2 = filterstring2; this->casesensitive = casesensitive; this->wholeword = wholeword; redrawScene(); @@ -561,6 +569,56 @@ void cImageWindowWidget::mouseReleaseEvent(QMouseEvent *event) { } +void cImageWindowWidget::mouseDoubleClickEvent(QMouseEvent *event) { + QGraphicsView::mouseDoubleClickEvent(event); + int x, y, spectrumid; + + if (event->button() == Qt::LeftButton) { + QPointF p = mapToScene(event->x(), event->y()); + pressedx = (int)p.x(); + pressedy = (int)p.y(); + + currentx = pressedx; + currenty = pressedy; + + if (vendor == bruker) { + x = currentx * (maxx + 1) / max(1, currentwidth) - leftshift; + y = currenty * (maxy + 1) / max(1, currentheight) - topshift; + } + else { + x = currentx * maxx / max(1, currentwidth) - leftshift + 1; + y = currenty * maxy / max(1, currentheight) - topshift + 1; + } + + if ((currentx > 0) && (currenty > 0) && (currentx < currentwidth) && (currenty < currentheight)) { + + spectrumid = -1; + for (auto& it : coordinates) { + if ((it.x == x) && (it.y == y)) { + spectrumid = it.id; + break; + } + } + + if (spectrumid != -1) { + emit imageWidgetDoubleClicked(spectrumid - 1); + } + } + + pressedx = -1; + pressedy = -1; + + setCursor(Qt::ArrowCursor); + cursoractivity = cursoractivity_none; + + redrawScene(); + + } + + event->accept(); +} + + void cImageWindowWidget::resizeEvent(QResizeEvent *event) { QGraphicsView::resizeEvent(event); redrawScene(); @@ -598,8 +656,22 @@ void cImageWindowWidget::redrawScene() { QRectF rect_scene = mapToScene(rect_viewport).boundingRect(); QPixmap scaledpixmap = layersvector[layer_optical_image].pixmap->copy(rect_scene.x() / currentscale, rect_scene.y() / currentscale, rect_scene.width() / currentscale + 1, rect_scene.height() / currentscale + 1); + + if (scaledpixmap.isNull()) { + return; + } + + if (scaledpixmap.width() * currentscale * scaledpixmap.height() * currentscale > 100000000) { + // too many pixels + return; + } + scaledpixmap = scaledpixmap.scaledToHeight(scaledpixmap.height()*currentscale); + if (scaledpixmap.isNull()) { + return; + } + currentwidth = layersvector[layer_optical_image].pixmap->width()*currentscale; currentheight = layersvector[layer_optical_image].pixmap->height()*currentscale; @@ -678,7 +750,9 @@ void cImageWindowWidget::redrawScene() { coord.mzratio = 0; coord.relativeintensity += coordinates[i].relativeintensity; coord.absoluteintensity += coordinates[i].absoluteintensity; - coord.name += "\n" + coordinates[i].name; + if (coord.name.find(coordinates[i].name) == string::npos) { + coord.name += "\n" + coordinates[i].name; + } reduced_coordinates.erase(it); reduced_coordinates.insert(coord); @@ -861,8 +935,25 @@ void cImageWindowWidget::redrawScene() { } qstr = "Number of Points Selected: " + QString::number(reduced_coordinates.size()); - if (!filteredstring.empty()) { - qstr += " (filtered by column: \"" + QString(columnname.c_str()) + "\", comparator: \"" + QString(comparatorname.c_str()) + "\", text: \"" + QString(filteredstring.c_str()) + "\", case sensitive: " + QString((casesensitive) ? "yes" : "no") + ", whole words only: " + QString((wholeword) ? "yes" : "no") + ")"; + if (!filterstring1.empty() || !filterstring2.empty()) { + qstr += " ("; + } + if (!filterstring1.empty()) { + qstr += "column: \"" + QString(columnname1.c_str()) + "\", comparator: \"" + QString(comparatorname1.c_str()) + "\", text: \"" + QString(filterstring1.c_str()) + "\""; + } + if (!filterstring1.empty() && !filterstring2.empty()) { + if (operatortype == 0) { + qstr += " or "; + } + else { + qstr += " and "; + } + } + if (!filterstring2.empty()) { + qstr += "column: \"" + QString(columnname2.c_str()) + "\", comparator: \"" + QString(comparatorname2.c_str()) + "\", text: \"" + QString(filterstring2.c_str()) + "\""; + } + if (!filterstring1.empty() || !filterstring2.empty()) { + qstr += ", case sensitive: " + QString((casesensitive) ? "yes" : "no") + ", whole words only: " + QString((wholeword) ? "yes" : "no") + ")"; } qstr += "\n"; qstr += "Minimum Bounding Region:\nX: " + QString::number(xmin) + "-" + QString::number(xmax) + "; Y: " + QString::number(ymin) + "-" + QString::number(ymax) + "\n"; @@ -1905,7 +1996,15 @@ void cImageWindowWidget::setRulerValue(double value) { if ((horizontalshift != horizontalScrollBar()->value()) || (verticalshift != verticalScrollBar()->value())) { horizontalScrollBar()->setValue(horizontalshift); + if (horizontalshift != horizontalScrollBar()->value()) { + // if horizontalshift > maximum value, setValue was ignored + redrawScene(); + } verticalScrollBar()->setValue(verticalshift); + if (verticalshift != verticalScrollBar()->value()) { + // if verticalshift > maximum value, setValue was ignored + redrawScene(); + } } else { redrawScene(); diff --git a/CycloBranch/gui/cImageWindowWidget.h b/CycloBranch/gui/cImageWindowWidget.h index 30d7ba0..b4cfd13 100644 --- a/CycloBranch/gui/cImageWindowWidget.h +++ b/CycloBranch/gui/cImageWindowWidget.h @@ -249,13 +249,17 @@ class cImageWindowWidget : public QGraphicsView /** \brief Set options which was used to filter the points. \param coordinates a vector of coordinates - \param columnname name of column which was compared - \param comparatorname name of used comparator - \param filteredstring a string used to filter the points + \param operatortype the type of operator (0 = or; 1 = and) + \param columnname1 name of column which was compared + \param comparatorname1 name of used comparator + \param filterstring1 a string used to filter the points + \param columnname2 name of column which was compared + \param comparatorname2 name of used comparator + \param filterstring2 a string used to filter the points \param casesensitive true if the string was used as a casesensitive, false otherwise \param wholeword true if whole words only are compared, false otherwise */ - void setFilterOptions(vector& coordinates, string& columnname, string& comparatorname, string& filteredstring, bool casesensitive, bool wholeword); + void setFilterOptions(vector& coordinates, bool operatortype, string& columnname1, string& comparatorname1, string& filterstring1, string& columnname2, string& comparatorname2, string& filterstring2, bool casesensitive, bool wholeword); /** @@ -358,6 +362,13 @@ class cImageWindowWidget : public QGraphicsView void mouseReleaseEvent(QMouseEvent *event); + /** + \brief Handle the mouse double click event. + \param event pointer to QMouseEvent + */ + void mouseDoubleClickEvent(QMouseEvent *event); + + /** \brief Handle the resize event. \param event pointer to QResizeEvent @@ -417,15 +428,26 @@ class cImageWindowWidget : public QGraphicsView void updateRuler(double size); + /** + \brief The image was double clicked. + \param spectrumid id of a spectrum + */ + void imageWidgetDoubleClicked(int spectrumid); + + private: QWidget* parent; QGraphicsScene* scene; vector coordinates; - string columnname; - string comparatorname; - string filteredstring; + bool operatortype; + string columnname1; + string comparatorname1; + string filterstring1; + string columnname2; + string comparatorname2; + string filterstring2; bool casesensitive; bool wholeword; diff --git a/CycloBranch/gui/cLinearWidget.cpp b/CycloBranch/gui/cLinearWidget.cpp index 5f9ae5e..427392d 100644 --- a/CycloBranch/gui/cLinearWidget.cpp +++ b/CycloBranch/gui/cLinearWidget.cpp @@ -15,19 +15,45 @@ bool operator == (cIonLabel const& a, cIonLabel const& b) { void insertLabel(unordered_set& labels, int x, int y, string& description, bool alignright) { - cIonLabel label; - label.x = x; - label.y = y; - label.label = description; - label.alignright = alignright; - - if (labels.count(label) == 1) { - auto it = labels.find(label); - label.label = it->label + "," + label.label; + cIonLabel newlabel; + newlabel.x = x; + newlabel.y = y; + newlabel.labelset.insert(description); + newlabel.alignright = alignright; + + if (labels.count(newlabel) == 1) { + auto it = labels.find(newlabel); + newlabel.labelset = it->labelset; + newlabel.labelset.insert(description); labels.erase(it); } - labels.insert(label); + labels.insert(newlabel); +} + + +void drawLabels(QPainter& painter, unordered_set& labels, int width) { + QFont myFont("Courier", 9); + QFontMetrics fm(myFont); + string labeldesc; + + painter.setPen(QPen(Qt::red, 2, Qt::SolidLine)); + for (auto& it : labels) { + labeldesc = ""; + for (auto& it2 : it.labelset) { + labeldesc += it2 + ","; + } + if (labeldesc.size() > 0) { + labeldesc = labeldesc.substr(0, labeldesc.size() - 1); + } + labeldesc.erase(remove_if(begin(labeldesc), end(labeldesc), isWhiteSpace), end(labeldesc)); + if (it.alignright) { + painter.drawText(it.x - fm.width(labeldesc.c_str()), it.y, fm.width(labeldesc.c_str()), 20, Qt::AlignLeft, labeldesc.c_str()); + } + else { + painter.drawText(it.x, it.y, width, 20, Qt::AlignLeft, labeldesc.c_str()); + } + } } @@ -182,7 +208,7 @@ void cLinearWidget::paint(QPainter& painter) { painter.setPen(QPen(Qt::black, 2, Qt::SolidLine)); painter.drawLine(leftmargin + horizontalstep/4 + horizontalstep*i + horizontalstep/2, topmargin + 11, leftmargin + horizontalstep/4 + horizontalstep*(i + 1), topmargin + 11); - if (theoreticalspectrum->getVisualCoverage().size() > 0) { + if (theoreticalspectrum->getTheoreticalPeaks()->size() > 0) { painter.setPen(QPen(Qt::black, 2, Qt::DashLine)); painter.drawLine(leftmargin + horizontalstep*(i + 1), topmargin - 10, leftmargin + horizontalstep*(i + 1), topmargin + 30); painter.drawLine(leftmargin + horizontalstep/4 + horizontalstep/8 + horizontalstep*i + horizontalstep/2, topmargin - 10, leftmargin + horizontalstep*(i + 1), topmargin + - 10); @@ -191,85 +217,76 @@ void cLinearWidget::paint(QPainter& painter) { } } - if (parameters && !hidelabels && (theoreticalspectrum->getVisualCoverage().size() > 0)) { + if (parameters && !hidelabels && theoreticalspectrum->getTheoreticalPeaks()) { unordered_set labels; labels.clear(); - string name; - int len = (int)theoreticalspectrum->getVisualCoverage()[0].series.size(); - int coverageindex = 0; - bool skipiontype, skipneutralloss; - - for (int i = 0; i < (int)parameters->ionsfortheoreticalspectra.size(); i++) { + cPeaksList* thpeaks = theoreticalspectrum->getTheoreticalPeaks(); + string description; + size_t pos; + for (int i = 0; i < thpeaks->size(); i++) { - skipiontype = false; - if ((visibleionseries.compare("") != 0) && (parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name.compare(visibleionseries) != 0)) { - skipiontype = true; - } + if ((*thpeaks)[i].matched > 0) { - for (int j = -1; j < (int)parameters->neutrallossesfortheoreticalspectra.size(); j++) { + description = (*thpeaks)[i].description; + description = description.substr(0, description.find(':')); - skipneutralloss = false; - if (visibleneutralloss.compare("all") != 0) { - if ((j == -1) && (visibleneutralloss.compare("none") != 0)) { - skipneutralloss = true; + if (description.find('[') == string::npos) { + if (parameters->precursorcharge > 0) { + pos = description.find("+ "); + if (pos != string::npos) { + description = description.substr(pos + 2); + } + else { + continue; + } } - if ((j >= 0) && (parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[j]].summary.compare(visibleneutralloss) != 0)) { - skipneutralloss = true; + else { + pos = description.find("- "); + if (pos != string::npos) { + description = description.substr(pos + 2); + } + else { + continue; + } } - } - if (!skipiontype && !skipneutralloss) { + if (visibleionseries.empty() || (!visibleionseries.empty() && (parameters->iondefinitions[(*thpeaks)[i].iontype].name.compare(visibleionseries) == 0))) { - if (((parameters->peptidetype == linear) && (parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].nterminal)) - || ((parameters->peptidetype == linearpolyketide) && ((parameters->ionsfortheoreticalspectra[i] == l1h_ion) || (parameters->ionsfortheoreticalspectra[i] == l2h_ion) || (parameters->ionsfortheoreticalspectra[i] == l1oh_ion) || (parameters->ionsfortheoreticalspectra[i] == l2oh_ion)))) { - for (int k = 0; k < len; k++) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[k] > 0) { - if (parameters->peptidetype == linearpolyketide) { - name = parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name.substr(0, 2) + to_string(k + 1) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name.substr(2); - } - else { - name = parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name[0] + to_string(k + 1) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name.substr(1); - } - if (j >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[j]].summary; + if ((visibleneutralloss.compare("all") == 0) + || ((visibleneutralloss.compare("none") == 0) && (description.find(" -") == string::npos)) + || ((visibleneutralloss.compare("all") != 0) && (visibleneutralloss.compare("none") != 0) && (description.substr(description.find(" -") + 2).compare(visibleneutralloss) == 0))) { + + if (((parameters->peptidetype == linear) && (parameters->iondefinitions[(*thpeaks)[i].iontype].nterminal)) + || ((parameters->peptidetype == linearpolyketide) && (((*thpeaks)[i].iontype == l1h_ion) || ((*thpeaks)[i].iontype == l2h_ion) || ((*thpeaks)[i].iontype == l1oh_ion) || ((*thpeaks)[i].iontype == l2oh_ion)))) { + + if ((*thpeaks)[i].seriesid >= 0) { + insertLabel(labels, leftmargin + horizontalstep / 4 + horizontalstep / 8 + horizontalstep * (*thpeaks)[i].seriesid + horizontalstep / 2, topmargin - 35, description, false); } - insertLabel(labels, leftmargin + horizontalstep / 4 + horizontalstep / 8 + horizontalstep * k + horizontalstep / 2, topmargin - 35, name, false); + } - } - } - if (((parameters->peptidetype == linear) && (parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].cterminal)) || - ((parameters->peptidetype == linearpolyketide) && ((parameters->ionsfortheoreticalspectra[i] == r1h_ion) || (parameters->ionsfortheoreticalspectra[i] == r2h_ion) || (parameters->ionsfortheoreticalspectra[i] == r1oh_ion) || (parameters->ionsfortheoreticalspectra[i] == r2oh_ion)))) { - for (int k = len - 1; k >= 0; k--) { - if (theoreticalspectrum->getVisualCoverage()[coverageindex].series[len - k - 1] > 0) { - if (parameters->peptidetype == linearpolyketide) { - name = parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name.substr(0, 2) + to_string(len - k) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name.substr(2); - } - else { - name = parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name[0] + to_string(len - k) + parameters->iondefinitions[parameters->ionsfortheoreticalspectra[i]].name.substr(1); - } - if (j >= 0) { - name += "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[j]].summary; + if (((parameters->peptidetype == linear) && (parameters->iondefinitions[(*thpeaks)[i].iontype].cterminal)) || + ((parameters->peptidetype == linearpolyketide) && (((*thpeaks)[i].iontype == r1h_ion) || ((*thpeaks)[i].iontype == r2h_ion) || ((*thpeaks)[i].iontype == r1oh_ion) || ((*thpeaks)[i].iontype == r2oh_ion)))) { + + if ((*thpeaks)[i].seriesid >= 0) { + insertLabel(labels, leftmargin + horizontalstep * (size - (*thpeaks)[i].seriesid - 1), topmargin + 35, description, false); } - insertLabel(labels, leftmargin + horizontalstep * (k + 1), topmargin + 35, name, false); + } + } + } } - coverageindex++; - } } - painter.setPen(QPen(Qt::red, 2, Qt::SolidLine)); - for (auto it = labels.begin(); it != labels.end(); ++it) { - painter.drawText(it->x, it->y, width(), 20, Qt::AlignLeft, it->label.c_str()); - } + drawLabels(painter, labels, width()); } diff --git a/CycloBranch/gui/cLinearWidget.h b/CycloBranch/gui/cLinearWidget.h index 0d87b9f..51f00d5 100644 --- a/CycloBranch/gui/cLinearWidget.h +++ b/CycloBranch/gui/cLinearWidget.h @@ -34,9 +34,9 @@ struct cIonLabel { /** - \brief Label of a ion. + \brief Set of labels to be merged. */ - string label; + set labelset; /** @@ -59,7 +59,7 @@ struct cIonLabel { void clear() { x = 0; y = 0; - label = ""; + labelset.clear(); alignright = false; } @@ -103,6 +103,15 @@ bool operator == (cIonLabel const& a, cIonLabel const& b); void insertLabel(unordered_set& labels, int x, int y, string& description, bool alignright); +/** + \brief Draw labels of fragment ions. + \param painter reference to a painter + \param labels unordered set of labels + \param width widget width +*/ +void drawLabels(QPainter& painter, unordered_set& labels, int width); + + /** \brief Visualization of a linear peptide. */ diff --git a/CycloBranch/gui/cMainThread.cpp b/CycloBranch/gui/cMainThread.cpp index f321350..93db270 100644 --- a/CycloBranch/gui/cMainThread.cpp +++ b/CycloBranch/gui/cMainThread.cpp @@ -87,6 +87,8 @@ void cMainThread::run() { isotopepatterncache.clear(); isotopepatterncache.unlock(); + int hrs, mins, secs; + QTime time; time.start(); @@ -94,14 +96,23 @@ void cMainThread::run() { *os << appname.toStdString() << " started at " << time.currentTime().toString().toStdString() << "." << endl << endl; + if (parameters.mode == denovoengine) { + if (parameters.peptidetype == other) { + *os << "Error: The peptide type 'other' cannot be used in this mode." << endl; + emitEndSignals(); + return; + } + } + parameters.setOutputStream(*os); if (parameters.checkAndPrepare(terminatecomputation) == -1) { emitEndSignals(); return; } + *os << parameters.printToString(); - if (parameters.mode == singlecomparison) { + if ((parameters.mode == singlecomparison) && (parameters.peptidetype != other)) { if (!checkRegex(parameters.peptidetype, parameters.searchedsequence, errormessage)) { *os << "Error: " << errormessage << endl; emitEndSignals(); @@ -109,7 +120,7 @@ void cMainThread::run() { } } - if ((parameters.mode == denovoengine) || (parameters.mode == singlecomparison) || (parameters.mode == databasesearch)) { + if ((parameters.mode == denovoengine) || ((parameters.mode == singlecomparison) && (parameters.peptidetype != other)) || ((parameters.mode == databasesearch) && (parameters.peptidetype != other))) { if (!parameters.bricksdatabase.replaceAcronymsByIDs(parameters.searchedsequence, errormessage)) { *os << "Error: " << errormessage << endl; emitEndSignals(); @@ -136,13 +147,13 @@ void cMainThread::run() { return; } - int startscanno = ((parameters.mode == dereplication) || (parameters.mode == singlecomparison)) ? 0 : parameters.scannumber - 1; - int endscanno = ((parameters.mode == dereplication) || (parameters.mode == singlecomparison)) ? parameters.peaklistseries.size() : parameters.scannumber; + int startscanno = ((parameters.mode == dereplication) || (parameters.mode == compoundsearch) || (parameters.mode == singlecomparison)) ? 0 : parameters.scannumber - 1; + int endscanno = ((parameters.mode == dereplication) || (parameters.mode == compoundsearch) || (parameters.mode == singlecomparison)) ? parameters.peaklistseries.size() : parameters.scannumber; for (int i = startscanno; i < endscanno; i++) { parameters.peaklistseries[i].sortbyMass(); if (parameters.peaklistseries[i].normalizeIntenzity() == -1) { - if ((parameters.mode == dereplication) || (parameters.mode == singlecomparison)) { + if ((parameters.mode == dereplication) || (parameters.mode == compoundsearch) || (parameters.mode == singlecomparison)) { *os << "Warning: the spectrum no. " << i + 1 << " is empty or the format of peaklist is incorrect." << endl; } else { @@ -159,6 +170,12 @@ void cMainThread::run() { parameters.peaklistseries[i].cropMaximumMZRatio(charge(uncharge(parameters.precursormass, parameters.precursorcharge), (parameters.precursorcharge > 0)?1:-1), parameters.precursormasserrortolerance); } + if ((parameters.mode == dereplication) || (parameters.mode == compoundsearch)) { + if (parameters.maximummz > 0) { + parameters.peaklistseries[i].cropMaximumMZRatio(parameters.maximummz, parameters.fragmentmasserrortolerance); + } + } + parameters.peaklistseries[i].cropAbsoluteIntenzity(parameters.minimumabsoluteintensitythreshold); parameters.peaklistseries[i].cropRelativeIntenzity(parameters.minimumrelativeintensitythreshold); @@ -173,6 +190,32 @@ void cMainThread::run() { } } + if (parameters.prepareLossesAndCompounds(terminatecomputation) == -1) { + emitEndSignals(); + return; + } + + if (parameters.mode == compoundsearch) { + int compoundslimit = 5000000; + if (parameters.generateisotopepattern) { + compoundslimit = 1000000; + } + if (parameters.sequencedatabase.size() > compoundslimit) { + parameters.sequencedatabase.clear(); + *os << "Error: The number of generated compounds exceeded the limit " + to_string(compoundslimit) + ". Please, adjust the settings to limit the number of compounds." << endl; + + secs = time.elapsed() / 1000; + mins = (secs / 60) % 60; + hrs = (secs / 3600); + secs = secs % 60; + + *os << "Execution time: " << to_string(hrs) << " hrs, " << to_string(mins) << " min, " << to_string(secs) << " sec." << endl << endl; + + emitEndSignals(); + return; + } + } + if ((parameters.mode == denovoengine) || (parameters.mode == singlecomparison) || (parameters.mode == databasesearch)) { int startmodifid, endmodifid, middlemodifid; @@ -197,14 +240,28 @@ void cMainThread::run() { cCandidate c; vector netmp; - parseBranch(parameters.peptidetype, parameters.searchedsequence, v, branchstart, branchend); - // startmodifid, endmodifid and middlemodifid were filled up by checkModifications - c.setCandidate(v, netmp, fragmentIonTypeEnd, startmodifid, endmodifid, middlemodifid, branchstart, branchend); - cSummaryFormula formula = c.calculateSummaryFormula(parameters, parameters.peptidetype, parameters.precursormass); + cSummaryFormula formula; + string formstr; + if (parameters.peptidetype == other) { + v.push_back(to_string(1)); + c.setCandidate(v, netmp, fragmentIonTypeEnd, 0, 0, 0, -1, -1); + + formula.setFormula(parameters.searchedsequenceformula); + formstr = parameters.precursoradduct.empty() ? "" : "H-1"; + formula.addFormula(formstr); + formstr = parameters.precursoradduct; + formula.addFormula(formstr); + } + else { + parseBranch(parameters.peptidetype, parameters.searchedsequence, v, branchstart, branchend); + // startmodifid, endmodifid and middlemodifid were filled up by checkModifications + c.setCandidate(v, netmp, fragmentIonTypeEnd, startmodifid, endmodifid, middlemodifid, branchstart, branchend); + formula = c.calculateSummaryFormulaFromBricks(parameters, parameters.peptidetype, parameters.precursormass); + } + c.setSummaryFormula(formula); - candidates.getSet().insert(c); - + graphreaderisworking = false; } } @@ -310,68 +367,80 @@ void cMainThread::run() { errormessage = ""; // check peptide type - if (!calculatesummaries && (parameters.peptidetype != parameters.sequencedatabase[i].getPeptideType())) { - continue; + if (!calculatesummaries) { + if (parameters.peptidetype != other) { + if (parameters.peptidetype != parameters.sequencedatabase[i].getPeptideType()) { + continue; + } + } } - // check format of sequence - if (!calculatesummaries && !checkRegex(parameters.sequencedatabase[i].getPeptideType(), parameters.sequencedatabase[i].getSequence(), errormessage)) { - *os << "Ignored sequence: " << errormessage << endl; - continue; - } + if (parameters.peptidetype != other) { - // replace acronyms of bricks by ids - composition = parameters.sequencedatabase[i].getSequence(); - if (!parameters.bricksdatabase.replaceAcronymsByIDs(composition, errormessage)) { - *os << "Ignored sequence: " << errormessage << endl; - continue; - } + // check format of sequence + if (!calculatesummaries && !checkRegex(parameters.sequencedatabase[i].getPeptideType(), parameters.sequencedatabase[i].getSequence(), errormessage)) { + *os << "Ignored sequence: " << errormessage << endl; + continue; + } - // check whether modification are defined - if (!parameters.checkModifications(parameters.sequencedatabase[i], startmodifid, endmodifid, middlemodifid, errormessage)) { - *os << "Ignored sequence: " << errormessage << endl; - continue; - } + // replace acronyms of bricks by ids + composition = parameters.sequencedatabase[i].getSequence(); + if (!parameters.bricksdatabase.replaceAcronymsByIDs(composition, errormessage)) { + *os << "Ignored sequence: " << errormessage << endl; + continue; + } - // parse branch of a branched or a branch-cyclic peptide - parseBranch(parameters.sequencedatabase[i].getPeptideType(), composition, v, branchstart, branchend); + // check whether modification are defined + if (!parameters.checkModifications(parameters.sequencedatabase[i], startmodifid, endmodifid, middlemodifid, errormessage)) { + *os << "Ignored sequence: " << errormessage << endl; + continue; + } - // set candidate - c.setCandidate(v, netmp, fragmentIonTypeEnd, startmodifid, endmodifid, middlemodifid, branchstart, branchend); + // parse branch of a branched or a branch-cyclic peptide + parseBranch(parameters.sequencedatabase[i].getPeptideType(), composition, v, branchstart, branchend); - if (!calculatesummaries && ((parameters.sequencedatabase[i].getPeptideType() == linearpolyketide) || (parameters.sequencedatabase[i].getPeptideType() == cyclicpolyketide))) { + // set candidate + c.setCandidate(v, netmp, fragmentIonTypeEnd, startmodifid, endmodifid, middlemodifid, branchstart, branchend); - if (!c.checkKetideSequence(parameters.bricksdatabase, parameters.sequencedatabase[i].getPeptideType(), parameters.regularblocksorder)) { - if (parameters.sequencedatabase[i].getPeptideType() == linearpolyketide) { - *os << "Ignored sequence: " << parameters.sequencedatabase[i].getName() << " " << parameters.sequencedatabase[i].getSequence() << "; the order of building blocks is not correct." << endl; - } - else { - *os << "Ignored sequence: " << parameters.sequencedatabase[i].getName() << " " << parameters.sequencedatabase[i].getSequence() << "; the number or order of building blocks is not correct." << endl; + if (!calculatesummaries && ((parameters.sequencedatabase[i].getPeptideType() == linearpolyketide) || (parameters.sequencedatabase[i].getPeptideType() == cyclicpolyketide))) { + + if (!c.checkKetideSequence(parameters.bricksdatabase, parameters.sequencedatabase[i].getPeptideType(), parameters.regularblocksorder)) { + if (parameters.sequencedatabase[i].getPeptideType() == linearpolyketide) { + *os << "Ignored sequence: " << parameters.sequencedatabase[i].getName() << " " << parameters.sequencedatabase[i].getSequence() << "; the order of building blocks is not correct." << endl; + } + else { + *os << "Ignored sequence: " << parameters.sequencedatabase[i].getName() << " " << parameters.sequencedatabase[i].getSequence() << "; the number or order of building blocks is not correct." << endl; + } + continue; } - continue; - } - eResidueLossType leftresiduelosstype = c.getLeftResidueType(parameters.bricksdatabase); - eResidueLossType rightresiduelosstype = c.getRightResidueType(parameters.bricksdatabase); + eResidueLossType leftresiduelosstype = c.getLeftResidueType(parameters.bricksdatabase); + eResidueLossType rightresiduelosstype = c.getRightResidueType(parameters.bricksdatabase); - if (parameters.peptidetype == linearpolyketide) { - if (((leftresiduelosstype == h2_loss) && (c.getStartModifID() > 0) && parameters.searchedmodifications[c.getStartModifID()].cterminal) - || ((rightresiduelosstype == h2_loss) && (c.getEndModifID() > 0) && parameters.searchedmodifications[c.getEndModifID()].cterminal)) { - *os << "Ignored sequence: " << parameters.sequencedatabase[i].getName() << " " << parameters.sequencedatabase[i].getSequence() << "; the C-terminal modification is attached to the N-terminus." << endl; - continue; + if (parameters.peptidetype == linearpolyketide) { + if (((leftresiduelosstype == h2_loss) && (c.getStartModifID() > 0) && parameters.searchedmodifications[c.getStartModifID()].cterminal) + || ((rightresiduelosstype == h2_loss) && (c.getEndModifID() > 0) && parameters.searchedmodifications[c.getEndModifID()].cterminal)) { + *os << "Ignored sequence: " << parameters.sequencedatabase[i].getName() << " " << parameters.sequencedatabase[i].getSequence() << "; the C-terminal modification is attached to the N-terminus." << endl; + continue; + } } - } - else { - if (((leftresiduelosstype == h2_loss) && (c.getStartModifID() > 0) && parameters.searchedmodifications[c.getStartModifID()].cterminal) - || ((leftresiduelosstype == h2o_loss) && (c.getStartModifID() > 0) && parameters.searchedmodifications[c.getStartModifID()].nterminal) - || ((rightresiduelosstype == h2_loss) && (c.getEndModifID() > 0) && parameters.searchedmodifications[c.getEndModifID()].cterminal) - || ((rightresiduelosstype == h2o_loss) && (c.getEndModifID() > 0) && parameters.searchedmodifications[c.getEndModifID()].nterminal)) { - *os << "Ignored sequence: " << parameters.sequencedatabase[i].getName() << " " << parameters.sequencedatabase[i].getSequence() << "; the N-terminal modification is attached to the C-terminus or vice versa." << endl; - continue; + else { + if (((leftresiduelosstype == h2_loss) && (c.getStartModifID() > 0) && parameters.searchedmodifications[c.getStartModifID()].cterminal) + || ((leftresiduelosstype == h2o_loss) && (c.getStartModifID() > 0) && parameters.searchedmodifications[c.getStartModifID()].nterminal) + || ((rightresiduelosstype == h2_loss) && (c.getEndModifID() > 0) && parameters.searchedmodifications[c.getEndModifID()].cterminal) + || ((rightresiduelosstype == h2o_loss) && (c.getEndModifID() > 0) && parameters.searchedmodifications[c.getEndModifID()].nterminal)) { + *os << "Ignored sequence: " << parameters.sequencedatabase[i].getName() << " " << parameters.sequencedatabase[i].getSequence() << "; the N-terminal modification is attached to the C-terminus or vice versa." << endl; + continue; + } } + } } + else { + v.push_back(to_string(i + 1)); + c.setCandidate(v, netmp, fragmentIonTypeEnd, 0, 0, 0, -1, -1); + } // check the precursor mass error formula.setFormula(parameters.sequencedatabase[i].getSummaryFormula()); @@ -393,8 +462,8 @@ void cMainThread::run() { c.setSummaryFormula(formula); candidates.getSet().insert(c); - if (calculatesummaries) { - *os << i + 1 << " " << c.calculateSummaryFormula(parameters, parameters.sequencedatabase[i].getPeptideType()).getSummary() << endl; + if (calculatesummaries && (parameters.peptidetype != other)) { + *os << i + 1 << " " << c.calculateSummaryFormulaFromBricks(parameters, parameters.sequencedatabase[i].getPeptideType()).getSummary() << endl; } } @@ -412,7 +481,7 @@ void cMainThread::run() { // database search - MS mode - if (parameters.mode == dereplication) { + if ((parameters.mode == dereplication) || (parameters.mode == compoundsearch)) { *os << "Generating theoretical peaks... "; theoreticalspectrumlist->initialize(*os, parameters, &graph); @@ -421,10 +490,15 @@ void cMainThread::run() { ts.setParameters(¶meters); if (parameters.generateisotopepattern) { - ts.generateFineMSSpectrum(); + ts.generateFineMSSpectrum(terminatecomputation); } else { - ts.generateMSSpectrum(true); + ts.generateMSSpectrum(terminatecomputation, true); + } + + if (terminatecomputation) { + emitEndSignals(); + return; } unordered_map tempmap; @@ -442,7 +516,6 @@ void cMainThread::run() { *os << "ok" << endl; *os << "Comparing theoretical peaks with the experimental peaklist(s)... " << endl; *os << "Number of experimental peaklists: " << parameters.peaklistseries.size() << endl; - *os << "Processing the peaklist no. : " << endl; vector unmatchedpeaks; unmatchedpeaks.resize(parameters.peaklistseries.size()); @@ -456,6 +529,41 @@ void cMainThread::run() { parameters.peaklistseries[i].sortbyMass(); } + vector< vector > hintsindex; + hintsindex.resize(ts.getNumberOfPeaks()); + + bool lcms = (parameters.peaklistseries.size() > 1) && !((parameters.peaklistfileformat == mis) || (parameters.peaklistfileformat == imzML)); + + if (lcms || (parameters.peaklistfileformat == mis) || (parameters.peaklistfileformat == imzML)) { + *os << "Analyzing spectra : " << endl; + + for (int i = 0; i < parameters.peaklistseries.size(); i++) { + if ((i + 1) % 100 == 0) { + *os << i + 1 << " "; + } + if ((i + 1) % 2500 == 0) { + *os << endl; + } + + if (terminatecomputation) { + emitEndSignals(); + return; + } + + cTheoreticalSpectrum tstmp; + tstmp.setParameters(¶meters); + tstmp.getHintsIndex(i, ts, unmatchedpeaks[i], hintsindex); + + for (auto& it : hintsindex) { + sort(it.begin(), it.end()); + } + } + + *os << " ok" << endl; + } + + *os << "Processing the peaklist no. : " << endl; + for (int i = 0; i < parameters.peaklistseries.size(); i++) { if ((i + 1) % 100 == 0) { *os << i + 1 << " "; @@ -471,7 +579,7 @@ void cMainThread::run() { cTheoreticalSpectrum tstmp; tstmp.setParameters(¶meters); - tstmp.compareMSSpectrum(i, ts, unmatchedpeaks[i]); + tstmp.compareMSSpectrum(i, ts, unmatchedpeaks[i], hintsindex); if ((parameters.peaklistfileformat == mis) || (parameters.peaklistfileformat == imzML)) { parameters.peaklistseries[i].clear(); } @@ -584,7 +692,7 @@ void cMainThread::run() { } - if ((parameters.mode == denovoengine) || (parameters.mode == singlecomparison) || (parameters.mode == databasesearch)) { + if ((parameters.mode == denovoengine) || (parameters.mode == singlecomparison) || (parameters.mode == databasesearch)) { *os << "Comparing theoretical spectra of candidates with the peak list... " << endl; theoreticalspectrumlist->initialize(*os, parameters, &graph); if (theoreticalspectrumlist->parallelCompareAndStore(candidates, terminatecomputation) == -1) { @@ -594,9 +702,9 @@ void cMainThread::run() { *os << " ok" << endl; } - int secs = time.elapsed() / 1000; - int mins = (secs / 60) % 60; - int hrs = (secs / 3600); + secs = time.elapsed() / 1000; + mins = (secs / 60) % 60; + hrs = (secs / 3600); secs = secs % 60; *os << endl << appname.toStdString() << " successfully finished at " << time.currentTime().toString().toStdString(); @@ -612,7 +720,7 @@ void cMainThread::run() { void cMainThread::emitEndSignals() { emit setGraph(graph.printGraph()); - if ((parameters.mode == dereplication) || (parameters.neutrallossesfortheoreticalspectra.size() > 10000)) { + if ((parameters.mode == dereplication) || (parameters.mode == compoundsearch) || (parameters.neutrallossesfortheoreticalspectra.size() > 10000)) { parameters.neutrallossesdefinitions.clear(); parameters.neutrallossesfortheoreticalspectra.clear(); } diff --git a/CycloBranch/gui/cMainWindow.cpp b/CycloBranch/gui/cMainWindow.cpp index 0449c7d..715ca61 100644 --- a/CycloBranch/gui/cMainWindow.cpp +++ b/CycloBranch/gui/cMainWindow.cpp @@ -83,8 +83,8 @@ cMainWindow::cMainWindow() { actionNorine = new QAction(QIcon(":/images/icons/25.png"), tr("&Norine"), this); actionNorine->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_1)); - actionSmilesToMonomers = new QAction(QIcon(":/images/icons/5.png"), tr("Smiles2Monome&rs"), this); - actionSmilesToMonomers->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_2)); + actionBBDGNC = new QAction(QIcon(":/images/icons/5.png"), tr("Gene&rate Blocks and Sequences using BBDGNC"), this); + actionBBDGNC->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_2)); actionShowIsomers = new QAction(QIcon(":/images/icons/95.png"), tr("Show &Isomers"), this); actionShowIsomers->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_I)); @@ -129,7 +129,7 @@ cMainWindow::cMainWindow() { toolbarTools->addAction(actionImageWindow); toolbarTools->addSeparator(); toolbarTools->addAction(actionNorine); - toolbarTools->addAction(actionSmilesToMonomers); + toolbarTools->addAction(actionBBDGNC); toolbarView = addToolBar(tr("View")); toolbarView->addAction(actionShowIsomers); @@ -141,22 +141,45 @@ cMainWindow::cMainWindow() { toolbarHelp->addAction(actionPDFManual); toolbarHelp->addAction(actionAbout); - rowsfiltercombobox = new QComboBox(); - rowsfiltercombobox->setToolTip("Column to be Searched"); - rowsfiltercombobox->setSizeAdjustPolicy(QComboBox::AdjustToContents); - - rowsfiltercomparatorcombobox = new QComboBox(); - rowsfiltercomparatorcombobox->setToolTip("Type of Comparison"); - rowsfiltercomparatorcombobox->addItem("="); - rowsfiltercomparatorcombobox->addItem("<"); - rowsfiltercomparatorcombobox->addItem("<="); - rowsfiltercomparatorcombobox->addItem(">"); - rowsfiltercomparatorcombobox->addItem(">="); - rowsfiltercomparatorcombobox->setSizeAdjustPolicy(QComboBox::AdjustToContents); - - rowsfilterline = new QLineEdit(); - rowsfilterline->setMinimumWidth(300); - rowsfilterline->setToolTip("Text to Find"); + rowsfilteroperator = new QComboBox(); + rowsfilteroperator->setToolTip("OR = any condition must be met; AND = all conditions must be met."); + rowsfilteroperator->addItem("OR"); + rowsfilteroperator->addItem("AND"); + rowsfilteroperator->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfiltercombobox1 = new QComboBox(); + rowsfiltercombobox1->setToolTip("Column to be Searched"); + rowsfiltercombobox1->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfiltercomparatorcombobox1 = new QComboBox(); + rowsfiltercomparatorcombobox1->setToolTip("Type of Comparison"); + rowsfiltercomparatorcombobox1->addItem("="); + rowsfiltercomparatorcombobox1->addItem("<"); + rowsfiltercomparatorcombobox1->addItem("<="); + rowsfiltercomparatorcombobox1->addItem(">"); + rowsfiltercomparatorcombobox1->addItem(">="); + rowsfiltercomparatorcombobox1->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfilterline1 = new QLineEdit(); + rowsfilterline1->setMinimumWidth(150); + rowsfilterline1->setToolTip("Text to Find"); + + rowsfiltercombobox2 = new QComboBox(); + rowsfiltercombobox2->setToolTip("Column to be Searched"); + rowsfiltercombobox2->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfiltercomparatorcombobox2 = new QComboBox(); + rowsfiltercomparatorcombobox2->setToolTip("Type of Comparison"); + rowsfiltercomparatorcombobox2->addItem("="); + rowsfiltercomparatorcombobox2->addItem("<"); + rowsfiltercomparatorcombobox2->addItem("<="); + rowsfiltercomparatorcombobox2->addItem(">"); + rowsfiltercomparatorcombobox2->addItem(">="); + rowsfiltercomparatorcombobox2->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfilterline2 = new QLineEdit(); + rowsfilterline2->setMinimumWidth(150); + rowsfilterline2->setToolTip("Text to Find"); rowsfiltercasesensitive = new QCheckBox(); rowsfiltercasesensitive->setToolTip("Case Sensitive"); @@ -174,11 +197,19 @@ cMainWindow::cMainWindow() { rowsfilterclearbutton->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_R)); rowsfilterhbox = new QHBoxLayout(); - rowsfilterhbox->addWidget(rowsfiltercombobox); + rowsfilterhbox->addWidget(rowsfiltercombobox1); + rowsfilterhbox->addSpacing(10); + rowsfilterhbox->addWidget(rowsfiltercomparatorcombobox1); + rowsfilterhbox->addSpacing(10); + rowsfilterhbox->addWidget(rowsfilterline1); rowsfilterhbox->addSpacing(10); - rowsfilterhbox->addWidget(rowsfiltercomparatorcombobox); + rowsfilterhbox->addWidget(rowsfilteroperator); rowsfilterhbox->addSpacing(10); - rowsfilterhbox->addWidget(rowsfilterline); + rowsfilterhbox->addWidget(rowsfiltercombobox2); + rowsfilterhbox->addSpacing(10); + rowsfilterhbox->addWidget(rowsfiltercomparatorcombobox2); + rowsfilterhbox->addSpacing(10); + rowsfilterhbox->addWidget(rowsfilterline2); rowsfilterhbox->addSpacing(10); rowsfilterhbox->addWidget(rowsfiltercasesensitive); rowsfilterhbox->addSpacing(10); @@ -198,7 +229,7 @@ cMainWindow::cMainWindow() { results = new QTableView(this); resultsmodel = new QStandardItemModel(0, 0, this); resultsproxymodel = new cMainWindowProxyModel(this); - resultsproxymodel->initialize(rowsfiltercombobox, rowsfiltercomparatorcombobox); + resultsproxymodel->initialize(rowsfilteroperator, rowsfiltercombobox1, rowsfiltercomparatorcombobox1, rowsfilterline1, rowsfiltercombobox2, rowsfiltercomparatorcombobox2, rowsfilterline2); logWindow = new QTextEdit(this); logWindow->setPlainText("To start the program: click \"Search -> Settings\", configure the tool and then click \"Search -> Run\"."); @@ -230,7 +261,7 @@ cMainWindow::cMainWindow() { connect(actionModifications, SIGNAL(triggered()), this, SLOT(showModifications())); connect(actionDrawPeptide, SIGNAL(triggered()), this, SLOT(showDrawPeptideWidget())); connect(actionNorine, SIGNAL(triggered()), this, SLOT(gotoNorine())); - connect(actionSmilesToMonomers, SIGNAL(triggered()), this, SLOT(gotoSmiles2Monomers())); + connect(actionBBDGNC, SIGNAL(triggered()), this, SLOT(gotoBBDGNC())); connect(actionShowIsomers, SIGNAL(triggered()), this, SLOT(showIsomersStateChanged())); connect(actionGraph, SIGNAL(triggered()), this, SLOT(showGraph())); connect(actionSummaryTableOfMatchedPeaks, SIGNAL(triggered()), this, SLOT(showSummaryTableOfMatchedPeaks())); @@ -246,10 +277,13 @@ cMainWindow::cMainWindow() { connect(summarytableofmatchedpeaks, SIGNAL(tableCancelled()), this, SLOT(summaryPeaksTableCancelled())); connect(summarytableofmatchedpeaks, SIGNAL(summaryPeaksTableRowDoubleClicked(int, double)), this, SLOT(summaryPeaksTableRowDoubleClicked(int, double))); - connect(summarytableofmatchedpeaks, SIGNAL(sendFilterOptionsToImageWindow(vector, string, string, string, bool, bool)), imagewindow, SLOT(setFilterOptionsSlot(vector, string, string, string, bool, bool))); + connect(summarytableofmatchedpeaks, SIGNAL(sendFilterOptionsToImageWindow(vector, bool, string, string, string, string, string, string, bool, bool)), imagewindow, SLOT(setFilterOptionsSlot(vector, bool, string, string, string, string, string, string, bool, bool))); connect(summarytableofmatchedpeaks, SIGNAL(sendFilterOptionsToChromatogram(cPeaksList)), chromatogramwindow, SLOT(setFilterOptionsSlot(cPeaksList))); connect(summarytableofmatchedpeaks, SIGNAL(resetRegion()), imagewindow, SLOT(clearSelection())); + connect(chromatogramwindow, SIGNAL(doubleClickedScanIDSignal(int)), this, SLOT(chromatogramDoubleClicked(int))); + connect(imagewindow, SIGNAL(doubleClickedSpectrumIDSignal(int)), this, SLOT(imageWindowDoubleClicked(int))); + menuFile->addAction(actionOpenResults); menuFile->addAction(actionSaveResults); menuFile->addSeparator(); @@ -274,7 +308,7 @@ cMainWindow::cMainWindow() { menuTools->addAction(actionImageWindow); menuTools->addSeparator(); menuTools->addAction(actionNorine); - menuTools->addAction(actionSmilesToMonomers); + menuTools->addAction(actionBBDGNC); menuView->addAction(actionShowIsomers); menuView->addSeparator(); @@ -325,7 +359,7 @@ cMainWindow::cMainWindow() { setCentralWidget(splitter); - resize(1280, 780); + resize(defaultwinsizex, defaultwinsizey); theoreticalspectrumlist.clear(); spectradetails.clear(); @@ -355,9 +389,13 @@ cMainWindow::cMainWindow() { cMainWindow::~cMainWindow() { deleteResults(); - delete rowsfiltercombobox; - delete rowsfiltercomparatorcombobox; - delete rowsfilterline; + delete rowsfilteroperator; + delete rowsfiltercombobox1; + delete rowsfiltercomparatorcombobox1; + delete rowsfilterline1; + delete rowsfiltercombobox2; + delete rowsfiltercomparatorcombobox2; + delete rowsfilterline2; delete rowsfiltercasesensitive; delete rowsfilterwholeword; delete rowsfilterbutton; @@ -396,7 +434,7 @@ cMainWindow::~cMainWindow() { delete actionModifications; delete actionDrawPeptide; delete actionNorine; - delete actionSmilesToMonomers; + delete actionBBDGNC; delete actionShowIsomers; delete actionGraph; delete actionSummaryTableOfMatchedPeaks; @@ -419,7 +457,7 @@ cMainWindow::~cMainWindow() { void cMainWindow::keyPressEvent(QKeyEvent *event) { if ((event->key() == Qt::Key_Enter) || (event->key() == Qt::Key_Return)) { - if (rowsfilterline->hasFocus()) { + if (rowsfilterline1->hasFocus() || rowsfilterline2->hasFocus()) { filterResults(); } else { @@ -430,7 +468,7 @@ void cMainWindow::keyPressEvent(QKeyEvent *event) { } if ((event->modifiers() == Qt::ControlModifier) && (event->key() == Qt::Key_F)) { - rowsfilterline->setFocus(); + rowsfilterline1->setFocus(); } if ((event->modifiers() == Qt::ControlModifier) && (event->key() == Qt::Key_T)) { @@ -532,33 +570,33 @@ void cMainWindow::reportSpectrum(int row, cTheoreticalSpectrum& theoreticalspect resultsmodel->setItem(row, 5 + searchspecificcolumncount, new QStandardItem()); resultsmodel->item(row, 5 + searchspecificcolumncount)->setData(QVariant::fromValue(getNumberOfBricks(theoreticalspectrum.getCandidate().getComposition())), Qt::DisplayRole); - switch (parameters.peptidetype) - { - case linear: - case linearpolyketide: - resultsmodel->setItem(row, 6 + searchspecificcolumncount, new QStandardItem()); - resultsmodel->item(row, 6 + searchspecificcolumncount)->setText(parameters.searchedmodifications[theoreticalspectrum.getCandidate().getStartModifID()].name.c_str()); - resultsmodel->setItem(row, 7 + searchspecificcolumncount, new QStandardItem()); - resultsmodel->item(row, 7 + searchspecificcolumncount)->setText(parameters.searchedmodifications[theoreticalspectrum.getCandidate().getEndModifID()].name.c_str()); - break; - case branched: - resultsmodel->setItem(row, 6 + searchspecificcolumncount, new QStandardItem()); - resultsmodel->item(row, 6 + searchspecificcolumncount)->setText(parameters.searchedmodifications[theoreticalspectrum.getCandidate().getStartModifID()].name.c_str()); - resultsmodel->setItem(row, 7 + searchspecificcolumncount, new QStandardItem()); - resultsmodel->item(row, 7 + searchspecificcolumncount)->setText(parameters.searchedmodifications[theoreticalspectrum.getCandidate().getMiddleModifID()].name.c_str()); - resultsmodel->setItem(row, 8 + searchspecificcolumncount, new QStandardItem()); - resultsmodel->item(row, 8 + searchspecificcolumncount)->setText(parameters.searchedmodifications[theoreticalspectrum.getCandidate().getEndModifID()].name.c_str()); - break; - case cyclic: - case cyclicpolyketide: - break; - case branchcyclic: - resultsmodel->setItem(row, 6 + searchspecificcolumncount, new QStandardItem()); - resultsmodel->item(row, 6 + searchspecificcolumncount)->setText(parameters.searchedmodifications[theoreticalspectrum.getCandidate().getMiddleModifID()].name.c_str()); - break; - case other: - default: - break; + switch (parameters.peptidetype) { + case linear: + case linearpolyketide: + resultsmodel->setItem(row, 6 + searchspecificcolumncount, new QStandardItem()); + resultsmodel->item(row, 6 + searchspecificcolumncount)->setText(parameters.searchedmodifications[theoreticalspectrum.getCandidate().getStartModifID()].name.c_str()); + resultsmodel->setItem(row, 7 + searchspecificcolumncount, new QStandardItem()); + resultsmodel->item(row, 7 + searchspecificcolumncount)->setText(parameters.searchedmodifications[theoreticalspectrum.getCandidate().getEndModifID()].name.c_str()); + break; + case branched: + resultsmodel->setItem(row, 6 + searchspecificcolumncount, new QStandardItem()); + resultsmodel->item(row, 6 + searchspecificcolumncount)->setText(parameters.searchedmodifications[theoreticalspectrum.getCandidate().getStartModifID()].name.c_str()); + resultsmodel->setItem(row, 7 + searchspecificcolumncount, new QStandardItem()); + resultsmodel->item(row, 7 + searchspecificcolumncount)->setText(parameters.searchedmodifications[theoreticalspectrum.getCandidate().getMiddleModifID()].name.c_str()); + resultsmodel->setItem(row, 8 + searchspecificcolumncount, new QStandardItem()); + resultsmodel->item(row, 8 + searchspecificcolumncount)->setText(parameters.searchedmodifications[theoreticalspectrum.getCandidate().getEndModifID()].name.c_str()); + break; + case cyclic: + case cyclicpolyketide: + break; + case branchcyclic: + resultsmodel->setItem(row, 6 + searchspecificcolumncount, new QStandardItem()); + resultsmodel->item(row, 6 + searchspecificcolumncount)->setText(parameters.searchedmodifications[theoreticalspectrum.getCandidate().getMiddleModifID()].name.c_str()); + break; + case other: + break; + default: + break; } resultsmodel->setItem(row, 6 + searchspecificcolumncount + resultsspecificcolumncount, new QStandardItem()); @@ -595,25 +633,38 @@ void cMainWindow::reportSpectrum(int row, cTheoreticalSpectrum& theoreticalspect } - if (parameters.mode == dereplication) { - resultsmodel->setItem(row, 2, new QStandardItem()); - resultsmodel->item(row, 2)->setText(theoreticalspectrum.getExperimentalSpectrum().getTitle().c_str()); + if ((parameters.mode == dereplication) || (parameters.mode == compoundsearch)) { + int mscol = 2; + + if ((parameters.peaklistfileformat != mis) && (parameters.peaklistfileformat != imzML)) { + resultsmodel->setItem(row, mscol, new QStandardItem()); + resultsmodel->item(row, mscol)->setData(QVariant::fromValue(cropPrecisionToSixDecimalsByteArray(theoreticalspectrum.getExperimentalSpectrum().getRetentionTime())), Qt::DisplayRole); + mscol++; + } + + resultsmodel->setItem(row, mscol, new QStandardItem()); + resultsmodel->item(row, mscol)->setText(theoreticalspectrum.getExperimentalSpectrum().getTitle().c_str()); + mscol++; - resultsmodel->setItem(row, 3, new QStandardItem()); - resultsmodel->item(row, 3)->setData(QVariant::fromValue(theoreticalspectrum.getNumberOfMatchedPeaks()), Qt::DisplayRole); + resultsmodel->setItem(row, mscol, new QStandardItem()); + resultsmodel->item(row, mscol)->setData(QVariant::fromValue(theoreticalspectrum.getNumberOfMatchedPeaks()), Qt::DisplayRole); + mscol++; - resultsmodel->setItem(row, 4, new QStandardItem()); - resultsmodel->item(row, 4)->setData(QVariant::fromValue(cropPrecisionToSixDecimalsByteArray(theoreticalspectrum.getRatioOfMatchedPeaks()*100)), Qt::DisplayRole); + resultsmodel->setItem(row, mscol, new QStandardItem()); + resultsmodel->item(row, mscol)->setData(QVariant::fromValue(cropPrecisionToSixDecimalsByteArray(theoreticalspectrum.getRatioOfMatchedPeaks()*100)), Qt::DisplayRole); + mscol++; - resultsmodel->setItem(row, 5, new QStandardItem()); - resultsmodel->item(row, 5)->setData(QVariant::fromValue(cropPrecisionToSixDecimalsByteArray(theoreticalspectrum.getSumOfRelativeIntensities())), Qt::DisplayRole); + resultsmodel->setItem(row, mscol, new QStandardItem()); + resultsmodel->item(row, mscol)->setData(QVariant::fromValue(cropPrecisionToSixDecimalsByteArray(theoreticalspectrum.getSumOfRelativeIntensities())), Qt::DisplayRole); + mscol++; if ((parameters.peaklistfileformat == mis) || (parameters.peaklistfileformat == imzML)) { - resultsmodel->setItem(row, 6, new QStandardItem()); - resultsmodel->item(row, 6)->setData(QVariant::fromValue(theoreticalspectrum.getExperimentalSpectrum().getCoordinateX()), Qt::DisplayRole); + resultsmodel->setItem(row, mscol, new QStandardItem()); + resultsmodel->item(row, mscol)->setData(QVariant::fromValue(theoreticalspectrum.getExperimentalSpectrum().getCoordinateX()), Qt::DisplayRole); + mscol++; - resultsmodel->setItem(row, 7, new QStandardItem()); - resultsmodel->item(row, 7)->setData(QVariant::fromValue(theoreticalspectrum.getExperimentalSpectrum().getCoordinateY()), Qt::DisplayRole); + resultsmodel->setItem(row, mscol, new QStandardItem()); + resultsmodel->item(row, mscol)->setData(QVariant::fromValue(theoreticalspectrum.getExperimentalSpectrum().getCoordinateY()), Qt::DisplayRole); } } @@ -728,6 +779,7 @@ void cMainWindow::showImageWindow() { void cMainWindow::showChromatogramWindow() { if (prepareSummaryTableOfMatchedPeaks()) { + chromatogramwindow->recalculateTICChromatogram(); chromatogramwindow->show(); chromatogramwindow->activateWindow(); if (chromatogramwindow->isMinimized()) { @@ -807,6 +859,7 @@ void cMainWindow::run() { } } + /* rx = "\\.[mM][zZ][mM][lL]$"; if (regex_search(localparameters.peaklistfilename, rx)) { string convertedmzml = localparameters.peaklistfilename.substr(0, (int)localparameters.peaklistfilename.size() - 5); @@ -827,6 +880,7 @@ void cMainWindow::run() { } } } + */ #if OS_TYPE == WIN if (localparameters.useprofiledata) { @@ -926,7 +980,7 @@ void cMainWindow::enableButtonsHandlingResults(bool enable) { actionSummaryTableOfMatchedPeaks->setEnabled(enable); if (enable) { - if (parameters.mode == dereplication) { + if ((parameters.mode == dereplication) || (parameters.mode == compoundsearch)) { actionShowIsomers->setEnabled(false); if ((parameters.peaklistfileformat == mis) || (parameters.peaklistfileformat == imzML)) { actionImageWindow->setEnabled(true); @@ -962,25 +1016,26 @@ void cMainWindow::reportSpectra() { return; } - switch (parameters.peptidetype) - { - case linear: - case linearpolyketide: - resultsspecificcolumncount = 2; - break; - case branched: - resultsspecificcolumncount = 3; - break; - case cyclic: - case cyclicpolyketide: - resultsspecificcolumncount = 0; - break; - case branchcyclic: - resultsspecificcolumncount = 1; - break; - case other: - default: - break; + switch (parameters.peptidetype) { + case linear: + case linearpolyketide: + resultsspecificcolumncount = 2; + break; + case branched: + resultsspecificcolumncount = 3; + break; + case cyclic: + case cyclicpolyketide: + resultsspecificcolumncount = 0; + break; + case branchcyclic: + resultsspecificcolumncount = 1; + break; + case other: + resultsspecificcolumncount = 0; + break; + default: + break; } @@ -1047,51 +1102,51 @@ void cMainWindow::reportSpectra() { resultsmodel->horizontalHeaderItem(5 + searchspecificcolumncount)->setText("Number of Bricks"); results->setItemDelegateForColumn(5 + searchspecificcolumncount, new QItemDelegate()); - switch (parameters.peptidetype) - { - case linear: - resultsmodel->setHorizontalHeaderItem(6 + searchspecificcolumncount, new QStandardItem()); - resultsmodel->horizontalHeaderItem(6 + searchspecificcolumncount)->setText("N-terminal Modification"); - results->setItemDelegateForColumn(6 + searchspecificcolumncount, new QItemDelegate()); - - resultsmodel->setHorizontalHeaderItem(7 + searchspecificcolumncount, new QStandardItem()); - resultsmodel->horizontalHeaderItem(7 + searchspecificcolumncount)->setText("C-terminal Modification"); - results->setItemDelegateForColumn(7 + searchspecificcolumncount, new QItemDelegate()); - break; - case branched: - resultsmodel->setHorizontalHeaderItem(6 + searchspecificcolumncount, new QStandardItem()); - resultsmodel->horizontalHeaderItem(6 + searchspecificcolumncount)->setText("N-terminal Modification"); - results->setItemDelegateForColumn(6 + searchspecificcolumncount, new QItemDelegate()); - - resultsmodel->setHorizontalHeaderItem(7 + searchspecificcolumncount, new QStandardItem()); - resultsmodel->horizontalHeaderItem(7 + searchspecificcolumncount)->setText("Branch Modification"); - results->setItemDelegateForColumn(7 + searchspecificcolumncount, new QItemDelegate()); + switch (parameters.peptidetype) { + case linear: + resultsmodel->setHorizontalHeaderItem(6 + searchspecificcolumncount, new QStandardItem()); + resultsmodel->horizontalHeaderItem(6 + searchspecificcolumncount)->setText("N-terminal Modification"); + results->setItemDelegateForColumn(6 + searchspecificcolumncount, new QItemDelegate()); - resultsmodel->setHorizontalHeaderItem(8 + searchspecificcolumncount, new QStandardItem()); - resultsmodel->horizontalHeaderItem(8 + searchspecificcolumncount)->setText("C-terminal Modification"); - results->setItemDelegateForColumn(8 + searchspecificcolumncount, new QItemDelegate()); - break; - case cyclic: - case cyclicpolyketide: - break; - case branchcyclic: - resultsmodel->setHorizontalHeaderItem(6 + searchspecificcolumncount, new QStandardItem()); - resultsmodel->horizontalHeaderItem(6 + searchspecificcolumncount)->setText("Branch Modification"); - results->setItemDelegateForColumn(6 + searchspecificcolumncount, new QItemDelegate()); - break; - case linearpolyketide: - resultsmodel->setHorizontalHeaderItem(6 + searchspecificcolumncount, new QStandardItem()); - resultsmodel->horizontalHeaderItem(6 + searchspecificcolumncount)->setText("Left Terminal Modification"); - results->setItemDelegateForColumn(6 + searchspecificcolumncount, new QItemDelegate()); + resultsmodel->setHorizontalHeaderItem(7 + searchspecificcolumncount, new QStandardItem()); + resultsmodel->horizontalHeaderItem(7 + searchspecificcolumncount)->setText("C-terminal Modification"); + results->setItemDelegateForColumn(7 + searchspecificcolumncount, new QItemDelegate()); + break; + case branched: + resultsmodel->setHorizontalHeaderItem(6 + searchspecificcolumncount, new QStandardItem()); + resultsmodel->horizontalHeaderItem(6 + searchspecificcolumncount)->setText("N-terminal Modification"); + results->setItemDelegateForColumn(6 + searchspecificcolumncount, new QItemDelegate()); + + resultsmodel->setHorizontalHeaderItem(7 + searchspecificcolumncount, new QStandardItem()); + resultsmodel->horizontalHeaderItem(7 + searchspecificcolumncount)->setText("Branch Modification"); + results->setItemDelegateForColumn(7 + searchspecificcolumncount, new QItemDelegate()); + + resultsmodel->setHorizontalHeaderItem(8 + searchspecificcolumncount, new QStandardItem()); + resultsmodel->horizontalHeaderItem(8 + searchspecificcolumncount)->setText("C-terminal Modification"); + results->setItemDelegateForColumn(8 + searchspecificcolumncount, new QItemDelegate()); + break; + case cyclic: + case cyclicpolyketide: + break; + case branchcyclic: + resultsmodel->setHorizontalHeaderItem(6 + searchspecificcolumncount, new QStandardItem()); + resultsmodel->horizontalHeaderItem(6 + searchspecificcolumncount)->setText("Branch Modification"); + results->setItemDelegateForColumn(6 + searchspecificcolumncount, new QItemDelegate()); + break; + case linearpolyketide: + resultsmodel->setHorizontalHeaderItem(6 + searchspecificcolumncount, new QStandardItem()); + resultsmodel->horizontalHeaderItem(6 + searchspecificcolumncount)->setText("Left Terminal Modification"); + results->setItemDelegateForColumn(6 + searchspecificcolumncount, new QItemDelegate()); - resultsmodel->setHorizontalHeaderItem(7 + searchspecificcolumncount, new QStandardItem()); - resultsmodel->horizontalHeaderItem(7 + searchspecificcolumncount)->setText("Right Terminal Modification"); - results->setItemDelegateForColumn(7 + searchspecificcolumncount, new QItemDelegate()); + resultsmodel->setHorizontalHeaderItem(7 + searchspecificcolumncount, new QStandardItem()); + resultsmodel->horizontalHeaderItem(7 + searchspecificcolumncount)->setText("Right Terminal Modification"); + results->setItemDelegateForColumn(7 + searchspecificcolumncount, new QItemDelegate()); - break; - case other: - default: - break; + break; + case other: + break; + default: + break; } resultsmodel->setHorizontalHeaderItem(6 + searchspecificcolumncount + resultsspecificcolumncount, new QStandardItem()); @@ -1131,52 +1186,70 @@ void cMainWindow::reportSpectra() { } - if (parameters.mode == dereplication) { + if ((parameters.mode == dereplication) || (parameters.mode == compoundsearch)) { if ((parameters.peaklistfileformat == mis) || (parameters.peaklistfileformat == imzML)) { resultsmodel->setColumnCount(8); } else { - resultsmodel->setColumnCount(6); + resultsmodel->setColumnCount(7); } - resultsmodel->setHorizontalHeaderItem(0, new QStandardItem()); - resultsmodel->horizontalHeaderItem(0)->setText("*"); - results->setItemDelegateForColumn(0, new QItemDelegate()); + int mscol = 0; - resultsmodel->setHorizontalHeaderItem(1, new QStandardItem()); - resultsmodel->horizontalHeaderItem(1)->setText("Spectrum ID"); - results->setItemDelegateForColumn(1, new QItemDelegate()); + resultsmodel->setHorizontalHeaderItem(mscol, new QStandardItem()); + resultsmodel->horizontalHeaderItem(mscol)->setText("*"); + results->setItemDelegateForColumn(mscol, new QItemDelegate()); + mscol++; - resultsmodel->setHorizontalHeaderItem(2, new QStandardItem()); - resultsmodel->horizontalHeaderItem(2)->setText("Title"); - results->setItemDelegateForColumn(2, new QItemDelegate()); + resultsmodel->setHorizontalHeaderItem(mscol, new QStandardItem()); + resultsmodel->horizontalHeaderItem(mscol)->setText("Spectrum ID"); + results->setItemDelegateForColumn(mscol, new QItemDelegate()); + mscol++; - resultsmodel->setHorizontalHeaderItem(3, new QStandardItem()); - resultsmodel->horizontalHeaderItem(3)->setText("Matched Peaks"); - results->setItemDelegateForColumn(3, new QItemDelegate()); + if ((parameters.peaklistfileformat != mis) && (parameters.peaklistfileformat != imzML)) { + resultsmodel->setHorizontalHeaderItem(mscol, new QStandardItem()); + resultsmodel->horizontalHeaderItem(mscol)->setText("Time"); + results->setItemDelegateForColumn(mscol, new QItemDelegate()); + mscol++; + } - resultsmodel->setHorizontalHeaderItem(4, new QStandardItem()); - resultsmodel->horizontalHeaderItem(4)->setText("Ratio of Matched Peaks [%]"); - results->setItemDelegateForColumn(4, new QItemDelegate()); + resultsmodel->setHorizontalHeaderItem(mscol, new QStandardItem()); + resultsmodel->horizontalHeaderItem(mscol)->setText("Title"); + results->setItemDelegateForColumn(mscol, new QItemDelegate()); + mscol++; - resultsmodel->setHorizontalHeaderItem(5, new QStandardItem()); - resultsmodel->horizontalHeaderItem(5)->setText("Sum of Relative Intensities"); - results->setItemDelegateForColumn(5, new QItemDelegate()); + resultsmodel->setHorizontalHeaderItem(mscol, new QStandardItem()); + resultsmodel->horizontalHeaderItem(mscol)->setText("Matched Peaks"); + results->setItemDelegateForColumn(mscol, new QItemDelegate()); + mscol++; - if ((parameters.peaklistfileformat == mis) || (parameters.peaklistfileformat == imzML)) { - resultsmodel->setHorizontalHeaderItem(6, new QStandardItem()); - resultsmodel->horizontalHeaderItem(6)->setText("Coordinate X"); - results->setItemDelegateForColumn(6, new QItemDelegate()); + resultsmodel->setHorizontalHeaderItem(mscol, new QStandardItem()); + resultsmodel->horizontalHeaderItem(mscol)->setText("Ratio of Matched Peaks [%]"); + results->setItemDelegateForColumn(mscol, new QItemDelegate()); + mscol++; + + resultsmodel->setHorizontalHeaderItem(mscol, new QStandardItem()); + resultsmodel->horizontalHeaderItem(mscol)->setText("Sum of Relative Intensities"); + results->setItemDelegateForColumn(mscol, new QItemDelegate()); + mscol++; - resultsmodel->setHorizontalHeaderItem(7, new QStandardItem()); - resultsmodel->horizontalHeaderItem(7)->setText("Coordinate Y"); - results->setItemDelegateForColumn(7, new QItemDelegate()); + if ((parameters.peaklistfileformat == mis) || (parameters.peaklistfileformat == imzML)) { + resultsmodel->setHorizontalHeaderItem(mscol, new QStandardItem()); + resultsmodel->horizontalHeaderItem(mscol)->setText("Coordinate X"); + results->setItemDelegateForColumn(mscol, new QItemDelegate()); + mscol++; + + resultsmodel->setHorizontalHeaderItem(mscol, new QStandardItem()); + resultsmodel->horizontalHeaderItem(mscol)->setText("Coordinate Y"); + results->setItemDelegateForColumn(mscol, new QItemDelegate()); } } - rowsfiltercombobox->clear(); + rowsfiltercombobox1->clear(); + rowsfiltercombobox2->clear(); for (int i = 0; i < resultsmodel->columnCount(); i++) { - rowsfiltercombobox->addItem(resultsmodel->horizontalHeaderItem(i)->text()); + rowsfiltercombobox1->addItem(resultsmodel->horizontalHeaderItem(i)->text()); + rowsfiltercombobox2->addItem(resultsmodel->horizontalHeaderItem(i)->text()); } results->resizeColumnsToContents(); @@ -1187,7 +1260,15 @@ void cMainWindow::reportSpectra() { rawdata.resize(theoreticalspectrumlist.size()); } - if ((parameters.peaklistfileformat == imzML) && (parameters.mode == dereplication)) { + if (parameters.peaklistfileformat == dat) { + rawdata.resize(theoreticalspectrumlist.size()); + } + + if ((parameters.peaklistfileformat == mzML) || (parameters.peaklistfileformat == raw)) { + rawdata.resize(theoreticalspectrumlist.size()); + } + + if ((parameters.peaklistfileformat == imzML) && ((parameters.mode == dereplication) || (parameters.mode == compoundsearch))) { rawdata.resize(theoreticalspectrumlist.size()); imzmlprofilemetadata.clear(); profilemz64precision = false; @@ -1428,7 +1509,7 @@ void cMainWindow::exportToHTML() { out << "\n"; out << "\n"; - out << "

" << QString(title.c_str()) << "

\n"; + out << "

" << QString(title.c_str()) << "

\n"; if (htmlexportdialog->checkboxparameters->isChecked()) { out << "

Parameters

\n"; @@ -1495,7 +1576,7 @@ void cMainWindow::exportToHTML() { int columncount; string tdwidth; - if (parameters.mode == dereplication) { + if ((parameters.mode == dereplication) || (parameters.mode == compoundsearch)) { if ((parameters.peaklistfileformat == mis) || (parameters.peaklistfileformat == imzML)) { if (parameters.generateisotopepattern) { columncount = 15; @@ -1506,10 +1587,10 @@ void cMainWindow::exportToHTML() { } else { if (parameters.generateisotopepattern) { - columncount = 13; + columncount = 14; } else { - columncount = 10; + columncount = 11; } } } @@ -1534,11 +1615,14 @@ void cMainWindow::exportToHTML() { out << "ID"; - if (parameters.mode == dereplication) { + if ((parameters.mode == dereplication) || (parameters.mode == compoundsearch)) { if ((parameters.peaklistfileformat == mis) || (parameters.peaklistfileformat == imzML)) { out << "Coordinate X"; out << "Coordinate Y"; } + else { + out << "Time"; + } if (parameters.generateisotopepattern) { out << "Pattern Type"; } @@ -1551,7 +1635,7 @@ void cMainWindow::exportToHTML() { out << "Group ID"; } - if (parameters.mode != dereplication) { + if ((parameters.mode == denovoengine) || (parameters.mode == singlecomparison) || (parameters.mode == databasesearch)) { out << "Fragment Type"; } @@ -1566,7 +1650,7 @@ void cMainWindow::exportToHTML() { out << "Absolute Intensity"; out << "Error [ppm]"; - if (parameters.mode == dereplication) { + if ((parameters.mode == dereplication) || (parameters.mode == compoundsearch)) { if (parameters.generateisotopepattern) { out << "Score"; out << "FDR"; @@ -1825,7 +1909,7 @@ void cMainWindow::openResultsFile() { parameters.load(infile); parameterswidget->setAndRestoreParameters(parameters); - if (parameters.mode == dereplication) { + if ((parameters.mode == dereplication) || (parameters.mode == compoundsearch)) { actionShowIsomers->setEnabled(false); if ((parameters.peaklistfileformat == mis) || (parameters.peaklistfileformat == imzML)) { actionImageWindow->setEnabled(true); @@ -1910,7 +1994,7 @@ void cMainWindow::filterResults() { resultsproxymodel->setWholeWord(rowsfilterwholeword->isChecked()); resultsproxymodel->setFilterKeyColumn(-1); resultsproxymodel->setFilterCaseSensitivity(rowsfiltercasesensitive->isChecked()?Qt::CaseSensitive:Qt::CaseInsensitive); - resultsproxymodel->setFilterFixedString(rowsfilterline->text()); + resultsproxymodel->setFilterFixedString(""); if (!summarytableofmatchedpeaks->isHidden() || !imagewindow->isHidden() || !chromatogramwindow->isHidden()) { summarytableofmatchedpeaks->deleteTable(); @@ -1926,7 +2010,8 @@ void cMainWindow::filterResults() { void cMainWindow::resetFilter() { - rowsfilterline->setText(""); + rowsfilterline1->setText(""); + rowsfilterline2->setText(""); results->horizontalHeader()->setSortIndicator(-1, Qt::AscendingOrder); resultsproxymodel->sort(-1); @@ -1949,12 +2034,12 @@ void cMainWindow::resetFilter() { void cMainWindow::gotoNorine() { - QDesktopServices::openUrl(QUrl("http://bioinfo.lifl.fr/norine/")); + QDesktopServices::openUrl(QUrl("https://bioinfo.lifl.fr/norine/")); } -void cMainWindow::gotoSmiles2Monomers() { - QDesktopServices::openUrl(QUrl("http://bioinfo.lifl.fr/norine/smiles2monomers.jsp")); +void cMainWindow::gotoBBDGNC() { + QDesktopServices::openUrl(QUrl("https://ms.biomed.cas.cz/bbdgnc/")); } @@ -1979,6 +2064,30 @@ void cMainWindow::updateSummaryPeaksTableFilterSlot(int xmin, int xmax, int ymin } +void cMainWindow::chromatogramDoubleClicked(int scanid) { + if ((scanid >= 0) && (scanid < spectradetails.size())) { + spectradetails[scanid].prepareToShow(actionShowIsomers, &rawdata, &imzmlprofilemetadata, profilemz64precision, profileintensity64precision); + spectradetails[scanid].show(); + spectradetails[scanid].activateWindow(); + if (spectradetails[scanid].isMinimized()) { + spectradetails[scanid].showNormal(); + } + } +} + + +void cMainWindow::imageWindowDoubleClicked(int spectrumid) { + if ((spectrumid >= 0) && (spectrumid < spectradetails.size())) { + spectradetails[spectrumid].prepareToShow(actionShowIsomers, &rawdata, &imzmlprofilemetadata, profilemz64precision, profileintensity64precision); + spectradetails[spectrumid].show(); + spectradetails[spectrumid].activateWindow(); + if (spectradetails[spectrumid].isMinimized()) { + spectradetails[spectrumid].showNormal(); + } + } +} + + /* void cMainWindow::showContextMenu(const QPoint &pt) { QMenu *menu = logWindow->createStandardContextMenu(); diff --git a/CycloBranch/gui/cMainWindow.h b/CycloBranch/gui/cMainWindow.h index 8a71f06..756e0a6 100644 --- a/CycloBranch/gui/cMainWindow.h +++ b/CycloBranch/gui/cMainWindow.h @@ -102,7 +102,7 @@ class cMainWindow : public QMainWindow QAction* actionModifications; QAction *actionDrawPeptide; QAction *actionNorine; - QAction *actionSmilesToMonomers; + QAction *actionBBDGNC; QAction* actionShowIsomers; QAction* actionGraph; QAction* actionSummaryTableOfMatchedPeaks; @@ -115,9 +115,13 @@ class cMainWindow : public QMainWindow QWidget* rowsfilterwidget; QHBoxLayout* rowsfilterhbox; - QComboBox* rowsfiltercombobox; - QComboBox* rowsfiltercomparatorcombobox; - QLineEdit* rowsfilterline; + QComboBox* rowsfilteroperator; + QComboBox* rowsfiltercombobox1; + QComboBox* rowsfiltercomparatorcombobox1; + QLineEdit* rowsfilterline1; + QComboBox* rowsfiltercombobox2; + QComboBox* rowsfiltercomparatorcombobox2; + QLineEdit* rowsfilterline2; QCheckBox* rowsfiltercasesensitive; QCheckBox* rowsfilterwholeword; QPushButton* rowsfilterbutton; @@ -250,7 +254,7 @@ private slots: void gotoNorine(); - void gotoSmiles2Monomers(); + void gotoBBDGNC(); void summaryPeaksTableCancelled(); @@ -258,6 +262,10 @@ private slots: void updateSummaryPeaksTableFilterSlot(int xmin, int xmax, int ymin, int ymax); + void chromatogramDoubleClicked(int scanid); + + void imageWindowDoubleClicked(int spectrumid); + //void showContextMenu(const QPoint &pt); signals: diff --git a/CycloBranch/gui/cMainWindowProxyModel.cpp b/CycloBranch/gui/cMainWindowProxyModel.cpp index c251917..8829b38 100644 --- a/CycloBranch/gui/cMainWindowProxyModel.cpp +++ b/CycloBranch/gui/cMainWindowProxyModel.cpp @@ -6,9 +6,14 @@ cMainWindowProxyModel::cMainWindowProxyModel(QObject *parent) : QSortFilterProxy } -void cMainWindowProxyModel::initialize(QComboBox* rowsfiltercombobox, QComboBox* rowsfiltercomparatorcombobox) { - this->rowsfiltercombobox = rowsfiltercombobox; - this->rowsfiltercomparatorcombobox = rowsfiltercomparatorcombobox; +void cMainWindowProxyModel::initialize(QComboBox* rowsfilteroperator, QComboBox* rowsfiltercombobox1, QComboBox* rowsfiltercomparatorcombobox1, QLineEdit* rowsfilterline1, QComboBox* rowsfiltercombobox2, QComboBox* rowsfiltercomparatorcombobox2, QLineEdit* rowsfilterline2) { + filteroperator = rowsfilteroperator; + filtercombobox1 = rowsfiltercombobox1; + filtercomparatorcombobox1 = rowsfiltercomparatorcombobox1; + filterline1 = rowsfilterline1; + filtercombobox2 = rowsfiltercombobox2; + filtercomparatorcombobox2 = rowsfiltercomparatorcombobox2; + filterline2 = rowsfilterline2; } @@ -18,116 +23,59 @@ void cMainWindowProxyModel::setWholeWord(bool wholeword) { bool cMainWindowProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { - if (filterRegExp().isEmpty()) { + if (filterline1->text().isEmpty() && filterline2->text().isEmpty()) { return true; } - int col = rowsfiltercombobox->currentIndex(); - - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).type() == QVariant::ByteArray) { - switch (rowsfiltercomparatorcombobox->currentIndex()) { - case 0: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() == filterRegExp().pattern().toDouble()) { - return true; - } - break; - case 1: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() < filterRegExp().pattern().toDouble()) { - return true; - } - break; - case 2: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() <= filterRegExp().pattern().toDouble()) { - return true; - } - break; - case 3: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() > filterRegExp().pattern().toDouble()) { - return true; - } - break; - case 4: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() >= filterRegExp().pattern().toDouble()) { - return true; - } - break; - default: - break; + int col1 = filtercombobox1->currentIndex(); + int col2 = filtercombobox2->currentIndex(); + + bool result1 = false; + bool result2 = false; + + if (!filterline1->text().isEmpty()) { + if (sourceModel()->data(sourceModel()->index(sourceRow, col1, sourceParent)).type() == QVariant::ByteArray) { + result1 = proxyModelCheckDouble(sourceModel(), filtercomparatorcombobox1->currentIndex(), sourceRow, col1, filterline1->text(), sourceParent); + } + + if (sourceModel()->data(sourceModel()->index(sourceRow, col1, sourceParent)).type() == QVariant::String) { + QString qstr = sourceModel()->data(sourceModel()->index(sourceRow, col1, sourceParent)).toString(); + result1 = proxyModelCheckString(sourceModel(), filtercomparatorcombobox1->currentIndex(), sourceRow, col1, qstr, filterline1->text(), sourceParent, wholeword, filterCaseSensitivity()); } - } - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).type() == QVariant::String) { - switch (rowsfiltercomparatorcombobox->currentIndex()) { - case 0: - if (wholeword) { - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().compare(filterRegExp().pattern(), filterCaseSensitivity()) == 0) { - return true; - } - } - else { - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().contains(filterRegExp())) { - return true; - } - } - break; - case 1: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().compare(filterRegExp().pattern(), filterCaseSensitivity()) < 0) { - return true; - } - break; - case 2: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().compare(filterRegExp().pattern(), filterCaseSensitivity()) <= 0) { - return true; - } - break; - case 3: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().compare(filterRegExp().pattern(), filterCaseSensitivity()) > 0) { - return true; - } - break; - case 4: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().compare(filterRegExp().pattern(), filterCaseSensitivity()) >= 0) { - return true; - } - break; - default: - break; + if (sourceModel()->data(sourceModel()->index(sourceRow, col1, sourceParent)).type() == QVariant::Int) { + result1 = proxyModelCheckInt(sourceModel(), filtercomparatorcombobox1->currentIndex(), sourceRow, col1, filterline1->text(), sourceParent); } } - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).type() == QVariant::Int) { - switch (rowsfiltercomparatorcombobox->currentIndex()) { - case 0: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() == filterRegExp().pattern().toInt()) { - return true; - } - break; - case 1: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() < filterRegExp().pattern().toInt()) { - return true; - } - break; - case 2: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() <= filterRegExp().pattern().toInt()) { - return true; - } - break; - case 3: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() > filterRegExp().pattern().toInt()) { - return true; - } - break; - case 4: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() >= filterRegExp().pattern().toInt()) { - return true; - } - break; - default: - break; + if (!filterline2->text().isEmpty()) { + if (sourceModel()->data(sourceModel()->index(sourceRow, col2, sourceParent)).type() == QVariant::ByteArray) { + result2 = proxyModelCheckDouble(sourceModel(), filtercomparatorcombobox2->currentIndex(), sourceRow, col2, filterline2->text(), sourceParent); + } + + if (sourceModel()->data(sourceModel()->index(sourceRow, col2, sourceParent)).type() == QVariant::String) { + QString qstr = sourceModel()->data(sourceModel()->index(sourceRow, col2, sourceParent)).toString(); + result2 = proxyModelCheckString(sourceModel(), filtercomparatorcombobox2->currentIndex(), sourceRow, col2, qstr, filterline2->text(), sourceParent, wholeword, filterCaseSensitivity()); } + + if (sourceModel()->data(sourceModel()->index(sourceRow, col2, sourceParent)).type() == QVariant::Int) { + result2 = proxyModelCheckInt(sourceModel(), filtercomparatorcombobox2->currentIndex(), sourceRow, col2, filterline2->text(), sourceParent); + } + } + + if (!filterline1->text().isEmpty() && filterline2->text().isEmpty()) { + return result1; + } + + if (filterline1->text().isEmpty() && !filterline2->text().isEmpty()) { + return result2; + } + + if (filteroperator->currentIndex() == 0) { + return result1 || result2; } - return false; + return result1 && result2; } diff --git a/CycloBranch/gui/cMainWindowProxyModel.h b/CycloBranch/gui/cMainWindowProxyModel.h index 9546fa7..1ab5c65 100644 --- a/CycloBranch/gui/cMainWindowProxyModel.h +++ b/CycloBranch/gui/cMainWindowProxyModel.h @@ -9,8 +9,10 @@ #include #include -#include #include +#include +#include +#include "core/utilities.h" /** @@ -22,8 +24,13 @@ class cMainWindowProxyModel : public QSortFilterProxyModel { private: - QComboBox* rowsfiltercombobox; - QComboBox* rowsfiltercomparatorcombobox; + QComboBox* filteroperator; + QComboBox* filtercombobox1; + QComboBox* filtercomparatorcombobox1; + QLineEdit* filterline1; + QComboBox* filtercombobox2; + QComboBox* filtercomparatorcombobox2; + QLineEdit* filterline2; bool wholeword; public: @@ -38,10 +45,15 @@ class cMainWindowProxyModel : public QSortFilterProxyModel { /** \brief Initialize the model. - \param rowsfiltercombobox reference to the combobox with selection of columns - \param rowsfiltercomparatorcombobox reference to the combobox with selection of comparator + \param rowsfilteroperator reference to the combobox with operator selection + \param rowsfiltercombobox1 reference to the combobox with selection of columns + \param rowsfiltercomparatorcombobox1 reference to the combobox with selection of comparator + \param rowsfilterline1 reference to a text field + \param rowsfiltercombobox2 reference to the combobox with selection of columns + \param rowsfiltercomparatorcombobox2 reference to the combobox with selection of comparator + \param rowsfilterline2 reference to a text field */ - void initialize(QComboBox* rowsfiltercombobox, QComboBox* rowsfiltercomparatorcombobox); + void initialize(QComboBox* rowsfilteroperator, QComboBox* rowsfiltercombobox1, QComboBox* rowsfiltercomparatorcombobox1, QLineEdit* rowsfilterline1, QComboBox* rowsfiltercombobox2, QComboBox* rowsfiltercomparatorcombobox2, QLineEdit* rowsfilterline2); /** diff --git a/CycloBranch/gui/cModificationsProxyModel.cpp b/CycloBranch/gui/cModificationsProxyModel.cpp index 2fe0239..a6d0566 100644 --- a/CycloBranch/gui/cModificationsProxyModel.cpp +++ b/CycloBranch/gui/cModificationsProxyModel.cpp @@ -6,9 +6,14 @@ cModificationsProxyModel::cModificationsProxyModel(QObject *parent) : QSortFilte } -void cModificationsProxyModel::initialize(QComboBox* rowsfiltercombobox, QComboBox* rowsfiltercomparatorcombobox) { - this->rowsfiltercombobox = rowsfiltercombobox; - this->rowsfiltercomparatorcombobox = rowsfiltercomparatorcombobox; +void cModificationsProxyModel::initialize(QComboBox* rowsfilteroperator, QComboBox* rowsfiltercombobox1, QComboBox* rowsfiltercomparatorcombobox1, QLineEdit* rowsfilterline1, QComboBox* rowsfiltercombobox2, QComboBox* rowsfiltercomparatorcombobox2, QLineEdit* rowsfilterline2) { + filteroperator = rowsfilteroperator; + filtercombobox1 = rowsfiltercombobox1; + filtercomparatorcombobox1 = rowsfiltercomparatorcombobox1; + filterline1 = rowsfilterline1; + filtercombobox2 = rowsfiltercombobox2; + filtercomparatorcombobox2 = rowsfiltercomparatorcombobox2; + filterline2 = rowsfilterline2; } @@ -18,116 +23,59 @@ void cModificationsProxyModel::setWholeWord(bool wholeword) { bool cModificationsProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { - if (filterRegExp().isEmpty()) { + if (filterline1->text().isEmpty() && filterline2->text().isEmpty()) { return true; } - int col = rowsfiltercombobox->currentIndex() + 1; - - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).type() == QVariant::ByteArray) { - switch (rowsfiltercomparatorcombobox->currentIndex()) { - case 0: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() == filterRegExp().pattern().toDouble()) { - return true; - } - break; - case 1: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() < filterRegExp().pattern().toDouble()) { - return true; - } - break; - case 2: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() <= filterRegExp().pattern().toDouble()) { - return true; - } - break; - case 3: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() > filterRegExp().pattern().toDouble()) { - return true; - } - break; - case 4: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() >= filterRegExp().pattern().toDouble()) { - return true; - } - break; - default: - break; + int col1 = filtercombobox1->currentIndex() + 1; + int col2 = filtercombobox2->currentIndex() + 1; + + bool result1 = false; + bool result2 = false; + + if (!filterline1->text().isEmpty()) { + if (sourceModel()->data(sourceModel()->index(sourceRow, col1, sourceParent)).type() == QVariant::ByteArray) { + result1 = proxyModelCheckDouble(sourceModel(), filtercomparatorcombobox1->currentIndex(), sourceRow, col1, filterline1->text(), sourceParent); + } + + if (sourceModel()->data(sourceModel()->index(sourceRow, col1, sourceParent)).type() == QVariant::String) { + QString qstr = sourceModel()->data(sourceModel()->index(sourceRow, col1, sourceParent)).toString(); + result1 = proxyModelCheckString(sourceModel(), filtercomparatorcombobox1->currentIndex(), sourceRow, col1, qstr, filterline1->text(), sourceParent, wholeword, filterCaseSensitivity()); } - } - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).type() == QVariant::String) { - switch (rowsfiltercomparatorcombobox->currentIndex()) { - case 0: - if (wholeword) { - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().compare(filterRegExp().pattern(), filterCaseSensitivity()) == 0) { - return true; - } - } - else { - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().contains(filterRegExp())) { - return true; - } - } - break; - case 1: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().compare(filterRegExp().pattern(), filterCaseSensitivity()) < 0) { - return true; - } - break; - case 2: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().compare(filterRegExp().pattern(), filterCaseSensitivity()) <= 0) { - return true; - } - break; - case 3: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().compare(filterRegExp().pattern(), filterCaseSensitivity()) > 0) { - return true; - } - break; - case 4: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().compare(filterRegExp().pattern(), filterCaseSensitivity()) >= 0) { - return true; - } - break; - default: - break; + if (sourceModel()->data(sourceModel()->index(sourceRow, col1, sourceParent)).type() == QVariant::Int) { + result1 = proxyModelCheckInt(sourceModel(), filtercomparatorcombobox1->currentIndex(), sourceRow, col1, filterline1->text(), sourceParent); } } - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).type() == QVariant::Int) { - switch (rowsfiltercomparatorcombobox->currentIndex()) { - case 0: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() == filterRegExp().pattern().toInt()) { - return true; - } - break; - case 1: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() < filterRegExp().pattern().toInt()) { - return true; - } - break; - case 2: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() <= filterRegExp().pattern().toInt()) { - return true; - } - break; - case 3: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() > filterRegExp().pattern().toInt()) { - return true; - } - break; - case 4: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() >= filterRegExp().pattern().toInt()) { - return true; - } - break; - default: - break; + if (!filterline2->text().isEmpty()) { + if (sourceModel()->data(sourceModel()->index(sourceRow, col2, sourceParent)).type() == QVariant::ByteArray) { + result2 = proxyModelCheckDouble(sourceModel(), filtercomparatorcombobox2->currentIndex(), sourceRow, col2, filterline2->text(), sourceParent); + } + + if (sourceModel()->data(sourceModel()->index(sourceRow, col2, sourceParent)).type() == QVariant::String) { + QString qstr = sourceModel()->data(sourceModel()->index(sourceRow, col2, sourceParent)).toString(); + result2 = proxyModelCheckString(sourceModel(), filtercomparatorcombobox2->currentIndex(), sourceRow, col2, qstr, filterline2->text(), sourceParent, wholeword, filterCaseSensitivity()); } + + if (sourceModel()->data(sourceModel()->index(sourceRow, col2, sourceParent)).type() == QVariant::Int) { + result2 = proxyModelCheckInt(sourceModel(), filtercomparatorcombobox2->currentIndex(), sourceRow, col2, filterline2->text(), sourceParent); + } + } + + if (!filterline1->text().isEmpty() && filterline2->text().isEmpty()) { + return result1; + } + + if (filterline1->text().isEmpty() && !filterline2->text().isEmpty()) { + return result2; + } + + if (filteroperator->currentIndex() == 0) { + return result1 || result2; } - return false; + return result1 && result2; } diff --git a/CycloBranch/gui/cModificationsProxyModel.h b/CycloBranch/gui/cModificationsProxyModel.h index 787a19a..b5d22a7 100644 --- a/CycloBranch/gui/cModificationsProxyModel.h +++ b/CycloBranch/gui/cModificationsProxyModel.h @@ -11,7 +11,8 @@ #include #include #include -#include "core/cFragmentIons.h" +#include +#include "core/utilities.h" /** @@ -23,8 +24,13 @@ class cModificationsProxyModel : public QSortFilterProxyModel { private: - QComboBox* rowsfiltercombobox; - QComboBox* rowsfiltercomparatorcombobox; + QComboBox* filteroperator; + QComboBox* filtercombobox1; + QComboBox* filtercomparatorcombobox1; + QLineEdit* filterline1; + QComboBox* filtercombobox2; + QComboBox* filtercomparatorcombobox2; + QLineEdit* filterline2; bool wholeword; public: @@ -39,10 +45,15 @@ class cModificationsProxyModel : public QSortFilterProxyModel { /** \brief Initialize the model. - \param rowsfiltercombobox reference to the combobox with selection of columns - \param rowsfiltercomparatorcombobox reference to the combobox with selection of comparator + \param rowsfilteroperator reference to the combobox with operator selection + \param rowsfiltercombobox1 reference to the combobox with selection of columns + \param rowsfiltercomparatorcombobox1 reference to the combobox with selection of comparator + \param rowsfilterline1 reference to a text field + \param rowsfiltercombobox2 reference to the combobox with selection of columns + \param rowsfiltercomparatorcombobox2 reference to the combobox with selection of comparator + \param rowsfilterline2 reference to a text field */ - void initialize(QComboBox* rowsfiltercombobox, QComboBox* rowsfiltercomparatorcombobox); + void initialize(QComboBox* rowsfilteroperator, QComboBox* rowsfiltercombobox1, QComboBox* rowsfiltercomparatorcombobox1, QLineEdit* rowsfilterline1, QComboBox* rowsfiltercombobox2, QComboBox* rowsfiltercomparatorcombobox2, QLineEdit* rowsfilterline2); /** diff --git a/CycloBranch/gui/cModificationsWidget.cpp b/CycloBranch/gui/cModificationsWidget.cpp index 7c2e6a8..e191fa3 100644 --- a/CycloBranch/gui/cModificationsWidget.cpp +++ b/CycloBranch/gui/cModificationsWidget.cpp @@ -30,22 +30,45 @@ cModificationsWidget::cModificationsWidget(QWidget* parent) { menuEdit = new QMenu(tr("&Edit"), this); menuHelp = new QMenu(tr("&Help"), this); - rowsfiltercombobox = new QComboBox(); - rowsfiltercombobox->setToolTip("Column to be Searched"); - rowsfiltercombobox->setSizeAdjustPolicy(QComboBox::AdjustToContents); - - rowsfiltercomparatorcombobox = new QComboBox(); - rowsfiltercomparatorcombobox->setToolTip("Type of Comparison"); - rowsfiltercomparatorcombobox->addItem("="); - rowsfiltercomparatorcombobox->addItem("<"); - rowsfiltercomparatorcombobox->addItem("<="); - rowsfiltercomparatorcombobox->addItem(">"); - rowsfiltercomparatorcombobox->addItem(">="); - rowsfiltercomparatorcombobox->setSizeAdjustPolicy(QComboBox::AdjustToContents); - - rowsfilterline = new QLineEdit(); - rowsfilterline->setMinimumWidth(300); - rowsfilterline->setToolTip("Text to Find"); + rowsfilteroperator = new QComboBox(); + rowsfilteroperator->setToolTip("OR = any condition must be met; AND = all conditions must be met."); + rowsfilteroperator->addItem("OR"); + rowsfilteroperator->addItem("AND"); + rowsfilteroperator->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfiltercombobox1 = new QComboBox(); + rowsfiltercombobox1->setToolTip("Column to be Searched"); + rowsfiltercombobox1->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfiltercomparatorcombobox1 = new QComboBox(); + rowsfiltercomparatorcombobox1->setToolTip("Type of Comparison"); + rowsfiltercomparatorcombobox1->addItem("="); + rowsfiltercomparatorcombobox1->addItem("<"); + rowsfiltercomparatorcombobox1->addItem("<="); + rowsfiltercomparatorcombobox1->addItem(">"); + rowsfiltercomparatorcombobox1->addItem(">="); + rowsfiltercomparatorcombobox1->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfilterline1 = new QLineEdit(); + rowsfilterline1->setMinimumWidth(150); + rowsfilterline1->setToolTip("Text to Find"); + + rowsfiltercombobox2 = new QComboBox(); + rowsfiltercombobox2->setToolTip("Column to be Searched"); + rowsfiltercombobox2->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfiltercomparatorcombobox2 = new QComboBox(); + rowsfiltercomparatorcombobox2->setToolTip("Type of Comparison"); + rowsfiltercomparatorcombobox2->addItem("="); + rowsfiltercomparatorcombobox2->addItem("<"); + rowsfiltercomparatorcombobox2->addItem("<="); + rowsfiltercomparatorcombobox2->addItem(">"); + rowsfiltercomparatorcombobox2->addItem(">="); + rowsfiltercomparatorcombobox2->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfilterline2 = new QLineEdit(); + rowsfilterline2->setMinimumWidth(150); + rowsfilterline2->setToolTip("Text to Find"); rowsfiltercasesensitive = new QCheckBox(); rowsfiltercasesensitive->setToolTip("Case Sensitive"); @@ -63,11 +86,19 @@ cModificationsWidget::cModificationsWidget(QWidget* parent) { rowsfilterclearbutton->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_R)); rowsfilterhbox = new QHBoxLayout(); - rowsfilterhbox->addWidget(rowsfiltercombobox); + rowsfilterhbox->addWidget(rowsfiltercombobox1); rowsfilterhbox->addSpacing(10); - rowsfilterhbox->addWidget(rowsfiltercomparatorcombobox); + rowsfilterhbox->addWidget(rowsfiltercomparatorcombobox1); rowsfilterhbox->addSpacing(10); - rowsfilterhbox->addWidget(rowsfilterline); + rowsfilterhbox->addWidget(rowsfilterline1); + rowsfilterhbox->addSpacing(10); + rowsfilterhbox->addWidget(rowsfilteroperator); + rowsfilterhbox->addSpacing(10); + rowsfilterhbox->addWidget(rowsfiltercombobox2); + rowsfilterhbox->addSpacing(10); + rowsfilterhbox->addWidget(rowsfiltercomparatorcombobox2); + rowsfilterhbox->addSpacing(10); + rowsfilterhbox->addWidget(rowsfilterline2); rowsfilterhbox->addSpacing(10); rowsfilterhbox->addWidget(rowsfiltercasesensitive); rowsfilterhbox->addSpacing(10); @@ -85,7 +116,7 @@ cModificationsWidget::cModificationsWidget(QWidget* parent) { proxymodel = new cModificationsProxyModel(this); proxymodel->setSourceModel(databasemodel); proxymodel->setDynamicSortFilter(false); - proxymodel->initialize(rowsfiltercombobox, rowsfiltercomparatorcombobox); + proxymodel->initialize(rowsfilteroperator, rowsfiltercombobox1, rowsfiltercomparatorcombobox1, rowsfilterline1, rowsfiltercombobox2, rowsfiltercomparatorcombobox2, rowsfilterline2); database->setModel(proxymodel); database->setSortingEnabled(true); @@ -115,7 +146,7 @@ cModificationsWidget::cModificationsWidget(QWidget* parent) { actionSaveDatabase->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_S)); actionSaveDatabase->setToolTip("Save Database... (Ctrl + S)"); toolbarFile->addAction(actionSaveDatabase); - connect(actionSaveDatabase, SIGNAL(triggered()), this, SLOT(saveDatabase())); + connect(actionSaveDatabase, SIGNAL(triggered()), this, SLOT(saveDatabaseCheck())); actionSaveDatabaseAs = new QAction(QIcon(":/images/icons/86.png"), tr("Save &Database As..."), this); actionSaveDatabaseAs->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_D)); @@ -168,6 +199,8 @@ cModificationsWidget::cModificationsWidget(QWidget* parent) { actionHTMLDocumentation->setToolTip("Show HTML Documentation (F1)"); toolbarHelp->addAction(actionHTMLDocumentation); connect(actionHTMLDocumentation, SIGNAL(triggered()), this, SLOT(showHTMLDocumentation())); + + addToolBarBreak(); toolbarFilter = addToolBar(tr("Filter")); toolbarFilter->addWidget(rowsfilterwidget); @@ -203,7 +236,7 @@ cModificationsWidget::cModificationsWidget(QWidget* parent) { setCentralWidget(mainwidget); - resize(1280, 780); + resize(defaultwinsizex, defaultwinsizey); databasefile = ""; @@ -226,9 +259,13 @@ cModificationsWidget::~cModificationsWidget() { delete proxymodel; delete database; - delete rowsfiltercombobox; - delete rowsfiltercomparatorcombobox; - delete rowsfilterline; + delete rowsfilteroperator; + delete rowsfiltercombobox1; + delete rowsfiltercomparatorcombobox1; + delete rowsfilterline1; + delete rowsfiltercombobox2; + delete rowsfiltercomparatorcombobox2; + delete rowsfilterline2; delete rowsfiltercasesensitive; delete rowsfilterwholeword; delete rowsfilterbutton; @@ -290,9 +327,11 @@ void cModificationsWidget::resetHeader() { databasemodel->setHorizontalHeaderItem(5, new QStandardItem("C-terminal")); database->setItemDelegateForColumn(5, new cCheckBoxDelegate()); - rowsfiltercombobox->clear(); + rowsfiltercombobox1->clear(); + rowsfiltercombobox2->clear(); for (int i = 1; i < databasemodel->columnCount() - 2; i++) { - rowsfiltercombobox->addItem(databasemodel->horizontalHeaderItem(i)->text()); + rowsfiltercombobox1->addItem(databasemodel->horizontalHeaderItem(i)->text()); + rowsfiltercombobox2->addItem(databasemodel->horizontalHeaderItem(i)->text()); } database->horizontalHeader()->setStretchLastSection(true); @@ -358,13 +397,13 @@ void cModificationsWidget::setDataModified(bool datamodified) { void cModificationsWidget::keyPressEvent(QKeyEvent *event) { if ((event->key() == Qt::Key_Enter) || (event->key() == Qt::Key_Return)) { - if (rowsfilterline->hasFocus()) { + if (rowsfilterline1->hasFocus() || rowsfilterline2->hasFocus()) { filterRows(); } } if ((event->modifiers() == Qt::ControlModifier) && (event->key() == Qt::Key_F)) { - rowsfilterline->setFocus(); + rowsfilterline1->setFocus(); } if ((event->modifiers() == Qt::ControlModifier) && (event->key() == Qt::Key_T)) { @@ -592,6 +631,18 @@ bool cModificationsWidget::saveDatabaseAs() { } +void cModificationsWidget::saveDatabaseCheck() { + QMessageBox::StandardButton reply; + reply = QMessageBox::question(this, appname, "Save changes ?", QMessageBox::Yes | QMessageBox::No); + + if (reply == QMessageBox::No) { + return; + } + + saveDatabase(); +} + + void cModificationsWidget::addRow() { resetFilter(); @@ -654,12 +705,13 @@ void cModificationsWidget::filterRows() { proxymodel->setWholeWord(rowsfilterwholeword->isChecked()); proxymodel->setFilterKeyColumn(-1); proxymodel->setFilterCaseSensitivity(rowsfiltercasesensitive->isChecked()?Qt::CaseSensitive:Qt::CaseInsensitive); - proxymodel->setFilterFixedString(rowsfilterline->text()); + proxymodel->setFilterFixedString(""); } void cModificationsWidget::resetFilter() { - rowsfilterline->setText(""); + rowsfilterline1->setText(""); + rowsfilterline2->setText(""); database->horizontalHeader()->setSortIndicator(-1, Qt::AscendingOrder); proxymodel->sort(-1); diff --git a/CycloBranch/gui/cModificationsWidget.h b/CycloBranch/gui/cModificationsWidget.h index 494c1e9..cb1678c 100644 --- a/CycloBranch/gui/cModificationsWidget.h +++ b/CycloBranch/gui/cModificationsWidget.h @@ -96,9 +96,13 @@ class cModificationsWidget : public QMainWindow QToolBar* toolbarFilter; QWidget* rowsfilterwidget; QHBoxLayout* rowsfilterhbox; - QComboBox* rowsfiltercombobox; - QComboBox* rowsfiltercomparatorcombobox; - QLineEdit* rowsfilterline; + QComboBox* rowsfilteroperator; + QComboBox* rowsfiltercombobox1; + QComboBox* rowsfiltercomparatorcombobox1; + QLineEdit* rowsfilterline1; + QComboBox* rowsfiltercombobox2; + QComboBox* rowsfiltercomparatorcombobox2; + QLineEdit* rowsfilterline2; QCheckBox* rowsfiltercasesensitive; QCheckBox* rowsfilterwholeword; QPushButton* rowsfilterbutton; @@ -148,6 +152,8 @@ private slots: bool saveDatabaseAs(); + void saveDatabaseCheck(); + void addRow(); void removeSelectedRows(); diff --git a/CycloBranch/gui/cMultipleButtonDelegate.cpp b/CycloBranch/gui/cMultipleButtonDelegate.cpp index d02c8c7..ddf0e0f 100644 --- a/CycloBranch/gui/cMultipleButtonDelegate.cpp +++ b/CycloBranch/gui/cMultipleButtonDelegate.cpp @@ -42,7 +42,7 @@ void cMultipleButtonDelegate::paint(QPainter* painter, const QStyleOptionViewIte bool cMultipleButtonDelegate::editorEvent(QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index) { if (event->type() == QEvent::MouseButtonRelease) { QString acronyms = index.model()->index(index.row(), 2).data(Qt::DisplayRole).toString(); - QString references = index.model()->index(index.row(), 6).data(Qt::DisplayRole).toString(); + QString references = index.model()->index(index.row(), 7).data(Qt::DisplayRole).toString(); if (acronyms.isEmpty() || references.isEmpty()) { return false; diff --git a/CycloBranch/gui/cNeutralLossesListWidget.cpp b/CycloBranch/gui/cNeutralLossesListWidget.cpp index 2555745..d17be24 100644 --- a/CycloBranch/gui/cNeutralLossesListWidget.cpp +++ b/CycloBranch/gui/cNeutralLossesListWidget.cpp @@ -14,8 +14,8 @@ cNeutralLossesListWidget::cNeutralLossesListWidget(QObject* parent) { hbox = new QHBoxLayout(); list = new QListWidget(); - list->setMinimumHeight(180); - list->setMaximumHeight(180); + list->setMinimumHeight(175); + list->setMaximumHeight(175); list->setSelectionMode(QAbstractItemView::MultiSelection); selectallbutton = new QPushButton("Select All"); @@ -28,6 +28,8 @@ cNeutralLossesListWidget::cNeutralLossesListWidget(QObject* parent) { removebutton->setToolTip("Remove selected items."); defaultbutton = new QPushButton("Default"); defaultbutton->setToolTip("Set default items."); + hconbutton = new QPushButton("HCON"); + hconbutton->setToolTip("Set the default chemical elements H, C, O, N, S, and P."); vbox1->addWidget(list); vbox1->addStretch(1); @@ -37,6 +39,7 @@ cNeutralLossesListWidget::cNeutralLossesListWidget(QObject* parent) { vbox2->addWidget(addbutton); vbox2->addWidget(removebutton); vbox2->addWidget(defaultbutton); + vbox2->addWidget(hconbutton); vbox2->addStretch(1); hbox->setMargin(0); @@ -48,6 +51,7 @@ cNeutralLossesListWidget::cNeutralLossesListWidget(QObject* parent) { connect(addbutton, SIGNAL(released()), this, SLOT(addEmptyItem())); connect(removebutton, SIGNAL(released()), this, SLOT(removeItem())); connect(defaultbutton, SIGNAL(released()), this, SLOT(setDefaultItems())); + connect(hconbutton, SIGNAL(released()), this, SLOT(setHCON())); setLayout(hbox); @@ -62,6 +66,7 @@ cNeutralLossesListWidget::~cNeutralLossesListWidget() { delete addbutton; delete removebutton; delete defaultbutton; + delete hconbutton; delete vbox1; delete vbox2; @@ -132,5 +137,8 @@ void cNeutralLossesListWidget::setHCON() { addItem("N"); selectAllItems(); + + addItem("S:1"); + addItem("P:1"); } diff --git a/CycloBranch/gui/cNeutralLossesListWidget.h b/CycloBranch/gui/cNeutralLossesListWidget.h index 563455b..3c9ff6e 100644 --- a/CycloBranch/gui/cNeutralLossesListWidget.h +++ b/CycloBranch/gui/cNeutralLossesListWidget.h @@ -65,6 +65,7 @@ class cNeutralLossesListWidget : public QWidget QPushButton* addbutton; QPushButton* removebutton; QPushButton* defaultbutton; + QPushButton* hconbutton; QHBoxLayout* hbox; QVBoxLayout* vbox1; diff --git a/CycloBranch/gui/cParametersWidget.cpp b/CycloBranch/gui/cParametersWidget.cpp index 3d4e654..5acd447 100644 --- a/CycloBranch/gui/cParametersWidget.cpp +++ b/CycloBranch/gui/cParametersWidget.cpp @@ -28,8 +28,8 @@ cParametersWidget::cParametersWidget(QWidget* parent) { this->parent = parent; - int leftdefaultwidth = 370; - int rightdefaultwidth = 370; + int leftdefaultwidth = 400; + int rightdefaultwidth = 400; int searchedsequencedefaultwidth = 510; int checkboxfieldwidth = 80; @@ -67,11 +67,17 @@ cParametersWidget::cParametersWidget(QWidget* parent) { mode = new QComboBox(); mode->setSizeAdjustPolicy(QComboBox::AdjustToContents); - mode->setToolTip("'De Novo Search Engine' - the default mode of the application.\n'Compare Peaklist(s) with Spectrum of Searched Sequence' - a theoretical spectrum is generated for the input 'Searched Sequence' and is compared with the peaklist(s).\n'Compare Peaklist with Database - MS/MS data' - a peaklist is compared with theoretical spectra generated from a database of sequences.\n'Compare Peaklist(s) with Database - MS or MSI data' - compound search; dereplication; the peaklists are compared with theoretical peaks generated from a database of compounds/sequences."); - mode->addItem(tr("De Novo Search Engine")); - mode->addItem(tr("Compare Peaklist(s) with Spectrum of Searched Sequence")); - mode->addItem(tr("Compare Peaklist with Database - MS/MS data")); - mode->addItem(tr("Compare Peaklist(s) with Database - MS or MSI data")); + QString modetooltip = "'De Novo Search Engine - MS/MS': perform the de novo sequencing.\n"; + modetooltip += "'Compare Peaklist(s) with Spectrum of Searched Sequence - MS/MS': a theoretical spectrum is generated from the input 'Searched Sequence' and compared with the peaklist(s).\n"; + modetooltip += "'Compare Peaklist with Database - MS/MS': a peaklist is compared with theoretical spectra generated from a database of sequences.\n"; + modetooltip += "'Compare Peaklist(s) with Database - MS, LC-MS, MSI': dereplication; the peaklist(s) are compared with a theoretical peaklist generated from a database of compounds.\n"; + modetooltip += "'Compound Search - MS, LC-MS, MSI': the peaklist(s) are compared with a theoretical peaklist generated from a list of input chemical elements (a database-free search method)."; + mode->setToolTip(modetooltip); + mode->addItem(tr("De Novo Search Engine - MS/MS")); + mode->addItem(tr("Compare Peaklist(s) with Spectrum of Searched Sequence - MS/MS")); + mode->addItem(tr("Compare Peaklist with Database - MS/MS")); + mode->addItem(tr("Compare Peaklist(s) with Database - MS, LC-MS, MSI")); + mode->addItem(tr("Compound Search - MS, LC-MS, MSI")); mode->setFixedWidth(leftdefaultwidth); modelabel = new QLabel("Mode:"); searchgridlayout->addWidget(modelabel, 0, 0); @@ -102,7 +108,7 @@ cParametersWidget::cParametersWidget(QWidget* parent) { peptidetype->addItem(tr("Branch-cyclic")); peptidetype->addItem(tr("Linear polyketide")); peptidetype->addItem(tr("Cyclic polyketide")); - //peptidetype->addItem(tr("Other")); + peptidetype->addItem(tr("Other")); peptidetype->setFixedWidth(leftdefaultwidth); peptidetypelabel = new QLabel("Peptide Type:"); experimentalspectragridlayout->addWidget(peptidetypelabel, 0, 0); @@ -152,7 +158,7 @@ cParametersWidget::cParametersWidget(QWidget* parent) { experimentalspectragridlayout->addWidget(precursormass, 3, 1); precursoradduct = new QLineEdit(); - precursoradduct->setToolTip("Enter the formula of a precursor ion adduct (e.g., Na, K, Li).\nH is used by default if the field is empty.\nSee the manual for more options."); + precursoradduct->setToolTip("Enter the formula of a precursor ion adduct (e.g., Na, K, Li).\nH is used by default if the field is empty.\nm/z ratios of theoretical peaks are shifted by mass of adduct.\nSee the manual for more details."); precursoradduct->setFixedWidth(leftdefaultwidth); precursoradductlabel = new QLabel("Precursor Ion Adduct:"); experimentalspectragridlayout->addWidget(precursoradductlabel, 4, 0); @@ -212,12 +218,27 @@ cParametersWidget::cParametersWidget(QWidget* parent) { minimummz = new QDoubleSpinBox(); minimummz->setToolTip("Enter the minimum m/z ratio. Peaks with m/z ratios below the threshold are removed from the peaklist."); minimummz->setDecimals(3); - minimummz->setRange(0, 10000); + minimummz->setRange(0, 100000); minimummz->setSingleStep(1); - minimummz->setFixedWidth(leftdefaultwidth); - minimummzlabel = new QLabel("Minimum m/z Ratio:"); - experimentalspectragridlayout->addWidget(minimummzlabel, 10, 0); - experimentalspectragridlayout->addWidget(minimummz, 10, 1); + minimummz->setPrefix("minimum: "); + + maximummz = new QDoubleSpinBox(); + maximummz->setToolTip("Enter the maximum m/z ratio. Peaks with m/z ratios above the threshold are removed from the peaklist (0 = disabled)."); + maximummz->setDecimals(3); + maximummz->setRange(0, 100000); + maximummz->setSingleStep(1); + maximummz->setPrefix("maximum: "); + + mzratiolayout = new QHBoxLayout(); + mzratiolayout->addWidget(minimummz); + mzratiolayout->addWidget(maximummz); + mzratiolayout->setMargin(0); + mzratiowidget = new QWidget(); + mzratiowidget->setLayout(mzratiolayout); + mzratiowidget->setFixedWidth(leftdefaultwidth); + mzratiolabel = new QLabel("m/z Ratio:"); + experimentalspectragridlayout->addWidget(mzratiolabel, 10, 0); + experimentalspectragridlayout->addWidget(mzratiowidget, 10, 1); fwhm = new QDoubleSpinBox(); fwhm->setToolTip("Full width at half maximum. The value is used if the profile spectra are converted into peaklists (mzML and imzML) and if the full isotope patterns of compounds are generated."); @@ -326,14 +347,14 @@ cParametersWidget::cParametersWidget(QWidget* parent) { miscgridlayout = new QGridLayout(); similaritysearch = new QCheckBox(); - similaritysearch->setToolTip("Disable the filtering of sequence candidates by precursor mass. This option can be used to determine a peptide family when a modified peptide is included in a sequence database."); + similaritysearch->setToolTip("Disable the filtering of compounds by precursor mass."); similaritysearch->setFixedWidth(checkboxfieldwidth); similaritysearchlabel = new QLabel("Disable Precursor Mass Filter:"); miscgridlayout->addWidget(similaritysearchlabel, 0, 0); miscgridlayout->addWidget(similaritysearch, 0, 1); internalfragments = new QCheckBox(); - internalfragments->setToolTip("Generate internal fragment ions in theoretical spectra."); + internalfragments->setToolTip("Generate internal fragment ions in theoretical spectra.\nThis feature is currently available only for branch-cyclic peptides."); internalfragments->setFixedWidth(checkboxfieldwidth); internalfragmentslabel = new QLabel("Internal Fragments:"); miscgridlayout->addWidget(internalfragmentslabel, 1, 0); @@ -427,18 +448,18 @@ cParametersWidget::cParametersWidget(QWidget* parent) { theoreticalspectragridlayout->addWidget(iontypes, 4, 1); neutrallosstypes = new cNeutralLossesListWidget(this); - neutrallosstypes->setToolTip("Define and select the types of neutral losses which will be generated in theoretical spectra."); + neutrallosstypes->setToolTip("Define and select the types of neutral losses or chemical elements which will be used when generating theoretical spectra."); neutrallosstypes->setFixedWidth(rightdefaultwidth); - neutrallosstypeslabel = new QLabel("Neutral Losses:"); + neutrallosstypeslabel = new QLabel("Neutral Losses / Chemical Elements:"); theoreticalspectragridlayout->addWidget(neutrallosstypeslabel, 5, 0); theoreticalspectragridlayout->addWidget(neutrallosstypes, 5, 1); maximumcombinedlosses = new QSpinBox(); - maximumcombinedlosses->setToolTip("Maximum number of combined neutral losses."); + maximumcombinedlosses->setToolTip("Maximum number of combined neutral losses or chemical elements."); maximumcombinedlosses->setRange(0, 10000); maximumcombinedlosses->setSingleStep(1); maximumcombinedlosses->setFixedWidth(rightdefaultwidth); - maximumcombinedlosseslabel = new QLabel("Maximum Number of Combined Losses:"); + maximumcombinedlosseslabel = new QLabel("Maximum Number of Combined Losses/Elements:"); theoreticalspectragridlayout->addWidget(maximumcombinedlosseslabel, 6, 0); theoreticalspectragridlayout->addWidget(maximumcombinedlosses, 6, 1); @@ -462,29 +483,74 @@ cParametersWidget::cParametersWidget(QWidget* parent) { theoreticalspectragridlayout->addWidget(generateisotopepattern, 8, 1); minimumpatternsize = new QSpinBox(); - minimumpatternsize->setToolTip("The minimum number of matched peaks in an isotope pattern to be reported. The option \"Generate Full Isotope Patterns\" must be enabled."); + minimumpatternsize->setToolTip("The minimum number of peaks which must be annotated in an isotopic pattern. The option \"Generate Full Isotope Patterns\" must be enabled."); minimumpatternsize->setRange(1, 100); minimumpatternsize->setSingleStep(1); minimumpatternsize->setFixedWidth(rightdefaultwidth); - minimumpatternsizelabel = new QLabel("Minimum Pattern Size:"); + minimumpatternsizelabel = new QLabel("Minimum Number of Isotopic Peaks:"); theoreticalspectragridlayout->addWidget(minimumpatternsizelabel, 9, 0); theoreticalspectragridlayout->addWidget(minimumpatternsize, 9, 1); minimumfeaturesize = new QSpinBox(); - minimumfeaturesize->setToolTip("The minimum number of consecutive scans in which a compound must be identified to be reported (LC-MS data only)."); + minimumfeaturesize->setToolTip("The minimum number of spectra in which a compound must be identified to be reported.\nLC-MS data = the minimum number of consecutive scans;\nMSI data = the minimum number of pixels."); minimumfeaturesize->setRange(1, 10000); minimumfeaturesize->setSingleStep(1); minimumfeaturesize->setFixedWidth(rightdefaultwidth); - minimumfeaturesizelabel = new QLabel("Minimum Feature Size:"); + minimumfeaturesizelabel = new QLabel("Minimum Number of Spectra:"); theoreticalspectragridlayout->addWidget(minimumfeaturesizelabel, 10, 0); theoreticalspectragridlayout->addWidget(minimumfeaturesize, 10, 1); - allionsmustbepresent = new QCheckBox(); - allionsmustbepresent->setToolTip("If enabled, all ions must be annotated in a spectrum for a compound to be reported."); - allionsmustbepresent->setFixedWidth(rightdefaultwidth); - allionsmustbepresentlabel = new QLabel("All Ions Must be Annotated:"); - theoreticalspectragridlayout->addWidget(allionsmustbepresentlabel, 11, 0); - theoreticalspectragridlayout->addWidget(allionsmustbepresent, 11, 1); + minimumiontypes = new QSpinBox(); + minimumiontypes->setToolTip("The minimum number of ion types which must be matched to report a given compound."); + minimumiontypes->setRange(1, 100); + minimumiontypes->setSingleStep(1); + minimumiontypes->setFixedWidth(rightdefaultwidth); + minimumiontypeslabel = new QLabel("Minimum Number of Ion Types:"); + theoreticalspectragridlayout->addWidget(minimumiontypeslabel, 11, 0); + theoreticalspectragridlayout->addWidget(minimumiontypes, 11, 1); + + basicformulacheck = new QCheckBox(); + basicformulacheck->setToolTip("Apply Senior's filtering rules."); + basicformulacheck->setFixedWidth(rightdefaultwidth); + basicformulachecklabel = new QLabel("Basic Formula Check:"); + theoreticalspectragridlayout->addWidget(basicformulachecklabel, 12, 0); + theoreticalspectragridlayout->addWidget(basicformulacheck, 12, 1); + + advancedformulacheck = new QCheckBox(); + advancedformulacheck->setToolTip("Apply advanced filtering rules if molecular formulas of compounds are generated."); + advancedformulacheck->setFixedWidth(rightdefaultwidth); + advancedformulachecklabel = new QLabel("Advanced Formula Check:"); + theoreticalspectragridlayout->addWidget(advancedformulachecklabel, 13, 0); + theoreticalspectragridlayout->addWidget(advancedformulacheck, 13, 1); + + noratiocheck = new QCheckBox(); + noratiocheck->setToolTip("Check if the number of nitrogen atoms is less or equal to the number of oxygen atoms."); + noratiocheck->setFixedWidth(rightdefaultwidth); + noratiochecklabel = new QLabel("N/O Ratio Check:"); + theoreticalspectragridlayout->addWidget(noratiochecklabel, 14, 0); + theoreticalspectragridlayout->addWidget(noratiocheck, 14, 1); + + mzdifftolerance = new QDoubleSpinBox(); + mzdifftolerance->setToolTip("The maximum m/z error of difference between an isotopic peak and the monoisotopic peak in an experimental and theoretical isotopic pattern (0 = disabled) [ppm]."); + mzdifftolerance->setDecimals(3); + mzdifftolerance->setRange(0, 10000); + mzdifftolerance->setSingleStep(1); + mzdifftolerance->setSuffix(" ppm"); + mzdifftolerance->setFixedWidth(rightdefaultwidth); + mzdifftolerancelabel = new QLabel("Isotope m/z Tolerance:"); + theoreticalspectragridlayout->addWidget(mzdifftolerancelabel, 15, 0); + theoreticalspectragridlayout->addWidget(mzdifftolerance, 15, 1); + + intensitytolerance = new QDoubleSpinBox(); + intensitytolerance->setToolTip("The maximum error tolerance of intensities of matched isotopes (0 = disabled) [in % of relative intensity of monoisotopic peak].\nExample:\nIsotope Intensity Tolerance = 10%, Relative Intensity of Monoisotopic Peak = 100% => the tolerance of relative intensities of isotopes is 10%;\nIsotope Intensity Tolerance = 10%, Relative Intensity of Monoisotopic Peak = 50% => the tolerance of relative intensities of isotopes is 5%; etc."); + intensitytolerance->setDecimals(3); + intensitytolerance->setRange(0, 100); + intensitytolerance->setSingleStep(1); + intensitytolerance->setSuffix(" %"); + intensitytolerance->setFixedWidth(rightdefaultwidth); + intensitytolerancelabel = new QLabel("Isotope Intensity Tolerance:"); + theoreticalspectragridlayout->addWidget(intensitytolerancelabel, 16, 0); + theoreticalspectragridlayout->addWidget(intensitytolerance, 16, 1); theoreticalspectragroupbox = new QGroupBox("Theoretical Spectrum/Spectra"); theoreticalspectragroupbox->setLayout(theoreticalspectragridlayout); @@ -512,26 +578,36 @@ cParametersWidget::cParametersWidget(QWidget* parent) { searchedsequenceNtermmodif = new QLineEdit(); searchedsequenceNtermmodif->setToolTip("A name of an N-terminal modification which belongs to the searched peptide. The name must be defined in \"N-/C-terminal Modifications File\"."); - searchedsequenceNtermmodif->setFixedWidth(searchedsequencedefaultwidth); - searchedsequenceNtermmodiflabel = new QLabel("N-terminal Modification:"); - searchedsequencegridlayout->addWidget(searchedsequenceNtermmodiflabel, 1, 0); - searchedsequencegridlayout->addWidget(searchedsequenceNtermmodif, 1, 1); + searchedsequenceNtermmodif->setPlaceholderText("N-terminal"); searchedsequenceCtermmodif = new QLineEdit(); searchedsequenceCtermmodif->setToolTip("A name of a C-terminal modification which belongs to the searched peptide. The name must be defined in \"N-/C-terminal Modifications File\"."); - searchedsequenceCtermmodif->setFixedWidth(searchedsequencedefaultwidth); - searchedsequenceCtermmodiflabel = new QLabel("C-terminal Modification:"); - searchedsequencegridlayout->addWidget(searchedsequenceCtermmodiflabel, 2, 0); - searchedsequencegridlayout->addWidget(searchedsequenceCtermmodif, 2, 1); + searchedsequenceCtermmodif->setPlaceholderText("C-terminal"); searchedsequenceTmodif = new QLineEdit(); searchedsequenceTmodif->setToolTip("A name of an N-terminal or C-terminal modification which belongs to a branch of a searched peptide (branched and branch-cyclic peptides only). The name must be defined in \"N-/C-terminal Modifications File\"."); - searchedsequenceTmodif->setFixedWidth(searchedsequencedefaultwidth); - searchedsequenceTmodiflabel = new QLabel("Branch Modification:"); - searchedsequencegridlayout->addWidget(searchedsequenceTmodiflabel, 3, 0); - searchedsequencegridlayout->addWidget(searchedsequenceTmodif, 3, 1); - - searchedsequencegroupbox = new QGroupBox("Searched Sequence"); + searchedsequenceTmodif->setPlaceholderText("Branch"); + + searchedsequencemodiflayout = new QHBoxLayout(); + searchedsequencemodiflayout->addWidget(searchedsequenceNtermmodif); + searchedsequencemodiflayout->addWidget(searchedsequenceCtermmodif); + searchedsequencemodiflayout->addWidget(searchedsequenceTmodif); + searchedsequencemodiflayout->setMargin(0); + searchedsequencemodifwidget = new QWidget(); + searchedsequencemodifwidget->setLayout(searchedsequencemodiflayout); + searchedsequencemodifwidget->setFixedWidth(searchedsequencedefaultwidth); + searchedsequencemodiflabel = new QLabel("Modifications:"); + searchedsequencegridlayout->addWidget(searchedsequencemodiflabel, 1, 0); + searchedsequencegridlayout->addWidget(searchedsequencemodifwidget, 1, 1); + + searchedsequenceformula = new QLineEdit(); + searchedsequenceformula->setToolTip("Formula of searched sequence."); + searchedsequenceformula->setFixedWidth(searchedsequencedefaultwidth); + searchedsequenceformulalabel = new QLabel("Formula:"); + searchedsequencegridlayout->addWidget(searchedsequenceformulalabel, 2, 0); + searchedsequencegridlayout->addWidget(searchedsequenceformula, 2, 1); + + searchedsequencegroupbox = new QGroupBox("Searched Sequence/Compound"); searchedsequencegroupbox->setLayout(searchedsequencegridlayout); @@ -566,7 +642,7 @@ cParametersWidget::cParametersWidget(QWidget* parent) { setLayout(vlayout); - resize(1280, 780); + resize(defaultwinsizex, defaultwinsizey); connect(load, SIGNAL(released()), this, SLOT(loadSettings())); connect(save, SIGNAL(released()), this, SLOT(saveSettings())); @@ -593,24 +669,26 @@ cParametersWidget::cParametersWidget(QWidget* parent) { #if OS_TYPE == WIN lastdirloadsettings = "./Settings/"; lastdirsavesettings = "./Settings/"; - lastdirselectpeaklist = "./PeakLists/"; - lastdirselectbricksdatabase = "./BrickDatabases/"; - lastdirselectmodifications = "./Modifications/"; - lastdirselectsequencedatabase = "./SequenceDatabases/"; + + defaultdirselectpeaklist = "./PeakLists/"; + defaultdirselectbricksdatabase = "./BrickDatabases/"; + defaultdirselectmodifications = "./Modifications/"; + defaultdirselectsequencedatabase = "./SequenceDatabases/"; #else lastdirloadsettings = installdir + "Settings/"; lastdirsavesettings = installdir + "Settings/"; - lastdirselectpeaklist = installdir + "PeakLists/"; - lastdirselectbricksdatabase = installdir + "BrickDatabases/"; - lastdirselectmodifications = installdir + "Modifications/"; - lastdirselectsequencedatabase = installdir + "SequenceDatabases/"; + + defaultdirselectpeaklist = installdir + "PeakLists/"; + defaultdirselectbricksdatabase = installdir + "BrickDatabases/"; + defaultdirselectmodifications = installdir + "Modifications/"; + defaultdirselectsequencedatabase = installdir + "SequenceDatabases/"; #endif + mode->setCurrentIndex(dereplication); } cParametersWidget::~cParametersWidget() { - delete stdbuttons; delete load; delete save; @@ -648,8 +726,11 @@ cParametersWidget::~cParametersWidget() { delete minimumrelativeintensitythreshold; delete minimumabsoluteintensitythresholdlabel; delete minimumabsoluteintensitythreshold; - delete minimummzlabel; + delete mzratiolabel; delete minimummz; + delete maximummz; + delete mzratiolayout; + delete mzratiowidget; delete fwhmlabel; delete fwhm; delete experimentalspectragridlayout; @@ -719,8 +800,18 @@ cParametersWidget::~cParametersWidget() { delete minimumpatternsize; delete minimumfeaturesizelabel; delete minimumfeaturesize; - delete allionsmustbepresentlabel; - delete allionsmustbepresent; + delete minimumiontypeslabel; + delete minimumiontypes; + delete basicformulachecklabel; + delete basicformulacheck; + delete advancedformulachecklabel; + delete advancedformulacheck; + delete noratiochecklabel; + delete noratiocheck; + delete mzdifftolerancelabel; + delete mzdifftolerance; + delete intensitytolerancelabel; + delete intensitytolerance; delete theoreticalspectragridlayout; delete theoreticalspectragroupbox; @@ -729,12 +820,14 @@ cParametersWidget::~cParametersWidget() { delete searchedsequencebutton; delete searchedsequencelayout; delete searchedsequencewidget; - delete searchedsequenceNtermmodiflabel; + delete searchedsequencemodiflabel; delete searchedsequenceNtermmodif; - delete searchedsequenceCtermmodiflabel; delete searchedsequenceCtermmodif; - delete searchedsequenceTmodiflabel; delete searchedsequenceTmodif; + delete searchedsequencemodiflayout; + delete searchedsequencemodifwidget; + delete searchedsequenceformulalabel; + delete searchedsequenceformula; delete searchedsequencegridlayout; delete searchedsequencegroupbox; @@ -774,7 +867,7 @@ void cParametersWidget::closeEvent(QCloseEvent *event) { void cParametersWidget::setSequence(int peptidetypeindex, QString sequence) { - if ((eModeType)mode->currentIndex() == dereplication) { + if (((eModeType)mode->currentIndex() == dereplication) || ((eModeType)mode->currentIndex() == compoundsearch)) { mode->setCurrentIndex(denovoengine); } peptidetype->setCurrentIndex(peptidetypeindex); @@ -783,7 +876,7 @@ void cParametersWidget::setSequence(int peptidetypeindex, QString sequence) { void cParametersWidget::setTag(int peptidetypeindex, QString tag) { - if ((eModeType)mode->currentIndex() == dereplication) { + if (((eModeType)mode->currentIndex() == dereplication) || ((eModeType)mode->currentIndex() == compoundsearch)) { mode->setCurrentIndex(denovoengine); } peptidetype->setCurrentIndex(peptidetypeindex); @@ -809,6 +902,9 @@ void cParametersWidget::keyPressEvent(QKeyEvent *event) { emit clearIonSelection(); emit setHCON(); } + if (mode->currentIndex() == (int)compoundsearch) { + emit setHCON(); + } } if (event->key() == Qt::Key_F1) { @@ -836,7 +932,7 @@ void cParametersWidget::loadSettings() { save->setText(QString(" Save '") + QString(settingsfile.toStdString().substr(settingsfile.toStdString().rfind('/') + 1, settingsfile.toStdString().size()).c_str()) + QString("' ")); QSettings settings(settingsfile, QSettings::IniFormat); - mode->setCurrentIndex(settings.value("mode", 0).toInt()); + mode->setCurrentIndex(settings.value("mode", 3).toInt()); maximumnumberofthreads->setValue(settings.value("maximumnumberofthreads", 1).toInt()); peptidetype->setCurrentIndex(settings.value("peptidetype", 0).toInt()); @@ -855,6 +951,7 @@ void cParametersWidget::loadSettings() { minimumrelativeintensitythreshold->setValue(settings.value("minimumrelativeintensitythreshold", 1).toDouble()); minimumabsoluteintensitythreshold->setValue(settings.value("minimumabsoluteintensitythreshold", 0).toUInt()); minimummz->setValue(settings.value("minimummz", 150).toDouble()); + maximummz->setValue(settings.value("maximummz", 0).toDouble()); fwhm->setValue(settings.value("fwhm", 0.05).toDouble()); brickdatabaseline->setText(settings.value("brickdatabase", "").toString()); @@ -904,12 +1001,18 @@ void cParametersWidget::loadSettings() { settings.value("generateisotopepattern", 0).toInt() == 0 ? generateisotopepattern->setChecked(false) : generateisotopepattern->setChecked(true); minimumpatternsize->setValue(settings.value("minimumpatternsize", 1).toInt()); minimumfeaturesize->setValue(settings.value("minimumfeaturesize", 1).toInt()); - settings.value("allionsmustbepresent", 0).toInt() == 0 ? allionsmustbepresent->setChecked(false) : allionsmustbepresent->setChecked(true); + minimumiontypes->setValue(settings.value("minimumiontypes", 1).toInt()); + settings.value("basicformulacheck", 1).toInt() == 0 ? basicformulacheck->setChecked(false) : basicformulacheck->setChecked(true); + settings.value("advancedformulacheck", 1).toInt() == 0 ? advancedformulacheck->setChecked(false) : advancedformulacheck->setChecked(true); + settings.value("noratiocheck", 1).toInt() == 0 ? noratiocheck->setChecked(false) : noratiocheck->setChecked(true); + mzdifftolerance->setValue(settings.value("mzdifftolerance", 0).toDouble()); + intensitytolerance->setValue(settings.value("intensitytolerance", 0).toDouble()); searchedsequenceline->setText(settings.value("searchedsequence", "").toString()); searchedsequenceNtermmodif->setText(settings.value("searchedsequenceNtermmodif", "").toString()); searchedsequenceCtermmodif->setText(settings.value("searchedsequenceCtermmodif", "").toString()); searchedsequenceTmodif->setText(settings.value("searchedsequenceTmodif", "").toString()); + searchedsequenceformula->setText(settings.value("searchedsequenceformula", "").toString()); } } @@ -942,6 +1045,7 @@ void cParametersWidget::saveSettings() { settings.setValue("minimumrelativeintensitythreshold", minimumrelativeintensitythreshold->value()); settings.setValue("minimumabsoluteintensitythreshold", minimumabsoluteintensitythreshold->value()); settings.setValue("minimummz", minimummz->value()); + settings.setValue("maximummz", maximummz->value()); settings.setValue("fwhm", fwhm->value()); settings.setValue("brickdatabase", brickdatabaseline->text()); @@ -983,12 +1087,18 @@ void cParametersWidget::saveSettings() { generateisotopepattern->isChecked() ? settings.setValue("generateisotopepattern", 1) : settings.setValue("generateisotopepattern", 0); settings.setValue("minimumpatternsize", minimumpatternsize->value()); settings.setValue("minimumfeaturesize", minimumfeaturesize->value()); - allionsmustbepresent->isChecked() ? settings.setValue("allionsmustbepresent", 1) : settings.setValue("allionsmustbepresent", 0); + settings.setValue("minimumiontypes", minimumiontypes->value()); + basicformulacheck->isChecked() ? settings.setValue("basicformulacheck", 1) : settings.setValue("basicformulacheck", 0); + advancedformulacheck->isChecked() ? settings.setValue("advancedformulacheck", 1) : settings.setValue("advancedformulacheck", 0); + noratiocheck->isChecked() ? settings.setValue("noratiocheck", 1) : settings.setValue("noratiocheck", 0); + settings.setValue("mzdifftolerance", mzdifftolerance->value()); + settings.setValue("intensitytolerance", intensitytolerance->value()); settings.setValue("searchedsequence", searchedsequenceline->text()); settings.setValue("searchedsequenceNtermmodif", searchedsequenceNtermmodif->text()); settings.setValue("searchedsequenceCtermmodif", searchedsequenceCtermmodif->text()); settings.setValue("searchedsequenceTmodif", searchedsequenceTmodif->text()); + settings.setValue("searchedsequenceformula", searchedsequenceformula->text()); } @@ -1007,44 +1117,60 @@ void cParametersWidget::saveSettingsAs() { void cParametersWidget::peaklistButtonReleased() { + QString currentdir = peaklistline->text(); + if (!checkFile(currentdir.toStdString())) { + currentdir = defaultdirselectpeaklist; + } + #if OS_TYPE != WIN - QString filename = QFileDialog::getOpenFileName(this, tr("Select Peaklist..."), lastdirselectpeaklist, tr("Peak Lists (*.txt *.mgf *.mzML *.mzXML *.imzML)")); + QString filename = QFileDialog::getOpenFileName(this, tr("Select Peaklist..."), currentdir, tr("Peak Lists (*.txt *.mgf *.mzML *.mzXML *.imzML)")); #else - QString filename = QFileDialog::getOpenFileName(this, tr("Select Peaklist..."), lastdirselectpeaklist, tr("Peak Lists (*.txt *.mgf *.mzML *.mzXML *.imzML *.baf *.raw *.dat *.mis ser)")); + QString filename = QFileDialog::getOpenFileName(this, tr("Select Peaklist..."), currentdir, tr("Peak Lists (*.txt *.mgf *.mzML *.mzXML *.imzML *.baf *.raw *.dat *.mis ser)")); #endif if (!filename.isEmpty()) { - lastdirselectpeaklist = filename; peaklistline->setText(filename); } } void cParametersWidget::brickDatabaseButtonReleased() { - QString filename = QFileDialog::getOpenFileName(this, tr("Select Building Blocks Database..."), lastdirselectbricksdatabase, tr("Text Files (*.txt)")); + QString currentdir = brickdatabaseline->text(); + if (!checkFile(currentdir.toStdString())) { + currentdir = defaultdirselectbricksdatabase; + } + + QString filename = QFileDialog::getOpenFileName(this, tr("Select Building Blocks Database..."), currentdir, tr("Text Files (*.txt)")); if (!filename.isEmpty()) { - lastdirselectbricksdatabase = filename; brickdatabaseline->setText(filename); } } void cParametersWidget::modificationsButtonReleased() { - QString filename = QFileDialog::getOpenFileName(this, tr("Select Modifications File..."), lastdirselectmodifications, tr("Text Files (*.txt)")); + QString currentdir = modificationsline->text(); + if (!checkFile(currentdir.toStdString())) { + currentdir = defaultdirselectmodifications; + } + + QString filename = QFileDialog::getOpenFileName(this, tr("Select Modifications File..."), currentdir, tr("Text Files (*.txt)")); if (!filename.isEmpty()) { - lastdirselectmodifications = filename; modificationsline->setText(filename); } } void cParametersWidget::sequenceDatabaseButtonReleased() { - QString filename = QFileDialog::getOpenFileName(this, tr("Select Sequence Database..."), lastdirselectsequencedatabase, tr("Text Files (*.txt)")); + QString currentdir = sequencedatabaseline->text(); + if (!checkFile(currentdir.toStdString())) { + currentdir = defaultdirselectsequencedatabase; + } + + QString filename = QFileDialog::getOpenFileName(this, tr("Select Sequence Database..."), currentdir, tr("Text Files (*.txt)")); if (!filename.isEmpty()) { - lastdirselectsequencedatabase = filename; sequencedatabaseline->setText(filename); } } @@ -1065,7 +1191,7 @@ bool cParametersWidget::updateParameters() { return false; } - if ((brickdatabaseline->text().toStdString().compare("") == 0) && (((eModeType)mode->currentIndex() == denovoengine) || ((eModeType)mode->currentIndex() == singlecomparison) || ((eModeType)mode->currentIndex() == databasesearch))) { + if ((brickdatabaseline->text().toStdString().compare("") == 0) && (((eModeType)mode->currentIndex() == denovoengine) || (((eModeType)mode->currentIndex() == databasesearch) && ((ePeptideType)peptidetype->currentIndex() != other)) || (((eModeType)mode->currentIndex() == singlecomparison) && ((ePeptideType)peptidetype->currentIndex() != other)))) { errstr = "A database of building blocks must be specified!"; msgBox.setText(errstr); msgBox.exec(); @@ -1093,6 +1219,43 @@ bool cParametersWidget::updateParameters() { return false; } + if (((eModeType)mode->currentIndex() == compoundsearch) && (maximummz->value() <= minimummz->value())) { + errstr = "The maximum m/z ratio must be bigger than the minimum m/z ratio!"; + msgBox.setText(errstr); + msgBox.exec(); + return false; + } + + if ((eModeType)mode->currentIndex() == denovoengine) { + if ((ePeptideType)peptidetype->currentIndex() == other) { + errstr = "The peptide type 'Other' cannot be used in this mode!"; + msgBox.setText(errstr); + msgBox.exec(); + return false; + } + } + + if ((eModeType)mode->currentIndex() == singlecomparison) { + if ((ePeptideType)peptidetype->currentIndex() == other) { + if (searchedsequenceformula->text().isEmpty()) { + errstr = "The field 'Formula' is empty!"; + msgBox.setText(errstr); + msgBox.exec(); + return false; + } + + tmpstring = searchedsequenceformula->text().toStdString(); + tmpformula.setFormula(tmpstring, false); + if (!tmpformula.isValid(errmsg)) { + errstr = "The field 'Formula' is not valid!\n\n"; + errstr += errmsg.c_str(); + msgBox.setText(errstr); + msgBox.exec(); + return false; + } + } + } + /* if ((maximumbricksincombinationmiddle->value() < 2) && ((eModeType)mode->currentIndex() == denovoengine) && (((ePeptideType)peptidetype->currentIndex() == branched) || ((ePeptideType)peptidetype->currentIndex() == branchcyclic))) { errstr = "'Maximum Number of Combined Blocks (middle)' must be at least 2 when a branched or a branch-cyclic peptide is searched! (One block represents a branched residue, the other block(s) corresponds to a branch.)"; @@ -1104,8 +1267,12 @@ bool cParametersWidget::updateParameters() { for (int i = 0; i < neutrallosstypes->getList()->count(); i++) { tmpstring = neutrallosstypes->getList()->item(i)->text().toStdString(); - tmpformula.setFormula(tmpstring, false); + + if (tmpstring.rfind(':') != string::npos) { + tmpstring = tmpstring.substr(0, tmpstring.rfind(':')); + } + tmpformula.setFormula(tmpstring, false); if (!tmpformula.isValid(errmsg)) { errstr = "A molecular formula of a neutral loss is not valid!\n\n"; errstr += errmsg.c_str(); @@ -1130,6 +1297,7 @@ bool cParametersWidget::updateParameters() { parameters.minimumrelativeintensitythreshold = minimumrelativeintensitythreshold->value(); parameters.minimumabsoluteintensitythreshold = minimumabsoluteintensitythreshold->value(); parameters.minimummz = minimummz->value(); + parameters.maximummz = maximummz->value(); parameters.fwhm = fwhm->value(); parameters.bricksdatabasefilename = brickdatabaseline->text().toStdString(); @@ -1155,35 +1323,37 @@ bool cParametersWidget::updateParameters() { parameters.originalsequencetag = parameters.sequencetag; parameters.ionsfortheoreticalspectra.clear(); - int start; - - if ((eModeType)mode->currentIndex() == dereplication) { + + int start = -1; + if (((eModeType)mode->currentIndex() == dereplication) || ((eModeType)mode->currentIndex() == compoundsearch)) { start = ms_Hplus; } else { - switch ((ePeptideType)peptidetype->currentIndex()) - { - case linear: - case branched: - case cyclic: - case branchcyclic: - start = a_ion; - break; - case linearpolyketide: - start = l1h_ion; - break; - case cyclicpolyketide: - start = l1h_ion; // l0h_ion; - break; - case other: - default: - break; + switch ((ePeptideType)peptidetype->currentIndex()) { + case linear: + case branched: + case cyclic: + case branchcyclic: + start = a_ion; + break; + case linearpolyketide: + start = l1h_ion; + break; + case cyclicpolyketide: + start = l1h_ion; // l0h_ion; + break; + case other: + break; + default: + break; } } - for (int i = 0; i < iontypes->getList()->count(); i++) { - if (iontypes->getList()->item(i)->isSelected()) { - parameters.ionsfortheoreticalspectra.push_back((eFragmentIonType)(i + start)); + if (start != -1) { + for (int i = 0; i < iontypes->getList()->count(); i++) { + if (iontypes->getList()->item(i)->isSelected()) { + parameters.ionsfortheoreticalspectra.push_back((eFragmentIonType)(i + start)); + } } } @@ -1205,13 +1375,19 @@ bool cParametersWidget::updateParameters() { parameters.generateisotopepattern = generateisotopepattern->isChecked(); parameters.minimumpatternsize = minimumpatternsize->value(); parameters.minimumfeaturesize = minimumfeaturesize->value(); - parameters.allionsmustbepresent = allionsmustbepresent->isChecked(); + parameters.minimumiontypes = minimumiontypes->value(); + parameters.basicformulacheck = basicformulacheck->isChecked(); + parameters.advancedformulacheck = advancedformulacheck->isChecked(); + parameters.noratiocheck = noratiocheck->isChecked(); + parameters.mzdifftolerance = mzdifftolerance->value(); + parameters.intensitytolerance = intensitytolerance->value(); parameters.searchedsequence = searchedsequenceline->text().toStdString(); parameters.originalsearchedsequence = parameters.searchedsequence; parameters.searchedsequenceNtermmodif = searchedsequenceNtermmodif->text().toStdString(); parameters.searchedsequenceCtermmodif = searchedsequenceCtermmodif->text().toStdString(); parameters.searchedsequenceTmodif = searchedsequenceTmodif->text().toStdString(); + parameters.searchedsequenceformula = searchedsequenceformula->text().toStdString(); parameters.updateFragmentDefinitions(); @@ -1244,6 +1420,7 @@ void cParametersWidget::restoreParameters() { minimumrelativeintensitythreshold->setValue(parameters.minimumrelativeintensitythreshold); minimumabsoluteintensitythreshold->setValue(parameters.minimumabsoluteintensitythreshold); minimummz->setValue(parameters.minimummz); + maximummz->setValue(parameters.maximummz); fwhm->setValue(parameters.fwhm); brickdatabaseline->setText(parameters.bricksdatabasefilename.c_str()); @@ -1266,33 +1443,35 @@ void cParametersWidget::restoreParameters() { hitsreported->setValue(parameters.hitsreported); sequencetag->setText(parameters.sequencetag.c_str()); - int start; - if (parameters.mode == dereplication) { + int start = -1; + if ((parameters.mode == dereplication) || (parameters.mode == compoundsearch)) { start = ms_Hplus; } else { - switch (parameters.peptidetype) - { - case linear: - case branched: - case cyclic: - case branchcyclic: - start = a_ion; - break; - case linearpolyketide: - start = l1h_ion; - break; - case cyclicpolyketide: - start = l1h_ion; // l0h_ion; - break; - case other: - default: - break; + switch (parameters.peptidetype) { + case linear: + case branched: + case cyclic: + case branchcyclic: + start = a_ion; + break; + case linearpolyketide: + start = l1h_ion; + break; + case cyclicpolyketide: + start = l1h_ion; // l0h_ion; + break; + case other: + break; + default: + break; } } - for (int i = 0; i < (int)parameters.ionsfortheoreticalspectra.size(); i++) { - iontypes->getList()->item(parameters.ionsfortheoreticalspectra[i] - start)->setSelected(true); + if (start != -1) { + for (int i = 0; i < (int)parameters.ionsfortheoreticalspectra.size(); i++) { + iontypes->getList()->item(parameters.ionsfortheoreticalspectra[i] - start)->setSelected(true); + } } neutrallosstypes->getList()->clear(); @@ -1310,12 +1489,18 @@ void cParametersWidget::restoreParameters() { generateisotopepattern->setChecked(parameters.generateisotopepattern); minimumpatternsize->setValue(parameters.minimumpatternsize); minimumfeaturesize->setValue(parameters.minimumfeaturesize); - allionsmustbepresent->setChecked(parameters.allionsmustbepresent); + minimumiontypes->setValue(parameters.minimumiontypes); + basicformulacheck->setChecked(parameters.basicformulacheck); + advancedformulacheck->setChecked(parameters.advancedformulacheck); + noratiocheck->setChecked(parameters.noratiocheck); + mzdifftolerance->setValue(parameters.mzdifftolerance); + intensitytolerance->setValue(parameters.intensitytolerance); searchedsequenceline->setText(parameters.searchedsequence.c_str()); searchedsequenceNtermmodif->setText(parameters.searchedsequenceNtermmodif.c_str()); searchedsequenceCtermmodif->setText(parameters.searchedsequenceCtermmodif.c_str()); searchedsequenceTmodif->setText(parameters.searchedsequenceTmodif.c_str()); + searchedsequenceformula->setText(parameters.searchedsequenceformula.c_str()); settingsfile = oldsettingsfile; if (settingsfile.toStdString().compare("") == 0) { @@ -1331,261 +1516,452 @@ void cParametersWidget::restoreParameters() { void cParametersWidget::updateSettingsWhenPeptideTypeChanged(int index) { - if (!(((eModeType)mode->currentIndex() != oldmodetype) && ((eModeType)mode->currentIndex() != dereplication) && (oldmodetype != dereplication))) { + if (!(((eModeType)mode->currentIndex() != oldmodetype) + && (((eModeType)mode->currentIndex() == denovoengine) || ((eModeType)mode->currentIndex() == singlecomparison) || ((eModeType)mode->currentIndex() == databasesearch)) + && ((oldmodetype == denovoengine) || (oldmodetype == singlecomparison) || (oldmodetype == databasesearch)) + )) { resetFragmentIonTypes(); } - switch ((ePeptideType)index) - { - case linear: - modificationsline->setDisabled(false); - modificationsbutton->setDisabled(false); - cyclicnterminus->setDisabled(false); - cycliccterminus->setDisabled(false); - internalfragments->setDisabled(true); - enablescrambling->setDisabled(true); - regularblocksorder->setDisabled(true); - searchedsequenceNtermmodif->setDisabled(false); - searchedsequenceCtermmodif->setDisabled(false); - searchedsequenceTmodif->setDisabled(true); - break; - case cyclic: - modificationsline->setDisabled(true); - modificationsbutton->setDisabled(true); - cyclicnterminus->setDisabled(true); - cycliccterminus->setDisabled(true); - internalfragments->setDisabled(true); - enablescrambling->setDisabled(false); - regularblocksorder->setDisabled(true); - searchedsequenceNtermmodif->setDisabled(true); - searchedsequenceCtermmodif->setDisabled(true); - searchedsequenceTmodif->setDisabled(true); - break; - case branched: - modificationsline->setDisabled(false); - modificationsbutton->setDisabled(false); - cyclicnterminus->setDisabled(true); - cycliccterminus->setDisabled(true); - internalfragments->setDisabled(true); - enablescrambling->setDisabled(true); - regularblocksorder->setDisabled(true); - searchedsequenceNtermmodif->setDisabled(false); - searchedsequenceCtermmodif->setDisabled(false); - searchedsequenceTmodif->setDisabled(false); - break; - case branchcyclic: - modificationsline->setDisabled(false); - modificationsbutton->setDisabled(false); - cyclicnterminus->setDisabled(true); - cycliccterminus->setDisabled(true); - internalfragments->setDisabled(false); - enablescrambling->setDisabled(true); - regularblocksorder->setDisabled(true); - searchedsequenceNtermmodif->setDisabled(true); - searchedsequenceCtermmodif->setDisabled(true); - searchedsequenceTmodif->setDisabled(false); - break; - case linearpolyketide: - modificationsline->setDisabled(false); - modificationsbutton->setDisabled(false); - cyclicnterminus->setDisabled(false); - cycliccterminus->setDisabled(false); - internalfragments->setDisabled(true); - enablescrambling->setDisabled(true); - regularblocksorder->setDisabled(false); - searchedsequenceNtermmodif->setDisabled(false); - searchedsequenceCtermmodif->setDisabled(false); - searchedsequenceTmodif->setDisabled(true); - break; - case cyclicpolyketide: - modificationsline->setDisabled(true); - modificationsbutton->setDisabled(true); - cyclicnterminus->setDisabled(true); - cycliccterminus->setDisabled(true); - internalfragments->setDisabled(true); - enablescrambling->setDisabled(true); - regularblocksorder->setDisabled(false); - searchedsequenceNtermmodif->setDisabled(true); - searchedsequenceCtermmodif->setDisabled(true); - searchedsequenceTmodif->setDisabled(true); - break; - case other: - break; - default: - break; + bool denovostate = (mode->currentIndex() == denovoengine) ? false : true; + bool sequencetagstate = (mode->currentIndex() == denovoengine) || (mode->currentIndex() == databasesearch) ? false : true; + + switch ((ePeptideType)index) { + case linear: + brickdatabaseline->setDisabled(false); + brickdatabasebutton->setDisabled(false); + maximumbricksincombinationbegin->setDisabled(denovostate); + maximumbricksincombinationmiddle->setDisabled(denovostate); + maximumbricksincombinationend->setDisabled(denovostate); + blindedges->setDisabled(denovostate); + maximumcumulativemass->setDisabled(denovostate); + modificationsline->setDisabled(false); + modificationsbutton->setDisabled(false); + cyclicnterminus->setDisabled(false); + cycliccterminus->setDisabled(false); + internalfragments->setDisabled(true); + enablescrambling->setDisabled(true); + regularblocksorder->setDisabled(true); + sequencetag->setDisabled(sequencetagstate); + iontypes->setDisabled(false); + searchedsequenceline->setDisabled(false); + searchedsequencebutton->setDisabled(false); + searchedsequenceNtermmodif->setDisabled(false); + searchedsequenceCtermmodif->setDisabled(false); + searchedsequenceTmodif->setDisabled(true); + searchedsequenceformula ->setDisabled(true); + break; + case cyclic: + brickdatabaseline->setDisabled(false); + brickdatabasebutton->setDisabled(false); + maximumbricksincombinationbegin->setDisabled(denovostate); + maximumbricksincombinationmiddle->setDisabled(denovostate); + maximumbricksincombinationend->setDisabled(denovostate); + blindedges->setDisabled(denovostate); + maximumcumulativemass->setDisabled(denovostate); + modificationsline->setDisabled(true); + modificationsbutton->setDisabled(true); + cyclicnterminus->setDisabled(true); + cycliccterminus->setDisabled(true); + internalfragments->setDisabled(true); + enablescrambling->setDisabled(false); + regularblocksorder->setDisabled(true); + sequencetag->setDisabled(sequencetagstate); + iontypes->setDisabled(false); + searchedsequenceline->setDisabled(false); + searchedsequencebutton->setDisabled(false); + searchedsequenceNtermmodif->setDisabled(true); + searchedsequenceCtermmodif->setDisabled(true); + searchedsequenceTmodif->setDisabled(true); + searchedsequenceformula->setDisabled(true); + break; + case branched: + brickdatabaseline->setDisabled(false); + brickdatabasebutton->setDisabled(false); + maximumbricksincombinationbegin->setDisabled(denovostate); + maximumbricksincombinationmiddle->setDisabled(denovostate); + maximumbricksincombinationend->setDisabled(denovostate); + blindedges->setDisabled(denovostate); + maximumcumulativemass->setDisabled(denovostate); + modificationsline->setDisabled(false); + modificationsbutton->setDisabled(false); + cyclicnterminus->setDisabled(true); + cycliccterminus->setDisabled(true); + internalfragments->setDisabled(true); + enablescrambling->setDisabled(true); + regularblocksorder->setDisabled(true); + sequencetag->setDisabled(sequencetagstate); + iontypes->setDisabled(false); + searchedsequenceline->setDisabled(false); + searchedsequencebutton->setDisabled(false); + searchedsequenceNtermmodif->setDisabled(false); + searchedsequenceCtermmodif->setDisabled(false); + searchedsequenceTmodif->setDisabled(false); + searchedsequenceformula->setDisabled(true); + break; + case branchcyclic: + brickdatabaseline->setDisabled(false); + brickdatabasebutton->setDisabled(false); + maximumbricksincombinationbegin->setDisabled(denovostate); + maximumbricksincombinationmiddle->setDisabled(denovostate); + maximumbricksincombinationend->setDisabled(denovostate); + blindedges->setDisabled(denovostate); + maximumcumulativemass->setDisabled(denovostate); + modificationsline->setDisabled(false); + modificationsbutton->setDisabled(false); + cyclicnterminus->setDisabled(true); + cycliccterminus->setDisabled(true); + internalfragments->setDisabled(false); + enablescrambling->setDisabled(true); + regularblocksorder->setDisabled(true); + sequencetag->setDisabled(sequencetagstate); + iontypes->setDisabled(false); + searchedsequenceline->setDisabled(false); + searchedsequencebutton->setDisabled(false); + searchedsequenceNtermmodif->setDisabled(true); + searchedsequenceCtermmodif->setDisabled(true); + searchedsequenceTmodif->setDisabled(false); + searchedsequenceformula->setDisabled(true); + break; + case linearpolyketide: + brickdatabaseline->setDisabled(false); + brickdatabasebutton->setDisabled(false); + maximumbricksincombinationbegin->setDisabled(denovostate); + maximumbricksincombinationmiddle->setDisabled(denovostate); + maximumbricksincombinationend->setDisabled(denovostate); + blindedges->setDisabled(denovostate); + maximumcumulativemass->setDisabled(denovostate); + modificationsline->setDisabled(false); + modificationsbutton->setDisabled(false); + cyclicnterminus->setDisabled(false); + cycliccterminus->setDisabled(false); + internalfragments->setDisabled(true); + enablescrambling->setDisabled(true); + regularblocksorder->setDisabled(false); + sequencetag->setDisabled(sequencetagstate); + iontypes->setDisabled(false); + searchedsequenceline->setDisabled(false); + searchedsequencebutton->setDisabled(false); + searchedsequenceNtermmodif->setDisabled(false); + searchedsequenceCtermmodif->setDisabled(false); + searchedsequenceTmodif->setDisabled(true); + searchedsequenceformula->setDisabled(true); + break; + case cyclicpolyketide: + brickdatabaseline->setDisabled(false); + brickdatabasebutton->setDisabled(false); + maximumbricksincombinationbegin->setDisabled(denovostate); + maximumbricksincombinationmiddle->setDisabled(denovostate); + maximumbricksincombinationend->setDisabled(denovostate); + blindedges->setDisabled(denovostate); + maximumcumulativemass->setDisabled(denovostate); + modificationsline->setDisabled(true); + modificationsbutton->setDisabled(true); + cyclicnterminus->setDisabled(true); + cycliccterminus->setDisabled(true); + internalfragments->setDisabled(true); + enablescrambling->setDisabled(true); + regularblocksorder->setDisabled(false); + sequencetag->setDisabled((mode->currentIndex() == denovoengine) || (mode->currentIndex() == databasesearch) ? false : true); + iontypes->setDisabled(false); + searchedsequenceline->setDisabled(false); + searchedsequencebutton->setDisabled(false); + searchedsequenceNtermmodif->setDisabled(true); + searchedsequenceCtermmodif->setDisabled(true); + searchedsequenceTmodif->setDisabled(true); + searchedsequenceformula->setDisabled(true); + break; + case other: + brickdatabaseline->setDisabled(true); + brickdatabasebutton->setDisabled(true); + maximumbricksincombinationbegin->setDisabled(true); + maximumbricksincombinationmiddle->setDisabled(true); + maximumbricksincombinationend->setDisabled(true); + blindedges->setDisabled(true); + maximumcumulativemass->setDisabled(true); + modificationsline->setDisabled(true); + modificationsbutton->setDisabled(true); + cyclicnterminus->setDisabled(true); + cycliccterminus->setDisabled(true); + internalfragments->setDisabled(true); + enablescrambling->setDisabled(true); + regularblocksorder->setDisabled(true); + sequencetag->setDisabled(true); + iontypes->setDisabled(true); + searchedsequenceline->setDisabled(true); + searchedsequencebutton->setDisabled(true); + searchedsequenceNtermmodif->setDisabled(true); + searchedsequenceCtermmodif->setDisabled(true); + searchedsequenceTmodif->setDisabled(true); + searchedsequenceformula->setDisabled(false); + break; + default: + break; } } void cParametersWidget::updateSettingsWhenModeChanged(int index) { - switch ((eModeType)index) - { - case denovoengine: - peptidetype->setDisabled(false); - scannumber->setDisabled(false); - precursormass->setDisabled(false); - precursoradduct->setDisabled(false); - precursorcharge->setDisabled(false); - precursormasserrortolerance->setDisabled(false); - fwhm->setDisabled(false); - brickdatabaseline->setDisabled(false); - brickdatabasebutton->setDisabled(false); - maximumbricksincombinationbegin->setDisabled(false); - maximumbricksincombinationmiddle->setDisabled(false); - maximumbricksincombinationend->setDisabled(false); - maximumcumulativemass->setDisabled(false); - modificationsline->setDisabled(false); - modificationsbutton->setDisabled(false); - sequencedatabaseline->setDisabled(true); - sequencedatabasebutton->setDisabled(true); - blindedges->setDisabled(false); - similaritysearch->setDisabled(true); - maximumnumberofthreads->setDisabled(false); - scoretype->setDisabled(false); - hitsreported->setDisabled(false); - sequencetag->setDisabled(false); - iontypes->setDisabled(false); - neutrallosstypes->setDisabled(false); - maximumcombinedlosses->setDisabled(false); - //clearhitswithoutparent->setDisabled(false); - reportunmatchedtheoreticalpeaks->setDisabled(false); - generateisotopepattern->setDisabled(false); - minimumpatternsize->setDisabled(false); - minimumfeaturesize->setDisabled(true); - allionsmustbepresent->setDisabled(true); - searchedsequenceline->setDisabled(false); - searchedsequencebutton->setDisabled(false); - - updateSettingsWhenPeptideTypeChanged(peptidetype->currentIndex()); - break; - case singlecomparison: - peptidetype->setDisabled(false); - scannumber->setDisabled(true); - precursormass->setDisabled(false); - precursoradduct->setDisabled(false); - precursorcharge->setDisabled(false); - precursormasserrortolerance->setDisabled(false); - fwhm->setDisabled(false); - brickdatabaseline->setDisabled(false); - brickdatabasebutton->setDisabled(false); - maximumbricksincombinationbegin->setDisabled(true); - maximumbricksincombinationmiddle->setDisabled(true); - maximumbricksincombinationend->setDisabled(true); - maximumcumulativemass->setDisabled(true); - modificationsline->setDisabled(false); - modificationsbutton->setDisabled(false); - sequencedatabaseline->setDisabled(true); - sequencedatabasebutton->setDisabled(true); - blindedges->setDisabled(true); - similaritysearch->setDisabled(true); - maximumnumberofthreads->setDisabled(true); - scoretype->setDisabled(true); - hitsreported->setDisabled(true); - sequencetag->setDisabled(true); - iontypes->setDisabled(false); - neutrallosstypes->setDisabled(false); - maximumcombinedlosses->setDisabled(false); - //clearhitswithoutparent->setDisabled(false); - reportunmatchedtheoreticalpeaks->setDisabled(false); - generateisotopepattern->setDisabled(false); - minimumpatternsize->setDisabled(false); - minimumfeaturesize->setDisabled(true); - allionsmustbepresent->setDisabled(true); - searchedsequenceline->setDisabled(false); - searchedsequencebutton->setDisabled(false); - - updateSettingsWhenPeptideTypeChanged(peptidetype->currentIndex()); - break; - case databasesearch: - peptidetype->setDisabled(false); - scannumber->setDisabled(false); - precursormass->setDisabled(false); - precursoradduct->setDisabled(false); - precursorcharge->setDisabled(false); - precursormasserrortolerance->setDisabled(false); - fwhm->setDisabled(false); - brickdatabaseline->setDisabled(false); - brickdatabasebutton->setDisabled(false); - maximumbricksincombinationbegin->setDisabled(true); - maximumbricksincombinationmiddle->setDisabled(true); - maximumbricksincombinationend->setDisabled(true); - maximumcumulativemass->setDisabled(true); - modificationsline->setDisabled(false); - modificationsbutton->setDisabled(false); - blindedges->setDisabled(true); - similaritysearch->setDisabled(false); - sequencedatabaseline->setDisabled(false); - sequencedatabasebutton->setDisabled(false); - maximumnumberofthreads->setDisabled(false); - scoretype->setDisabled(false); - hitsreported->setDisabled(false); - sequencetag->setDisabled(false); - iontypes->setDisabled(false); - neutrallosstypes->setDisabled(false); - maximumcombinedlosses->setDisabled(false); - //clearhitswithoutparent->setDisabled(false); - reportunmatchedtheoreticalpeaks->setDisabled(false); - generateisotopepattern->setDisabled(false); - minimumpatternsize->setDisabled(false); - minimumfeaturesize->setDisabled(true); - allionsmustbepresent->setDisabled(true); - searchedsequenceline->setDisabled(false); - searchedsequencebutton->setDisabled(false); - - updateSettingsWhenPeptideTypeChanged(peptidetype->currentIndex()); - break; - case dereplication: - peptidetype->setDisabled(true); - scannumber->setDisabled(true); - precursormass->setDisabled(true); - precursoradduct->setDisabled(true); - precursorcharge->setDisabled(false); - precursormasserrortolerance->setDisabled(true); - fwhm->setDisabled(false); - brickdatabaseline->setDisabled(true); - brickdatabasebutton->setDisabled(true); - maximumbricksincombinationbegin->setDisabled(true); - maximumbricksincombinationmiddle->setDisabled(true); - maximumbricksincombinationend->setDisabled(true); - maximumcumulativemass->setDisabled(true); - modificationsline->setDisabled(true); - modificationsbutton->setDisabled(true); - blindedges->setDisabled(true); - similaritysearch->setDisabled(true); - sequencedatabaseline->setDisabled(false); - sequencedatabasebutton->setDisabled(false); - maximumnumberofthreads->setDisabled(true); - scoretype->setDisabled(true); - hitsreported->setDisabled(true); - sequencetag->setDisabled(true); - iontypes->setDisabled(false); - neutrallosstypes->setDisabled(false); - maximumcombinedlosses->setDisabled(false); - //clearhitswithoutparent->setDisabled(true); - reportunmatchedtheoreticalpeaks->setDisabled(false); - generateisotopepattern->setDisabled(false); - minimumpatternsize->setDisabled(false); - minimumfeaturesize->setDisabled(false); - allionsmustbepresent->setDisabled(false); - searchedsequenceline->setDisabled(true); - searchedsequencebutton->setDisabled(true); - - resetFragmentIonTypes(); + switch ((eModeType)index) { + case denovoengine: + peptidetype->setDisabled(false); + scannumber->setDisabled(false); + precursormass->setDisabled(false); + precursoradduct->setDisabled(false); + precursorcharge->setDisabled(false); + precursormasserrortolerance->setDisabled(false); + maximummz->setDisabled(true); + fwhm->setDisabled(false); + brickdatabaseline->setDisabled(false); + brickdatabasebutton->setDisabled(false); + maximumbricksincombinationbegin->setDisabled(false); + maximumbricksincombinationmiddle->setDisabled(false); + maximumbricksincombinationend->setDisabled(false); + blindedges->setDisabled(false); + maximumcumulativemass->setDisabled(false); + modificationsline->setDisabled(false); + modificationsbutton->setDisabled(false); + sequencedatabaseline->setDisabled(true); + sequencedatabasebutton->setDisabled(true); + similaritysearch->setDisabled(true); + maximumnumberofthreads->setDisabled(false); + scoretype->setDisabled(false); + hitsreported->setDisabled(false); + sequencetag->setDisabled(false); + iontypes->setDisabled(false); + neutrallosstypes->setDisabled(false); + maximumcombinedlosses->setDisabled(false); + //clearhitswithoutparent->setDisabled(false); + basicformulacheck->setDisabled(false); + advancedformulacheck->setDisabled(true); + noratiocheck->setDisabled(true); + mzdifftolerance->setDisabled(true); + intensitytolerance->setDisabled(true); + reportunmatchedtheoreticalpeaks->setDisabled(false); + generateisotopepattern->setDisabled(false); + minimumpatternsize->setDisabled(false); + minimumfeaturesize->setDisabled(true); + minimumiontypes->setDisabled(true); + searchedsequenceline->setDisabled(false); + searchedsequencebutton->setDisabled(false); + + updateSettingsWhenPeptideTypeChanged(peptidetype->currentIndex()); + break; + case singlecomparison: + peptidetype->setDisabled(false); + scannumber->setDisabled(true); + precursormass->setDisabled(false); + precursoradduct->setDisabled(false); + precursorcharge->setDisabled(false); + precursormasserrortolerance->setDisabled(false); + maximummz->setDisabled(true); + fwhm->setDisabled(false); + brickdatabaseline->setDisabled(false); + brickdatabasebutton->setDisabled(false); + maximumbricksincombinationbegin->setDisabled(true); + maximumbricksincombinationmiddle->setDisabled(true); + maximumbricksincombinationend->setDisabled(true); + blindedges->setDisabled(true); + maximumcumulativemass->setDisabled(true); + modificationsline->setDisabled(false); + modificationsbutton->setDisabled(false); + sequencedatabaseline->setDisabled(true); + sequencedatabasebutton->setDisabled(true); + similaritysearch->setDisabled(true); + maximumnumberofthreads->setDisabled(true); + scoretype->setDisabled(true); + hitsreported->setDisabled(true); + sequencetag->setDisabled(true); + iontypes->setDisabled(false); + neutrallosstypes->setDisabled(false); + maximumcombinedlosses->setDisabled(false); + //clearhitswithoutparent->setDisabled(false); + basicformulacheck->setDisabled(false); + advancedformulacheck->setDisabled(true); + noratiocheck->setDisabled(true); + mzdifftolerance->setDisabled(true); + intensitytolerance->setDisabled(true); + reportunmatchedtheoreticalpeaks->setDisabled(false); + generateisotopepattern->setDisabled(false); + minimumpatternsize->setDisabled(false); + minimumfeaturesize->setDisabled(true); + minimumiontypes->setDisabled(true); + searchedsequenceline->setDisabled(false); + searchedsequencebutton->setDisabled(false); + + updateSettingsWhenPeptideTypeChanged(peptidetype->currentIndex()); + break; + case databasesearch: + peptidetype->setDisabled(false); + scannumber->setDisabled(false); + precursormass->setDisabled(false); + precursoradduct->setDisabled(false); + precursorcharge->setDisabled(false); + precursormasserrortolerance->setDisabled(false); + maximummz->setDisabled(true); + fwhm->setDisabled(false); + brickdatabaseline->setDisabled(false); + brickdatabasebutton->setDisabled(false); + maximumbricksincombinationbegin->setDisabled(true); + maximumbricksincombinationmiddle->setDisabled(true); + maximumbricksincombinationend->setDisabled(true); + blindedges->setDisabled(true); + maximumcumulativemass->setDisabled(true); + modificationsline->setDisabled(false); + modificationsbutton->setDisabled(false); + similaritysearch->setDisabled(false); + sequencedatabaseline->setDisabled(false); + sequencedatabasebutton->setDisabled(false); + maximumnumberofthreads->setDisabled(false); + scoretype->setDisabled(false); + hitsreported->setDisabled(false); + sequencetag->setDisabled(false); + iontypes->setDisabled(false); + neutrallosstypes->setDisabled(false); + maximumcombinedlosses->setDisabled(false); + //clearhitswithoutparent->setDisabled(false); + basicformulacheck->setDisabled(false); + advancedformulacheck->setDisabled(true); + noratiocheck->setDisabled(true); + mzdifftolerance->setDisabled(true); + intensitytolerance->setDisabled(true); + reportunmatchedtheoreticalpeaks->setDisabled(false); + generateisotopepattern->setDisabled(false); + minimumpatternsize->setDisabled(false); + minimumfeaturesize->setDisabled(true); + minimumiontypes->setDisabled(true); + searchedsequenceline->setDisabled(false); + searchedsequencebutton->setDisabled(false); + + updateSettingsWhenPeptideTypeChanged(peptidetype->currentIndex()); + break; + case dereplication: + peptidetype->setDisabled(true); + scannumber->setDisabled(true); + precursormass->setDisabled(true); + precursoradduct->setDisabled(true); + precursorcharge->setDisabled(false); + precursormasserrortolerance->setDisabled(true); + maximummz->setDisabled(false); + fwhm->setDisabled(false); + brickdatabaseline->setDisabled(true); + brickdatabasebutton->setDisabled(true); + maximumbricksincombinationbegin->setDisabled(true); + maximumbricksincombinationmiddle->setDisabled(true); + maximumbricksincombinationend->setDisabled(true); + blindedges->setDisabled(true); + maximumcumulativemass->setDisabled(true); + modificationsline->setDisabled(true); + modificationsbutton->setDisabled(true); + similaritysearch->setDisabled(true); + sequencedatabaseline->setDisabled(false); + sequencedatabasebutton->setDisabled(false); + maximumnumberofthreads->setDisabled(true); + scoretype->setDisabled(true); + hitsreported->setDisabled(true); + sequencetag->setDisabled(true); + iontypes->setDisabled(false); + neutrallosstypes->setDisabled(false); + maximumcombinedlosses->setDisabled(false); + //clearhitswithoutparent->setDisabled(true); + basicformulacheck->setDisabled(false); + advancedformulacheck->setDisabled(true); + noratiocheck->setDisabled(true); + mzdifftolerance->setDisabled(false); + intensitytolerance->setDisabled(false); + reportunmatchedtheoreticalpeaks->setDisabled(false); + generateisotopepattern->setDisabled(false); + minimumpatternsize->setDisabled(false); + minimumfeaturesize->setDisabled(false); + minimumiontypes->setDisabled(false); + searchedsequenceline->setDisabled(true); + searchedsequencebutton->setDisabled(true); + + if ((oldmodetype == denovoengine) || (oldmodetype == singlecomparison) || (oldmodetype == databasesearch)) { + resetFragmentIonTypes(); + } - modificationsline->setDisabled(true); - modificationsbutton->setDisabled(true); - cyclicnterminus->setDisabled(true); - cycliccterminus->setDisabled(true); - internalfragments->setDisabled(true); - enablescrambling->setDisabled(true); - regularblocksorder->setDisabled(true); - searchedsequenceNtermmodif->setDisabled(true); - searchedsequenceCtermmodif->setDisabled(true); - searchedsequenceTmodif->setDisabled(true); - break; - default: - break; + brickdatabaseline->setDisabled(true); + brickdatabasebutton->setDisabled(true); + modificationsline->setDisabled(true); + modificationsbutton->setDisabled(true); + cyclicnterminus->setDisabled(true); + cycliccterminus->setDisabled(true); + internalfragments->setDisabled(true); + enablescrambling->setDisabled(true); + regularblocksorder->setDisabled(true); + sequencetag->setDisabled(true); + iontypes->setDisabled(false); + searchedsequenceNtermmodif->setDisabled(true); + searchedsequenceCtermmodif->setDisabled(true); + searchedsequenceTmodif->setDisabled(true); + searchedsequenceformula->setDisabled(true); + break; + case compoundsearch: + peptidetype->setDisabled(true); + scannumber->setDisabled(true); + precursormass->setDisabled(true); + precursoradduct->setDisabled(true); + precursorcharge->setDisabled(false); + precursormasserrortolerance->setDisabled(true); + maximummz->setDisabled(false); + fwhm->setDisabled(false); + brickdatabaseline->setDisabled(true); + brickdatabasebutton->setDisabled(true); + maximumbricksincombinationbegin->setDisabled(true); + maximumbricksincombinationmiddle->setDisabled(true); + maximumbricksincombinationend->setDisabled(true); + blindedges->setDisabled(true); + maximumcumulativemass->setDisabled(true); + modificationsline->setDisabled(true); + modificationsbutton->setDisabled(true); + similaritysearch->setDisabled(true); + sequencedatabaseline->setDisabled(true); + sequencedatabasebutton->setDisabled(true); + maximumnumberofthreads->setDisabled(true); + scoretype->setDisabled(true); + hitsreported->setDisabled(true); + sequencetag->setDisabled(true); + iontypes->setDisabled(false); + neutrallosstypes->setDisabled(false); + maximumcombinedlosses->setDisabled(false); + //clearhitswithoutparent->setDisabled(true); + basicformulacheck->setDisabled(false); + advancedformulacheck->setDisabled(false); + noratiocheck->setDisabled(false); + mzdifftolerance->setDisabled(false); + intensitytolerance->setDisabled(false); + reportunmatchedtheoreticalpeaks->setDisabled(false); + generateisotopepattern->setDisabled(false); + minimumpatternsize->setDisabled(false); + minimumfeaturesize->setDisabled(false); + minimumiontypes->setDisabled(false); + searchedsequenceline->setDisabled(true); + searchedsequencebutton->setDisabled(true); + + if ((oldmodetype == denovoengine) || (oldmodetype == singlecomparison) || (oldmodetype == databasesearch)) { + resetFragmentIonTypes(); + } + + brickdatabaseline->setDisabled(true); + brickdatabasebutton->setDisabled(true); + modificationsline->setDisabled(true); + modificationsbutton->setDisabled(true); + cyclicnterminus->setDisabled(true); + cycliccterminus->setDisabled(true); + internalfragments->setDisabled(true); + enablescrambling->setDisabled(true); + regularblocksorder->setDisabled(true); + sequencetag->setDisabled(true); + iontypes->setDisabled(false); + searchedsequenceNtermmodif->setDisabled(true); + searchedsequenceCtermmodif->setDisabled(true); + searchedsequenceTmodif->setDisabled(true); + searchedsequenceformula->setDisabled(true); + break; + default: + break; } oldmodetype = (eModeType)mode->currentIndex(); @@ -1596,83 +1972,83 @@ void cParametersWidget::resetFragmentIonTypes() { iontypes->getList()->clear(); eFragmentIonType start, end; - if ((eModeType)mode->currentIndex() == dereplication) { + if (((eModeType)mode->currentIndex() == dereplication) || ((eModeType)mode->currentIndex() == compoundsearch)) { start = ms_Hplus; end = ms_MGa4H; } else { switch ((ePeptideType)peptidetype->currentIndex()) { - case linear: - case branched: - start = a_ion; - end = z_ion; - break; - case cyclic: - start = a_ion; - end = c_ion; - break; - case branchcyclic: - start = a_ion; - end = z_ion; - break; - case linearpolyketide: - start = l1h_ion; - end = r2oh_ion; - break; - case cyclicpolyketide: - start = l1h_ion; // l0h_ion; - end = l2h_ion; - break; - case other: - break; - default: - break; - } - } - - for (int i = (int)start; i <= (int)end; i++) { - - iontypes->getList()->addItem(tr(parameters.iondefinitions[(eFragmentIonType)i].name.c_str())); - - if ((eModeType)mode->currentIndex() == dereplication) { - if ((eFragmentIonType)i == ms_Hplus) { - iontypes->getList()->item(i-start)->setSelected(true); - } - } - else { - switch ((ePeptideType)peptidetype->currentIndex()) { case linear: case branched: - if (((eFragmentIonType)i == b_ion) || ((eFragmentIonType)i == y_ion)) { - iontypes->getList()->item(i-start)->setSelected(true); - } + start = a_ion; + end = z_ion; break; case cyclic: - if ((eFragmentIonType)i == b_ion) { - iontypes->getList()->item(i-start)->setSelected(true); - } + start = a_ion; + end = c_ion; break; case branchcyclic: - if (((eFragmentIonType)i == b_ion) || ((eFragmentIonType)i == y_ion)) { - iontypes->getList()->item(i-start)->setSelected(true); - } + start = a_ion; + end = z_ion; break; case linearpolyketide: - if (((eFragmentIonType)i == l1h_ion) || ((eFragmentIonType)i == l2h_ion) || ((eFragmentIonType)i == r1h_ion) || ((eFragmentIonType)i == r2h_ion) || - ((eFragmentIonType)i == l1oh_ion) || ((eFragmentIonType)i == l2oh_ion) || ((eFragmentIonType)i == r1oh_ion) || ((eFragmentIonType)i == r2oh_ion) - ) { - iontypes->getList()->item(i-start)->setSelected(true); - } + start = l1h_ion; + end = r2oh_ion; break; case cyclicpolyketide: - if (/*((eFragmentIonType)i == l0h_ion) ||*/ ((eFragmentIonType)i == l1h_ion) || ((eFragmentIonType)i == l2h_ion)) { - iontypes->getList()->item(i-start)->setSelected(true); - } + start = l1h_ion; // l0h_ion; + end = l2h_ion; break; case other: - break; + return; default: break; + } + } + + for (int i = (int)start; i <= (int)end; i++) { + + iontypes->getList()->addItem(tr(parameters.iondefinitions[(eFragmentIonType)i].name.c_str())); + + if (((eModeType)mode->currentIndex() == dereplication) || ((eModeType)mode->currentIndex() == compoundsearch)) { + if ((eFragmentIonType)i == ms_Hplus) { + iontypes->getList()->item(i-start)->setSelected(true); + } + } + else { + switch ((ePeptideType)peptidetype->currentIndex()) { + case linear: + case branched: + if (((eFragmentIonType)i == b_ion) || ((eFragmentIonType)i == y_ion)) { + iontypes->getList()->item(i-start)->setSelected(true); + } + break; + case cyclic: + if ((eFragmentIonType)i == b_ion) { + iontypes->getList()->item(i-start)->setSelected(true); + } + break; + case branchcyclic: + if (((eFragmentIonType)i == b_ion) || ((eFragmentIonType)i == y_ion)) { + iontypes->getList()->item(i-start)->setSelected(true); + } + break; + case linearpolyketide: + if (((eFragmentIonType)i == l1h_ion) || ((eFragmentIonType)i == l2h_ion) || ((eFragmentIonType)i == r1h_ion) || ((eFragmentIonType)i == r2h_ion) || + ((eFragmentIonType)i == l1oh_ion) || ((eFragmentIonType)i == l2oh_ion) || ((eFragmentIonType)i == r1oh_ion) || ((eFragmentIonType)i == r2oh_ion) + ) { + iontypes->getList()->item(i-start)->setSelected(true); + } + break; + case cyclicpolyketide: + if (/*((eFragmentIonType)i == l0h_ion) ||*/ ((eFragmentIonType)i == l1h_ion) || ((eFragmentIonType)i == l2h_ion)) { + iontypes->getList()->item(i-start)->setSelected(true); + } + break; + case other: + break; + default: + break; } } diff --git a/CycloBranch/gui/cParametersWidget.h b/CycloBranch/gui/cParametersWidget.h index 09c31da..8dcabc8 100644 --- a/CycloBranch/gui/cParametersWidget.h +++ b/CycloBranch/gui/cParametersWidget.h @@ -162,8 +162,11 @@ class cParametersWidget : public QWidget QDoubleSpinBox* minimumrelativeintensitythreshold; QLabel* minimumabsoluteintensitythresholdlabel; QSpinBox* minimumabsoluteintensitythreshold; - QLabel* minimummzlabel; + QLabel* mzratiolabel; QDoubleSpinBox* minimummz; + QDoubleSpinBox* maximummz; + QHBoxLayout* mzratiolayout; + QWidget* mzratiowidget; QLabel* fwhmlabel; QDoubleSpinBox* fwhm; @@ -233,8 +236,18 @@ class cParametersWidget : public QWidget QSpinBox* minimumpatternsize; QLabel* minimumfeaturesizelabel; QSpinBox* minimumfeaturesize; - QLabel* allionsmustbepresentlabel; - QCheckBox* allionsmustbepresent; + QLabel* minimumiontypeslabel; + QSpinBox* minimumiontypes; + QLabel* basicformulachecklabel; + QCheckBox* basicformulacheck; + QLabel* advancedformulachecklabel; + QCheckBox* advancedformulacheck; + QLabel* noratiochecklabel; + QCheckBox* noratiocheck; + QLabel* mzdifftolerancelabel; + QDoubleSpinBox* mzdifftolerance; + QLabel* intensitytolerancelabel; + QDoubleSpinBox* intensitytolerance; QGroupBox* searchedsequencegroupbox; QGridLayout* searchedsequencegridlayout; @@ -243,19 +256,22 @@ class cParametersWidget : public QWidget QPushButton* searchedsequencebutton; QHBoxLayout* searchedsequencelayout; QWidget* searchedsequencewidget; - QLabel* searchedsequenceNtermmodiflabel; + QLabel* searchedsequencemodiflabel; QLineEdit* searchedsequenceNtermmodif; - QLabel* searchedsequenceCtermmodiflabel; QLineEdit* searchedsequenceCtermmodif; - QLabel* searchedsequenceTmodiflabel; QLineEdit* searchedsequenceTmodif; + QHBoxLayout* searchedsequencemodiflayout; + QWidget* searchedsequencemodifwidget; + QLabel* searchedsequenceformulalabel; + QLineEdit* searchedsequenceformula; QString lastdirloadsettings; QString lastdirsavesettings; - QString lastdirselectpeaklist; - QString lastdirselectbricksdatabase; - QString lastdirselectmodifications; - QString lastdirselectsequencedatabase; + + QString defaultdirselectpeaklist; + QString defaultdirselectbricksdatabase; + QString defaultdirselectmodifications; + QString defaultdirselectsequencedatabase; protected: diff --git a/CycloBranch/gui/cSequenceDatabaseProxyModel.cpp b/CycloBranch/gui/cSequenceDatabaseProxyModel.cpp index 8965a8f..32f1477 100644 --- a/CycloBranch/gui/cSequenceDatabaseProxyModel.cpp +++ b/CycloBranch/gui/cSequenceDatabaseProxyModel.cpp @@ -6,9 +6,14 @@ cSequenceDatabaseProxyModel::cSequenceDatabaseProxyModel(QObject *parent) : QSor } -void cSequenceDatabaseProxyModel::initialize(QComboBox* rowsfiltercombobox, QComboBox* rowsfiltercomparatorcombobox) { - this->rowsfiltercombobox = rowsfiltercombobox; - this->rowsfiltercomparatorcombobox = rowsfiltercomparatorcombobox; +void cSequenceDatabaseProxyModel::initialize(QComboBox* rowsfilteroperator, QComboBox* rowsfiltercombobox1, QComboBox* rowsfiltercomparatorcombobox1, QLineEdit* rowsfilterline1, QComboBox* rowsfiltercombobox2, QComboBox* rowsfiltercomparatorcombobox2, QLineEdit* rowsfilterline2) { + filteroperator = rowsfilteroperator; + filtercombobox1 = rowsfiltercombobox1; + filtercomparatorcombobox1 = rowsfiltercomparatorcombobox1; + filterline1 = rowsfilterline1; + filtercombobox2 = rowsfiltercombobox2; + filtercomparatorcombobox2 = rowsfiltercomparatorcombobox2; + filterline2 = rowsfilterline2; } @@ -18,162 +23,71 @@ void cSequenceDatabaseProxyModel::setWholeWord(bool wholeword) { bool cSequenceDatabaseProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { - if (filterRegExp().isEmpty()) { + if (filterline1->text().isEmpty() && filterline2->text().isEmpty()) { return true; } - int col = rowsfiltercombobox->currentIndex() + 1; + int col1 = filtercombobox1->currentIndex() + 1; + int col2 = filtercombobox2->currentIndex() + 1; - if (col == 1) { + bool result1 = false; + bool result2 = false; - QString qstr = getStringFromPeptideType((ePeptideType)sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt()).c_str(); - - switch (rowsfiltercomparatorcombobox->currentIndex()) { - case 0: - if (wholeword) { - if (qstr.compare(filterRegExp().pattern(), filterCaseSensitivity()) == 0) { - return true; - } - } - else { - if (qstr.contains(filterRegExp())) { - return true; - } - } - break; - case 1: - if (qstr.compare(filterRegExp().pattern(), filterCaseSensitivity()) < 0) { - return true; - } - break; - case 2: - if (qstr.compare(filterRegExp().pattern(), filterCaseSensitivity()) <= 0) { - return true; + if (!filterline1->text().isEmpty()) { + if (col1 == 1) { + QString qstr = getStringFromPeptideType((ePeptideType)sourceModel()->data(sourceModel()->index(sourceRow, col1, sourceParent)).toInt()).c_str(); + result1 = proxyModelCheckString(sourceModel(), filtercomparatorcombobox1->currentIndex(), sourceRow, col1, qstr, filterline1->text(), sourceParent, wholeword, filterCaseSensitivity()); + } + else { + if (sourceModel()->data(sourceModel()->index(sourceRow, col1, sourceParent)).type() == QVariant::ByteArray) { + result1 = proxyModelCheckDouble(sourceModel(), filtercomparatorcombobox1->currentIndex(), sourceRow, col1, filterline1->text(), sourceParent); } - break; - case 3: - if (qstr.compare(filterRegExp().pattern(), filterCaseSensitivity()) > 0) { - return true; + + if (sourceModel()->data(sourceModel()->index(sourceRow, col1, sourceParent)).type() == QVariant::String) { + QString qstr = sourceModel()->data(sourceModel()->index(sourceRow, col1, sourceParent)).toString(); + result1 = proxyModelCheckString(sourceModel(), filtercomparatorcombobox1->currentIndex(), sourceRow, col1, qstr, filterline1->text(), sourceParent, wholeword, filterCaseSensitivity()); } - break; - case 4: - if (qstr.compare(filterRegExp().pattern(), filterCaseSensitivity()) >= 0) { - return true; + + if (sourceModel()->data(sourceModel()->index(sourceRow, col1, sourceParent)).type() == QVariant::Int) { + result1 = proxyModelCheckInt(sourceModel(), filtercomparatorcombobox1->currentIndex(), sourceRow, col1, filterline1->text(), sourceParent); } - break; - default: - break; } - } - else { - - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).type() == QVariant::ByteArray) { - switch (rowsfiltercomparatorcombobox->currentIndex()) { - case 0: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() == filterRegExp().pattern().toDouble()) { - return true; - } - break; - case 1: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() < filterRegExp().pattern().toDouble()) { - return true; - } - break; - case 2: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() <= filterRegExp().pattern().toDouble()) { - return true; - } - break; - case 3: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() > filterRegExp().pattern().toDouble()) { - return true; - } - break; - case 4: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() >= filterRegExp().pattern().toDouble()) { - return true; - } - break; - default: - break; - } + + if (!filterline2->text().isEmpty()) { + if (col2 == 1) { + QString qstr = getStringFromPeptideType((ePeptideType)sourceModel()->data(sourceModel()->index(sourceRow, col2, sourceParent)).toInt()).c_str(); + result2 = proxyModelCheckString(sourceModel(), filtercomparatorcombobox2->currentIndex(), sourceRow, col2, qstr, filterline2->text(), sourceParent, wholeword, filterCaseSensitivity()); } + else { + if (sourceModel()->data(sourceModel()->index(sourceRow, col2, sourceParent)).type() == QVariant::ByteArray) { + result2 = proxyModelCheckDouble(sourceModel(), filtercomparatorcombobox2->currentIndex(), sourceRow, col2, filterline2->text(), sourceParent); + } - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).type() == QVariant::String) { - switch (rowsfiltercomparatorcombobox->currentIndex()) { - case 0: - if (wholeword) { - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().compare(filterRegExp().pattern(), filterCaseSensitivity()) == 0) { - return true; - } - } - else { - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().contains(filterRegExp())) { - return true; - } - } - break; - case 1: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().compare(filterRegExp().pattern(), filterCaseSensitivity()) < 0) { - return true; - } - break; - case 2: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().compare(filterRegExp().pattern(), filterCaseSensitivity()) <= 0) { - return true; - } - break; - case 3: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().compare(filterRegExp().pattern(), filterCaseSensitivity()) > 0) { - return true; - } - break; - case 4: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().compare(filterRegExp().pattern(), filterCaseSensitivity()) >= 0) { - return true; - } - break; - default: - break; + if (sourceModel()->data(sourceModel()->index(sourceRow, col2, sourceParent)).type() == QVariant::String) { + QString qstr = sourceModel()->data(sourceModel()->index(sourceRow, col2, sourceParent)).toString(); + result2 = proxyModelCheckString(sourceModel(), filtercomparatorcombobox2->currentIndex(), sourceRow, col2, qstr, filterline2->text(), sourceParent, wholeword, filterCaseSensitivity()); } - } - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).type() == QVariant::Int) { - switch (rowsfiltercomparatorcombobox->currentIndex()) { - case 0: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() == filterRegExp().pattern().toInt()) { - return true; - } - break; - case 1: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() < filterRegExp().pattern().toInt()) { - return true; - } - break; - case 2: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() <= filterRegExp().pattern().toInt()) { - return true; - } - break; - case 3: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() > filterRegExp().pattern().toInt()) { - return true; - } - break; - case 4: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() >= filterRegExp().pattern().toInt()) { - return true; - } - break; - default: - break; + if (sourceModel()->data(sourceModel()->index(sourceRow, col2, sourceParent)).type() == QVariant::Int) { + result2 = proxyModelCheckInt(sourceModel(), filtercomparatorcombobox2->currentIndex(), sourceRow, col2, filterline2->text(), sourceParent); } } + } + + if (!filterline1->text().isEmpty() && filterline2->text().isEmpty()) { + return result1; + } + + if (filterline1->text().isEmpty() && !filterline2->text().isEmpty()) { + return result2; + } + if (filteroperator->currentIndex() == 0) { + return result1 || result2; } - return false; + return result1 && result2; } diff --git a/CycloBranch/gui/cSequenceDatabaseProxyModel.h b/CycloBranch/gui/cSequenceDatabaseProxyModel.h index 46067cd..bd11a88 100644 --- a/CycloBranch/gui/cSequenceDatabaseProxyModel.h +++ b/CycloBranch/gui/cSequenceDatabaseProxyModel.h @@ -9,9 +9,10 @@ #include #include -#include #include -#include "core/cFragmentIons.h" +#include +#include +#include "core/utilities.h" /** @@ -23,8 +24,13 @@ class cSequenceDatabaseProxyModel : public QSortFilterProxyModel { private: - QComboBox* rowsfiltercombobox; - QComboBox* rowsfiltercomparatorcombobox; + QComboBox* filteroperator; + QComboBox* filtercombobox1; + QComboBox* filtercomparatorcombobox1; + QLineEdit* filterline1; + QComboBox* filtercombobox2; + QComboBox* filtercomparatorcombobox2; + QLineEdit* filterline2; bool wholeword; public: @@ -39,10 +45,15 @@ class cSequenceDatabaseProxyModel : public QSortFilterProxyModel { /** \brief Initialize the model. - \param rowsfiltercombobox reference to the combobox with selection of columns - \param rowsfiltercomparatorcombobox reference to the combobox with selection of comparator + \param rowsfilteroperator reference to the combobox with operator selection + \param rowsfiltercombobox1 reference to the combobox with selection of columns + \param rowsfiltercomparatorcombobox1 reference to the combobox with selection of comparator + \param rowsfilterline1 reference to a text field + \param rowsfiltercombobox2 reference to the combobox with selection of columns + \param rowsfiltercomparatorcombobox2 reference to the combobox with selection of comparator + \param rowsfilterline2 reference to a text field */ - void initialize(QComboBox* rowsfiltercombobox, QComboBox* rowsfiltercomparatorcombobox); + void initialize(QComboBox* rowsfilteroperator, QComboBox* rowsfiltercombobox1, QComboBox* rowsfiltercomparatorcombobox1, QLineEdit* rowsfilterline1, QComboBox* rowsfiltercombobox2, QComboBox* rowsfiltercomparatorcombobox2, QLineEdit* rowsfilterline2); /** diff --git a/CycloBranch/gui/cSequenceDatabaseWidget.cpp b/CycloBranch/gui/cSequenceDatabaseWidget.cpp index 2b0bc5c..904d9de 100644 --- a/CycloBranch/gui/cSequenceDatabaseWidget.cpp +++ b/CycloBranch/gui/cSequenceDatabaseWidget.cpp @@ -32,22 +32,45 @@ cSequenceDatabaseWidget::cSequenceDatabaseWidget(QWidget* parent) { menuEdit = new QMenu(tr("&Edit"), this); menuHelp = new QMenu(tr("&Help"), this); - rowsfiltercombobox = new QComboBox(); - rowsfiltercombobox->setToolTip("Column to be Searched"); - rowsfiltercombobox->setSizeAdjustPolicy(QComboBox::AdjustToContents); - - rowsfiltercomparatorcombobox = new QComboBox(); - rowsfiltercomparatorcombobox->setToolTip("Type of Comparison"); - rowsfiltercomparatorcombobox->addItem("="); - rowsfiltercomparatorcombobox->addItem("<"); - rowsfiltercomparatorcombobox->addItem("<="); - rowsfiltercomparatorcombobox->addItem(">"); - rowsfiltercomparatorcombobox->addItem(">="); - rowsfiltercomparatorcombobox->setSizeAdjustPolicy(QComboBox::AdjustToContents); - - rowsfilterline = new QLineEdit(); - rowsfilterline->setMinimumWidth(300); - rowsfilterline->setToolTip("Text to Find"); + rowsfilteroperator = new QComboBox(); + rowsfilteroperator->setToolTip("OR = any condition must be met; AND = all conditions must be met."); + rowsfilteroperator->addItem("OR"); + rowsfilteroperator->addItem("AND"); + rowsfilteroperator->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfiltercombobox1 = new QComboBox(); + rowsfiltercombobox1->setToolTip("Column to be Searched"); + rowsfiltercombobox1->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfiltercomparatorcombobox1 = new QComboBox(); + rowsfiltercomparatorcombobox1->setToolTip("Type of Comparison"); + rowsfiltercomparatorcombobox1->addItem("="); + rowsfiltercomparatorcombobox1->addItem("<"); + rowsfiltercomparatorcombobox1->addItem("<="); + rowsfiltercomparatorcombobox1->addItem(">"); + rowsfiltercomparatorcombobox1->addItem(">="); + rowsfiltercomparatorcombobox1->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfilterline1 = new QLineEdit(); + rowsfilterline1->setMinimumWidth(150); + rowsfilterline1->setToolTip("Text to Find"); + + rowsfiltercombobox2 = new QComboBox(); + rowsfiltercombobox2->setToolTip("Column to be Searched"); + rowsfiltercombobox2->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfiltercomparatorcombobox2 = new QComboBox(); + rowsfiltercomparatorcombobox2->setToolTip("Type of Comparison"); + rowsfiltercomparatorcombobox2->addItem("="); + rowsfiltercomparatorcombobox2->addItem("<"); + rowsfiltercomparatorcombobox2->addItem("<="); + rowsfiltercomparatorcombobox2->addItem(">"); + rowsfiltercomparatorcombobox2->addItem(">="); + rowsfiltercomparatorcombobox2->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfilterline2 = new QLineEdit(); + rowsfilterline2->setMinimumWidth(150); + rowsfilterline2->setToolTip("Text to Find"); rowsfiltercasesensitive = new QCheckBox(); rowsfiltercasesensitive->setToolTip("Case Sensitive"); @@ -65,11 +88,19 @@ cSequenceDatabaseWidget::cSequenceDatabaseWidget(QWidget* parent) { rowsfilterclearbutton->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_R)); rowsfilterhbox = new QHBoxLayout(); - rowsfilterhbox->addWidget(rowsfiltercombobox); + rowsfilterhbox->addWidget(rowsfiltercombobox1); rowsfilterhbox->addSpacing(10); - rowsfilterhbox->addWidget(rowsfiltercomparatorcombobox); + rowsfilterhbox->addWidget(rowsfiltercomparatorcombobox1); rowsfilterhbox->addSpacing(10); - rowsfilterhbox->addWidget(rowsfilterline); + rowsfilterhbox->addWidget(rowsfilterline1); + rowsfilterhbox->addSpacing(10); + rowsfilterhbox->addWidget(rowsfilteroperator); + rowsfilterhbox->addSpacing(10); + rowsfilterhbox->addWidget(rowsfiltercombobox2); + rowsfilterhbox->addSpacing(10); + rowsfilterhbox->addWidget(rowsfiltercomparatorcombobox2); + rowsfilterhbox->addSpacing(10); + rowsfilterhbox->addWidget(rowsfilterline2); rowsfilterhbox->addSpacing(10); rowsfilterhbox->addWidget(rowsfiltercasesensitive); rowsfilterhbox->addSpacing(10); @@ -87,7 +118,7 @@ cSequenceDatabaseWidget::cSequenceDatabaseWidget(QWidget* parent) { proxymodel = new cSequenceDatabaseProxyModel(this); proxymodel->setSourceModel(databasemodel); proxymodel->setDynamicSortFilter(false); - proxymodel->initialize(rowsfiltercombobox, rowsfiltercomparatorcombobox); + proxymodel->initialize(rowsfilteroperator, rowsfiltercombobox1, rowsfiltercomparatorcombobox1, rowsfilterline1, rowsfiltercombobox2, rowsfiltercomparatorcombobox2, rowsfilterline2); database->setModel(proxymodel); database->setSortingEnabled(true); @@ -117,7 +148,7 @@ cSequenceDatabaseWidget::cSequenceDatabaseWidget(QWidget* parent) { actionSaveDatabase->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_S)); actionSaveDatabase->setToolTip("Save Database... (Ctrl + S)"); toolbarFile->addAction(actionSaveDatabase); - connect(actionSaveDatabase, SIGNAL(triggered()), this, SLOT(saveDatabase())); + connect(actionSaveDatabase, SIGNAL(triggered()), this, SLOT(saveDatabaseCheck())); actionSaveDatabaseAs = new QAction(QIcon(":/images/icons/86.png"), tr("Save &Database As..."), this); actionSaveDatabaseAs->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_D)); @@ -170,6 +201,8 @@ cSequenceDatabaseWidget::cSequenceDatabaseWidget(QWidget* parent) { actionHTMLDocumentation->setToolTip("Show HTML Documentation (F1)"); toolbarHelp->addAction(actionHTMLDocumentation); connect(actionHTMLDocumentation, SIGNAL(triggered()), this, SLOT(showHTMLDocumentation())); + + addToolBarBreak(); toolbarFilter = addToolBar(tr("Filter")); toolbarFilter->addWidget(rowsfilterwidget); @@ -208,7 +241,7 @@ cSequenceDatabaseWidget::cSequenceDatabaseWidget(QWidget* parent) { setCentralWidget(mainwidget); - resize(1280, 780); + resize(defaultwinsizex, defaultwinsizey); databasefile = ""; @@ -231,9 +264,13 @@ cSequenceDatabaseWidget::~cSequenceDatabaseWidget() { delete proxymodel; delete database; - delete rowsfiltercombobox; - delete rowsfiltercomparatorcombobox; - delete rowsfilterline; + delete rowsfilteroperator; + delete rowsfiltercombobox1; + delete rowsfiltercomparatorcombobox1; + delete rowsfilterline1; + delete rowsfiltercombobox2; + delete rowsfiltercomparatorcombobox2; + delete rowsfilterline2; delete rowsfiltercasesensitive; delete rowsfilterwholeword; delete rowsfilterbutton; @@ -314,9 +351,11 @@ void cSequenceDatabaseWidget::resetHeader() { databasemodel->setHorizontalHeaderItem(10, new QStandardItem("View")); database->setItemDelegateForColumn(10, new cViewButtonDelegate()); - rowsfiltercombobox->clear(); + rowsfiltercombobox1->clear(); + rowsfiltercombobox2->clear(); for (int i = 1; i < databasemodel->columnCount() - 1; i++) { - rowsfiltercombobox->addItem(databasemodel->horizontalHeaderItem(i)->text()); + rowsfiltercombobox1->addItem(databasemodel->horizontalHeaderItem(i)->text()); + rowsfiltercombobox2->addItem(databasemodel->horizontalHeaderItem(i)->text()); } database->horizontalHeader()->setStretchLastSection(true); @@ -378,26 +417,25 @@ bool cSequenceDatabaseWidget::checkSequence(int row) { regex rx; // [^\\[\\]]+ is used instead of .+ to prevent from a too complex regex error - switch ((ePeptideType)(databasemodel->item(row, 1)->data(Qt::DisplayRole).toInt())) - { - case linear: - case linearpolyketide: - rx = "^\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*$"; - break; - case cyclic: - case cyclicpolyketide: - rx = "^\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])+$"; - break; - case branched: - rx = "^\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*\\\\\\(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])+\\\\\\)\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*$"; - break; - case branchcyclic: - rx = "(^(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*)?\\\\\\(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])+\\\\\\)\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*$|^\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*\\\\\\(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])+\\\\\\)(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*)?$)"; - break; - case other: - default: - rx = ".*"; - break; + switch ((ePeptideType)(databasemodel->item(row, 1)->data(Qt::DisplayRole).toInt())) { + case linear: + case linearpolyketide: + rx = "^\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*$"; + break; + case cyclic: + case cyclicpolyketide: + rx = "^\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])+$"; + break; + case branched: + rx = "^\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*\\\\\\(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])+\\\\\\)\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*$"; + break; + case branchcyclic: + rx = "(^(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*)?\\\\\\(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])+\\\\\\)\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*$|^\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*\\\\\\(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])+\\\\\\)(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*)?$)"; + break; + case other: + default: + rx = ".*"; + break; } try { @@ -453,13 +491,13 @@ void cSequenceDatabaseWidget::setDataModified(bool datamodified) { void cSequenceDatabaseWidget::keyPressEvent(QKeyEvent *event) { if ((event->key() == Qt::Key_Enter) || (event->key() == Qt::Key_Return)) { - if (rowsfilterline->hasFocus()) { + if (rowsfilterline1->hasFocus() || rowsfilterline2->hasFocus()) { filterRows(); } } if ((event->modifiers() == Qt::ControlModifier) && (event->key() == Qt::Key_F)) { - rowsfilterline->setFocus(); + rowsfilterline1->setFocus(); } if ((event->modifiers() == Qt::ControlModifier) && (event->key() == Qt::Key_T)) { @@ -733,6 +771,18 @@ bool cSequenceDatabaseWidget::saveDatabaseAs() { } +void cSequenceDatabaseWidget::saveDatabaseCheck() { + QMessageBox::StandardButton reply; + reply = QMessageBox::question(this, appname, "Save changes ?", QMessageBox::Yes | QMessageBox::No); + + if (reply == QMessageBox::No) { + return; + } + + saveDatabase(); +} + + void cSequenceDatabaseWidget::addRow() { resetFilter(); @@ -823,12 +873,13 @@ void cSequenceDatabaseWidget::filterRows() { proxymodel->setWholeWord(rowsfilterwholeword->isChecked()); proxymodel->setFilterKeyColumn(-1); proxymodel->setFilterCaseSensitivity(rowsfiltercasesensitive->isChecked()?Qt::CaseSensitive:Qt::CaseInsensitive); - proxymodel->setFilterFixedString(rowsfilterline->text()); + proxymodel->setFilterFixedString(""); } void cSequenceDatabaseWidget::resetFilter() { - rowsfilterline->setText(""); + rowsfilterline1->setText(""); + rowsfilterline2->setText(""); database->horizontalHeader()->setSortIndicator(-1, Qt::AscendingOrder); proxymodel->sort(-1); diff --git a/CycloBranch/gui/cSequenceDatabaseWidget.h b/CycloBranch/gui/cSequenceDatabaseWidget.h index 75fee82..c76a1a3 100644 --- a/CycloBranch/gui/cSequenceDatabaseWidget.h +++ b/CycloBranch/gui/cSequenceDatabaseWidget.h @@ -105,9 +105,13 @@ class cSequenceDatabaseWidget : public QMainWindow QToolBar* toolbarFilter; QWidget* rowsfilterwidget; QHBoxLayout* rowsfilterhbox; - QComboBox* rowsfiltercombobox; - QComboBox* rowsfiltercomparatorcombobox; - QLineEdit* rowsfilterline; + QComboBox* rowsfilteroperator; + QComboBox* rowsfiltercombobox1; + QComboBox* rowsfiltercomparatorcombobox1; + QLineEdit* rowsfilterline1; + QComboBox* rowsfiltercombobox2; + QComboBox* rowsfiltercomparatorcombobox2; + QLineEdit* rowsfilterline2; QCheckBox* rowsfiltercasesensitive; QCheckBox* rowsfilterwholeword; QPushButton* rowsfilterbutton; @@ -160,6 +164,8 @@ private slots: bool saveDatabaseAs(); + void saveDatabaseCheck(); + void addRow(); void removeSelectedRows(); diff --git a/CycloBranch/gui/cSpectrumDetailWidget.cpp b/CycloBranch/gui/cSpectrumDetailWidget.cpp index 7742899..5551561 100644 --- a/CycloBranch/gui/cSpectrumDetailWidget.cpp +++ b/CycloBranch/gui/cSpectrumDetailWidget.cpp @@ -32,6 +32,7 @@ cSpectrumDetailWidget::cSpectrumDetailWidget() { rowid = 0; preparedToShow = false; + localneutralosses.clear(); theoreticalspectrum = new cTheoreticalSpectrum(); } @@ -50,6 +51,7 @@ cSpectrumDetailWidget& cSpectrumDetailWidget::operator=(const cSpectrumDetailWid profileintensity64precision = sd.profileintensity64precision; preparedToShow = false; + localneutralosses = sd.localneutralosses; theoreticalspectrum = new cTheoreticalSpectrum(); if (parameters && sd.theoreticalspectrum) { @@ -116,38 +118,37 @@ string cSpectrumDetailWidget::getDetailsAsHTMLString() { rname += " (" + to_string(parameters->searchedmodifications[theoreticalspectrum->getCandidate().getEndModifID()].massdifference) + " Da)"; } - switch (parameters->peptidetype) - { - case linear: - s += "

"; - s += "N-terminal Modification: " + lname + "
"; - s += "C-terminal Modification: " + rname + "
"; - break; - case cyclic: - s += "
"; - break; - case branched: - s += "

"; - s += "N-terminal Modification: " + lname + "
"; - s += "Branch Modification: " + bname + "
"; - s += "C-terminal Modification: " + rname + "
"; - break; - case branchcyclic: - s += "

"; - s += "Branch Modification: " + bname + "
"; - break; - case linearpolyketide: - s += "

"; - s += "Left Modification: " + lname + "
"; - s += "Right Modification: " + rname + "
"; - break; - case cyclicpolyketide: - s += "
"; - break; - case other: - break; - default: - break; + switch (parameters->peptidetype) { + case linear: + s += "

"; + s += "N-terminal Modification: " + lname + "
"; + s += "C-terminal Modification: " + rname + "
"; + break; + case cyclic: + s += "
"; + break; + case branched: + s += "

"; + s += "N-terminal Modification: " + lname + "
"; + s += "Branch Modification: " + bname + "
"; + s += "C-terminal Modification: " + rname + "
"; + break; + case branchcyclic: + s += "

"; + s += "Branch Modification: " + bname + "
"; + break; + case linearpolyketide: + s += "

"; + s += "Left Modification: " + lname + "
"; + s += "Right Modification: " + rname + "
"; + break; + case cyclicpolyketide: + s += "
"; + break; + case other: + break; + default: + break; } if ((int)theoreticalspectrum->getCandidate().getPathAsString().size() > 0) { @@ -175,13 +176,14 @@ string cSpectrumDetailWidget::getPeaksTableAsHTMLString(bool unmatchedtheoretica bool isred; string tdwidth; string desc; + QString celltext; size_t pos; if (theoreticalspectrum && parameters) { s += ""; - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if (parameters->generateisotopepattern) { columncount = 12; } @@ -200,7 +202,7 @@ string cSpectrumDetailWidget::getPeaksTableAsHTMLString(bool unmatchedtheoretica tdwidth = to_string(100/columncount); - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if (parameters->generateisotopepattern) { s += ""; } @@ -223,7 +225,7 @@ string cSpectrumDetailWidget::getPeaksTableAsHTMLString(bool unmatchedtheoretica s += ""; s += ""; - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if (parameters->generateisotopepattern) { s += ""; s += ""; @@ -269,7 +271,7 @@ string cSpectrumDetailWidget::getPeaksTableAsHTMLString(bool unmatchedtheoretica s += ""; - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { secondspace = (int)peak->description.find(' ', peak->description.find(' ') + 1); s += printHTMLTableCell(peak->description.substr(0, secondspace), isred); } @@ -293,7 +295,7 @@ string cSpectrumDetailWidget::getPeaksTableAsHTMLString(bool unmatchedtheoretica s += printHTMLTableCell(to_string(cropPrecisionToSixDecimals(peak->matchedrelativeintensity)), isred); s += printHTMLTableCell(QVariant(cropDecimalsByteArray(peak->matchedabsoluteintensity)).toString().toStdString(), isred); s += printHTMLTableCell(to_string(cropPrecisionToSixDecimals(peak->matchedppm)), isred); - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if (parameters->generateisotopepattern) { s += printHTMLTableCell(to_string(cropPrecisionToSixDecimals(theoreticalspectrum->getTargetPatternScore(peak->groupid))), isred); s += printHTMLTableCell(to_string(cropPrecisionToSixDecimals(theoreticalspectrum->getTargetPatternFDR(peak->groupid))), isred); @@ -302,14 +304,14 @@ string cSpectrumDetailWidget::getPeaksTableAsHTMLString(bool unmatchedtheoretica } else { s += ""; - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if (parameters->generateisotopepattern) { s += ""; } } } - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { s += printHTMLTableCell(peak->description.substr(peak->description.rfind('(') + 1, peak->description.rfind(')') - peak->description.rfind('(') - 1), isred); langle = (int)peak->description.rfind(""); @@ -320,7 +322,16 @@ string cSpectrumDetailWidget::getPeaksTableAsHTMLString(bool unmatchedtheoretica tmp1 = (int)peak->description.find('<'); tmp2 = (int)peak->description.rfind(""); tmp2 += 3; - s += printHTMLTableCell(peak->description.substr(tmp1, rangle - tmp1 + 1) + "view" + peak->description.substr(langle, tmp2 - langle + 1), isred); + + celltext = peak->description.substr(tmp1, rangle - tmp1 + 1).c_str(); + if (celltext.contains("https://www.ncbi.nlm.nih.gov/pccompound?term=")) { + celltext += "search"; + } + else { + celltext += "view"; + } + celltext += peak->description.substr(langle, tmp2 - langle + 1).c_str(); + s += printHTMLTableCell(celltext.toStdString(), isred); } else { s += printHTMLTableCell(peak->description.substr(secondspace + 1, peak->description.rfind('(') - secondspace - 2), isred); @@ -368,7 +379,7 @@ string cSpectrumDetailWidget::getPeaksTableAsHTMLString(bool unmatchedtheoretica s += printHTMLTableCell(to_string(cropPrecisionToSixDecimals(peak->relativeintensity)), false); s += printHTMLTableCell(QVariant(cropDecimalsByteArray(peak->absoluteintensity)).toString().toStdString(), false); s += ""; - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { s += ""; if (parameters->generateisotopepattern) { s += ""; @@ -394,11 +405,12 @@ string cSpectrumDetailWidget::getPartialPeaksTableAsHTMLString(int id, bool expo cPeak* peak; bool isred; string desc; + QString celltext; size_t pos; if (theoreticalspectrum && parameters) { - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { thpeaks = new cPeaksList(); for (int i = 0; i < (int)theoreticalspectrum->getTheoreticalPeaks()->size(); i++) { peak = &((*(theoreticalspectrum->getTheoreticalPeaks()))[i]); @@ -439,11 +451,14 @@ string cSpectrumDetailWidget::getPartialPeaksTableAsHTMLString(int id, bool expo s += ""; s += printHTMLTableCell(to_string(id + 1), isred); - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if ((parameters->peaklistfileformat == mis) || (parameters->peaklistfileformat == imzML)) { s += printHTMLTableCell(to_string(theoreticalspectrum->getExperimentalSpectrum().getCoordinateX()), isred); s += printHTMLTableCell(to_string(theoreticalspectrum->getExperimentalSpectrum().getCoordinateY()), isred); } + else { + s += printHTMLTableCell(to_string(cropPrecisionToSixDecimals(theoreticalspectrum->getExperimentalSpectrum().getRetentionTime())), isred); + } secondspace = (int)peak->description.find(' ', peak->description.find(' ') + 1); s += printHTMLTableCell(peak->description.substr(0, secondspace), isred); } @@ -452,7 +467,7 @@ string cSpectrumDetailWidget::getPartialPeaksTableAsHTMLString(int id, bool expo s += printHTMLTableCell(to_string(theoreticalspectrum->getPathId() + 1), isred); } - if (parameters->mode != dereplication) { + if ((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch)) { s += printHTMLTableCell(peak->description.substr(0, peak->description.find(':')), isred); } @@ -467,7 +482,7 @@ string cSpectrumDetailWidget::getPartialPeaksTableAsHTMLString(int id, bool expo s += printHTMLTableCell(to_string(cropPrecisionToSixDecimals(peak->matchedrelativeintensity)), isred); s += printHTMLTableCell(QVariant(cropDecimalsByteArray(peak->matchedabsoluteintensity)).toString().toStdString(), isred); s += printHTMLTableCell(to_string(cropPrecisionToSixDecimals(peak->matchedppm)), isred); - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if (parameters->generateisotopepattern) { s += printHTMLTableCell(to_string(cropPrecisionToSixDecimals(theoreticalspectrum->getTargetPatternScore(peak->groupid))), isred); s += printHTMLTableCell(to_string(cropPrecisionToSixDecimals(theoreticalspectrum->getTargetPatternFDR(peak->groupid))), isred); @@ -476,14 +491,14 @@ string cSpectrumDetailWidget::getPartialPeaksTableAsHTMLString(int id, bool expo } else { s += ""; - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if (parameters->generateisotopepattern) { s += ""; } } } - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { s += printHTMLTableCell(peak->description.substr(peak->description.rfind('(') + 1, peak->description.rfind(')') - peak->description.rfind('(') - 1), isred); langle = (int)peak->description.rfind(""); @@ -494,7 +509,16 @@ string cSpectrumDetailWidget::getPartialPeaksTableAsHTMLString(int id, bool expo tmp1 = (int)peak->description.find('<'); tmp2 = (int)peak->description.rfind(""); tmp2 += 3; - s += printHTMLTableCell(peak->description.substr(tmp1, rangle - tmp1 + 1) + "view" + peak->description.substr(langle, tmp2 - langle + 1), isred); + + celltext = peak->description.substr(tmp1, rangle - tmp1 + 1).c_str(); + if (celltext.contains("https://www.ncbi.nlm.nih.gov/pccompound?term=")) { + celltext += "search"; + } + else { + celltext += "view"; + } + celltext += peak->description.substr(langle, tmp2 - langle + 1).c_str(); + s += printHTMLTableCell(celltext.toStdString(), isred); } else { s += printHTMLTableCell(peak->description.substr(secondspace + 1, peak->description.rfind('(') - secondspace - 2), isred); @@ -525,7 +549,7 @@ string cSpectrumDetailWidget::getPartialPeaksTableAsHTMLString(int id, bool expo s += ""; } - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { delete thpeaks; } @@ -587,26 +611,25 @@ cSpectrumDetailWidget::~cSpectrumDetailWidget() { if (parameters && ((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch))) { - switch (parameters->peptidetype) - { - case linear: - case linearpolyketide: - delete linearwidget; - break; - case cyclic: - case cyclicpolyketide: - delete cyclicwidget; - break; - case branched: - delete branchedwidget; - break; - case branchcyclic: - delete branchcyclicwidget; - break; - case other: - break; - default: - break; + switch (parameters->peptidetype) { + case linear: + case linearpolyketide: + delete linearwidget; + break; + case cyclic: + case cyclicpolyketide: + delete cyclicwidget; + break; + case branched: + delete branchedwidget; + break; + case branchcyclic: + delete branchcyclicwidget; + break; + case other: + break; + default: + break; } } @@ -659,13 +682,27 @@ void cSpectrumDetailWidget::prepareToShow(QAction* actionShowIsomers, cPeakListS if (!preparedToShow) { if (parameters) { - if ((parameters->mode == dereplication) || (parameters->mode == singlecomparison)) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { + string title = "Experimental Spectrum No. " + to_string(rowid); + if (theoreticalspectrum) { + if ((parameters->peaklistfileformat == mis) || (parameters->peaklistfileformat == imzML)) { + title += " - X: " + to_string(theoreticalspectrum->getExperimentalSpectrum().getCoordinateX()); + title += " Y: " + to_string(theoreticalspectrum->getExperimentalSpectrum().getCoordinateY()); + } + else { + if (theoreticalspectrum->getExperimentalSpectrum().getRetentionTime() > 0) { + title += " - Time: " + to_string(theoreticalspectrum->getExperimentalSpectrum().getRetentionTime()); + } + } + } + setWindowTitle(title.c_str()); + } + else if (parameters->mode == singlecomparison) { setWindowTitle(("Experimental Spectrum No. " + to_string(rowid)).c_str()); } else { setWindowTitle(("Theoretical Spectrum No. " + to_string(rowid)).c_str()); } - } this->rawdata = rawdata; @@ -987,12 +1024,6 @@ void cSpectrumDetailWidget::prepareToShow(QAction* actionShowIsomers, cPeakListS toolbarNeutralLoss->addWidget(neutrallosswidget); neutrallosscombobox->addItem(tr("all")); - if (parameters->neutrallossesfortheoreticalspectra.size() > 0) { - neutrallosscombobox->addItem(tr("none")); - for (int i = 0; i < (int)parameters->neutrallossesfortheoreticalspectra.size(); i++) { - neutrallosscombobox->addItem(tr(parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[i]].summary.c_str())); - } - } connect(neutrallosscombobox, SIGNAL(currentIndexChanged(QString)), spectrumscene, SLOT(neutralLossChanged(QString))); connect(neutrallosscombobox, SIGNAL(currentIndexChanged(int)), this, SLOT(filterTableAfterNeutralLossChanged(int))); @@ -1025,18 +1056,11 @@ void cSpectrumDetailWidget::prepareToShow(QAction* actionShowIsomers, cPeakListS // cyclic - if (theoreticalspectrum && ((parameters->peptidetype == cyclic) || (parameters->peptidetype == cyclicpolyketide))) { - int r = (int)theoreticalspectrum->getCandidate().getAcronyms().size(); - int hint = (int)theoreticalspectrum->getVisualCoverage().size()/(2*r); - + if (theoreticalspectrum && ((parameters->peptidetype == cyclic) || (parameters->peptidetype == cyclicpolyketide))) { + vector rotationslabels = theoreticalspectrum->getLabelsOfRotations(); rotationcombobox->addItem(tr("all")); - - string s; - if (theoreticalspectrum->getVisualCoverage().size() > 0) { - for (int i = 0; i < 2*r; i++) { - s = theoreticalspectrum->getVisualCoverage()[i*hint].name.substr(0, theoreticalspectrum->getVisualCoverage()[i*hint].name.rfind('_')); - rotationcombobox->addItem(tr(s.c_str())); - } + for (auto& it : rotationslabels) { + rotationcombobox->addItem(tr(it.c_str())); } connect(rotationcombobox, SIGNAL(currentIndexChanged(int)), spectrumscene, SLOT(rotationChanged(int))); @@ -1052,12 +1076,12 @@ void cSpectrumDetailWidget::prepareToShow(QAction* actionShowIsomers, cPeakListS // branched if (parameters->peptidetype == branched) { trotationcombobox->addItem(tr("all")); - trotationcombobox->addItem(tr("1 (left-to-right)")); - trotationcombobox->addItem(tr("2 (top-to-right)")); - trotationcombobox->addItem(tr("3 (right-to-left)")); - trotationcombobox->addItem(tr("4 (left-to-top)")); - trotationcombobox->addItem(tr("5 (top-to-left)")); - trotationcombobox->addItem(tr("6 (right-to-top)")); + trotationcombobox->addItem(tr("1 (N-term to C-term)")); + trotationcombobox->addItem(tr("2 (Branch to C-term)")); + trotationcombobox->addItem(tr("3 (C-term to N-term)")); + trotationcombobox->addItem(tr("4 (N-term to Branch)")); + trotationcombobox->addItem(tr("5 (Branch to N-term)")); + trotationcombobox->addItem(tr("6 (C-term to Branch)")); connect(trotationcombobox, SIGNAL(currentIndexChanged(int)), spectrumscene, SLOT(trotationChanged(int))); connect(trotationcombobox, SIGNAL(currentIndexChanged(int)), branchedwidget, SLOT(trotationChanged(int))); @@ -1070,17 +1094,10 @@ void cSpectrumDetailWidget::prepareToShow(QAction* actionShowIsomers, cPeakListS // branch-cyclic if (parameters && theoreticalspectrum && (parameters->peptidetype == branchcyclic)) { - int r = (int)theoreticalspectrum->getCandidate().getAcronyms().size() - (int)theoreticalspectrum->getCandidate().getBranchSize(); - int hint = (int)theoreticalspectrum->getVisualCoverage().size()/(2*r); - + vector rotationslabels = theoreticalspectrum->getLabelsOfRotations(); rotationcombobox->addItem(tr("all")); - - string s; - if (theoreticalspectrum->getVisualCoverage().size() > 0) { - for (int i = 0; i < 2*r; i++) { - s = theoreticalspectrum->getVisualCoverage()[i*hint].name.substr(0, theoreticalspectrum->getVisualCoverage()[i*hint].name.find('_')); - rotationcombobox->addItem(tr(s.c_str())); - } + for (auto& it : rotationslabels) { + rotationcombobox->addItem(tr(it.c_str())); } connect(rotationcombobox, SIGNAL(currentIndexChanged(int)), spectrumscene, SLOT(rotationChanged(int))); @@ -1092,12 +1109,12 @@ void cSpectrumDetailWidget::prepareToShow(QAction* actionShowIsomers, cPeakListS toolbarRotation->addWidget(rotationwidget); trotationcombobox->addItem(tr("all")); - trotationcombobox->addItem(tr("1 (left-to-right)")); - trotationcombobox->addItem(tr("2 (top-to-right)")); - trotationcombobox->addItem(tr("3 (right-to-left)")); - trotationcombobox->addItem(tr("4 (left-to-top)")); - trotationcombobox->addItem(tr("5 (top-to-left)")); - trotationcombobox->addItem(tr("6 (right-to-top)")); + trotationcombobox->addItem(tr("1 (N-term to C-term)")); + trotationcombobox->addItem(tr("2 (Branch to C-term)")); + trotationcombobox->addItem(tr("3 (C-term to N-term)")); + trotationcombobox->addItem(tr("4 (N-term to Branch)")); + trotationcombobox->addItem(tr("5 (Branch to N-term)")); + trotationcombobox->addItem(tr("6 (C-term to Branch)")); connect(trotationcombobox, SIGNAL(currentIndexChanged(int)), spectrumscene, SLOT(trotationChanged(int))); connect(trotationcombobox, SIGNAL(currentIndexChanged(int)), branchcyclicwidget, SLOT(trotationChanged(int))); @@ -1117,7 +1134,7 @@ void cSpectrumDetailWidget::prepareToShow(QAction* actionShowIsomers, cPeakListS sizes.push_back(100); sizes.push_back(100); - if ((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch)) { + if ((parameters->mode == denovoengine) || ((parameters->mode == singlecomparison) && (parameters->peptidetype != other)) || ((parameters->mode == databasesearch) && (parameters->peptidetype != other))) { switch (parameters->peptidetype) { case linear: @@ -1188,11 +1205,11 @@ void cSpectrumDetailWidget::prepareToShow(QAction* actionShowIsomers, cPeakListS setMenuBar(menuBar); - resize(1280, 780); + resize(defaultwinsizex, defaultwinsizey); if (parameters && theoreticalspectrum) { - if ((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch)) { + if ((parameters->mode == denovoengine) || ((parameters->mode == singlecomparison) && (parameters->peptidetype != other)) || ((parameters->mode == databasesearch) && (parameters->peptidetype != other))) { switch (parameters->peptidetype) { case linear: @@ -1231,6 +1248,26 @@ void cSpectrumDetailWidget::prepareToShow(QAction* actionShowIsomers, cPeakListS preparePeaksTable(); + if ((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch)) { + if (localneutralosses.size() > 0) { + neutrallosscombobox->addItem(tr("none")); + if (localneutralosses.size() <= 10000) { + vector tmpstrvector; + tmpstrvector.reserve(localneutralosses.size()); + for (auto& it : localneutralosses) { + tmpstrvector.push_back(it); + } + + compareStringBySize cmp; + sort(tmpstrvector.begin(), tmpstrvector.end(), cmp); + + for (auto& it : tmpstrvector) { + neutrallosscombobox->addItem(tr(it.c_str())); + } + } + } + } + } preparedToShow = true; @@ -1268,7 +1305,7 @@ void cSpectrumDetailWidget::findAll(const QString& str, QTextDocument::FindFlags QStandardItem* item; for (int i = 0; i < proxymodel->rowCount(); i++) { - for (int j = 0; j < ((parameters->mode == dereplication)?peakstablemodel->columnCount() - 1:peakstablemodel->columnCount()); j++) { + for (int j = 0; j < (((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) ? peakstablemodel->columnCount() - 1 : peakstablemodel->columnCount()); j++) { item = peakstablemodel->itemFromIndex(proxymodel->mapToSource(proxymodel->index(i, j))); if (!item) { @@ -1355,6 +1392,11 @@ void cSpectrumDetailWidget::zoomToPeak(double value) { } +set& cSpectrumDetailWidget::getLocalNeutralLosses() { + return localneutralosses; +} + + void cSpectrumDetailWidget::keyPressEvent(QKeyEvent *event) { if ((event->key() == Qt::Key_Enter) || (event->key() == Qt::Key_Return)) { setMZInterval(); @@ -1399,7 +1441,7 @@ void cSpectrumDetailWidget::preparePeaksTable() { peakstable->horizontalHeader()->setSectionsMovable(true); //peakstable->verticalHeader()->setDefaultSectionSize(30); - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if (parameters->generateisotopepattern) { peakstablemodel->setColumnCount(12); } @@ -1421,7 +1463,7 @@ void cSpectrumDetailWidget::preparePeaksTable() { } int currentcolumn = 0; - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if (parameters->generateisotopepattern) { peakstablemodel->horizontalHeaderItem(currentcolumn)->setText("Pattern Type"); } @@ -1454,7 +1496,7 @@ void cSpectrumDetailWidget::preparePeaksTable() { peakstablemodel->horizontalHeaderItem(currentcolumn)->setText("Error [ppm]"); currentcolumn++; - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if (parameters->generateisotopepattern) { peakstablemodel->horizontalHeaderItem(currentcolumn)->setText("Score"); @@ -1494,7 +1536,7 @@ void cSpectrumDetailWidget::preparePeaksTable() { int thpeakscount; cPeak* peak; int secondspace, langle, rangle, tmp; - string stmp, desc; + string stmp, desc, fragname; size_t pos; QBrush brush; @@ -1534,7 +1576,7 @@ void cSpectrumDetailWidget::preparePeaksTable() { } currentcolumn = 0; - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { secondspace = (int)peak->description.find(' ', peak->description.find(' ') + 1); peakstablemodel->setItem(i, currentcolumn, new QStandardItem()); @@ -1544,7 +1586,18 @@ void cSpectrumDetailWidget::preparePeaksTable() { else { peakstablemodel->setItem(i, currentcolumn, new QStandardItem()); peakstablemodel->item(i, currentcolumn)->setForeground(brush); - peakstablemodel->item(i, currentcolumn)->setText(peak->description.substr(0, peak->description.find(':')).c_str()); + fragname = peak->description.substr(0, peak->description.find(':')); + peakstablemodel->item(i, currentcolumn)->setText(fragname.c_str()); + if (fragname.rfind(" -") != string::npos) { + fragname = fragname.substr(fragname.rfind(" -") + 2); + if (fragname.find('_') != string::npos) { + fragname = fragname.substr(0, fragname.find('_')); + } + if (fragname.find(' ') != string::npos) { + fragname = fragname.substr(0, fragname.find(' ')); + } + localneutralosses.insert(fragname); + } } currentcolumn++; @@ -1583,7 +1636,7 @@ void cSpectrumDetailWidget::preparePeaksTable() { peakstablemodel->item(i, currentcolumn)->setData(QVariant::fromValue(cropPrecisionToSixDecimalsByteArray(peak->matchedppm)), Qt::DisplayRole); currentcolumn++; - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if (parameters->generateisotopepattern) { peakstablemodel->setItem(i, currentcolumn, new QStandardItem()); peakstablemodel->item(i, currentcolumn)->setForeground(brush); @@ -1599,14 +1652,14 @@ void cSpectrumDetailWidget::preparePeaksTable() { } else { currentcolumn += 4; - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if (parameters->generateisotopepattern) { currentcolumn += 2; } } } - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { peakstablemodel->setItem(i, currentcolumn, new QStandardItem()); peakstablemodel->item(i, currentcolumn)->setForeground(brush); QString summary; @@ -1726,7 +1779,7 @@ void cSpectrumDetailWidget::preparePeaksTable() { peakstable->resizeColumnToContents(i); } - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if (parameters->generateisotopepattern) { peakstable->setColumnWidth(9, min(400, peakstable->columnWidth(9))); } @@ -1968,7 +2021,7 @@ void cSpectrumDetailWidget::openFindDialog() { void cSpectrumDetailWidget::openExportImageDialog() { - if (parameters && ((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch))) { + if (parameters && ((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch)) && (parameters->peptidetype != other)) { exportdialog->exec(); } else { @@ -2162,18 +2215,19 @@ void cSpectrumDetailWidget::filterPeaksTable() { pattern = "^"; } pattern += "((?!"; - for (int i = 0; i < (int)parameters->neutrallossesfortheoreticalspectra.size(); i++) { - pattern += "-"; - pattern += parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[i]].summary.c_str(); + for (auto& it : localneutralosses) { + pattern += " -"; + pattern += it.c_str(); pattern += "(?:$|_| )"; - if (i < (int)parameters->neutrallossesfortheoreticalspectra.size() - 1) { - pattern += "|"; - } + pattern += "|"; + } + if (localneutralosses.size() > 0) { + pattern = pattern.left(pattern.size() - 1); } pattern += ").)*$"; } else { - pattern += "-"; + pattern += " -"; pattern += neutrallosscombobox->currentText(); pattern += "(?:$|_| )"; } @@ -2252,7 +2306,181 @@ void cSpectrumDetailWidget::rawDataStateChanged(bool state) { } - if ((parameters->peaklistfileformat == imzML) && (parameters->mode == dereplication) && (imzmlprofilemetadata->size() > 0)) { + if (parameters->peaklistfileformat == dat) { + + targetid = rowid - 1; + + if ((targetid >= 0) && (targetid < rawdata->size())) { + if (state) { + string mgfname = parameters->peaklistfilename.substr(0, parameters->peaklistfilename.rfind('/')); + mgfname = mgfname.substr(0, mgfname.size() - 4); + mgfname += ".mgf"; + + peakliststream.open(mgfname); + + (*rawdata)[targetid].clear(); + (*rawdata)[targetid].loadFromMGFStream(peakliststream); + while (peakliststream.good() && (theoreticalspectrum->getExperimentalSpectrum().getTitle().compare((*rawdata)[targetid].getTitle()) != 0)) { + (*rawdata)[targetid].clear(); + (*rawdata)[targetid].loadFromMGFStream(peakliststream); + } + + if ((theoreticalspectrum->getExperimentalSpectrum().getTitle().compare((*rawdata)[targetid].getTitle()) != 0)) { + (*rawdata)[targetid].clear(); + } + + peakliststream.close(); + + progress.setValue(33); + + (*rawdata)[targetid].sortbyMass(); + (*rawdata)[targetid].normalizeIntenzityByValue(theoreticalspectrum->getExperimentalSpectrum().getMaximumAbsoluteIntensity() * 100.0 / theoreticalspectrum->getExperimentalSpectrum().getMaximumRelativeIntensity()); + (*rawdata)[targetid].cropMinimumMZRatio(parameters->minimummz, parameters->fragmentmasserrortolerance); + + if ((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch)) { + (*rawdata)[targetid].cropMaximumMZRatio(charge(uncharge(parameters->precursormass, parameters->precursorcharge) + maxmzoverhead, (parameters->precursorcharge > 0) ? 1 : -1), parameters->precursormasserrortolerance); + } + + progress.setValue(66); + } + else { + (*rawdata)[targetid].clear(); + } + } + + emit rawDataStateChangedSignal(state); + + } + + if (parameters->peaklistfileformat == raw) { + + if ((parameters->mode == denovoengine) || (parameters->mode == databasesearch)) { + fileid = parameters->scannumber - 1; + } + else { + fileid = rowid - 1; + } + targetid = rowid - 1; + + if ((targetid >= 0) && (targetid < rawdata->size())) { + if (state) { + cMzML mzml; + vector peaklists; + + bool terminatecomputation = false; + + string basename = parameters->peaklistfilename.substr(0, (int)parameters->peaklistfilename.size() - 3); + string mzmlname = basename + "mzML"; + + int resultcode = mzml.parse(mzmlname, peaklists, fileid, parameters->mode, 0 /* ok */, terminatecomputation /* ok */); + if ((resultcode == 0) && (peaklists.size() == 1)) { + + progress.setValue(33); + + string mgfname = basename + "profile." + to_string(fileid) + ".mgf"; + + ifstream mgfifstream; + mgfifstream.open(mgfname); + (*rawdata)[targetid].clear(); + (*rawdata)[targetid].loadFromMGFStream(mgfifstream); + mgfifstream.close(); + + QFile::remove(mgfname.c_str()); + + (*rawdata)[targetid].sortbyMass(); + (*rawdata)[targetid].normalizeIntenzityByValue(theoreticalspectrum->getExperimentalSpectrum().getMaximumAbsoluteIntensity() * 100.0 / theoreticalspectrum->getExperimentalSpectrum().getMaximumRelativeIntensity()); + (*rawdata)[targetid].cropMinimumMZRatio(parameters->minimummz, parameters->fragmentmasserrortolerance); + + progress.setValue(66); + + } + } + else { + (*rawdata)[targetid].clear(); + } + } + + emit rawDataStateChangedSignal(state); + + } + + if (parameters->peaklistfileformat == mzML) { + + if ((parameters->mode == denovoengine) || (parameters->mode == databasesearch)) { + fileid = parameters->scannumber - 1; + } + else { + fileid = rowid - 1; + } + targetid = rowid - 1; + + if ((targetid >= 0) && (targetid < rawdata->size())) { + if (state) { + cMzML mzml; + vector peaklists; + + bool terminatecomputation = false; + + string basename = parameters->peaklistfilename.substr(0, (int)parameters->peaklistfilename.size() - 4); + string mzmlname = basename + "mzML"; + + int resultcode = mzml.parse(mzmlname, peaklists, fileid, parameters->mode, 0 /* ok */, terminatecomputation /* ok */); + if ((resultcode == 0) && (peaklists.size() == 1)) { + + progress.setValue(33); + + string fname = basename + "profile." + to_string(fileid); + + string s; + #if OS_TYPE == UNX + s = installdir.toStdString() + "External/linux/correctprofile.sh " + fname + "," + to_string(parameters->fwhm); + #else + #if OS_TYPE == OSX + s = installdir.toStdString() + "External/macosx/correctprofile.sh " + fname + "," + to_string(parameters->fwhm); + #else + s = "External\\windows\\correctprofile.bat \"" + fname + "\" " + to_string(parameters->fwhm); + #endif + #endif + + progress.setValue(66); + + if (system(s.c_str()) == 0) { + mzmlname = fname + ".mzML"; + string mgfname = fname + ".0000000000.mgf"; + + cMzML correctedmzml; + peaklists.clear(); + + resultcode = correctedmzml.parse(mzmlname, peaklists, -1, singlecomparison /* ok */, 0 /* ok */, terminatecomputation /* ok */); + if ((resultcode == 0) && (peaklists.size() == 1)) { + QFile::remove(mzmlname.c_str()); + + ifstream mgfifstream; + mgfifstream.open(mgfname); + (*rawdata)[targetid].clear(); + (*rawdata)[targetid].loadFromMGFStream(mgfifstream); + mgfifstream.close(); + + QFile::remove(mgfname.c_str()); + + (*rawdata)[targetid].sortbyMass(); + (*rawdata)[targetid].normalizeIntenzityByValue(theoreticalspectrum->getExperimentalSpectrum().getMaximumAbsoluteIntensity() * 100.0 / theoreticalspectrum->getExperimentalSpectrum().getMaximumRelativeIntensity()); + (*rawdata)[targetid].cropMinimumMZRatio(parameters->minimummz, parameters->fragmentmasserrortolerance); + } + } + + } + } + else { + (*rawdata)[targetid].clear(); + } + } + + emit rawDataStateChangedSignal(state); + + } + + if ((parameters->peaklistfileformat == imzML) && ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) && (imzmlprofilemetadata->size() > 0)) { targetid = rowid - 1; if ((targetid >= 0) && (targetid < rawdata->size())) { @@ -2284,7 +2512,7 @@ void cSpectrumDetailWidget::rawDataStateChanged(bool state) { mgfofstream << "BEGIN IONS" << endl; mgfofstream << "TITLE=" << endl; - mgfofstream << "SCAN=" << to_string(rowid) << endl; + mgfofstream << "SCANS=" << to_string(rowid) << endl; mgfofstream << "PEPMASS=1" << endl; mgfofstream << "RTINSECONDS=1" << endl; mgfofstream << "CHARGE=1+" << endl << endl; @@ -2322,7 +2550,7 @@ void cSpectrumDetailWidget::rawDataStateChanged(bool state) { string mzmlname = fname + ".mzML"; string mgfname = fname + ".0000000000.mgf"; - int resultcode = mzml.parse(mzmlname, peaklists, singlecomparison /* ok */, 0 /* ok */, terminatecomputation /* ok */); + int resultcode = mzml.parse(mzmlname, peaklists, -1, singlecomparison /* ok */, 0 /* ok */, terminatecomputation /* ok */); if ((resultcode == 0) && (peaklists.size() == 1)) { QFile::remove(mzmlname.c_str()); @@ -2346,7 +2574,7 @@ void cSpectrumDetailWidget::rawDataStateChanged(bool state) { emit rawDataStateChangedSignal(state); } - + } progress.setValue(maximum); @@ -2378,7 +2606,7 @@ void cSpectrumDetailWidget::hidePeakLabels(bool hide) { spectrumscene->hidePeakLabels(hide); - if (parameters && (parameters->mode != dereplication)) { + if (parameters && ((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch))) { switch (parameters->peptidetype) { case linear: linearwidget->hidePeakLabels(hide); @@ -2429,7 +2657,7 @@ void cSpectrumDetailWidget::filterTableAfterTRotationChanged(int index) { void cSpectrumDetailWidget::showIsomersStateChanged() { - if (parameters->mode != dereplication) { + if ((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch)) { reportisomers = actionShowIsomers->isChecked(); @@ -2512,60 +2740,68 @@ void cSpectrumDetailWidget::showHTMLDocumentation() { if (parameters->mode == dereplication) { QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo("docs/html/dereplication.html").absoluteFilePath())); } + else if (parameters->mode == compoundsearch) { + QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo("docs/html/compoundsearch.html").absoluteFilePath())); + } else { switch (parameters->peptidetype) { - case linear: - QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo("docs/html/lineardetail.html").absoluteFilePath())); - break; - case cyclic: - QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo("docs/html/cyclicdetail.html").absoluteFilePath())); - break; - case branched: - QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo("docs/html/brancheddetail.html").absoluteFilePath())); - break; - case branchcyclic: - QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo("docs/html/branchcyclicdetail.html").absoluteFilePath())); - break; - case linearpolyketide: - QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo("docs/html/linearketidedetail.html").absoluteFilePath())); - break; - case cyclicpolyketide: - QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo("docs/html/cyclicketidedetail.html").absoluteFilePath())); - break; - case other: - break; - default: - break; + case linear: + QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo("docs/html/lineardetail.html").absoluteFilePath())); + break; + case cyclic: + QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo("docs/html/cyclicdetail.html").absoluteFilePath())); + break; + case branched: + QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo("docs/html/brancheddetail.html").absoluteFilePath())); + break; + case branchcyclic: + QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo("docs/html/branchcyclicdetail.html").absoluteFilePath())); + break; + case linearpolyketide: + QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo("docs/html/linearketidedetail.html").absoluteFilePath())); + break; + case cyclicpolyketide: + QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo("docs/html/cyclicketidedetail.html").absoluteFilePath())); + break; + case other: + QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo("docs/html/metabolitedetail.html").absoluteFilePath())); + break; + default: + break; } } #else if (parameters->mode == dereplication) { QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo(installdir + "docs/html/dereplication.html").absoluteFilePath())); } + else if (parameters->mode == compoundsearch) { + QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo(installdir + "docs/html/compoundsearch.html").absoluteFilePath())); + } else { switch (parameters->peptidetype) { - case linear: - QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo(installdir + "docs/html/lineardetail.html").absoluteFilePath())); - break; - case cyclic: - QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo(installdir + "docs/html/cyclicdetail.html").absoluteFilePath())); - break; - case branched: - QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo(installdir + "docs/html/brancheddetail.html").absoluteFilePath())); - break; - case branchcyclic: - QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo(installdir + "docs/html/branchcyclicdetail.html").absoluteFilePath())); - break; - case linearpolyketide: - QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo(installdir + "docs/html/linearketidedetail.html").absoluteFilePath())); - break; - case cyclicpolyketide: - QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo(installdir + "docs/html/cyclicketidedetail.html").absoluteFilePath())); - break; - case other: - break; - default: - break; + case linear: + QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo(installdir + "docs/html/lineardetail.html").absoluteFilePath())); + break; + case cyclic: + QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo(installdir + "docs/html/cyclicdetail.html").absoluteFilePath())); + break; + case branched: + QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo(installdir + "docs/html/brancheddetail.html").absoluteFilePath())); + break; + case branchcyclic: + QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo(installdir + "docs/html/branchcyclicdetail.html").absoluteFilePath())); + break; + case linearpolyketide: + QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo(installdir + "docs/html/linearketidedetail.html").absoluteFilePath())); + break; + case cyclicpolyketide: + QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo(installdir + "docs/html/cyclicketidedetail.html").absoluteFilePath())); + break; + case other: + QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo(installdir + "docs/html/metabolitedetail.html").absoluteFilePath())); + break; + default: + break; } } #endif diff --git a/CycloBranch/gui/cSpectrumDetailWidget.h b/CycloBranch/gui/cSpectrumDetailWidget.h index 417f6b3..6093293 100644 --- a/CycloBranch/gui/cSpectrumDetailWidget.h +++ b/CycloBranch/gui/cSpectrumDetailWidget.h @@ -193,6 +193,13 @@ class cSpectrumDetailWidget : public QMainWindow void zoomToPeak(double value); + /** + \brief Get a set of local neutral losses. + \retval set get a set of local neutral losses + */ + set& getLocalNeutralLosses(); + + protected: @@ -294,6 +301,8 @@ class cSpectrumDetailWidget : public QMainWindow int rowid; bool preparedToShow; + set localneutralosses; + cParameters* parameters; cPeakListSeries* rawdata; diff --git a/CycloBranch/gui/cSpectrumSceneWidget.cpp b/CycloBranch/gui/cSpectrumSceneWidget.cpp index a2fbe20..91220ef 100644 --- a/CycloBranch/gui/cSpectrumSceneWidget.cpp +++ b/CycloBranch/gui/cSpectrumSceneWidget.cpp @@ -1,4 +1,5 @@ #include "gui/cSpectrumSceneWidget.h" +#include "gui/cSpectrumDetailWidget.h" #include #include @@ -25,6 +26,9 @@ cSpectrumSceneWidget::cSpectrumSceneWidget(QWidget* parent) { rawdatapeaklist = 0; origwidth = 0; origheight = 0; + calledbyresizeevent = false; + oldwidth.clear(); + oldheight.clear(); currentscale = 1; absoluteintensity = false; rawdatastate = false; @@ -64,6 +68,9 @@ cSpectrumSceneWidget::cSpectrumSceneWidget(QWidget* parent) { zoomsimpletextitem = new QGraphicsSimpleTextItem(); zoomgroup->addToGroup(zoomsimpletextitem); scene->addItem(zoomgroup); + + cursorsimpletextitem = new QGraphicsSimpleTextItem(); + scene->addItem(cursorsimpletextitem); } @@ -77,7 +84,7 @@ void cSpectrumSceneWidget::initialize(cParameters* parameters, cTheoreticalSpect this->theoreticalspectrum = theoreticalspectrum; if (parameters && parameters->useprofiledata) { - if ((parameters->peaklistfileformat == baf) || ((parameters->mode == dereplication) && (parameters->peaklistfileformat == imzML))) { + if ((parameters->peaklistfileformat == baf) || (parameters->peaklistfileformat == dat) || (parameters->peaklistfileformat == mzML) || (parameters->peaklistfileformat == raw) || (((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) && (parameters->peaklistfileformat == imzML))) { if ((rowid > 0) && (rowid <= rawdata->size())) { this->rawdatapeaklist = &((*rawdata)[rowid - 1]); } @@ -198,6 +205,7 @@ void cSpectrumSceneWidget::hidePeakLabels(bool state) { void cSpectrumSceneWidget::wheelEvent(QWheelEvent *event) { double part, newmin, newmax; + if (event->delta() > 0) { part = fabs(maxmzratio - minmzratio) / 10.0; newmin = minmzratio + part; @@ -214,8 +222,9 @@ void cSpectrumSceneWidget::wheelEvent(QWheelEvent *event) { maxmzratio = newmax; emit updateMZInterval(minmzratio, maxmzratio); redrawScene(); + viewport()->update(); } - + event->accept(); } @@ -223,8 +232,25 @@ void cSpectrumSceneWidget::wheelEvent(QWheelEvent *event) { void cSpectrumSceneWidget::mouseMoveEvent(QMouseEvent *event) { QGraphicsView::mouseMoveEvent(event); + QPointF p = mapToScene(event->x(), event->y()); + + QPointF curpos; + curpos.setX(p.x() + 15); + curpos.setY(p.y() - 2); + + double mz = getMZRatioFromXPosition((int)p.x(), origwidth); + double intensity = getIntensityFromYPosition((int)p.y(), origheight); + QString curtext = "m/z: " + QString::number(mz) + ", int: " + QString::number(intensity); + if (!absoluteintensity) { + curtext += " %"; + } + + cursorsimpletextitem->setPos(curpos); + cursorsimpletextitem->setText(curtext); + if ((pressedx != -1) && (pressedy != -1)) { - QPointF p = mapToScene(event->x(), event->y()); + cursorsimpletextitem->setVisible(false); + currentx = (int)p.x(); currenty = (int)p.y(); @@ -242,6 +268,14 @@ void cSpectrumSceneWidget::mouseMoveEvent(QMouseEvent *event) { redrawScene(); } } + else { + if (((int)p.x() >= leftmargin) && ((int)p.x() <= origwidth - rightmargin) && ((int)p.y() >= topmargin) && ((int)p.y() <= origheight - bottommargin)) { + cursorsimpletextitem->setVisible(true); + } + else { + cursorsimpletextitem->setVisible(false); + } + } event->accept(); } @@ -268,6 +302,29 @@ void cSpectrumSceneWidget::mouseReleaseEvent(QMouseEvent *event) { redrawScene(); } + QPointF p = mapToScene(event->x(), event->y()); + + QPointF curpos; + curpos.setX(p.x() + 15); + curpos.setY(p.y() - 2); + + double mz = getMZRatioFromXPosition((int)p.x(), origwidth); + double intensity = getIntensityFromYPosition((int)p.y(), origheight); + QString curtext = "m/z: " + QString::number(mz) + ", int: " + QString::number(intensity); + if (!absoluteintensity) { + curtext += " %"; + } + + cursorsimpletextitem->setPos(curpos); + cursorsimpletextitem->setText(curtext); + + if (((int)p.x() >= leftmargin) && ((int)p.x() <= origwidth - rightmargin) && ((int)p.y() >= topmargin) && ((int)p.y() <= origheight - bottommargin)) { + cursorsimpletextitem->setVisible(true); + } + else { + cursorsimpletextitem->setVisible(false); + } + event->accept(); } @@ -275,6 +332,8 @@ void cSpectrumSceneWidget::mouseReleaseEvent(QMouseEvent *event) { void cSpectrumSceneWidget::mousePressEvent(QMouseEvent *event) { QGraphicsView::mousePressEvent(event); + cursorsimpletextitem->setVisible(false); + if (event->button() == Qt::LeftButton) { QPointF p = mapToScene(event->x(), event->y()); pressedx = (int)p.x(); @@ -330,12 +389,14 @@ void cSpectrumSceneWidget::resizeEvent(QResizeEvent *event) { origwidth = (origwidth / 10) * 10; origheight = (origheight / 10) * 10; + calledbyresizeevent = true; + redrawScene(); } double cSpectrumSceneWidget::getMZRatioFromXPosition(int x, int w) { - double mz = (double)(x - leftmargin)/(double)(w - leftmargin - rightmargin)*(maxmzratio - minmzratio) + minmzratio; + double mz = (double)(x - leftmargin) / (double)(w - leftmargin - rightmargin) * (maxmzratio - minmzratio) + minmzratio; return max(0.0, mz); } @@ -348,6 +409,14 @@ int cSpectrumSceneWidget::getXPositionFromMZRatio(double mzratio, int w) { } +double cSpectrumSceneWidget::getIntensityFromYPosition(int y, int h) { + double maximumintensity = getMaximumIntensity(); + double intensity = (double)(y - topmargin) / (double)(h - topmargin - bottommargin) * maximumintensity; + intensity = maximumintensity - intensity; + return max(0.0, intensity); +} + + void cSpectrumSceneWidget::redrawScene() { QGraphicsSimpleTextItem* simpletext; QGraphicsTextItem* text; @@ -377,46 +446,20 @@ void cSpectrumSceneWidget::redrawScene() { QFont myFont("Arial", 8); QFontMetrics fm(myFont); - - - // maximum intensity in the interval - double maxintensity = 0; - double rawdatamaxintensity = 0; - - if (parameters->useprofiledata && ((parameters->peaklistfileformat == baf) || ((parameters->mode == dereplication) && (parameters->peaklistfileformat == imzML))) && rawdatastate && (rawdatapeaklist->size() > 0)) { - if (absoluteintensity) { - maxintensity = theoreticalspectrum->getExperimentalSpectrum().getMaximumAbsoluteIntensityFromMZInterval(minmzratio, maxmzratio, false, false, other, false); - } - else { - maxintensity = theoreticalspectrum->getExperimentalSpectrum().getMaximumRelativeIntensityFromMZInterval(minmzratio, maxmzratio, false, false, other, false); - } - - if (absoluteintensity) { - rawdatamaxintensity = rawdatapeaklist->getMaximumAbsoluteIntensityFromMZInterval(minmzratio, maxmzratio, false, false, other, false); - } - else { - rawdatamaxintensity = rawdatapeaklist->getMaximumRelativeIntensityFromMZInterval(minmzratio, maxmzratio, false, false, other, false); - } - if (maxintensity == 0) { - maxintensity = rawdatamaxintensity; - } - } - else { - if (absoluteintensity) { - maxintensity = theoreticalspectrum->getExperimentalSpectrum().getMaximumAbsoluteIntensityFromMZInterval(minmzratio, maxmzratio, hidematched, hideunmatched, parameters->peptidetype, hidescrambled); - } - else { - maxintensity = theoreticalspectrum->getExperimentalSpectrum().getMaximumRelativeIntensityFromMZInterval(minmzratio, maxmzratio, hidematched, hideunmatched, parameters->peptidetype, hidescrambled); - } - } - + double maxintensity = getMaximumIntensity(); scene->removeItem(zoomgroup); + scene->removeItem(cursorsimpletextitem); + scene->clear(); + zoomgroup->setVisible(false); scene->addItem(zoomgroup); + cursorsimpletextitem->setVisible(false); + scene->addItem(cursorsimpletextitem); + // x axis line = scene->addLine(leftmargin, h - bottommargin, w - rightmargin, h - bottommargin, QPen(Qt::black, 2, Qt::SolidLine)); @@ -524,7 +567,7 @@ void cSpectrumSceneWidget::redrawScene() { } // hide scrambled peaks - if ((parameters->mode != dereplication) && (parameters->peptidetype == cyclic) && hidescrambled && theoreticalspectrum->getExperimentalSpectrum()[i].scrambled) { + if (((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch)) && (parameters->peptidetype == cyclic) && hidescrambled && theoreticalspectrum->getExperimentalSpectrum()[i].scrambled) { continue; } @@ -537,7 +580,7 @@ void cSpectrumSceneWidget::redrawScene() { visiblepeaks[visiblepeakscount].description += "@"; } - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { visiblepeaks[visiblepeakscount].description += parameters->peakidtodesc[thpeaks[*it].descriptionid].substr(0, parameters->peakidtodesc[thpeaks[*it].descriptionid].rfind(':')); } else { @@ -576,6 +619,7 @@ void cSpectrumSceneWidget::redrawScene() { bool popit; string tmpvisibleneutralloss; size_t tmpposition; + set localneutrallosses = ((cSpectrumDetailWidget *)parent)->getLocalNeutralLosses(); for (int i = 0; i < (int)visiblepeaks.size(); i++) { x = getXPositionFromMZRatio(visiblepeaks[i].mzratio, w); @@ -599,7 +643,7 @@ void cSpectrumSceneWidget::redrawScene() { popit = false; - if (parameters->mode != dereplication) { + if ((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch)) { if (visibleionseriespart1.compare("") != 0) { tmppos = hits.back().find(visibleionseriespart1); @@ -632,8 +676,8 @@ void cSpectrumSceneWidget::redrawScene() { if (visibleneutralloss.compare("all") != 0) { if (visibleneutralloss.compare("none") == 0) { - for (int j = 0; j < (int)parameters->neutrallossesfortheoreticalspectra.size(); j++) { - tmpvisibleneutralloss = "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[j]].summary; + for (auto& it : localneutrallosses) { + tmpvisibleneutralloss = " -" + it; tmpposition = hits.back().find(tmpvisibleneutralloss); if (tmpposition != string::npos) { tmpstr = hits.back().substr(tmpposition + tmpvisibleneutralloss.size()); @@ -645,7 +689,7 @@ void cSpectrumSceneWidget::redrawScene() { } } else { - tmpvisibleneutralloss = "-" + visibleneutralloss; + tmpvisibleneutralloss = " -" + visibleneutralloss; tmpposition = hits.back().find(tmpvisibleneutralloss); if (tmpposition == string::npos) { popit = true; @@ -694,7 +738,7 @@ void cSpectrumSceneWidget::redrawScene() { popit = false; - if (parameters->mode != dereplication) { + if ((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch)) { if (visibleionseriespart1.compare("") != 0) { tmppos = hits.back().find(visibleionseriespart1); @@ -727,8 +771,8 @@ void cSpectrumSceneWidget::redrawScene() { if (visibleneutralloss.compare("all") != 0) { if (visibleneutralloss.compare("none") == 0) { - for (int j = 0; j < (int)parameters->neutrallossesfortheoreticalspectra.size(); j++) { - tmpvisibleneutralloss = "-" + parameters->neutrallossesdefinitions[parameters->neutrallossesfortheoreticalspectra[j]].summary; + for (auto& it : localneutrallosses) { + tmpvisibleneutralloss = " -" + it; tmpposition = hits.back().find(tmpvisibleneutralloss); if (tmpposition != string::npos) { tmpstr = hits.back().substr(tmpposition + tmpvisibleneutralloss.size()); @@ -740,7 +784,7 @@ void cSpectrumSceneWidget::redrawScene() { } } else { - tmpvisibleneutralloss = "-" + visibleneutralloss; + tmpvisibleneutralloss = " -" + visibleneutralloss; tmpposition = hits.back().find(tmpvisibleneutralloss); if (tmpposition == string::npos) { popit = true; @@ -797,7 +841,7 @@ void cSpectrumSceneWidget::redrawScene() { text = scene->addText(""); text->setDefaultTextColor(QColor(Qt::red)); text->setFont(myFont); - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { text->setTextInteractionFlags(Qt::TextBrowserInteraction); text->setOpenExternalLinks(true); } @@ -846,7 +890,7 @@ void cSpectrumSceneWidget::redrawScene() { // raw data (intersections with other objects are not tested) - if ((maxintensity > 0) && parameters->useprofiledata && ((parameters->peaklistfileformat == baf) || ((parameters->mode == dereplication) && (parameters->peaklistfileformat == imzML))) && rawdatastate && (rawdatapeaklist->size() > 0)) { + if ((maxintensity > 0) && parameters->useprofiledata && ((parameters->peaklistfileformat == baf) || (parameters->peaklistfileformat == dat) || (parameters->peaklistfileformat == mzML) || (parameters->peaklistfileformat == raw) || (((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) && (parameters->peaklistfileformat == imzML))) && rawdatastate && (rawdatapeaklist->size() > 0)) { QPainterPath rpath; int rx, ry, lastrx, lastry; @@ -888,10 +932,51 @@ void cSpectrumSceneWidget::redrawScene() { scene->removeItem(zoomgroup); + scene->removeItem(cursorsimpletextitem); + + if (calledbyresizeevent) { + oldwidth.push_back(origwidth); + oldheight.push_back(origheight); + } + else { + oldwidth.clear(); + oldheight.clear(); + } + + bool blocksignal = false; + // detection of cyclic calls redrawScene<->resizeEvent + if ((oldwidth.size() == 4) && (oldheight.size() == 4)) { + if ((oldwidth[3] == oldwidth[1]) && (oldheight[3] == oldheight[1]) && (oldwidth[2] == oldwidth[0]) && (oldheight[2] == oldheight[0])) { + blocksignal = true; + } + } + + if (blocksignal) { + scene->blockSignals(true); + } + scene->setSceneRect(scene->itemsBoundingRect()); + + if (blocksignal) { + scene->blockSignals(false); + } + zoomgroup->setVisible(false); scene->addItem(zoomgroup); + cursorsimpletextitem->setVisible(false); + scene->addItem(cursorsimpletextitem); + + while (oldwidth.size() > 3) { + oldwidth.pop_front(); + } + + while (oldheight.size() > 3) { + oldheight.pop_front(); + } + + calledbyresizeevent = false; + } @@ -972,6 +1057,43 @@ void cSpectrumSceneWidget::calculateMinMaxMZ() { } +double cSpectrumSceneWidget::getMaximumIntensity() { + double maxintensity = 0; + double rawdatamaxintensity = 0; + + // get the maximum intensity in the interval + if (parameters->useprofiledata && ((parameters->peaklistfileformat == baf) || (parameters->peaklistfileformat == dat) || (parameters->peaklistfileformat == mzML) || (parameters->peaklistfileformat == raw) || (((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) && (parameters->peaklistfileformat == imzML))) && rawdatastate && (rawdatapeaklist->size() > 0)) { + if (absoluteintensity) { + maxintensity = theoreticalspectrum->getExperimentalSpectrum().getMaximumAbsoluteIntensityFromMZInterval(minmzratio, maxmzratio, false, false, other, false); + } + else { + maxintensity = theoreticalspectrum->getExperimentalSpectrum().getMaximumRelativeIntensityFromMZInterval(minmzratio, maxmzratio, false, false, other, false); + } + + if (absoluteintensity) { + rawdatamaxintensity = rawdatapeaklist->getMaximumAbsoluteIntensityFromMZInterval(minmzratio, maxmzratio, false, false, other, false); + } + else { + rawdatamaxintensity = rawdatapeaklist->getMaximumRelativeIntensityFromMZInterval(minmzratio, maxmzratio, false, false, other, false); + } + + if (maxintensity == 0) { + maxintensity = rawdatamaxintensity; + } + } + else { + if (absoluteintensity) { + maxintensity = theoreticalspectrum->getExperimentalSpectrum().getMaximumAbsoluteIntensityFromMZInterval(minmzratio, maxmzratio, hidematched, hideunmatched, parameters->peptidetype, hidescrambled); + } + else { + maxintensity = theoreticalspectrum->getExperimentalSpectrum().getMaximumRelativeIntensityFromMZInterval(minmzratio, maxmzratio, hidematched, hideunmatched, parameters->peptidetype, hidescrambled); + } + } + + return maxintensity; +} + + void cSpectrumSceneWidget::zoomIn() { if (currentscale < 32) { currentscale += factor; @@ -1023,6 +1145,7 @@ void cSpectrumSceneWidget::setMZInterval(double minmz, double maxmz) { emit updateMZInterval(minmzratio, maxmzratio); redrawScene(); + viewport()->update(); } diff --git a/CycloBranch/gui/cSpectrumSceneWidget.h b/CycloBranch/gui/cSpectrumSceneWidget.h index 62fa5ea..b650252 100644 --- a/CycloBranch/gui/cSpectrumSceneWidget.h +++ b/CycloBranch/gui/cSpectrumSceneWidget.h @@ -164,6 +164,8 @@ class cSpectrumSceneWidget : public QGraphicsView QGraphicsRectItem* zoomrect; QGraphicsSimpleTextItem* zoomsimpletextitem; + QGraphicsSimpleTextItem* cursorsimpletextitem; + cParameters* parameters; cTheoreticalSpectrum* theoreticalspectrum; cPeaksList* rawdatapeaklist; @@ -174,6 +176,10 @@ class cSpectrumSceneWidget : public QGraphicsView int origwidth; int origheight; + bool calledbyresizeevent; + deque oldwidth; + deque oldheight; + string visibleionseriespart1; string visibleionseriespart2; string visibleneutralloss; @@ -214,6 +220,9 @@ class cSpectrumSceneWidget : public QGraphicsView int getXPositionFromMZRatio(double mzratio, int w); + double getIntensityFromYPosition(int y, int h); + + void redrawScene(); @@ -223,6 +232,9 @@ class cSpectrumSceneWidget : public QGraphicsView void calculateMinMaxMZ(); + double getMaximumIntensity(); + + signals: diff --git a/CycloBranch/gui/cSummaryPeaksTableProxyModel.cpp b/CycloBranch/gui/cSummaryPeaksTableProxyModel.cpp index 498c844..8dd745d 100644 --- a/CycloBranch/gui/cSummaryPeaksTableProxyModel.cpp +++ b/CycloBranch/gui/cSummaryPeaksTableProxyModel.cpp @@ -10,12 +10,17 @@ cSummaryPeaksTableProxyModel::cSummaryPeaksTableProxyModel(QObject *parent) : QS } -void cSummaryPeaksTableProxyModel::initialize(eModeType mode, ePeakListFileFormat peaklistfileformat, bool generateisotopepattern, QComboBox* rowsfiltercombobox, QComboBox* rowsfiltercomparatorcombobox) { +void cSummaryPeaksTableProxyModel::initialize(eModeType mode, ePeakListFileFormat peaklistfileformat, bool generateisotopepattern, QComboBox* rowsfilteroperator, QComboBox* rowsfiltercombobox1, QComboBox* rowsfiltercomparatorcombobox1, QLineEdit* rowsfilterline1, QComboBox* rowsfiltercombobox2, QComboBox* rowsfiltercomparatorcombobox2, QLineEdit* rowsfilterline2) { this->mode = mode; this->peaklistfileformat = peaklistfileformat; this->generateisotopepattern = generateisotopepattern; - this->rowsfiltercombobox = rowsfiltercombobox; - this->rowsfiltercomparatorcombobox = rowsfiltercomparatorcombobox; + this->filteroperator = rowsfilteroperator; + this->filtercombobox1 = rowsfiltercombobox1; + this->filtercomparatorcombobox1 = rowsfiltercomparatorcombobox1; + this->filterline1 = rowsfilterline1; + this->filtercombobox2 = rowsfiltercombobox2; + this->filtercomparatorcombobox2 = rowsfiltercomparatorcombobox2; + this->filterline2 = rowsfilterline2; } @@ -36,7 +41,7 @@ bool cSummaryPeaksTableProxyModel::filterAcceptsRow(int sourceRow, const QModelI bool checkrow = false; int x, y; - if ((mode == dereplication) && ((peaklistfileformat == mis) || (peaklistfileformat == imzML))) { + if (((mode == dereplication) || (mode == compoundsearch)) && ((peaklistfileformat == mis) || (peaklistfileformat == imzML))) { x = sourceModel()->data(sourceModel()->index(sourceRow, 1)).toInt(); y = sourceModel()->data(sourceModel()->index(sourceRow, 2)).toInt(); @@ -52,120 +57,59 @@ bool cSummaryPeaksTableProxyModel::filterAcceptsRow(int sourceRow, const QModelI return false; } - if (filterRegExp().isEmpty()) { + if (filterline1->text().isEmpty() && filterline2->text().isEmpty()) { return true; } - int col = rowsfiltercombobox->currentIndex(); - - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).type() == QVariant::ByteArray) { - switch (rowsfiltercomparatorcombobox->currentIndex()) { - case 0: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() == filterRegExp().pattern().toDouble()) { - return true; - } - break; - case 1: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() < filterRegExp().pattern().toDouble()) { - return true; - } - break; - case 2: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() <= filterRegExp().pattern().toDouble()) { - return true; - } - break; - case 3: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() > filterRegExp().pattern().toDouble()) { - return true; - } - break; - case 4: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toDouble() >= filterRegExp().pattern().toDouble()) { - return true; - } - break; - default: - break; + int col1 = filtercombobox1->currentIndex(); + int col2 = filtercombobox2->currentIndex(); + + bool result1 = false; + bool result2 = false; + + if (!filterline1->text().isEmpty()) { + if (sourceModel()->data(sourceModel()->index(sourceRow, col1, sourceParent)).type() == QVariant::ByteArray) { + result1 = proxyModelCheckDouble(sourceModel(), filtercomparatorcombobox1->currentIndex(), sourceRow, col1, filterline1->text(), sourceParent); } - } - - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).type() == QVariant::String) { - - string itemstr = sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toString().toStdString(); - QString qstr = stripHTML(itemstr).c_str(); - - switch (rowsfiltercomparatorcombobox->currentIndex()) { - case 0: - if (wholeword) { - if (qstr.compare(filterRegExp().pattern(), filterCaseSensitivity()) == 0) { - return true; - } - } - else { - if (qstr.contains(filterRegExp())) { - return true; - } - } - break; - case 1: - if (qstr.compare(filterRegExp().pattern(), filterCaseSensitivity()) < 0) { - return true; - } - break; - case 2: - if (qstr.compare(filterRegExp().pattern(), filterCaseSensitivity()) <= 0) { - return true; - } - break; - case 3: - if (qstr.compare(filterRegExp().pattern(), filterCaseSensitivity()) > 0) { - return true; - } - break; - case 4: - if (qstr.compare(filterRegExp().pattern(), filterCaseSensitivity()) >= 0) { - return true; - } - break; - default: - break; + + if (sourceModel()->data(sourceModel()->index(sourceRow, col1, sourceParent)).type() == QVariant::String) { + QString qstr = sourceModel()->data(sourceModel()->index(sourceRow, col1, sourceParent)).toString(); + result1 = proxyModelCheckString(sourceModel(), filtercomparatorcombobox1->currentIndex(), sourceRow, col1, qstr, filterline1->text(), sourceParent, wholeword, filterCaseSensitivity()); + } + + if (sourceModel()->data(sourceModel()->index(sourceRow, col1, sourceParent)).type() == QVariant::Int) { + result1 = proxyModelCheckInt(sourceModel(), filtercomparatorcombobox1->currentIndex(), sourceRow, col1, filterline1->text(), sourceParent); } } - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).type() == QVariant::Int) { - switch (rowsfiltercomparatorcombobox->currentIndex()) { - case 0: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() == filterRegExp().pattern().toInt()) { - return true; - } - break; - case 1: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() < filterRegExp().pattern().toInt()) { - return true; - } - break; - case 2: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() <= filterRegExp().pattern().toInt()) { - return true; - } - break; - case 3: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() > filterRegExp().pattern().toInt()) { - return true; - } - break; - case 4: - if (sourceModel()->data(sourceModel()->index(sourceRow, col, sourceParent)).toInt() >= filterRegExp().pattern().toInt()) { - return true; - } - break; - default: - break; + if (!filterline2->text().isEmpty()) { + if (sourceModel()->data(sourceModel()->index(sourceRow, col2, sourceParent)).type() == QVariant::ByteArray) { + result2 = proxyModelCheckDouble(sourceModel(), filtercomparatorcombobox2->currentIndex(), sourceRow, col2, filterline2->text(), sourceParent); + } + + if (sourceModel()->data(sourceModel()->index(sourceRow, col2, sourceParent)).type() == QVariant::String) { + QString qstr = sourceModel()->data(sourceModel()->index(sourceRow, col2, sourceParent)).toString(); + result2 = proxyModelCheckString(sourceModel(), filtercomparatorcombobox2->currentIndex(), sourceRow, col2, qstr, filterline2->text(), sourceParent, wholeword, filterCaseSensitivity()); } + + if (sourceModel()->data(sourceModel()->index(sourceRow, col2, sourceParent)).type() == QVariant::Int) { + result2 = proxyModelCheckInt(sourceModel(), filtercomparatorcombobox2->currentIndex(), sourceRow, col2, filterline2->text(), sourceParent); + } + } + + if (!filterline1->text().isEmpty() && filterline2->text().isEmpty()) { + return result1; + } + + if (filterline1->text().isEmpty() && !filterline2->text().isEmpty()) { + return result2; + } + + if (filteroperator->currentIndex() == 0) { + return result1 || result2; } - return false; + return result1 && result2; } diff --git a/CycloBranch/gui/cSummaryPeaksTableProxyModel.h b/CycloBranch/gui/cSummaryPeaksTableProxyModel.h index 3adaaef..36b1c82 100644 --- a/CycloBranch/gui/cSummaryPeaksTableProxyModel.h +++ b/CycloBranch/gui/cSummaryPeaksTableProxyModel.h @@ -11,6 +11,7 @@ #include #include #include +#include #include "core/cParameters.h" @@ -26,10 +27,16 @@ class cSummaryPeaksTableProxyModel : public QSortFilterProxyModel { eModeType mode; ePeakListFileFormat peaklistfileformat; bool generateisotopepattern; - QComboBox* rowsfiltercombobox; - QComboBox* rowsfiltercomparatorcombobox; + QComboBox* filteroperator; + QComboBox* filtercombobox1; + QComboBox* filtercomparatorcombobox1; + QLineEdit* filterline1; + QComboBox* filtercombobox2; + QComboBox* filtercomparatorcombobox2; + QLineEdit* filterline2; bool wholeword; + public: /** @@ -68,10 +75,15 @@ class cSummaryPeaksTableProxyModel : public QSortFilterProxyModel { \param mode program mode \param peaklistfileformat peaklist format \param generateisotopepattern true if full isotope patterns are generated; false otherwise - \param rowsfiltercombobox reference to the combobox with selection of columns - \param rowsfiltercomparatorcombobox reference to the combobox with selection of comparator - */ - void initialize(eModeType mode, ePeakListFileFormat peaklistfileformat, bool generateisotopepattern, QComboBox* rowsfiltercombobox, QComboBox* rowsfiltercomparatorcombobox); + \param rowsfilteroperator reference to the combobox with operator selection + \param rowsfiltercombobox1 reference to the combobox with selection of columns + \param rowsfiltercomparatorcombobox1 reference to the combobox with selection of comparator + \param rowsfilterline1 reference to a text field + \param rowsfiltercombobox2 reference to the combobox with selection of columns + \param rowsfiltercomparatorcombobox2 reference to the combobox with selection of comparator + \param rowsfilterline2 reference to a text field + */ + void initialize(eModeType mode, ePeakListFileFormat peaklistfileformat, bool generateisotopepattern, QComboBox* rowsfilteroperator, QComboBox* rowsfiltercombobox1, QComboBox* rowsfiltercomparatorcombobox1, QLineEdit* rowsfilterline1, QComboBox* rowsfiltercombobox2, QComboBox* rowsfiltercomparatorcombobox2, QLineEdit* rowsfilterline2); /** diff --git a/CycloBranch/gui/cSummaryPeaksTableWidget.cpp b/CycloBranch/gui/cSummaryPeaksTableWidget.cpp index 4768a74..cd01924 100644 --- a/CycloBranch/gui/cSummaryPeaksTableWidget.cpp +++ b/CycloBranch/gui/cSummaryPeaksTableWidget.cpp @@ -23,9 +23,11 @@ cSummaryPeaksTableWidget::cSummaryPeaksTableWidget(QWidget* parent) { + title = "Summary Table of Matched Peaks"; + this->parent = parent; - setWindowTitle("Summary Table of Matched Peaks"); + setWindowTitle(title); setWindowIcon(QIcon(":/images/icons/43.png")); menuBar = new QMenuBar(this); @@ -33,22 +35,71 @@ cSummaryPeaksTableWidget::cSummaryPeaksTableWidget(QWidget* parent) { menuFile = new QMenu(tr("&File"), this); menuHelp = new QMenu(tr("&Help"), this); - rowsfiltercombobox = new QComboBox(); - rowsfiltercombobox->setToolTip("Column to be Searched"); - rowsfiltercombobox->setSizeAdjustPolicy(QComboBox::AdjustToContents); - - rowsfiltercomparatorcombobox = new QComboBox(); - rowsfiltercomparatorcombobox->setToolTip("Type of Comparison"); - rowsfiltercomparatorcombobox->addItem("="); - rowsfiltercomparatorcombobox->addItem("<"); - rowsfiltercomparatorcombobox->addItem("<="); - rowsfiltercomparatorcombobox->addItem(">"); - rowsfiltercomparatorcombobox->addItem(">="); - rowsfiltercomparatorcombobox->setSizeAdjustPolicy(QComboBox::AdjustToContents); - - rowsfilterline = new QLineEdit(); - rowsfilterline->setMinimumWidth(300); - rowsfilterline->setToolTip("Text to Find"); + rowsfilteroperator = new QComboBox(); + rowsfilteroperator->setToolTip("OR = any condition must be met; AND = all conditions must be met."); + rowsfilteroperator->addItem("OR"); + rowsfilteroperator->addItem("AND"); + rowsfilteroperator->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfiltercombobox1 = new QComboBox(); + rowsfiltercombobox1->setToolTip("Column to be Searched"); + rowsfiltercombobox1->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfiltercomparatorcombobox1 = new QComboBox(); + rowsfiltercomparatorcombobox1->setToolTip("Type of Comparison"); + rowsfiltercomparatorcombobox1->addItem("="); + rowsfiltercomparatorcombobox1->addItem("<"); + rowsfiltercomparatorcombobox1->addItem("<="); + rowsfiltercomparatorcombobox1->addItem(">"); + rowsfiltercomparatorcombobox1->addItem(">="); + rowsfiltercomparatorcombobox1->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfilterstringlistmodel1 = new QStringListModel(); + rowsfilterlinecompleter1 = new QCompleter(); + rowsfilterlinecompleter1->setModel(rowsfilterstringlistmodel1); + rowsfilterlinecompleter1->setCaseSensitivity(Qt::CaseInsensitive); + rowsfilterlinecompleter1->setCompletionMode(QCompleter::UnfilteredPopupCompletion); + + rowsfilterline1 = new QLineEdit(); + rowsfilterline1->setMinimumWidth(150); + rowsfilterline1->setToolTip("Text to Find"); + rowsfilterline1->setCompleter(rowsfilterlinecompleter1); + + rowsfilterleft1 = new QPushButton("<"); + rowsfilterleft1->setMaximumWidth(25); + + rowsfilterright1 = new QPushButton(">"); + rowsfilterright1->setMaximumWidth(25); + + rowsfiltercombobox2 = new QComboBox(); + rowsfiltercombobox2->setToolTip("Column to be Searched"); + rowsfiltercombobox2->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfiltercomparatorcombobox2 = new QComboBox(); + rowsfiltercomparatorcombobox2->setToolTip("Type of Comparison"); + rowsfiltercomparatorcombobox2->addItem("="); + rowsfiltercomparatorcombobox2->addItem("<"); + rowsfiltercomparatorcombobox2->addItem("<="); + rowsfiltercomparatorcombobox2->addItem(">"); + rowsfiltercomparatorcombobox2->addItem(">="); + rowsfiltercomparatorcombobox2->setSizeAdjustPolicy(QComboBox::AdjustToContents); + + rowsfilterstringlistmodel2 = new QStringListModel(); + rowsfilterlinecompleter2 = new QCompleter(); + rowsfilterlinecompleter2->setModel(rowsfilterstringlistmodel2); + rowsfilterlinecompleter2->setCaseSensitivity(Qt::CaseInsensitive); + rowsfilterlinecompleter2->setCompletionMode(QCompleter::UnfilteredPopupCompletion); + + rowsfilterline2 = new QLineEdit(); + rowsfilterline2->setMinimumWidth(150); + rowsfilterline2->setToolTip("Text to Find"); + rowsfilterline2->setCompleter(rowsfilterlinecompleter2); + + rowsfilterleft2 = new QPushButton("<"); + rowsfilterleft2->setMaximumWidth(25); + + rowsfilterright2 = new QPushButton(">"); + rowsfilterright2->setMaximumWidth(25); rowsfiltercasesensitive = new QCheckBox(); rowsfiltercasesensitive->setToolTip("Case Sensitive"); @@ -66,11 +117,23 @@ cSummaryPeaksTableWidget::cSummaryPeaksTableWidget(QWidget* parent) { rowsfilterclearbutton->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_R)); rowsfilterhbox = new QHBoxLayout(); - rowsfilterhbox->addWidget(rowsfiltercombobox); + rowsfilterhbox->addWidget(rowsfiltercombobox1); + rowsfilterhbox->addSpacing(10); + rowsfilterhbox->addWidget(rowsfiltercomparatorcombobox1); + rowsfilterhbox->addSpacing(10); + rowsfilterhbox->addWidget(rowsfilterline1); + rowsfilterhbox->addWidget(rowsfilterleft1); + rowsfilterhbox->addWidget(rowsfilterright1); + rowsfilterhbox->addSpacing(10); + rowsfilterhbox->addWidget(rowsfilteroperator); rowsfilterhbox->addSpacing(10); - rowsfilterhbox->addWidget(rowsfiltercomparatorcombobox); + rowsfilterhbox->addWidget(rowsfiltercombobox2); rowsfilterhbox->addSpacing(10); - rowsfilterhbox->addWidget(rowsfilterline); + rowsfilterhbox->addWidget(rowsfiltercomparatorcombobox2); + rowsfilterhbox->addSpacing(10); + rowsfilterhbox->addWidget(rowsfilterline2); + rowsfilterhbox->addWidget(rowsfilterleft2); + rowsfilterhbox->addWidget(rowsfilterright2); rowsfilterhbox->addSpacing(10); rowsfilterhbox->addWidget(rowsfiltercasesensitive); rowsfilterhbox->addSpacing(10); @@ -141,6 +204,11 @@ cSummaryPeaksTableWidget::cSummaryPeaksTableWidget(QWidget* parent) { setMenuBar(menuBar); + connect(rowsfilterleft1, SIGNAL(released()), this, SLOT(rowsFilterLeft1Slot())); + connect(rowsfilterright1, SIGNAL(released()), this, SLOT(rowsFilterRight1Slot())); + connect(rowsfilterleft2, SIGNAL(released()), this, SLOT(rowsFilterLeft2Slot())); + connect(rowsfilterright2, SIGNAL(released()), this, SLOT(rowsFilterRight2Slot())); + connect(rowsfilterbutton, SIGNAL(released()), this, SLOT(filterRows())); connect(rowsfilterclearbutton, SIGNAL(released()), this, SLOT(resetFilter())); @@ -152,7 +220,7 @@ cSummaryPeaksTableWidget::cSummaryPeaksTableWidget(QWidget* parent) { setCentralWidget(mainwidget); - resize(1280, 780); + resize(defaultwinsizex, defaultwinsizey); lastdirexporttocsv = "./"; lastdirexportstatisticstocsv = "./"; @@ -164,9 +232,21 @@ cSummaryPeaksTableWidget::cSummaryPeaksTableWidget(QWidget* parent) { cSummaryPeaksTableWidget::~cSummaryPeaksTableWidget() { deleteTable(); - delete rowsfiltercombobox; - delete rowsfiltercomparatorcombobox; - delete rowsfilterline; + delete rowsfilteroperator; + delete rowsfiltercombobox1; + delete rowsfiltercomparatorcombobox1; + delete rowsfilterstringlistmodel1; + delete rowsfilterlinecompleter1; + delete rowsfilterline1; + delete rowsfilterleft1; + delete rowsfilterright1; + delete rowsfiltercombobox2; + delete rowsfiltercomparatorcombobox2; + delete rowsfilterstringlistmodel2; + delete rowsfilterlinecompleter2; + delete rowsfilterline2; + delete rowsfilterleft2; + delete rowsfilterright2; delete rowsfiltercasesensitive; delete rowsfilterwholeword; delete rowsfilterbutton; @@ -231,7 +311,7 @@ bool cSummaryPeaksTableWidget::prepareToShow(QStandardItemModel* resultsstandard if (thpeakscount > 1000000) { QMessageBox::StandardButton reply; - string msg = "The table contains " + to_string(thpeakscount) + " rows and might not fit into the main memory. Do you with to continue ?\n\nTip: Re-run the search using adjusted search settings to limit the number of rows. You may increase the minimum threshold of relative peak intensity, the minimum m/z ratio, decrease the m/z error tolerance or limit the number of selected ion types in theoretical spectra."; + string msg = "The table contains " + to_string(thpeakscount) + " rows and might not fit into the main memory. Do you wish to continue ?\n\nTip: Re-run the search using adjusted search settings to limit the number of rows. You may increase the minimum threshold of relative peak intensity, the minimum m/z ratio, decrease the m/z error tolerance or limit the number of selected ion types in theoretical spectra."; reply = QMessageBox::question(this, appname, msg.c_str(), QMessageBox::Yes | QMessageBox::No); if (reply == QMessageBox::No) { return false; @@ -242,12 +322,12 @@ bool cSummaryPeaksTableWidget::prepareToShow(QStandardItemModel* resultsstandard resetFilter(); deleteTable(); - proxymodel->initialize(parameters->mode, parameters->peaklistfileformat, parameters->generateisotopepattern, rowsfiltercombobox, rowsfiltercomparatorcombobox); + proxymodel->initialize(parameters->mode, parameters->peaklistfileformat, parameters->generateisotopepattern, rowsfilteroperator, rowsfiltercombobox1, rowsfiltercomparatorcombobox1, rowsfilterline1, rowsfiltercombobox2, rowsfiltercomparatorcombobox2, rowsfilterline2); coordinates.clear(); // prepare the header - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if ((parameters->peaklistfileformat == mis) || (parameters->peaklistfileformat == imzML)) { if (parameters->generateisotopepattern) { databasemodel->setColumnCount(15); @@ -258,10 +338,10 @@ bool cSummaryPeaksTableWidget::prepareToShow(QStandardItemModel* resultsstandard } else { if (parameters->generateisotopepattern) { - databasemodel->setColumnCount(13); + databasemodel->setColumnCount(14); } else { - databasemodel->setColumnCount(10); + databasemodel->setColumnCount(11); } } } @@ -287,7 +367,7 @@ bool cSummaryPeaksTableWidget::prepareToShow(QStandardItemModel* resultsstandard database->setItemDelegateForColumn(0, new QItemDelegate()); int currentcolumn = 1; - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if ((parameters->peaklistfileformat == mis) || (parameters->peaklistfileformat == imzML)) { iontypecol = 3; @@ -301,6 +381,12 @@ bool cSummaryPeaksTableWidget::prepareToShow(QStandardItemModel* resultsstandard database->setItemDelegateForColumn(currentcolumn, new QItemDelegate()); currentcolumn++; } + else { + databasemodel->setHorizontalHeaderItem(currentcolumn, new QStandardItem()); + databasemodel->horizontalHeaderItem(currentcolumn)->setText("Time"); + database->setItemDelegateForColumn(currentcolumn, new QItemDelegate()); + currentcolumn++; + } databasemodel->setHorizontalHeaderItem(currentcolumn, new QStandardItem()); if (parameters->generateisotopepattern) { @@ -320,7 +406,7 @@ bool cSummaryPeaksTableWidget::prepareToShow(QStandardItemModel* resultsstandard currentcolumn++; } - if (parameters->mode != dereplication) { + if ((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch)) { databasemodel->setHorizontalHeaderItem(currentcolumn, new QStandardItem()); databasemodel->horizontalHeaderItem(currentcolumn)->setText("Fragment Type"); database->setItemDelegateForColumn(currentcolumn, new QItemDelegate()); @@ -359,7 +445,7 @@ bool cSummaryPeaksTableWidget::prepareToShow(QStandardItemModel* resultsstandard database->setItemDelegateForColumn(currentcolumn, new QItemDelegate()); currentcolumn++; - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if (parameters->generateisotopepattern) { databasemodel->setHorizontalHeaderItem(currentcolumn, new QStandardItem()); databasemodel->horizontalHeaderItem(currentcolumn)->setText("Score"); @@ -409,14 +495,25 @@ bool cSummaryPeaksTableWidget::prepareToShow(QStandardItemModel* resultsstandard currentcolumn++; } - rowsfiltercombobox->clear(); + rowsfiltercombobox1->clear(); + rowsfiltercombobox2->clear(); for (int i = 0; i < databasemodel->columnCount(); i++) { database->resizeColumnToContents(i); - if ((parameters->mode != dereplication) || ((parameters->mode == dereplication) && (i < databasemodel->columnCount() - 1))) { - rowsfiltercombobox->addItem(databasemodel->horizontalHeaderItem(i)->text()); + if (((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch)) || + (((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) && (i < databasemodel->columnCount() - 1))) { + rowsfiltercombobox1->addItem(databasemodel->horizontalHeaderItem(i)->text()); + rowsfiltercombobox2->addItem(databasemodel->horizontalHeaderItem(i)->text()); } } + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { + rowsfiltercombobox1->setCurrentIndex(rowsfiltercombobox1->count() - 1); + rowsfiltercombobox2->setCurrentIndex(rowsfiltercombobox2->count() - 1); + + rowsfiltercomparatorcombobox1->setCurrentIndex(0); + rowsfiltercomparatorcombobox2->setCurrentIndex(0); + } + // fill new data QProgressDialog* progress; @@ -444,10 +541,12 @@ bool cSummaryPeaksTableWidget::prepareToShow(QStandardItemModel* resultsstandard QBrush brush; brush.setColor(QColor(0, 0, 0)); + set completernameset; + for (int i = 0; i < spectracount; i++) { if (!resultsproxymodel->mapFromSource(resultsstandardmodel->index(i, 0)).isValid()) { - if ((parameters->mode == dereplication) && (parameters->peaklistfileformat != mis) && (parameters->peaklistfileformat != imzML)) { + if (((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) && (parameters->peaklistfileformat != mis) && (parameters->peaklistfileformat != imzML)) { cPeak emptypeak; emptypeak.mzratio = (double)(eicchromatogram.size() + 1); emptypeak.absoluteintensity = 0; @@ -458,7 +557,7 @@ bool cSummaryPeaksTableWidget::prepareToShow(QStandardItemModel* resultsstandard spectrumindex = resultsstandardmodel->item(i, 1)->data(Qt::DisplayRole).toInt() - 1; - if ((parameters->mode == dereplication) && (parameters->peaklistfileformat != mis) && (parameters->peaklistfileformat != imzML)) { + if (((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) && (parameters->peaklistfileformat != mis) && (parameters->peaklistfileformat != imzML)) { addEICPeak(eicchromatogram, (*spectralist)[spectrumindex].getExperimentalSpectrum()); } @@ -496,7 +595,7 @@ bool cSummaryPeaksTableWidget::prepareToShow(QStandardItemModel* resultsstandard databasemodel->item(currentrow, currentcolumn)->setData(QVariant::fromValue(spectrumindex + 1), Qt::DisplayRole); currentcolumn++; - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if ((parameters->peaklistfileformat == mis) || (parameters->peaklistfileformat == imzML)) { databasemodel->setItem(currentrow, currentcolumn, new QStandardItem()); databasemodel->item(currentrow, currentcolumn)->setForeground(brush); @@ -510,6 +609,13 @@ bool cSummaryPeaksTableWidget::prepareToShow(QStandardItemModel* resultsstandard coordinates.push_back(cCoordinates((*spectralist)[spectrumindex].getExperimentalSpectrum().getCoordinateX(), (*spectralist)[spectrumindex].getExperimentalSpectrum().getCoordinateY(), spectrumindex + 1, cropPrecisionToSixDecimals(peak->matchedmz), cropPrecisionToSixDecimals(peak->matchedrelativeintensity), peak->matchedabsoluteintensity)); } + else { + databasemodel->setItem(currentrow, currentcolumn, new QStandardItem()); + databasemodel->item(currentrow, currentcolumn)->setForeground(brush); + databasemodel->item(currentrow, currentcolumn)->setData(QVariant::fromValue(cropPrecisionToSixDecimalsByteArray((*spectralist)[spectrumindex].getExperimentalSpectrum().getRetentionTime())), Qt::DisplayRole); + currentcolumn++; + } + secondspace = (int)peak->description.find(' ', peak->description.find(' ') + 1); databasemodel->setItem(currentrow, currentcolumn, new QStandardItem()); databasemodel->item(currentrow, currentcolumn)->setForeground(brush); @@ -524,7 +630,7 @@ bool cSummaryPeaksTableWidget::prepareToShow(QStandardItemModel* resultsstandard currentcolumn++; } - if (parameters->mode != dereplication) { + if ((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch)) { databasemodel->setItem(currentrow, currentcolumn, new QStandardItem()); databasemodel->item(currentrow, currentcolumn)->setForeground(brush); databasemodel->item(currentrow, currentcolumn)->setText(peak->description.substr(0, peak->description.find(':')).c_str()); @@ -563,7 +669,7 @@ bool cSummaryPeaksTableWidget::prepareToShow(QStandardItemModel* resultsstandard databasemodel->item(currentrow, currentcolumn)->setData(QVariant::fromValue(cropPrecisionToSixDecimalsByteArray(peak->matchedppm)), Qt::DisplayRole); currentcolumn++; - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if (parameters->generateisotopepattern) { databasemodel->setItem(currentrow, currentcolumn, new QStandardItem()); databasemodel->item(currentrow, currentcolumn)->setForeground(brush); @@ -576,17 +682,24 @@ bool cSummaryPeaksTableWidget::prepareToShow(QStandardItemModel* resultsstandard currentcolumn++; } + stmp = peak->description.substr(peak->description.rfind('(') + 1, peak->description.rfind(')') - peak->description.rfind('(') - 1); + databasemodel->setItem(currentrow, currentcolumn, new QStandardItem()); databasemodel->item(currentrow, currentcolumn)->setForeground(brush); - databasemodel->item(currentrow, currentcolumn)->setText(peak->description.substr(peak->description.rfind('(') + 1, peak->description.rfind(')') - peak->description.rfind('(') - 1).c_str()); + databasemodel->item(currentrow, currentcolumn)->setText(stmp.c_str()); currentcolumn++; langle = (int)peak->description.rfind(""); rangle = (int)peak->description.find('>'); if ((langle != string::npos) && (rangle != string::npos)) { + stmp = peak->description.substr(rangle + 1, langle - rangle - 1); + databasemodel->setItem(currentrow, currentcolumn, new QStandardItem()); databasemodel->item(currentrow, currentcolumn)->setForeground(brush); - databasemodel->item(currentrow, currentcolumn)->setText(peak->description.substr(rangle + 1, langle - rangle - 1).c_str()); + databasemodel->item(currentrow, currentcolumn)->setText(stmp.c_str()); + + completernameset.insert(stmp.c_str()); + if ((parameters->peaklistfileformat == mis) || (parameters->peaklistfileformat == imzML)) { coordinates.back().name = databasemodel->item(currentrow, iontypecol)->text().toStdString() + " "; if (databasemodel->item(currentrow, currentcolumn)->text().length() > 40) { @@ -674,10 +787,10 @@ bool cSummaryPeaksTableWidget::prepareToShow(QStandardItemModel* resultsstandard database->resizeColumnToContents(i); } - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if ((parameters->peaklistfileformat == mis) || (parameters->peaklistfileformat == imzML)) { emit resetRegion(); - emit sendFilterOptionsToImageWindow(coordinates, rowsfiltercombobox->currentText().toStdString(), rowsfiltercomparatorcombobox->currentText().toStdString(), rowsfilterline->text().toStdString(), rowsfiltercasesensitive->isChecked(), rowsfilterwholeword->isChecked()); + emit sendFilterOptionsToImageWindow(coordinates, (bool)rowsfilteroperator->currentIndex(), rowsfiltercombobox1->currentText().toStdString(), rowsfiltercomparatorcombobox1->currentText().toStdString(), rowsfilterline1->text().toStdString(), rowsfiltercombobox2->currentText().toStdString(), rowsfiltercomparatorcombobox2->currentText().toStdString(), rowsfilterline2->text().toStdString(), rowsfiltercasesensitive->isChecked(), rowsfilterwholeword->isChecked()); if (parameters->generateisotopepattern) { database->setColumnWidth(12, min(400, database->columnWidth(12))); @@ -692,10 +805,10 @@ bool cSummaryPeaksTableWidget::prepareToShow(QStandardItemModel* resultsstandard emit sendFilterOptionsToChromatogram(eicchromatogram); if (parameters->generateisotopepattern) { - database->setColumnWidth(10, min(400, database->columnWidth(10))); + database->setColumnWidth(11, min(400, database->columnWidth(11))); } else { - database->setColumnWidth(7, min(400, database->columnWidth(7))); + database->setColumnWidth(8, min(400, database->columnWidth(8))); } } } @@ -709,8 +822,19 @@ bool cSummaryPeaksTableWidget::prepareToShow(QStandardItemModel* resultsstandard database->setColumnWidth(8, min(400, database->columnWidth(8))); } } + + QStringList completerlist; + if (completernameset.size() <= 10000) { + for (auto& it : completernameset) { + completerlist.push_back(it); + } + } + rowsfilterstringlistmodel1->setStringList(completerlist); + rowsfilterstringlistmodel2->setStringList(completerlist); } + setWindowTitle(title); + progress->setValue(spectracount); delete progress; @@ -754,7 +878,7 @@ void cSummaryPeaksTableWidget::addEICPeak(cPeaksList& eicchromatogram, cPeaksLis void cSummaryPeaksTableWidget::keyPressEvent(QKeyEvent *event) { if ((event->key() == Qt::Key_Enter) || (event->key() == Qt::Key_Return)) { - if (rowsfilterline->hasFocus()) { + if (rowsfilterline1->hasFocus() || rowsfilterline2->hasFocus()) { filterRows(); } else { @@ -765,7 +889,7 @@ void cSummaryPeaksTableWidget::keyPressEvent(QKeyEvent *event) { } if ((event->modifiers() == Qt::ControlModifier) && (event->key() == Qt::Key_F)) { - rowsfilterline->setFocus(); + rowsfilterline1->setFocus(); } if ((event->modifiers() == Qt::ControlModifier) && (event->key() == Qt::Key_T)) { @@ -814,15 +938,17 @@ void cSummaryPeaksTableWidget::closeWindow() { void cSummaryPeaksTableWidget::filterRows() { + setWindowTitle(title); + Qt::CaseSensitivity casesensitive = rowsfiltercasesensitive->isChecked()?Qt::CaseSensitive:Qt::CaseInsensitive; - QString str = rowsfilterline->text(); + QString str = ""; int i, id, x, y; int iontypecol, mzcol, relintcol, absintcol, namecol; cPeaksList eicchromatogram; eicchromatogram.clear(); - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if ((parameters->peaklistfileformat == mis) || (parameters->peaklistfileformat == imzML)) { iontypecol = 3; if (parameters->generateisotopepattern) { @@ -840,10 +966,10 @@ void cSummaryPeaksTableWidget::filterRows() { } else { if (parameters->generateisotopepattern) { - absintcol = 6; + absintcol = 7; } else { - absintcol = 5; + absintcol = 6; } eicchromatogram = origeicchromatogram; @@ -869,7 +995,7 @@ void cSummaryPeaksTableWidget::filterRows() { // prepare data for visualization coordinates.clear(); - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if ((parameters->peaklistfileformat == mis) || (parameters->peaklistfileformat == imzML)) { int proxymodelrowcount = proxymodel->rowCount(); for (i = 0; i < proxymodelrowcount; i++) { @@ -918,9 +1044,9 @@ void cSummaryPeaksTableWidget::filterRows() { } } - if ((parameters->mode == dereplication) && !progress.wasCanceled()) { + if (((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) && !progress.wasCanceled()) { if ((parameters->peaklistfileformat == mis) || (parameters->peaklistfileformat == imzML)) { - emit sendFilterOptionsToImageWindow(coordinates, rowsfiltercombobox->currentText().toStdString(), rowsfiltercomparatorcombobox->currentText().toStdString(), rowsfilterline->text().toStdString(), rowsfiltercasesensitive->isChecked(), rowsfilterwholeword->isChecked()); + emit sendFilterOptionsToImageWindow(coordinates, (bool)rowsfilteroperator->currentIndex(), rowsfiltercombobox1->currentText().toStdString(), rowsfiltercomparatorcombobox1->currentText().toStdString(), rowsfilterline1->text().toStdString(), rowsfiltercombobox2->currentText().toStdString(), rowsfiltercomparatorcombobox2->currentText().toStdString(), rowsfilterline2->text().toStdString(), rowsfiltercasesensitive->isChecked(), rowsfilterwholeword->isChecked()); } else { eicchromatogram.normalizeIntenzity(); @@ -933,7 +1059,10 @@ void cSummaryPeaksTableWidget::filterRows() { void cSummaryPeaksTableWidget::resetFilter() { - rowsfilterline->setText(""); + setWindowTitle(title); + + rowsfilterline1->setText(""); + rowsfilterline2->setText(""); int rowcount = databasemodel->rowCount(); int i, x, y; @@ -942,7 +1071,7 @@ void cSummaryPeaksTableWidget::resetFilter() { cPeaksList eicchromatogram; eicchromatogram.clear(); - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if ((parameters->peaklistfileformat == mis) || (parameters->peaklistfileformat == imzML)) { iontypecol = 3; if (parameters->generateisotopepattern) { @@ -968,7 +1097,7 @@ void cSummaryPeaksTableWidget::resetFilter() { progress.setWindowModality(Qt::ApplicationModal); coordinates.clear(); - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if ((parameters->peaklistfileformat == mis) || (parameters->peaklistfileformat == imzML)) { for (i = 0; i < rowcount; i++) { x = databasemodel->item(i, 1)->data(Qt::DisplayRole).toInt(); @@ -994,7 +1123,7 @@ void cSummaryPeaksTableWidget::resetFilter() { progress.setValue(i); } - emit sendFilterOptionsToImageWindow(coordinates, rowsfiltercombobox->currentText().toStdString(), rowsfiltercomparatorcombobox->currentText().toStdString(), rowsfilterline->text().toStdString(), rowsfiltercasesensitive->isChecked(), rowsfilterwholeword->isChecked()); + emit sendFilterOptionsToImageWindow(coordinates, (bool)rowsfilteroperator->currentIndex(), rowsfiltercombobox1->currentText().toStdString(), rowsfiltercomparatorcombobox1->currentText().toStdString(), rowsfilterline1->text().toStdString(), rowsfiltercombobox2->currentText().toStdString(), rowsfiltercomparatorcombobox2->currentText().toStdString(), rowsfilterline2->text().toStdString(), rowsfiltercasesensitive->isChecked(), rowsfilterwholeword->isChecked()); } else { eicchromatogram = origeicchromatogram; @@ -1124,7 +1253,7 @@ void cSummaryPeaksTableWidget::exportStatistics() { int thintcol; - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if ((parameters->peaklistfileformat == mis) || (parameters->peaklistfileformat == imzML)) { if (parameters->generateisotopepattern) { @@ -1156,26 +1285,26 @@ void cSummaryPeaksTableWidget::exportStatistics() { } else { if (parameters->generateisotopepattern) { - iontypecol = 1; - theoreticalmzcol = 2; - summaryformulacol = 10; - namecol = 11; - referencecol = 12; - scorecol = 8; - fdrcol = 9; + iontypecol = 2; + theoreticalmzcol = 3; + summaryformulacol = 11; + namecol = 12; + referencecol = 13; + scorecol = 9; + fdrcol = 10; idcol = 0; - relintcol = 5; - absintcol = 6; + relintcol = 6; + absintcol = 7; } else { - iontypecol = 1; - theoreticalmzcol = 2; - summaryformulacol = 7; - namecol = 8; - referencecol = 9; + iontypecol = 2; + theoreticalmzcol = 3; + summaryformulacol = 8; + namecol = 9; + referencecol = 10; idcol = 0; - relintcol = 4; - absintcol = 5; + relintcol = 5; + absintcol = 6; } } @@ -1229,7 +1358,7 @@ void cSummaryPeaksTableWidget::exportStatistics() { QStandardItem* item; for (int i = 0; i < proxymodel->rowCount(); i++) { - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { keyms.clear(); @@ -1355,7 +1484,7 @@ void cSummaryPeaksTableWidget::exportStatistics() { vector scoremedianvector; vector fdrmedianvector; - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { auto cmpms = [](pair > const &a, pair > const &b) { if (a.first.name < b.first.name) { @@ -1656,7 +1785,7 @@ void cSummaryPeaksTableWidget::rowDoubleClicked(const QModelIndex& item) { int idcolumn = 0; int experimentalmzcolumn = 0; - if (parameters->mode == dereplication) { + if ((parameters->mode == dereplication) || (parameters->mode == compoundsearch)) { if ((parameters->peaklistfileformat == mis) || (parameters->peaklistfileformat == imzML)) { if (parameters->generateisotopepattern) { size = 14; @@ -1669,12 +1798,12 @@ void cSummaryPeaksTableWidget::rowDoubleClicked(const QModelIndex& item) { } else { if (parameters->generateisotopepattern) { - size = 12; - experimentalmzcolumn = 4; + size = 13; + experimentalmzcolumn = 5; } else { - size = 9; - experimentalmzcolumn = 3; + size = 10; + experimentalmzcolumn = 4; } } } @@ -1707,3 +1836,90 @@ void cSummaryPeaksTableWidget::rowDoubleClicked(const QModelIndex& item) { } } +void cSummaryPeaksTableWidget::rowsFilterLeft1Slot() { + if ((parameters->mode != dereplication) && (parameters->mode != compoundsearch)) { + return; + } + + QStringList list = ((QStringListModel*)rowsfilterlinecompleter1->model())->stringList(); + int index = list.indexOf(rowsfilterline1->text()); + int comboindex = rowsfiltercombobox1->findText("Name"); + + if ((index > 0) && (comboindex >= 0)) { + rowsfiltercombobox1->setCurrentIndex(comboindex); + rowsfiltercomparatorcombobox1->setCurrentIndex(0); + rowsfilterline1->setText(list[index - 1]); + filterRows(); + setWindowTitle(title + " - compound " + QVariant(index).toString() + " of " + QVariant(((QStringListModel*)rowsfilterlinecompleter1->model())->stringList().size()).toString()); + } + else { + setWindowTitle(title); + } +} + + +void cSummaryPeaksTableWidget::rowsFilterRight1Slot() { + if ((parameters->mode != dereplication) && (parameters->mode != compoundsearch)) { + return; + } + + QStringList list = ((QStringListModel*)rowsfilterlinecompleter1->model())->stringList(); + int index = list.indexOf(rowsfilterline1->text()); + int comboindex = rowsfiltercombobox1->findText("Name"); + + if ((index < list.size() - 1) && (comboindex >= 0)) { + rowsfiltercombobox1->setCurrentIndex(comboindex); + rowsfiltercomparatorcombobox1->setCurrentIndex(0); + rowsfilterline1->setText(list[index + 1]); + filterRows(); + setWindowTitle(title + " - compound " + QVariant(index + 2).toString() + " of " + QVariant(((QStringListModel*)rowsfilterlinecompleter1->model())->stringList().size()).toString()); + } + else { + setWindowTitle(title); + } +} + + +void cSummaryPeaksTableWidget::rowsFilterLeft2Slot() { + if ((parameters->mode != dereplication) && (parameters->mode != compoundsearch)) { + return; + } + + QStringList list = ((QStringListModel*)rowsfilterlinecompleter2->model())->stringList(); + int index = list.indexOf(rowsfilterline2->text()); + int comboindex = rowsfiltercombobox2->findText("Name"); + + if ((index > 0) && (comboindex >= 0)) { + rowsfiltercombobox2->setCurrentIndex(comboindex); + rowsfiltercomparatorcombobox2->setCurrentIndex(0); + rowsfilterline2->setText(list[index - 1]); + filterRows(); + setWindowTitle(title + " - compound " + QVariant(index).toString() + " of " + QVariant(((QStringListModel*)rowsfilterlinecompleter2->model())->stringList().size()).toString()); + } + else { + setWindowTitle(title); + } +} + + +void cSummaryPeaksTableWidget::rowsFilterRight2Slot() { + if ((parameters->mode != dereplication) && (parameters->mode != compoundsearch)) { + return; + } + + QStringList list = ((QStringListModel*)rowsfilterlinecompleter2->model())->stringList(); + int index = list.indexOf(rowsfilterline2->text()); + int comboindex = rowsfiltercombobox2->findText("Name"); + + if ((index < list.size() - 1) && (comboindex >= 0)) { + rowsfiltercombobox2->setCurrentIndex(comboindex); + rowsfiltercomparatorcombobox2->setCurrentIndex(0); + rowsfilterline2->setText(list[index + 1]); + filterRows(); + setWindowTitle(title + " - compound " + QVariant(index + 2).toString() + " of " + QVariant(((QStringListModel*)rowsfilterlinecompleter2->model())->stringList().size()).toString()); + } + else { + setWindowTitle(title); + } +} + diff --git a/CycloBranch/gui/cSummaryPeaksTableWidget.h b/CycloBranch/gui/cSummaryPeaksTableWidget.h index d604809..52e7a30 100644 --- a/CycloBranch/gui/cSummaryPeaksTableWidget.h +++ b/CycloBranch/gui/cSummaryPeaksTableWidget.h @@ -20,6 +20,8 @@ #include #include #include +#include +#include #include #include "core/utilities.h" #include "gui/cViewButtonDelegate.h" @@ -289,6 +291,8 @@ class cSummaryPeaksTableWidget : public QMainWindow private: + QString title; + cParameters* parameters; QWidget* parent; @@ -307,9 +311,25 @@ class cSummaryPeaksTableWidget : public QMainWindow QToolBar* toolbarFilter; QWidget* rowsfilterwidget; QHBoxLayout* rowsfilterhbox; - QComboBox* rowsfiltercombobox; - QComboBox* rowsfiltercomparatorcombobox; - QLineEdit* rowsfilterline; + + QComboBox* rowsfilteroperator; + + QComboBox* rowsfiltercombobox1; + QComboBox* rowsfiltercomparatorcombobox1; + QStringListModel* rowsfilterstringlistmodel1; + QCompleter* rowsfilterlinecompleter1; + QLineEdit* rowsfilterline1; + QPushButton* rowsfilterleft1; + QPushButton* rowsfilterright1; + + QComboBox* rowsfiltercombobox2; + QComboBox* rowsfiltercomparatorcombobox2; + QStringListModel* rowsfilterstringlistmodel2; + QCompleter* rowsfilterlinecompleter2; + QLineEdit* rowsfilterline2; + QPushButton* rowsfilterleft2; + QPushButton* rowsfilterright2; + QCheckBox* rowsfiltercasesensitive; QCheckBox* rowsfilterwholeword; QPushButton* rowsfilterbutton; @@ -363,6 +383,19 @@ private slots: void rowDoubleClicked(const QModelIndex& item); + void rowsFilterLeft1Slot(); + + + void rowsFilterRight1Slot(); + + + void rowsFilterLeft2Slot(); + + + void rowsFilterRight2Slot(); + + + signals: @@ -389,13 +422,17 @@ private slots: /** \brief Send the vector of coordinates to image window. \param coordinates a vector of coordinates x and y - \param columnname name of column which was compared - \param comparatorname name of used comparator - \param filterstring a string used to filter the points + \param operatortype the type of operator (0 = or; 1 = and) + \param columnname1 name of column which was compared + \param comparatorname1 name of used comparator + \param filterstring1 a string used to filter the points + \param columnname2 name of column which was compared + \param comparatorname2 name of used comparator + \param filterstring2 a string used to filter the points \param casesensitive true if the string was used as a casesensitive, false otherwise \param wholeword true if whole words only are compared, false otherwise */ - void sendFilterOptionsToImageWindow(vector coordinates, string columnname, string comparatorname, string filterstring, bool casesensitive, bool wholeword); + void sendFilterOptionsToImageWindow(vector coordinates, bool operatortype, string columnname1, string comparatorname1, string filterstring1, string columnname2, string comparatorname2, string filterstring2, bool casesensitive, bool wholeword); /** diff --git a/CycloBranch/gui/cViewButtonDelegate.cpp b/CycloBranch/gui/cViewButtonDelegate.cpp index e64e107..27586d3 100644 --- a/CycloBranch/gui/cViewButtonDelegate.cpp +++ b/CycloBranch/gui/cViewButtonDelegate.cpp @@ -23,7 +23,12 @@ void cViewButtonDelegate::paint(QPainter* painter, const QStyleOptionViewItem& o QStyleOptionButton button; button.rect = option.rect; - button.text = "view"; + if (index.data(Qt::DisplayRole).toString().contains("https://www.ncbi.nlm.nih.gov/pccompound?term=")) { + button.text = "search"; + } + else { + button.text = "view"; + } button.state = QStyle::State_Enabled; QApplication::style()->drawControl(QStyle::CE_PushButton, &button, painter); diff --git a/CycloBranch/images.qrc b/CycloBranch/images.qrc index ee791fe..cddf636 100644 --- a/CycloBranch/images.qrc +++ b/CycloBranch/images.qrc @@ -50,5 +50,6 @@ images/icons/rectangle.png images/icons/chromatography.png images/icons/79.png + images/icons/12.png diff --git a/CycloBranch/images/icons/12.png b/CycloBranch/images/icons/12.png new file mode 100644 index 0000000000000000000000000000000000000000..5445e11be71cc8c84d3003e9cf29182a7c2a4119 GIT binary patch literal 742 zcmV7^=0qgp}hT z?Kt;-ot^lU>p`{@1K`W8x#j>mlvreT=J0J~ zC?3G8nQP3-TptvhkBJ!s4gqW!7{ITS)Yl1xZ)!X7|(-x@NDVI}SiGAvD$06gqae zM$$e-4NbK^NkY>&08UQiP+DVZljy{qIeurh|apftbewOj}F+KzRD z*z@cF%10XjTvTuVx;TxG7?NY=ygmxabhGYo6|mEHlXLL((m!U@;!wT@jE zl+a_d#%fL5v19b4ef5)|V$ze(fBvfu8nx~<4z?HHfu9w5IohOQ0De9{6C(pkD4+!3;r(DD8FkhCLb(;J%l)YO!8gq8_elXZ55)~;jyAQaW| Y5B5>+5zcJI-2eap07*qoM6N<$f?`}^(*OVf literal 0 HcmV?d00001 diff --git a/CycloBranch/images/splash.cdr b/CycloBranch/images/splash.cdr index 1e3189ad4e08fa84fe9aab7229d61c182684127e..567fad9fd809f38fd492857db50ff525ab90e1a9 100644 GIT binary patch delta 464495 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
^FE{vQTb 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 z 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

DZ(|0OJvqWxbB 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%0DE76>jRGNo2T>_m`%@M3g{BRLvP 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

Yse(&dRwtK4(d(+o2EMN4^XnjiOU(Zhmc(wO!1n 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 LLf!d3#{m8hRvpFFKz)XQfOLn40*`Re95~jK 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 XERb(CCw#PD!ZQmt$VxI7j~FU9Sz!3?ZM z9L|MfbDo4!!e>>JUVZS&=G800R64o7!9h{CjWsX=O*9~Bv9Szoz9?{?1RKW0#-8Gn zJ&|U2+KvCce@Q_?(y@T^7;Jmt$Hqy?@h7wX)&OWWKeQD-&(kny@I43G>FO7dTpcJQ z*XukE){?@)oZjEnj*cc={Dmagjh9-UpWqtS+#-S@HU&TuMMFnkz5*yCz<*t7Aq22T zsaqQxH^V_k)$wt%#wlerBRwD}2$VGE&ba9cG8rqYf50LEyT3odZ1w4kp*M+w6%imL zBoz2&5E&V1H&S1hltj)Z6FfgNGxKjQ=7OQ_tLxBT4(%u;2_5zN_4RdwA5DeYW&gHj zyY?o~I8}QD?55sPh$VL0# z5Zs)scVXw^YW!216qv23t~S%+rvIKb9sdeL(A$Yn<(Zh6hBveRl@ldJp1GEN8v~P6}FRSpciZ! zV4?QAFCDDM&RE$kbOte(bp^UjZo! zXUFHA2G^uNfxztL|BqI@i06JjGeDWzu&3px9yWs(b6g@Zuv&5dQ5pWqb$HV3q)|a&DajO?0`Ju&63SF zM+)_IDs23i0o*P2eGUR6ol*T!U8$Yje)p`Nu`zutCkh&iTYG0`Onkf%Pis@7lt1tQ zDN#|43t&`+awYn{fWW}#1sWtFy}eJ=)b3rmjU*+RG+Kk)QArhk)w7{@H7h7eapCnqr28ZtxC2%gt77;EjQU zgcmpjup%k6S8Q$BL!TroD=QqzcB{j$0D5sESp29_^yZ{X!NHhUH!{TLi9?u0@9CW?h zzaH)ng}4a7%x}8&T?=6(Yoe^IxoS-NF)4W|0y=bhY$5-9|DsAiR6<&jRM=s(goF$X zrZS0I!#qmN?56Aa?aVGV^b}qCT%AsP)1|I6Km5Np_Eu%-7RBxCtSm6na>Et}_BPw1 zo~eSIoTbbCyb#4Y;0C#6Tf=KoYQQynbxH5RgBhc&p%H%*`J-ZC5ge~UqV}Si{DI98 z7*rBfiV(0qJiM)T7b_+v_QG()L+OhjHj%6&IJ^dXdnM-pmAt>ZDC}=#DGlpLx$nAh z+C{o+s<6Jk{`0at>G7mbbN&KT8ll=mO5BpP4516no4ddBzW8^Xrm8z!Y617R+cZ?h z%03m^pRdJ>5mfOzS-{C%=j^vanglXDGGdPK5GxS^l8e>_uwPcHj0{Ax{&@l;aRZl9P(%bSzm&A}8#Q#Mt8WcjQ;8Lq49G~>Z(CZf$l{PXmu?(^ z4A2|%oL!U0fEXLG&@qu|N#Zppa0hCXCrkF{l@Z}>TwN^f)O^Y}IgkoKe@_p_&PH#ThdDF@Br!uDNV z*eC9foQlp^JOZuCp9nK+36$iFbiKa2mb`%#}$_Pol%hPL?rwEHNb| z&XCFf`{U2ug`r_7KQ~ta`;zTy)_7l_hDACX8m7N1b%qby&>(Rf&j1GK(fU_9zqQLw z4mW#_s&U zCR1e)jVhel4oKKF<2em3Rt8um%3p=QduQ^XGj@4-8D_#BE!UOLN#!XXAe&S%ukLPY z5x@zF^tK>#Pziavw?(YOeuIK?QC(f#MM|s`ox%Q7jWG`V`VU@Neap#dTVN9cjP_B~ zLrp`@6FUL$rIAX9`2!7&LW72rz3l-oiYpyrhyF(Zg`&;=J(%tLA#Xn<;b?bi{(65Uks^wY3}5H7q(B<>o#5!otEpTDjRyOL>5rV2!1szcfGZZ|^#sKjz$Q z_g^^Xc(P*bg_7`_YVFO-+iQpHad$J;D=FkDbxhF?3t05!=ZY zjcao9@|#m-)?K4TKzO|jWsO6HDZIln%P%eJlbxG8THtk9I}v(cuQo9{$@1mHiMx(W z_wU>OIB@~Wj)#xW+0BhJm(EWfpO%>gVLALadBu@evK{ThsR}#3VUGr&e+quH@?Yrv zsfBgVPrWNLpR`>43XI_J@Hz+qfJ0b?GP&G(`lGUwu>0=Mso8=br7J*~xGNt#4WN5d zYPMdT#A`N~|Gea-{HnA{y8ZEv>Auo?ShY(kDk^-obs<5bSvd9YAAQ^ zCK&G!W1GWGrXuD}fV)Jb_4>CE`#50>*Lm*qzhYzjRx$ z1xQHVw<^c$R=f9gbVReoJlmM6Z)J|dw)ghj&z7HR z468os?CfsNDJ7n_yn~bJ7sscl{64xrU)N*wyOD`M(Hu}1S7Zu4)z;olTucnyc^|+Z zwmWGzyOzWYO6>mr%4@{9)8P90pyV;B$N5Q_|Bnec3f}kHK%*ZyJViS7-mNebV8w5Z zyU+*w9>~xU*8)4#S&8uf`ytE!u1M<0H$C+h*(RrX$SGVu!MAsFbF;TM4D}U(bcgoy zQdCszat-vr9dj7G$E4hRd=w(CRD5jrzeV97sEcxN6ux+o>z6SL_t*_Qs`j`GtP^}P z`<1z?BkTbiZt;#t69@++RBb%OsG2uTL{h-#lxjf8H!i?vLm#m@KY5N-S4U5Akd zmMMhP)bu@Uh16o6EdwR)$xrL*>iGHifN}&Ib8o(fQ}$jDw|y^?9!AQ^MUE{yclF+K zq7xDficMDhPx05**ONZc+h6<sPmevb~9IEdJUw+`@Iju z#7f-K=2lTM5VliI6&{1Q&8=Ivpc1}D5Zo^?p*T1=qAy^nNFK^t;(TGhsju(kQX?o* zVKbzyq4Bf5{e`0~xycS_Y6CevhW}l#9K249(JK*a+Tgm=L01wkLOHDY^;yU829x?T zdsx;W6sa?|K3sA)SVHEv}zdu?3(%jLJ=lFpDoRW?^Eg=OH<-8tPhA>qJ zvU_r$WT3`!t_z9?jZI7(u1sj^=%lcnya(;`5v2e#BQvBqb!BA(**L&Fd_)NIAUQb{ zElKLB2BJ~!eY|tT0SBTPgVM%X&6@xgv)N{JdmB)7Esczt;x0NTMci(4Xk$LF^j@^` z({Q+f<-K+9E;~D~><2|v)lI`88tvR1&H0E*S!dX99ytBnqa`N?;5yPzbh%ORqUh}3 zd-mTtrGnl^nCdO$XM7P-uq8oAf$bz=YX{jAb>Es9el=nEgzoWItFPxL`{wn(VnM#^ z`1PyI&aQRgk`>gbHmCl)k%r>9%EH3U*B9qo`jiwDbAhHxi0NthEBVMBeT?AYe?!&^ zM)hz6N_d=&0uK*}OcE|`O^&ez-Cu%ujb@*@rExD1VnA*%iH6?vZbeB{d% zWW3h=j^EHXHn1z0KTeyfbhu6gC+^{f1YO{p#wNeJQ7BXl^5MxMZZvE?DX_%DMk4OJ z!^jsvPJ=J?bvoToRwryj%+vl|DUhzUj;+{?X5An7UH=HGv9`x`#J+lEK*w!3)42G{ zLkD|yX=x(QTs21Aec2v?Ct6Y14rEWr<=9=G@J~sqeag}+d&I^r z19$F3sV&K^TmF2a1)7EHyZaR}F);^gV?K*JrU4o%(a5!vlN0OVZ!bqe42s>k+t91& zEIDn~6K~4CM%)~SUQR)wA~t!x@R)uSJ5B0F z!r{;dJQ+bIeg@H^Hy9zes+>*_O24Rs|EQbzoYHyYkLk#_$%*pKL@py^KbsQ(T{F@4 zwS7!&Kph>Otx=K?mevL-F?Z4yNz}+0;A1!qM4#x=v>VhD6A7hMA?M zAiE@$B%Zp{z2V;8sMuI`1Ejtdz~tAjcXtCZiE7>?Fm7>TgQ1S`<74I@VK+Y{#$CJL zeP1P%Q#&LiL`9AYD4hrX7}O%3#2?wfRzP>=rC;)l* z4SbWCPYAqDN8Ha9C{ATmD zJ|DzuYVqdV!hf6wmd3jdfu^ii<+=V_CuroruG^pz!ekUcUc!K*6|y28qv5mtvv7=~ zgP4(^_S+X%634p!|BnD?lrikGZ3{2uKAG#)|CzVM;~@k5?Q85W|a#;MXu zz(p3v8g;N)+e};KyMS!)XZi4*g9AD3hYy|BtM}dQw+Cqi-Iswn04o9{!|V<})0|VjL!Fyg;W+Aa!lh*BaioI@(=T)50avu?Mp@TEc$i6K06Cv{Dbfe z>Rit!z1qSO?lWkBwT5o&V+?0!=iTc!@PyrGuEk!igEDQ>l~@F6_n99Un#`?j5C3!p zwDi2h!o)OGqYrrd7JN2Ar8nSgI0fE>fad!3>p(U^4)-V-LX3K~h)D-n>vt@$L&HtY zqBWmB{i0h{4Ea$w(Tmc+#W~nN!ea0gPHps+`5c3Hm67z}uw412WgZF-D z`jVZ<)06+3ZXM{$oB`_#?2x<%(%Rh8l5G&}?(N#^6}H=Eg?+=r5A25D5o2#}&vS0R zuV`;#Ff&H-n6K@{_y`0@idI>CfRu$$sy6ZiA0!tO8nEDuU(ltpj) zENJCu2Id>z33WicQGC-J2w!GxT`lCY5Q*p+>Ic+N806bS&2`V+2F#mQKgd zRFMk1wx2ttnV@1BQ(mLH1Ehf&kN26kPtr3yJ71q|N!!gSN-r<^EI=*>WuE-&bo%d{ z{|z3mCKT#7h+8)J!PfWpwoZa^z|?Yn{=JL@VTg!XkVlBpXS!`BnvxI>AjF=JW&>K# zVhq{W*>sOc(L36fNEz^+62{ODXa54)OUCfEyA(tn*(dr2K*We)<;!`zJFc+(`TR6& z(|m1nlXI}}*>~=DTL-wj*8E;uRb|&aJa`MaKM8ast!EE%8O^nXk=|dp{V^U5IMwCh zg42e-FB+9!F3Kw_hcS91N6(k1hspTUj27OV@1G!X3>OGO|#WpZ*% zOUQg1_?<4cn*8AuVPWJV#Frnf_tXFEsk z9hKq@gq@Cvo=JM}YnDNQHh&DzDjUF~;z4|6dG;X-i+rUada(?~F*OEV>}R=fW~NU^ z?!3*GR#qA%%$s#@5?II>fi{WhvGRi5>R^z;W99Wfz^RflF!NB7qBc< zRr%1Jhq1~6jp6~J1UTW1c9Gwe~Kt~o}UHe)nLJ90c-g~RL+qB7S%0%s0XO?;C131csp6+0!SHZ z0V;Oaxl`gxq_l*x^X>-XTz;Uds^PAa2tSG{ota- zcJ}^1-XG8EYHLRm@JK@ko0A~@Yi(V!8Ms;a{O}%#9(C?3L{oGbuDWYz5rE_mN$>0S zR;jayi0J&qak$E>1(fo=O6Ir**Q2fju{4%4w2k5I)b7oeK$_k?DErrolE&DGQI+IU zA{Tz&psF8?34K$7?yTTKudo{GtoQN6KwB6(_XHZ^s0D}1a)%f~h#z=JNwa$@zL4X6 zB)6a!Y<$x-b4}QJEjK@3T3Bm_qmx5}Qp~d}4irTbP#cV zp{Msyx#n&^L1d&513itHrveeRi1xg?ggFsL-+|_B4vuwd5jSy<6Pq7D!-GWtE%bi# z@tR8^0@gKK<>T4%9i+tkX>oDljk}gBh^f0{(U#pK>bUs$x4kKq&{{Grd9S}%)=90+ zWpm1hT2GHr_(d5$?jpaLwAoGE@CYjL+Lsu1Kf54Rg-iM`0-Nm(zm^N z#cS^fi|FFwVzSy*3iTt;gQ)m;8eY#h|LcXndVlLwXql1#4Ih^igdzUY_$4@@sHmy0 zqut;tvz%~+clha(>}+#PYnWz%{_g{B;E-FK<`!3y;<|8J%D!5VrzDb5Q2Z6U{0l2B zq>VpBMfHA1jDD2A;uz)rbtwqG%&mi{#vjMy7mwhW047jA+boUyCG#h_N{0fSvH`prWWaIww2Oyfu9`u+1)VUi*fq(MpF{ znF0m+jx#593=k)yS+MZ$C#{DTI5Y3^SJqS!@*~otc>L0D_H)qWQ$n-AvI5`mdf(@z zU_u7CZ=DbRR0T!S>~Bn_jBZ1*3P;K%gAR6)8~!btrU@n{W22WMyuA8u;<;?xM!?A~ zBx)hJ&2kh$qyC3m?MpKmagfqlnasgA&W7h=y3T8}Ys_h%l8_TywxkBvVbM?onhBqSbSyQH3|n4gC84KgF6*tDV#xDcIk8`sk< zqxPtb(J9E6J!iOGeo3g0!86yEA5G5Yarkk>Hb6e1hm|x|_Fx?Y(n^ec3Hd^vCGbsf0Q%na}Km9NZ{bSy_|yzbP&8 z@(VWFJn4UpHuD^;M|Za2GB-a;2LBxLeV_`8C(M^YHNCka94uc)z?C$_k1$ zAYR7USvj!i&m^m)KER#hGn$i0x%1GG@;V~vHznz!Q0;KbEGAm}uqge@u2-n0cuPBk2J^IiKV5I1X8G(mozxd493efuB*(WCU-kUFfe!`3Ssj`z@Nbs zi2B9^S?Z>aDgRz-lIKj|7(J^5uERiUS80S7O;I{3pn)I%vX zNlDeNzKTTLMG@j7-RJ!s>k_r^_y=88dw`!=Bl{~4BXSg_QNj5QRO>!Ig!8ZiqBJAI^l+L1RrGm z`heJYON&fz`2)MDH;kiOS*fNXF?554Ju=E`ueDy=XSfx9)Dw0Sc0A%zkHZ1#n10vd zOK$G)mmg>XGYEhWlXzpODe7Zud4Z!$jQt#Dn91zUnz?1pp1-+ zz>ST|$Sr)Vm;_RFgPgoWWscC^+Ho%WM^590n9R&Vyf=?e=DyIcR93zqqJd;|?D{2h zCo~Re+%wmZBNz7;r2O;xR$G$k)3>;^QbbjLWPy71vYR9RcEkBXv2!nNZSV8B-R`1S zto23CcUyP&cVS2ceg=H3d+;tmK~Yhw&U2_hr?%TAcor?eH)G)u*s9ib1jdqhSeej7 zrr-BQy#%$&+Q`TV>H7Va2q|K!lS$SbJSvpl4`U??6_{$McO0C(8z2^Wl%DAo zU0S-ATxP8pB!=o5NM?P-TIHyE?FA!A3N}C9?iXm6TMSgc&ytTqw~+(|`%^?SF57KM=ezerBLB&q~M zO;@HPSLc@xd%L?YSC^qdMJ1D4RMdMb-4C3MKUJd&>7Loz(zFcPT&k7?|oUPoR zALELS;nXbDT^XoIGc4fDVhj!qrN=4{Ls4FRP>@87YNitlFVl{TJ$^swUQjw zj?(i_Gd*J)#l%lx@))zn1;#VK$zdQf-&-3BQ^aZS zF&mdMG3kNLXu9vAtsW5Czq(V*jf|=;8>N~&n?W%^Vs8`}{RoPU5e>e$NM%fqlkQFr zQ5550M5QZVjT#V&La)EWUa{6>4g7O5e@f;ZS$56*?^e^_e8pnr%(C6Dzq)}h4)$EP zi^#b-6);Ogg|q2$@&DM}DKUGmCLJY!**u+&GQix@Un5ZRIt&~&mlxL+GUy7lc|!x2 z(q18Qz$gp*{9S_s9}ZkaEMIyyHmq5~V~*DqWY})I!>=-|8n0ZF6PSJsO(}Wl>5`s| zE*s61b&m;uNiZrbIQRvU=uK9s8vG2BE^T?hhSgu~LK#D#>wzw})ZD5JEdnM!MrUZ! z`Q1+T?i5O!?k&)5SMKc7-uO)NjdpBI*B3eCbV}0N0@dcEBtxuI`emA?GL8Buj#U&sh;daq{WycX^3IhK^5S7Fs_{b|) zf_XZ&Owdx_tS`jHyo8%CDhh(+!QJnleqBXZc`y#q)isK0D~;cV=7u8~ZGBFCzSR6v#weSwcsrrxKv}g-iT;Xr+Yx(UPB^zs0Dx zocU35u*Rfh)VP+mjGP?Mo7ND9RH zjIl^FY<^_oHe{~FFP9$QslXEyuCFL73)Fz)!OR3PdGMzm z&OCs7`=<5TjA>u#N-B`v>iKP|NgVh7d8l&uHR%gL$G(vie&9A#=fA5@M0Be@(ECS2 z9I@GAN;HE!P;7w*t65-kgj&ZeF0w)X<%tT~i|2ViRZ!^I*+q<+1FmD>Mcso&NY<-Y zM}@|c_;ra-&x+{j^>~Jy{gE5E;oWfbevdyG^1%NDUDNPiG7v~m2oJf4`+QPvP-oQz5hx>$7&_!?JQsPc znk|pPVkFJR25Y0RYiYgPCQa;;q^IWzM1ubQMt8DsmOUOxhrYYG7*pt;1142^^=+^z zq--IB1H_Y*y!9%0SlMD(s0G~>oD~VNvz|$tpJqQ%`T!F8XhZoXA|ctu;~))5JzUxc zdxI;yj9v>{v%)T`rIrKn(8bvQ--T@va^Et1V)(kcdW+uilL|oeKcn1l-aMJ6rDJ)JT{GhDfp43P z$0WBJsTPjyxiTOF)({XBe4(vvwU<~F9F@q)8rP3^^{QycYfFd!_Vd6}&f|d{7$XAG z>Us)XlkQXr^Ow8<;BbjM`|m|DuPFSX;^&|*C5Z+~ci@BhL}_~$cp+Hsp~MoL55(9Q zATP7F_8jjn+1!}mB1f$z} za_%qOK`;KVpA;HpS>udfq9NvsJjYBVJKBRsa{q+%45n5W+ z{(DCnd!gXz1N+Mbo+^LZ=8s7#cp$8KAk)^m+`6=VyF{p@T*AW1 z9Sg4;npc)iE8>XSM%xK0{C3Qt@hO0^$YxB9ISmK6rB<`kgALQ2K&A%|%%G=ql;nb+ zhgS?rvUX+rUgIT^Q5vNIv|(U^zB+~m$GIa1Fy(=2S!z2Jvo=-@e1V!d;X&ImH#gV>;~`S{t|gNVr}hG(?eP+ zsz2$zb=MFirWK{aYRnh}R7RY~9|RHGae|aYo5||HxS8Xwd96?&4Gt&;Z0W{8#=)Yw zoRPZzl#GOg-+haY3d^Sl9ZqN*XRT)fA4;XKwdmD$*aV9g?SA)eg~X6^)M9 zzn+yujeiqIoDBF+L`di=-37EWta4C18~Dh)o*fn3yiMxB-oKBZpVDt|CDCHs5idhU z!FRi;t>UTylw>tAd?orrpxL;do#Nw18lTg>knj-T8Gis7epNA(o9n(k*9ztZ@TLv4 zx08({->sJ(d!GUu1$La_{O8KDvZj;OWx>WB2FJ(88-J?&GqK#w4C}QBk`o22Z$#IC zU%4a@Gb+GTIe|{vYM`9s6Pm7^u1WwkZ?-B9CZ@$mz1XLK_w4bp;i{>kelG|5hGZ!w z^0li_r(+6VL)9n5D#4lS;^GoXEr!h@gBS%xP)E{=z!!)bRAB;tAn9o3^w8pO?{Q}4 z*2g4jk@AN$09DJ%$__Wi{OQO71sz!A+d#4aofF(1q-{OZO`M|>6KN7|5gl=Cu`$V= zYXTS`Jjg^Uye2qK}4*vI=lK~b#y1Vh>(O0xj-qAI&&TOHr>Tj)r zH_To$NtE`CKt&F@3Sy96%Z8G4NRO=!7f#pM8Jr$yY*~doyJb&pkFCOtk?Z~}Zc7pU z#trO`E2$H1z};DmeEG3(+$MKskvY)czs3G($oiVs&pXl178VK+U{MT1C5K7(2(mHJ zzT0P2A3pr~GGGoOSb9dr@xLKu;;9BVd?Mey<)SiVb$Ir!nD^1Oz$agf9tL4QPdLWd zD*ZS6xvfxtV&0(S?{CmTCTcyPEMPMVR|ZTX{ES8yXXpUSX>DHmzkJIux4ay@OTlft z0Cl1A5fp(KH_b!SVB+|)UpUM;{|u-0?+slGxbns5#)qd|h}drt6pxanfz#IynfZtO z>zrO-sa*N-7O$z0*FzkiM%;UM80AugfvNaI zT1djA33@mlZ4qYNnI`y=@gxe^@W&td2vx;nIn}d~%L|jG!u56Q!Q7_}QvN_Nd%1fz zdvLt?ZogW-PGDD@b`>F(N)>V%MmEH}PWRT?ISVBZB##-MNX1}^BY&~fXpCAwrlq2u z278u{YT-`-Kgf))4vtreJJAes&TEE&KUVwdM2coGmA?0UJL-5m?0*A~?(bB0_ic>c&t4S= z>-Tb0Q|>MhDl2Z&Xv?^_NOJ0xuWi(M!9v`|#KZjn+%`8auuoHXJa~{@o+mZpbzUyT z8y1#EMW(+HGd0YoGIxB-QnOnBJ!gMf?A#FpMNxFz_L9hpA+x`apnCwYFr$tC8caCQ z(gPnhyS!fNo|aEy3L_oi<<>7T<3D(J-YD0T$X)0Eo&@h2#=~+#RBYT73oEm?duQmo zZtGLmgQ%sfs&*C?SXWk8aTIf(eTm7)AncgiokjdlNAtmnrciQ(oQJYvQwjBZQN0m}Y%V}+6b2B8cmwtV5C1j!q{C=4Z2^rpy@{>uVIxR}-(nml)xCC4~ikVI`yPB=)h|zl+o40h?Ri69U*zmVQ zqxIyhK)-?z{L#_&{1CgQy%p3n4EFVn)xXTi%36d|!m!1|t0w~u21$jHdxNVB)Me{Go}{)&Rw6e#83JND#vNP@3{&^@!c8R>sj zjgy5aCm7mW59Xt!WPSY##mm=N(debgOzk*1kH#y%Ln~ZR{#6BuV+}wUo5<;API@KD zM1I#b!S=3CvN*6YZ!e8XaCd%cJbAe!=$lDM01^#$2t?VTKa`TsCfM0|&rK9dVTNa? z_)Hvq(rd5Qb6xlwR{uRg-#^6wi;NOIu-r^12Hk(9N>g zb2A(nEq|Q!N}r2*?r0^GWi_1dr-}&{)f~AW(qjoy&?>p#lYV25qnqbm&FYt&bMnIvD95zCA%D?u=P@a&e9U zoqD3aXK1|jBlm8%-@W;%_6;gMBbip^2h5e)x;m?&{mIy*a>Ca3nM|K{|3oNqzkUP8IybLr4+zOeP z74et6v$G^kqhNnn*GIdOYENi`W7oq-S=0C|ciNwR1~b+>X;SkgFmBGhc_?eorJTUA z4l2i)XA5oR_eZ~fYv$`Jx}sm6{QRx+OEX{8Wry+G4=7#yp2lxIGRy90N_PyF6S%4y z0~H7-wu2k+LzuBa&ge|rq!NOxm^6eJB=pIN0c`i&wSm)(dfex z?#a4#%*j^bN%_@M4Bmb2?)A{wdN`MGvj;(IbTEDy^Yb^o+pQVZvvZIAtg^j*S}|W9 zn@bI9b+}guh#3W=^O?nf+Dxxa#uc~iS`V>nEFayS8DzA=%?`{aH*l$f?|D0UKd|dV#dCy?G-xT2y%_*P@c#K64Ilb6VPu*18ps^}J&!1`%MU3@;Vn)UmR*217WS zB^vorKxjZffFvg9TzQeg_|(R6B~~yQhe>8Vd=gfZ7}hcNS7~In2i)?qZJmO zaqSn90SX;J$J}Lo?rmgU;dMxJ#K)rgfzIpkWz#9gP8h3@Qm9uK+5&b@=Er2J@9gZi1iXoA6fX$=lEp{oQgp%)578vF ze5wIW%uX0Rd;%7|TWeLj-@h+hgI(7MSFzReKl5zd*RR^d4Zj=AaP?DlrjV%nu3RmS zJ3HVn!{3@8wIMfC=?lH=&>K+dDU+WqCeA6@U3Y)A4mY13eFN#cH)ot#WTYyk{N z%iITH7f)#O6-+hn`S?3goSNz0_xDh^?tXD5q%sOwv2xpqx6*d?@en_D5_Dx7NVq z-e-1jsH^A6+!wc8xkLE8?qq*U@gg2A@DtsGnD}TT9@9>n>H6Q$T{%APIoG0?Df9d} z2`O#Jg2_})a`N4V7dHjbU!#4a5$`x?DgLE!d4_f8&mZx|OUXE-+^a`l_kJ8fNbBaD z`a|_wX%0n2#l@y~6cm=;LL7K7?oVOd0^`n-M9 zv**|!?s&(TzeRR{5ZW_`@CgOC_tE-9Mbs6sCQi9+Eeosf)c;g=-tS!gVH-EIx9q)@ zJu$X2uMubF0zDV{C*<`O$%KDIz?3oqM)$ zqNhgBndmhtqmxp*oxUCGS;8?BvqMf6QlLGAVhnv9hQ`1Pf3McbOar#_?yTgzu`6mA zQ(eH$0cGMj5gFMhzmwyg1YRlYaBfN0A9ll;lUgYn!ORHrn^vAZvkmPhgf`Ob_N;g{ zFo1){YE#a;nk20|@8s77MNW5UyLuOk+j&Ssq_kFZZbO3<3tbjZKo$W(%+j}AGwF~P zRL6_2JmBqn(es%|lyih8>k1R^7PT7IZ5}`3z+)15{6=2gtmCbZoEHxp-ID*LFNRnw z?hyaplShcL-u>aMBPv+KKl`U2ud^!d>MQa|<0q2%G4mlfP=<8HcgFVsuIM+O{z`(Y zPRF&$$|3*Sw+-7UJ4+u%GMYhXK;+u`;5Yov^l zNj)G#fpyKx%bl5#p+xzh?&vp2?Td$v|hhYCMw`|w~s{y_=y56|VXme*lbue8}RT}?q`27+~B!^b3 zijIN4LxuhP_hikd9cxuuArlO$uO9<^?rz5Di297oK*Wu$7LXt?1;eAM!tU)0jxLxT z0mF@JM7D@}4qN(|XsWMS=6?CzAh)CFdpaO`6L)wZC^#Jn7R)TspoOrLu|faC-*pb- zoulbKt#0kRF`NJNr;7i2*3k(L1icK3{s(;&=G=MuG5(SVQ z;&Qti;~P$nPP)Jw(I5s&<}$gxxIx%GQm~^$eq!k7$f^(YP|}e{$C>|g%n1&z*Uz2* zJ@b*KT;#5;tL#<>sfCbi;-3M=mw_QOdZUWF7AMK#s!fLurt&0JvE08Fr6aiB*q8(I z8mU-d|1v(=bG5hY1K`eE9zx(=^vRcK{AqfIU~O3W47sd04QzOr^u1=)#LTSA zCm29GDk}2c`lmlh;k*?chWq`<8$<^CZ5wil36^{u!uQ`wBZc1F44}E;^J(Ov??df$ z%Z{Ho#}Bn=TXZIN#=x`Qa&Ga)qF|4l!U7T}*2C@`mHh9{lb-ZX{0FugX`d|tF7hbH z!LMb<=i6<=lO@LU&Gw^!{$Za!_PW@j2M7&_Z+LNuhJXnwH&Ax`j3AfvbPO+QSS0-= z^iMzn1z5;+J*FX8g^7Iv_N=uY1hl*BGaN<%S9D-KjcSr7y z7O-sTU?3UP`5J-9i&$Z->e=Q$?d)J=#KFZK$&jf@XwT(Su3Wvm;o33T>ai@wQKBA4 zo5Ff}zAO&8i;I`ZC(F3VSsHDe>Q2VI&h62Gf!@EJFNKZE&*7<|Xm|c`!0PQ{^E6CQ z`+k8*E+M`%yDKORYF}I)^?c@)=Y^o*KWotIz?g&>#OQ8GH1^}YM+2oM9|$in6S@bX z6yp-};qhi503S7$PN5))X$qKAQ$FmjTAqBxLeh`r&+jAy5Z`z0hRfn1ZI2`uLCce* zUdeOiJE@9MqS>;)MniqBR7eO=r(8aVs3p5J+kPoN*5%Fic}1eATNrevQ#=`rJeGVg zk09hzqV$;PevVt@P59CIRzEW0rP=1f(n-e|-`GJU_sf@i4ll-bIXSv-w;#ZMN;;#j z51*$C&!clBl@q#z=6Bxe7FMFGrHU=LA?E=Le-)M1o}D72LB=cvA(g<9EL9BaZZJ`5 zpTar@Qt9k#f!aUG&LY)BPk;athtzLmDSZef(ke{kRMK>(WxJ!>TB%gowr@Xe+wrlB zSyx~G@t!)ysJu7#fyhsSPisUs*;D6IFWY^AWZ7;lKDRg^!j>HS()I86AmDz9POVFby)57pu)q$Q&XuO zDef57)4<1XZD z2NM3($GyP1TF@2(30E8iyMiXR0;Z*}JfR+eXPl#tI6cBQ=%X)O#@X@G9!^Qhx@#;= zDLrr()--E@AU;faZmrTfU;Dh5-?Fd3p0+1TctF ze01@hXxsoUf?~tkUSLpAzgiqFR?(}I^{g%F2jil%sdvfBs?Uf-Tz}xCg%yB5+5d3s zqwg*yXgO1hD>9#_LkO>41C>C2}*MTxk>@(boq?QnPN?3f$P9k_WJ#0EXft3ya9hU?TZLP z7U9gLUsb1J$^_EBX&Y*}|Fb>Pg(7=m|J?;7OWiv{EdhUA4vLc*fh^jF?+%?_u|+5p zY>z>V)O^nJT*YB2c6rcU&utLaY_cxrzSMIcpV{xPT>3VnpB>GdfL(X7eaC9(jX3Q! zk6&oa6*&c1l^-4)fE2TJ@Tvwv({RO_ssbhv)nLAQT$$W1l6I6KV=H@cOHa>v`e@Ux zvmN9Qz}PcUP8Q#JI~#EHf*#kjP%m4h5c{#;>4qQN3~_tRbad9wBjd=8JM8J~Wo^2( zcvO?+9bV2_V$eT%2XXwTPt75J?E4vr+q~=b$?kE`<#v3l&D*&p7?!hM-rg&h%w%&j z7w4iGh|RZyK}NBudQeB;vI$3hOk$$tMJnarKBxQWW!q@$pj zpzzlJrD46+gXvXXOA)P%$_2+a^eQ#85B^H<~ zYVa1)*1jI~FdONhI=fJ$vn_sa0h9Fdx-kThdFjtKHh<~`CnWV>=D}#DuBmBeVgf5f zamyuuHN}a0Ep(l6V}b;k@!W&$+3E1Bn?x^WzyU131gE<))Sh%9<8L(qQ)mX*_oXGz zop#|&yd83}X0)mhu8=^=sw$0AN7v}miCa7mKSHUd)xxe#t-btTHuKha!sfL0(cH)8 zz84g65RXz}I8|$v^*-RMwja%6H^tC)0Hmtkx{+JbD~=K9A997;9q)HYv$GLlD_3JA z+=$25=FB2Q2u?I6aC}SgH!^fb+EqK;)APYw(XJs*ub}eQ5|`e_78{9;PmLIzYr3zK z#eWiuVXM|F^MXA`^X%ecsPEQPW5qeHTfcF> zlCgl`502f1@aw_UHX#Q+M6^j7(u=F>aoxZVyMstWLlv0j8`a>sPvOy1ley5NQ%q=} zy}(_%{fzDs1lFu$*wo$u$syc%CnCvNEmXv$&Q;SpGKVt~wi2YjM$H13U{}Y7B4u|T zuP=M~@@hGqi)i`gd*ccNX_!x;`Jvs5EoogQc*bN;dcmNdU72{NVM9FXAXD-^qMaEz zD}CceVL(H9I37v&9F#^zV6!o*`hs#2H|@F9XHBglb|?Db0{zN1nzu835oi0ZQkvER zY~y!Vg)QVY*LveG9d z9xn&D)>n=&kBWg93HiSHVo_?S3=jnADvR<^sTpPnM_JvzR=5it~at#5U-B~;TcRvu%#vx*%PIb;_1|8lVQxyf^D zX?q)i8(XRsuXM=f`MVBxjLqrY$D7TtiH$m3w<@R!##4B_wb@$v@fy8A{e?bD{?dDd{{nfUqxAW51hbNjbQ0KiYR%33ULhG9I4j zc4e*W%Qy*kNZx(1M~!)T?7_@U`0TYcb#=lcR+!77^` z+Ir!>8~H7Pj;NwAfm_}Ag+~1RF}zD63w^0UI-Q{WEd30rrI@?9Y&uk)N9%bzgy(tX?=nwX-I4FcPPE zSEo6BhwSn2ir~U6BR(l9*DI(i_MX3XtRc8nUH(MAZ9!a65*PJpIvFD@JwG?)W1& zKQh3nzl!vHj)!!|!gZ5LI1wgY$3g^fNdU2*kWRks2e7D0X*Vrx8O>Y?5Txx$)<7YL zWw4gI`qfjMtEuVf^RUH(d`y{~SEkq_F_j2*)hLiDCi}F4-O*!12(Eu_hY#E02;-xP*+k!1dxRIOqWAL z#2&ttrclLt!(}FflL<6RbjOXIMqzX5#0nZg^BqXlAX&4}4-|%lo!7y~Rr5|(x`kQ9 zEf;ok{}^@&U>3B?qiEIOCy%uF6q?3z+RM+ zh6W+bZtv+}hqe|?wVlG&qus+$Rg9R~bJmJkd}~%utRk6!BLN&I*clo<49mgXtY8;W zW_6*rNrg2%1O2YuRrEA)kFxOl3Ej_+tKfo}Ownw;&~i&hEnw#gnriC%caCXDf`cJs z?Q@~`+61oqeHTHyMrwQ#6xpR8e>(zm16%&vlQJ8O+dK-Z!`aPN9p@krE{Jk2Q^!OS zz9>-b%!TC|JZEd*?ekTKQUdKvzg_)Bsy7O){znJ=OZGF3yGwr~`29`~V&LW18GY@+ zeJeGquXjc$=r|jzM5+OTRp~J8z4oHV%@{6Sq%oa|oyqg9wx4#XcoFCfhH29I=~Eg( zi)zSR0#PHt`bnI#tj}6(HZg+)9g0wjrr!6{NVdo+^qLfSh0^)-F(we^=f8j7>@%-0 z(PWXe2AgF5pg;Gj9R@oV7OwQ!(t9}aJMInVNYNHj zAzpyBjJ~xAuYxm5Dqn899zvuOR@qlbe+eHXmU5}J_Zl$6P5iiI$9}r*37)#Losz#v z1~jM&6aoTIp?P&mv+mZ*#gm6#{Y{cyB)>ZY0sFboZX{qys(A?SEj~q%=n<8a+(c%JMnN*IlDey4*JohP z%>~lRm&wVh>jl?$jU734-ua&$TZMz!8*%fBvA zdUA&KZS~{Z&v{*_6Zf5a)UD5aQCidlltUD5T8(lAMOQFU5w|_w?W%@Y4uua*Irm#G zGbg1)7GXVPy%8vlbxU3l<}-IMukSTJ6=m7Xh|sLZMI^_1*CK1D=|#?-cchuHFF!dl zJ>6DMZUW~?^4r^Q6gEFMY(ps-;1uR|X(#{F5`#W=29AH!ROXX^KqQEY88BF~vf8jh z4zkZ!6-Dyod-c_L>A)!`@u#4&wWdTb>W3#w-{Q-dnC9$A3*nN3K=)YWHY2YWCg3X40qJ z0t#94@Pky< zT`4$k-@ZNZEvt06q`X5;WFnjLmTG(e_v1T1?3m>FKk;@fY?}EBiu}=KL2>n*QOR3# zUGD?S*8%`S5v-(Ts{6-9x}HR+)r)avmC5=t+;W*k@kaio0sJsSjFsWw57hW}?$5p- z+7m1p?8cx(?jUxG)Y{=-f>MnLWwwB7V|{-w*pfca@TmWcsoRG7#7oBmDME-4E4_jv z;1BE4k-ZvyR{KZ zJ7YV4k~N0i-ziD)kyK?R+RNCi#bFoBdg+1>2?J!Es4JNH#KIcz|6Bx}SzVxixBBj$qdTynlM0I6 z=r`m_ zHY}G(Bjp~Vgvn$91y29U$Alkv{_G{mD7oQ0t)aH##PiVHoK?P&3=haHkLFuHHrf~# z=~~o#5`=|-{kjW(Yo^L}{i|TKaGpK+9dollb+zbXv1jM!L@H^jwGPvdF9HjT=#`C) z$?U0nSzVXb*PqxAKB@h8w>K?2+*=-OOoST{0@)Qn9v#8$8ScO-pUx{oLt93IA#ui~ zgHK{>44aGJRF5?i#z)YH&N&qKMXaxC1{#G##s3CJCr z6o1eItW#~sUzii>og-bx%Y)7`&v8xq=|jT5Kg!@t=jMDZu)D+inHbD*GYWz2?{TrmK~D#N>~7oQD-~Fb z9}i4V6MgjqnjmuBxUBWr*^N>WETX&3SXw?N9oL!zLw|IXru^ntwu;+TEl3~*S9k)8 z_>~TvQg(qgu=&M257E;!al2Hg!2a{%KOHtJ$ci_C>8=vi4TtNa#Sisq<@m@qXchm` z^AMEF<~PAlCQvnPfD}C+77k#Yj&ctY^zTkpUIY=sU$fz*n;eGu=>;}@BOtv%T=m)h zP85!73j9UNeC?2D-w);=N67v2!6yH8-G7{wnNYqJd-eLl8LOf<@tJwk(^rv^Jrx|? z&v3OQnHkw}ad6mVDbBqxum@aue>$svMd4P)N0bhM0@ifM$ktEBD&PK}S!2?-6hSG( zCf{~P+lD$#I7d-cCPSCr0)@--QtrvOGSq{aRxcvFD7moL(Vbu%=o$wEU;Atp1cHTV zRkHrwK$5{lFQD(-)vFgRz3>*Tks^*YzDPIz->n!7fW)0BJv~VXm zC1t+l5z#Fm;E6)ErlH{vd`A#8roh92C#sZTo(oh@m9Wka?O$p!b6P`zXOxBpl)}JK z%`6gPillLj(|r!DO3kN$4y@%t+9?5^oNST``tl~Ue<|k0g$Rdk6eBry##t%{*<)gY z6CMc%+OvcG!${I(fm%Gp?sX3yj74_*+v7+ObO+g4J!L@~qfOWlYTLam_McAktwB1~ zs!yLr&^#C>nPHouFt_H(!44zNQ!%G8$1^8^zwEhz*tYvu{4Y10XZq}hb$af4%bq`yKo0M!)^u;$%)O zznC!cnObXXWh90Y=UUjl`j-(12aKTm^X_|7-y*QFvx9#76!3tEo!BfdgrlI(h;#T_ zZ!eFW&nC|@cPvcrPEJnsA9Tr}6JFKO@U#En`ag6y+t~M32x9=PQbJTTd6VF7eCpUh z&B@~SC}X{DQ$9YRhd@E`6BI0LxEa~WOx1+gKsF`MfD03!vaI^80Uvd&niB3iiIf4$ zmy*}7$MwgBxGFyw8OWP@k-8+;TAd54=fLyhT_R*HyDe^LXb3K+HMCr!qIWzOF{+FO zAS4Y-M@ktJ9jbS_rz`$A${@?O#{aqzo3 z&JBS_QR*^-56T6PX)fzs76h>|g&sC(-2%9z?ycBJAPj>0oms+7DRFBS$mN2KTjmre zN1M}Nl+4iWcZ2LEqE18$blpxP{p`->H^W1(N1z&#?lUORFcsH2%$0h*PfKLI^cW{) znu246`(CKse5;@Bcs=y#luesHNV4_z@W_&PygOI#1re*`>wAf%nV2`8nk3q`w*eQR zdT(Xr$a?749WIjmd=5F2I_UpkO<84i0xQAFsBILoWg(5c8Tu_q!!%i$r&_4DtY@tW z?KLjoU~wyqqZQ=%MC@aKdf*84shTItIxTDOFam0q=D~rd^?@AR_U&uZvU@8kTp(^O z4kS62D|ve#{kz)KRb2wTC8ZONI;bDOO=n0SpPPF_efJjCzb_y77GTPc>=i_+lQ7?a z4)o6PUBS|i$tQO4CBG^^t6--G?%K@xjw%3@1Xg&{(*ZJwBq|?z-`Xr;>TLO{BPa_c z#WetnNMDA!7FfhdiHVimdD{yMUj6JPJsWT%$jn`H>+JuS+=Ot`VWp$n+4yc){oF)eUf%af_8$9>qx0`IHTEOuE0gaGSC7if z;GAMNgR$nz%uLo0KPt&*JYQX97o6~nDyqSx30q@T*tItrWY9q9(`O;WT5|qA!3}fi zm8h1;i@rpaP2jZusI*p11#cH2itws+f+Xr73vGsw`>I?z|LC?mX4~mh4O6rSCC>b# z|MH67+!6z{Y{Nc~Q=Fje!3Pd$zP^bG%5Ts^<`)?~#79YbwcxG}@E+~#3dUwI!=UoK zbHoS~VZoQYS_%pZus?x907$L$wFqO>tGZFjV`%;ZbLO2pj+t0tvImPO=~`eIBgV#! z6I8tV4?g-21NjK<@!N1pn!JpVz+wiOEebl-LnOCwsITDcXnYep5qktgj(?$;l@3le z^LES>iKky-`5aLaf-ik6eNno^CL&@`Y@tJLPNir$Z&c=+@?GgU+^hkla6&{Y3{`yK z>>!MUrxw)8nKf~Hh@EE>ee~lUxbSq5Ddno}D6P)z)Q>SSqtLQW)Q58A=L~MCRqqtmU0HF((A}LqqzBXt&;FPoN)vd-$GlnWHVwMQrl>U9;J&^X~ zZw9YDz{j1GW`rETq5j^lE^q z+-bV7&g&EDdt*@qyv3U54(USK$aL+B;E*ce?2JNg<&$(FSRN-i6<67Qk`HVbFO+5} zzIT)AC#(>NnQcD5w@-xEFDHr&9Q65`e_W2ao^0)2*bV)n8Gik*EgR3((Hc{oUev}n zeI#4fyOQ#*S{k4}I!aV1lPub-f5PPt_NVSUjS764>`R0%5(QqlA!)i;0T7kolYPaS zom*NOuc!+S?sl$jUbJk=)iPbc`m_f28#NPz?!nKcmlp}0d$i~)e*53Gjv{}K_wj?> z3{6uSly=sQE3E4DhJ8Q9X!U&h6wuinqeaCQTwgB?4`|~2qu7DeI|c^rqHVqxS$2Ai zH!`HHXA|>QtbAR%v8^>>JO(QnV@g`2Y&k3S`oPDvl~NBvQxX% zO#tprH9W4HetS6MOCgxp8G*0Fw&y>Bxrp)RW8#$6@SL&9&*4)k{}mL7}eL|qLj2LHrA=NCZb$;0noH-@IWJn|fP>^P!gdWK3VhN?dPebR@` zRdDO&H5jRPhWi&f!bV@o0ldKpuxBa~7=o{4ABhzZ1y>~}gF<4~)z!5?bo-420p@1} zu(j)7-qpCyTbS63m1^oV|Bg=Pw61f13N6r6S4^3vz&^37S~=UI{rFoMr(wb(tv1m) zI6rn|f_~h?4!@k1qb)8ekw{3-tJE-~4<$=2YJ7@?Wl5{2p%#kq?G}z6OQ8`*#%&8i zhD7SCIHG>i1P*%K34D@RPS*?usqqj2y=7+`d@Rfp-N12)%V(`!hyIx2h4iB{hkw)7 zOKTcdH){TTKyA0R)%^KBALoECc022rzf%4Ia6xYf4nDTF235K;-01BaSWXu6dS-@U zgBC<)M))vPwmoqoNE!dTQZCM~jyI(OK7SlR$q0P_qL87uq35}<#fE=5g7*U#0m@3( z*aJ(}ocMUp0aW?Y%F57dDca$jKZPPL!2gq>b9ewogfBP>AjEDhR$&=b)E>k?8l23& zYDi^R$4b<`RaD?YLT33N!}wzCaedN{=z8;J9s%J9F7*~}T0_Y+H|j znX2Wy1ELFN*EaA$OZs?uMQ#=v=I6hyIogQSb9cX*R?vcMvur>Y zAyFy&#=nu9l(paI*|Tt0OwrF@$3q#oxr>*O852WDo*rNsNYhmn|(ac(O^^o`QRW?Bx#ZHSVI?{Pf6`1E#z zVX*2??&7oq4-=EfIEsLC=TkzEp0Ege`|d7*15bix z8_Q$Fr-iOHQPvm+k08sZyA)O5PwEjBXEo$Im|?m3H9x`(v|DWw_nLAm)3l zb)5=LY{#M9Z@JJohN&u&SIAi6=ToB!NtxuMk$Gyl#;YJaQeIwS{@EfZcgs;wp-L6Z zwzBtG8S=>q-s^Aj5={*k#B>elj;1)^LhrVZYO*=n+iQlVr?#9|*Nt}#9xqbM=a4xMu-wjl|5L57BqGhFOj{z}4ct;YFqoGmO|9JKKD2pfZ%%L+`Ql@=B` ziu+(QpO@;8D#j;R&qrw1hD&6i@HEH~apZrRRaI5F)%b?af9tev-BXH*=eEWjyKcDs zSC)NX^W~k53j7%S^L7wxX*h=KW3bWhkQr43)3VSx5`VuX_9^xAE7)mp^YSXIwcYgc zZ$fFpYX0iguqP^U0yB+shZ0(5X45J2fsBj|6q!qM0XH_beQYp%D*?{Td4h|K6-4_) zVpQA-?8Cn*}a6WmCOVc zuRvx_sK3z-0G3~M-wMZ(DGd37&akk`%9n0N7CDkcFR;5bEB3_ew|&nxPlC>l{+|9C zS6_^`U}nyqH8o{<^QMyR1DMstf5Co)sElsUI;_TwY2ldZLsqh6FO1E zYxvY=*B!{rah$f}gkw2x=1ZHJ5_B<6q13z*4mA(9%Kl>*V;AGdZ)!SyF7s@r=(Z+h zSnNu}ETzUbhj_iR?TUhy7UGA&&}CvyWVUoK)!6E6NL*!M)Zr$6dr1_SeDu2$%FA|1$|%!gli ze3rQ{Q>ovM)c-7K{CM-{ht<=DI)d~Rms06mTx2VXPW53PU7WLeq#GH%UKpAUc9Hrmq9!k|bc6RWc*R&)1FL^`?c)$%=tz9tBRjFk&(Cp!m@*v z?vi*QV;*S!0IPPKOFYuLz zh)GD?y^iA=b(W6!Lzh4L8D@qX8zd#x$1}gr4M9b``Yw_hQqyO z_7#s{+9k$2>Hk$#DWCM;v+r{(FDdCYjL;{WJt}+mj-9>3O@rUJTZh^D)xa&CU8H@J=p5Oz7 z+!*pUYhkTQq@7i};hkaCZ0pS~m(J^M8QrQ}R^8TvR-e3TBgefMUnlRR0dX0!awTPD zdfNz;Akhf>1CvI*q~b5B)FyZBuJIyoR|q2)H@?^K;cy4;5BK*Q z7G}IA~M-m^q#o56gFfs-YEU_u*v_hqt*jVnqR+g>A8(+(XJrWS+a+l z8DNNhUi)fuJ+2@ng^G{>e`mf$hT_lXxj74YqwI0p-dvkvXWgL(GfFd3X4CF{MV;*ZS@0J`- zyd38;Ns@>?2@W2kqnn2Z-_AOYPy=6;C>08FiH!8G$JxGj{v-JF!6Mu(+8rRa0iA;E#R6aW1lIUJ(p?~5SYoz zh}PeYGFjNyzC&5YEQlasr5{4??L>(o>P^JHD^x6*$Do5OZ^JD_?q?eF>rG3t)q&P%xXAJW#4)lL4Ob zH922R4KAa@1|@pYWpccd(B0O3Z1JJv-Kh1k5Dkf zapc|8Z)enL2g^Vg>f-vY1<~FTAS+U)t*WYUL_cVgCbQYKblY delta 48952 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 diff --git a/CycloBranch/parallel/cGraphReaderThread.cpp b/CycloBranch/parallel/cGraphReaderThread.cpp index 88decca..880f770 100644 --- a/CycloBranch/parallel/cGraphReaderThread.cpp +++ b/CycloBranch/parallel/cGraphReaderThread.cpp @@ -289,56 +289,55 @@ void cGraphReaderThread::run() { cEdge e; double unchargedprecursormass = charge(uncharge(parameters->precursormass, parameters->precursorcharge), (parameters->precursorcharge > 0)?1:-1); - switch (parameters->peptidetype) - { - case cyclic: - e = (*graph)[0][0]; - if (getCandidatesIter(e.targetion, candidates, e.targetnode, composition, unchargedprecursormass, 0, 0, 0, -1, perspectivepath, (*graph)[e.targetnode].getMZRatio(), e.summary, terminatecomputation) == -1) { - // terminated - return; - } - break; - case linear: - case branched: - for (int i = 0; i < (*graph)[0].size(); i++) { - e = (*graph)[0][i]; - if (getCandidatesIter(e.targetion, candidates, e.targetnode, composition, unchargedprecursormass, e.startmodifID, 0, 0, -1, perspectivepath, (*graph)[e.targetnode].getMZRatio(), e.summary, terminatecomputation) == -1) { + switch (parameters->peptidetype) { + case cyclic: + e = (*graph)[0][0]; + if (getCandidatesIter(e.targetion, candidates, e.targetnode, composition, unchargedprecursormass, 0, 0, 0, -1, perspectivepath, (*graph)[e.targetnode].getMZRatio(), e.summary, terminatecomputation) == -1) { // terminated return; } - } - break; - case branchcyclic: - for (int i = 0; i < (*graph)[0].size(); i++) { - e = (*graph)[0][i]; - if (getCandidatesIter(e.targetion, candidates, e.targetnode, composition, unchargedprecursormass, e.startmodifID, 0, 0, -1, perspectivepath, (*graph)[e.targetnode].getMZRatio(), e.summary, terminatecomputation) == -1) { - // terminated - return; + break; + case linear: + case branched: + for (int i = 0; i < (*graph)[0].size(); i++) { + e = (*graph)[0][i]; + if (getCandidatesIter(e.targetion, candidates, e.targetnode, composition, unchargedprecursormass, e.startmodifID, 0, 0, -1, perspectivepath, (*graph)[e.targetnode].getMZRatio(), e.summary, terminatecomputation) == -1) { + // terminated + return; + } } - } - break; - case linearpolyketide: - for (int i = 0; i < (*graph)[0].size(); i++) { - e = (*graph)[0][i]; - if (getCandidatesIter(e.targetion, candidates, e.targetnode, composition, unchargedprecursormass, e.startmodifID, 0, 0, -1, perspectivepath, (*graph)[e.targetnode].getMZRatio(), e.summary, terminatecomputation) == -1) { - // terminated - return; + break; + case branchcyclic: + for (int i = 0; i < (*graph)[0].size(); i++) { + e = (*graph)[0][i]; + if (getCandidatesIter(e.targetion, candidates, e.targetnode, composition, unchargedprecursormass, e.startmodifID, 0, 0, -1, perspectivepath, (*graph)[e.targetnode].getMZRatio(), e.summary, terminatecomputation) == -1) { + // terminated + return; + } } - } - break; - case cyclicpolyketide: - for (int i = 0; i < (*graph)[0].size(); i++) { - e = (*graph)[0][i]; - if (getCandidatesIter(e.targetion, candidates, e.targetnode, composition, unchargedprecursormass, 0, 0, 0, -1, perspectivepath, (*graph)[e.targetnode].getMZRatio(), e.summary, terminatecomputation) == -1) { - // terminated - return; + break; + case linearpolyketide: + for (int i = 0; i < (*graph)[0].size(); i++) { + e = (*graph)[0][i]; + if (getCandidatesIter(e.targetion, candidates, e.targetnode, composition, unchargedprecursormass, e.startmodifID, 0, 0, -1, perspectivepath, (*graph)[e.targetnode].getMZRatio(), e.summary, terminatecomputation) == -1) { + // terminated + return; + } } - } - break; - case other: - break; - default: - break; + break; + case cyclicpolyketide: + for (int i = 0; i < (*graph)[0].size(); i++) { + e = (*graph)[0][i]; + if (getCandidatesIter(e.targetion, candidates, e.targetnode, composition, unchargedprecursormass, 0, 0, 0, -1, perspectivepath, (*graph)[e.targetnode].getMZRatio(), e.summary, terminatecomputation) == -1) { + // terminated + return; + } + } + break; + case other: + break; + default: + break; } } diff --git a/CycloBranch/parallel/cSpectrumComparatorThread.cpp b/CycloBranch/parallel/cSpectrumComparatorThread.cpp index a7a8ab2..b6d6a17 100644 --- a/CycloBranch/parallel/cSpectrumComparatorThread.cpp +++ b/CycloBranch/parallel/cSpectrumComparatorThread.cpp @@ -234,6 +234,7 @@ void cSpectrumComparatorThread::run() { theoreticalpeaksrealsize = tsp.compareCyclicPolyketide(peaklist, *bricksdatabasewithcombinations, false, *rxsequencetag, *rxsearchedsequence, unmatchedpeaksinmatchedpatterns, 0); break; case other: + theoreticalpeaksrealsize = tsp.compareOther(peaklist, false, unmatchedpeaksinmatchedpatterns, 0); break; default: break; diff --git a/README.md b/README.md index f7740ee..b8ded95 100644 --- a/README.md +++ b/README.md @@ -1,44 +1,50 @@ # CycloBranch -An open-source, cross-platform and stand-alone tool for mass spectrometry data analysis. +A tool for mass spectrometry data analysis. -## Main features +## About * designed for identification of small molecules - * *de novo* sequencing - * non-ribosomal peptides (NRPs) [1] - * siderophores (including metals) [2] - * supports linear, cyclic, branched, and branch-cyclic structures - * based on custom databases of building blocks - * 19 proteinogenic amino acids (20 including isomers) - * 287 NRP blocks (512 including isomers) - * dereplication / database search + * open-source, cross-platform, and stand-alone + * supported types of spectra * conventional mass spectra (MS) - * liquid-chromatography mass spectra (LC-MS) [2] - * batch-processing + * liquid-chromatography mass spectra (LC-MS) * imaging mass spectra (MSI) - * pixel-by-pixel analysis of imaging mass spectra (imzML) [2] - * fusion of imzML files with optical and histology images [3] * tandem mass spectra (MS/MS) - * single spectra analysis - * supports also a direct comparison of an experimental spectrum with a theoretical one - + * main features + * MS, LC-MC, MSI + * dereplication / database search + * prediction of elemental compositions of unknown compounds + * fine isotopic structure + * MSI + * pixel-by-pixel analysis of imaging mass spectra (imzML) + * fusion of imzML files with optical and histology images + * MS/MS + * single spectra only + * analysis based on custom databases of building blocks (amino acids) + * linear, cyclic, branched, and branch-cyclic non-ribosomal peptides (NRPs) and siderophores + * direct comparison of experimental spectrum with theoretical spectrum + * database search + * *de novo* sequencing + * 19 proteinogenic amino acids (20 including isomers) + * 287 NRP blocks (512 including isomers) + ## Supported file formats * mzML, imzML * profile or centroid spectra - * profile spectra require [OpenMS 2.x](https://sourceforge.net/projects/open-ms/files/OpenMS/OpenMS-2.3/) installed + * profile spectra require [OpenMS 2.x](https://sourceforge.net/projects/open-ms/files/OpenMS/OpenMS-2.4/) installed * mzXML * centroid spectra - * requires [OpenMS 2.x](https://sourceforge.net/projects/open-ms/files/OpenMS/OpenMS-2.3/) installed + * requires [OpenMS 2.x](https://sourceforge.net/projects/open-ms/files/OpenMS/OpenMS-2.4/) installed * baf (Bruker) - * profile spectra + * profile and centroid spectra * requires [CompassXport 3.0](http://www.bruker.com/service/support-upgrades/software-downloads/mass-spectrometry.html) installed * Windows only * raw (Thermo) * profile or centroid spectra - * requires [OpenMS 2.x](https://sourceforge.net/projects/open-ms/files/OpenMS/OpenMS-2.3/) including ProteoWizard installed + * requires [OpenMS 2.x](https://sourceforge.net/projects/open-ms/files/OpenMS/OpenMS-2.4/) including ProteoWizard installed * Windows only * raw (Waters) - * centroid spectra + * profile and centroid spectra * Windows only * mgf (Mascot Generic File format) * centroid spectra @@ -47,10 +53,16 @@ An open-source, cross-platform and stand-alone tool for mass spectrometry data a * tab separated mass-to-charge ratio and intensity on each line; multiple peaklists separated by an empty line ## Homepage -http://ms.biomed.cas.cz/cyclobranch/ +https://ms.biomed.cas.cz/cyclobranch/ -## Publications - * [1] *J. Am. Soc. Mass Spectrom.* (2015), 26(10):1780-1786. DOI: [10.1007/s13361-015-1211-1](https://doi.org/10.1007/s13361-015-1211-1) - * [2] *BBA - Proteins Proteom.* (2017), 1865(7):768-775. DOI: [10.1016/j.bbapap.2016.12.003](https://doi.org/10.1016/j.bbapap.2016.12.003) - * [3] *Sci. Rep.* (2017), 7:16523. DOI: [10.1038/s41598-017-16648-z](https://doi.org/10.1038/s41598-017-16648-z) - * [4] *J. Mass Spectrom.* (2018), 53(11):1097-1103. DOI: [10.1002/jms.4285](https://doi.org/10.1002/jms.4285) +## References and More Information + * *de novo* peptide sequencing of NRPs + * Novak J. et al. CycloBranch: *De Novo* Sequencing of Nonribosomal Peptides from Accurate Product Ion Mass Spectra. *J. Am. Soc. Mass Spectrom.*, 26(10):1780-1786, 2015. DOI: [10.1007/s13361-015-1211-1](https://doi.org/10.1007/s13361-015-1211-1) + * dereplication in LC-MS and MSI datasets; *de novo* sequencing of siderophores + * Novak J. et al. Batch-processing of Imaging or Liquid-chromatography Mass Spectrometry Datasets and *De Novo* Sequencing of Polyketide Siderophores. *BBA - Proteins Proteom.*, 1865(7):768-775, 2017. DOI: [10.1016/j.bbapap.2016.12.003](https://doi.org/10.1016/j.bbapap.2016.12.003) + * fusion of imzML files with histology images + * Luptakova D. et al. Non-invasive and Invasive Diagnoses of Aspergillosis in a Rat Model by Mass Spectrometry. *Sci. Rep.*, 7:16523, 2017. DOI: [10.1038/s41598-017-16648-z](https://doi.org/10.1038/s41598-017-16648-z) + * isotopic fine structure + * Novak J. et al. CycloBranch: An open tool for fine isotope structures in conventional and product ion mass spectra. *J. Mass Spectrom.* 53(11):1097-1103, 2018. DOI: [10.1002/jms.4285](https://doi.org/10.1002/jms.4285) + * configuration of the tool for different use cases + * Pluhacek T. et al. Analysis of Microbial Siderophores by Mass Spectrometry. In Sanjoy K. Bhattacharya (ed.), *Metabolomics: Methods and Protocols*, Methods in Molecular Biology, 1996:131-153, Springer, 2019. DOI: [10.1007/978-1-4939-9488-5_12](https://doi.org/10.1007/978-1-4939-9488-5_12) diff --git a/readme.txt b/readme.txt index 2969cd9..3f335ad 100644 --- a/readme.txt +++ b/readme.txt @@ -1,3 +1,3 @@ CycloBranch.sln -- project for MS Visual Studio 2012 -- requires Qt 5.2.1, boost 1.57 and xerces-c 3.1.1 installed +- project for MS Visual Studio 2017 +- requires Qt 5.13.0, boost 1.71.0 and xerces-c 3.1.1 installed

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%0ArmqcQSqy(R)#tnL-iW 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%0A5?H@2CCB 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 Oyz{r{5o9`J3{ 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

Pattern TypeAbsolute IntensityError [ppm]ScoreFDR