diff --git a/CycloBranch/CycloBranch-Linux.pro b/CycloBranch/CycloBranch-Linux.pro index fc94b1c..688dc44 100644 --- a/CycloBranch/CycloBranch-Linux.pro +++ b/CycloBranch/CycloBranch-Linux.pro @@ -38,6 +38,8 @@ HEADERS += core/cBrick.h \ gui/cBricksDatabaseProxyModel.h \ gui/cBricksDatabaseWidget.h \ gui/cCheckBoxDelegate.h \ + gui/cChromatogramWindow.h \ + gui/cChromatogramWindowWidget.h \ gui/cComboBoxDelegate.h \ gui/cCyclicWidget.h \ gui/cDrawPeptideWidget.h \ @@ -93,6 +95,8 @@ SOURCES += core/cBrick.cpp \ gui/cBricksDatabaseProxyModel.cpp \ gui/cBricksDatabaseWidget.cpp \ gui/cCheckBoxDelegate.cpp \ + gui/cChromatogramWindow.cpp \ + gui/cChromatogramWindowWidget.cpp \ gui/cComboBoxDelegate.cpp \ gui/cCyclicWidget.cpp \ gui/cDrawPeptideWidget.cpp \ diff --git a/CycloBranch/CycloBranch-MacOSX.pro b/CycloBranch/CycloBranch-MacOSX.pro index 64fe6d7..9a4098b 100644 --- a/CycloBranch/CycloBranch-MacOSX.pro +++ b/CycloBranch/CycloBranch-MacOSX.pro @@ -1,134 +1,132 @@ -###################################################################### -# Automatically generated by qmake (3.0) Fri Dec 5 03:02:26 2014 -###################################################################### - -TEMPLATE = app -TARGET = CycloBranch -QT += core gui widgets printsupport svg -INCLUDEPATH += . core gui parallel /usr/local/Cellar/boost/1.57.0/include /usr/local/Cellar/xerces-c/3.1.1/include -QMAKE_CXXFLAGS += -std=c++0x -DMACOSX -m64 -QMAKE_LIBS += -lboost_regex -lxerces-c -QMAKE_LIBDIR = /usr/local/Cellar/boost/1.57.0/lib /usr/local/Cellar/xerces-c/3.1.1/lib -OBJECTS_DIR = build/ -MOC_DIR = moc/ -ICON = images/cb.icns - -# The following variables must be manually fixed in the 'Makefile' generated by qmake. -# The variables QMAKE_CC, QMAKE_CXX and QMAKE_LINK are ignored by qmake. -#CC = /usr/local/Cellar/gcc/4.9.2_1/bin/gcc-4.9 -#CXX = /usr/local/Cellar/gcc/4.9.2_1/bin/g++-4.9 -#LINK = /usr/local/Cellar/gcc/4.9.2_1/bin/g++-4.9 - -# Input -RESOURCES = images.qrc -HEADERS += core/cBrick.h \ - core/cBricksDatabase.h \ - core/cCandidate.h \ - core/cCandidateSet.h \ - core/cDeNovoGraph.h \ - core/cDeNovoGraphNode.h \ - core/cFragmentIons.h \ - core/cImzML.h \ - core/cMzML.h \ - core/cParameters.h \ - core/cPeak.h \ - core/cPeakListSeries.h \ - core/cPeaksList.h \ - core/cSequence.h \ - core/cSequenceDatabase.h \ - core/cSummaryFormula.h \ - core/cTheoreticalSpectrum.h \ - core/cTheoreticalSpectrumList.h \ - core/utilities.h \ - gui/cAboutWidget.h \ - gui/cBranchCyclicWidget.h \ - gui/cBranchedWidget.h \ - gui/cBricksDatabaseProxyModel.h \ - gui/cBricksDatabaseWidget.h \ - gui/cCheckBoxDelegate.h \ - gui/cComboBoxDelegate.h \ - gui/cCyclicWidget.h \ - gui/cDrawPeptideWidget.h \ - gui/cEventFilter.h \ - gui/cExportDialog.h \ - gui/cFindDialog.h \ - gui/cFragmentIonsListWidget.h \ - gui/cGraphWidget.h \ - gui/cHTMLDelegate.h \ - gui/cHTMLExportDialog.h \ - gui/cImageWindow.h \ - gui/cImageWindowWidget.h \ - gui/cLinearWidget.h \ - gui/cMainThread.h \ - gui/cMainWindow.h \ - gui/cMainWindowProxyModel.h \ - gui/cModificationsProxyModel.h \ - gui/cModificationsWidget.h \ - gui/cMultipleButtonDelegate.h \ - gui/cParametersWidget.h \ - gui/cSequenceDatabaseProxyModel.h \ - gui/cSequenceDatabaseWidget.h \ - gui/cSpectrumDetailProxyModel.h \ - gui/cSpectrumDetailWidget.h \ - gui/cSpectrumSceneWidget.h \ - gui/cSummaryPeaksTableProxyModel.h \ - gui/cSummaryPeaksTableWidget.h \ - gui/cViewButtonDelegate.h \ - parallel/cGraphReaderThread.h \ - parallel/cSpectrumComparatorThread.h -SOURCES += core/cBrick.cpp \ - core/cBricksDatabase.cpp \ - core/cCandidate.cpp \ - core/cCandidateSet.cpp \ - core/cDeNovoGraph.cpp \ - core/cDeNovoGraphNode.cpp \ - core/cFragmentIons.cpp \ - core/cImzML.cpp \ - core/cMzML.cpp \ - core/cParameters.cpp \ - core/cPeak.cpp \ - core/cPeakListSeries.cpp \ - core/cPeaksList.cpp \ - core/cSequence.cpp \ - core/cSequenceDatabase.cpp \ - core/cSummaryFormula.cpp \ - core/cTheoreticalSpectrum.cpp \ - core/cTheoreticalSpectrumList.cpp \ - core/utilities.cpp \ - gui/cAboutWidget.cpp \ - gui/cBranchCyclicWidget.cpp \ - gui/cBranchedWidget.cpp \ - gui/cBricksDatabaseProxyModel.cpp \ - gui/cBricksDatabaseWidget.cpp \ - gui/cCheckBoxDelegate.cpp \ - gui/cComboBoxDelegate.cpp \ - gui/cCyclicWidget.cpp \ - gui/cDrawPeptideWidget.cpp \ - gui/cEventFilter.cpp \ - gui/cExportDialog.cpp \ - gui/cFindDialog.cpp \ - gui/cFragmentIonsListWidget.cpp \ - gui/cGraphWidget.cpp \ - gui/cHTMLDelegate.cpp \ - gui/cHTMLExportDialog.cpp \ - gui/cImageWindow.cpp \ - gui/cImageWindowWidget.cpp \ - gui/cLinearWidget.cpp \ - gui/cMainThread.cpp \ - gui/cMainWindow.cpp \ - gui/cMainWindowProxyModel.cpp \ - gui/cModificationsProxyModel.cpp \ - gui/cModificationsWidget.cpp \ - gui/cMultipleButtonDelegate.cpp \ - gui/cParametersWidget.cpp \ - gui/cSequenceDatabaseProxyModel.cpp \ - gui/cSequenceDatabaseWidget.cpp \ - gui/cSpectrumDetailProxyModel.cpp \ - gui/cSpectrumDetailWidget.cpp \ - gui/cSpectrumSceneWidget.cpp \ - gui/cSummaryPeaksTableProxyModel.cpp \ - gui/cSummaryPeaksTableWidget.cpp \ - gui/cViewButtonDelegate.cpp\ - parallel/cGraphReaderThread.cpp \ - parallel/cSpectrumComparatorThread.cpp \ - main.cpp +###################################################################### +# Automatically generated by qmake (3.0) Fri Dec 5 03:02:26 2014 +###################################################################### + +TEMPLATE = app +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++0x -DMACOSX -m64 +QMAKE_LIBS += -lboost_regex -lxerces-c +QMAKE_LIBDIR = /usr/local/opt/boost/lib /usr/local/opt/xerces-c/lib +OBJECTS_DIR = build/ +MOC_DIR = moc/ +ICON = images/cb.icns + +# Input +RESOURCES = images.qrc +HEADERS += core/cBrick.h \ + core/cBricksDatabase.h \ + core/cCandidate.h \ + core/cCandidateSet.h \ + core/cDeNovoGraph.h \ + core/cDeNovoGraphNode.h \ + core/cFragmentIons.h \ + core/cImzML.h \ + core/cMzML.h \ + core/cParameters.h \ + core/cPeak.h \ + core/cPeakListSeries.h \ + core/cPeaksList.h \ + core/cSequence.h \ + core/cSequenceDatabase.h \ + core/cSummaryFormula.h \ + core/cTheoreticalSpectrum.h \ + core/cTheoreticalSpectrumList.h \ + core/utilities.h \ + gui/cAboutWidget.h \ + gui/cBranchCyclicWidget.h \ + gui/cBranchedWidget.h \ + gui/cBricksDatabaseProxyModel.h \ + gui/cBricksDatabaseWidget.h \ + gui/cCheckBoxDelegate.h \ + gui/cChromatogramWindow.h \ + gui/cChromatogramWindowWidget.h \ + gui/cComboBoxDelegate.h \ + gui/cCyclicWidget.h \ + gui/cDrawPeptideWidget.h \ + gui/cEventFilter.h \ + gui/cExportDialog.h \ + gui/cFindDialog.h \ + gui/cFragmentIonsListWidget.h \ + gui/cGraphWidget.h \ + gui/cHTMLDelegate.h \ + gui/cHTMLExportDialog.h \ + gui/cImageWindow.h \ + gui/cImageWindowWidget.h \ + gui/cLinearWidget.h \ + gui/cMainThread.h \ + gui/cMainWindow.h \ + gui/cMainWindowProxyModel.h \ + gui/cModificationsProxyModel.h \ + gui/cModificationsWidget.h \ + gui/cMultipleButtonDelegate.h \ + gui/cParametersWidget.h \ + gui/cSequenceDatabaseProxyModel.h \ + gui/cSequenceDatabaseWidget.h \ + gui/cSpectrumDetailProxyModel.h \ + gui/cSpectrumDetailWidget.h \ + gui/cSpectrumSceneWidget.h \ + gui/cSummaryPeaksTableProxyModel.h \ + gui/cSummaryPeaksTableWidget.h \ + gui/cViewButtonDelegate.h \ + parallel/cGraphReaderThread.h \ + parallel/cSpectrumComparatorThread.h +SOURCES += core/cBrick.cpp \ + core/cBricksDatabase.cpp \ + core/cCandidate.cpp \ + core/cCandidateSet.cpp \ + core/cDeNovoGraph.cpp \ + core/cDeNovoGraphNode.cpp \ + core/cFragmentIons.cpp \ + core/cImzML.cpp \ + core/cMzML.cpp \ + core/cParameters.cpp \ + core/cPeak.cpp \ + core/cPeakListSeries.cpp \ + core/cPeaksList.cpp \ + core/cSequence.cpp \ + core/cSequenceDatabase.cpp \ + core/cSummaryFormula.cpp \ + core/cTheoreticalSpectrum.cpp \ + core/cTheoreticalSpectrumList.cpp \ + core/utilities.cpp \ + gui/cAboutWidget.cpp \ + gui/cBranchCyclicWidget.cpp \ + gui/cBranchedWidget.cpp \ + gui/cBricksDatabaseProxyModel.cpp \ + gui/cBricksDatabaseWidget.cpp \ + gui/cCheckBoxDelegate.cpp \ + gui/cChromatogramWindow.cpp \ + gui/cChromatogramWindowWidget.cpp \ + gui/cComboBoxDelegate.cpp \ + gui/cCyclicWidget.cpp \ + gui/cDrawPeptideWidget.cpp \ + gui/cEventFilter.cpp \ + gui/cExportDialog.cpp \ + gui/cFindDialog.cpp \ + gui/cFragmentIonsListWidget.cpp \ + gui/cGraphWidget.cpp \ + gui/cHTMLDelegate.cpp \ + gui/cHTMLExportDialog.cpp \ + gui/cImageWindow.cpp \ + gui/cImageWindowWidget.cpp \ + gui/cLinearWidget.cpp \ + gui/cMainThread.cpp \ + gui/cMainWindow.cpp \ + gui/cMainWindowProxyModel.cpp \ + gui/cModificationsProxyModel.cpp \ + gui/cModificationsWidget.cpp \ + gui/cMultipleButtonDelegate.cpp \ + gui/cParametersWidget.cpp \ + gui/cSequenceDatabaseProxyModel.cpp \ + gui/cSequenceDatabaseWidget.cpp \ + gui/cSpectrumDetailProxyModel.cpp \ + gui/cSpectrumDetailWidget.cpp \ + gui/cSpectrumSceneWidget.cpp \ + gui/cSummaryPeaksTableProxyModel.cpp \ + gui/cSummaryPeaksTableWidget.cpp \ + gui/cViewButtonDelegate.cpp\ + parallel/cGraphReaderThread.cpp \ + parallel/cSpectrumComparatorThread.cpp \ + main.cpp diff --git a/CycloBranch/CycloBranch.vcxproj b/CycloBranch/CycloBranch.vcxproj index d2ff90b..2284b2c 100644 --- a/CycloBranch/CycloBranch.vcxproj +++ b/CycloBranch/CycloBranch.vcxproj @@ -190,6 +190,14 @@ true true + + true + true + + + true + true + true true @@ -344,6 +352,14 @@ true true + + true + true + + + true + true + true true @@ -470,6 +486,8 @@ + + @@ -520,6 +538,42 @@ + + $(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) + 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) + 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) + 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) + 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) + 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) + 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) + 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) Moc%27ing cHTMLDelegate.h... diff --git a/CycloBranch/CycloBranch.vcxproj.filters b/CycloBranch/CycloBranch.vcxproj.filters index 67dc4ed..1a2084b 100644 --- a/CycloBranch/CycloBranch.vcxproj.filters +++ b/CycloBranch/CycloBranch.vcxproj.filters @@ -434,6 +434,24 @@ Generated Files\Release + + Generated Files\Debug + + + Generated Files\Release + + + Generated Files\Debug + + + Generated Files\Release + + + Source Files\gui + + + Source Files\gui + @@ -553,6 +571,12 @@ Header Files\gui + + Header Files\gui + + + Header Files\gui + diff --git a/CycloBranch/core/cBrick.cpp b/CycloBranch/core/cBrick.cpp index 936429e..21c21ed 100644 --- a/CycloBranch/core/cBrick.cpp +++ b/CycloBranch/core/cBrick.cpp @@ -16,27 +16,6 @@ int getNumberOfBricks(const string& composition) { } -string stripHTML(string& htmlstring) { - string s; - bool add = true; - - for (int i = 0; i < (int)htmlstring.size(); i++) { - if (htmlstring[i] == '<') { - add = false; - continue; - } - if (htmlstring[i] == '>') { - add = true; - continue; - } - if (add) { - s += htmlstring[i]; - } - } - return s; -} - - cBrick::cBrick() { clear(); } diff --git a/CycloBranch/core/cBrick.h b/CycloBranch/core/cBrick.h index 1cb8ddc..3eb7f0b 100644 --- a/CycloBranch/core/cBrick.h +++ b/CycloBranch/core/cBrick.h @@ -34,14 +34,6 @@ enum eResidueLossType { int getNumberOfBricks(const string& composition); -/** - \brief Strip HTML tags from a HTML string. - \param htmlstring reference to a string with HTML tags - \retval string stripped string -*/ -string stripHTML(string& htmlstring); - - /** \brief The class representing a building block (brick). */ diff --git a/CycloBranch/core/cFragmentIons.cpp b/CycloBranch/core/cFragmentIons.cpp index 8477487..b2401af 100644 --- a/CycloBranch/core/cFragmentIons.cpp +++ b/CycloBranch/core/cFragmentIons.cpp @@ -1783,45 +1783,65 @@ void cFragmentIons::recalculateFragments(bool cyclicnterminus, bool cyclicctermi fragmentions[cyclic_precursor_ion_co_loss_and_dehydrated_and_deamidated].massdifference = PRECURSOR_ION_CYCLIC - CO - H2O - NH3 + adductshift; fragmentions[cyclic_precursor_ion_co_loss_and_dehydrated_and_deamidated].parent = cyclic_precursor_ion_co_loss; - // initialize ion H+ - fragmentions[ms_hplus].nterminal = true; - fragmentions[ms_hplus].cterminal = true; - fragmentions[ms_hplus].name = "[M+H]+"; - fragmentions[ms_hplus].massdifference = H - e; - fragmentions[ms_hplus].parent = ms_hplus; - fragmentions[ms_hplus].positive = true; - fragmentions[ms_hplus].multiplier = 1; - fragmentions[ms_hplus].summary = "H+"; - - // initialize ion Na+ - fragmentions[ms_naplus].nterminal = true; - fragmentions[ms_naplus].cterminal = true; - fragmentions[ms_naplus].name = "[M+Na]+"; - fragmentions[ms_naplus].massdifference = Na - e; - fragmentions[ms_naplus].parent = ms_naplus; - fragmentions[ms_naplus].positive = true; - fragmentions[ms_naplus].multiplier = 1; - fragmentions[ms_naplus].summary = "Na+"; - - // initialize ion K+ - fragmentions[ms_kplus].nterminal = true; - fragmentions[ms_kplus].cterminal = true; - fragmentions[ms_kplus].name = "[M+K]+"; - fragmentions[ms_kplus].massdifference = K - e; - fragmentions[ms_kplus].parent = ms_kplus; - fragmentions[ms_kplus].positive = true; - fragmentions[ms_kplus].multiplier = 1; - fragmentions[ms_kplus].summary = "K+"; - - // initialize ion H- - fragmentions[ms_hminus].nterminal = true; - fragmentions[ms_hminus].cterminal = true; - fragmentions[ms_hminus].name = "[M-H]-"; - fragmentions[ms_hminus].massdifference = -H + e; - fragmentions[ms_hminus].parent = ms_hminus; - fragmentions[ms_hminus].positive = false; - fragmentions[ms_hminus].multiplier = 1; - fragmentions[ms_hminus].summary = "H-1+-1"; + // initialize ion [M+H]+ + fragmentions[ms_Hplus].nterminal = true; + fragmentions[ms_Hplus].cterminal = true; + fragmentions[ms_Hplus].name = "[M+H]+"; + fragmentions[ms_Hplus].massdifference = H - e; + fragmentions[ms_Hplus].parent = ms_Hplus; + fragmentions[ms_Hplus].positive = true; + fragmentions[ms_Hplus].multiplier = 1; + fragmentions[ms_Hplus].summary = "H+"; + + // initialize ion [M+Na]+ + fragmentions[ms_Naplus].nterminal = true; + fragmentions[ms_Naplus].cterminal = true; + fragmentions[ms_Naplus].name = "[M+Na]+"; + fragmentions[ms_Naplus].massdifference = Na - e; + fragmentions[ms_Naplus].parent = ms_Naplus; + fragmentions[ms_Naplus].positive = true; + fragmentions[ms_Naplus].multiplier = 1; + fragmentions[ms_Naplus].summary = "Na+"; + + // initialize ion [M+K]+ + fragmentions[ms_Kplus].nterminal = true; + fragmentions[ms_Kplus].cterminal = true; + fragmentions[ms_Kplus].name = "[M+K]+"; + fragmentions[ms_Kplus].massdifference = K - e; + fragmentions[ms_Kplus].parent = ms_Kplus; + fragmentions[ms_Kplus].positive = true; + fragmentions[ms_Kplus].multiplier = 1; + fragmentions[ms_Kplus].summary = "K+"; + + // initialize ion [M-H]- + fragmentions[ms_Hminus].nterminal = true; + fragmentions[ms_Hminus].cterminal = true; + fragmentions[ms_Hminus].name = "[M-H]-"; + fragmentions[ms_Hminus].massdifference = -H + e; + fragmentions[ms_Hminus].parent = ms_Hminus; + fragmentions[ms_Hminus].positive = false; + fragmentions[ms_Hminus].multiplier = 1; + fragmentions[ms_Hminus].summary = "H-1+-1"; + + // initialize ion [M+Na-2H]- + fragmentions[ms_Naminus].nterminal = true; + fragmentions[ms_Naminus].cterminal = true; + fragmentions[ms_Naminus].name = "[M+Na-2H]-"; + fragmentions[ms_Naminus].massdifference = Na - 2*H + e; + fragmentions[ms_Naminus].parent = ms_Naminus; + fragmentions[ms_Naminus].positive = false; + fragmentions[ms_Naminus].multiplier = 1; + fragmentions[ms_Naminus].summary = "NaH-2+-1"; + + // initialize ion [M+K-2H]- + fragmentions[ms_Kminus].nterminal = true; + fragmentions[ms_Kminus].cterminal = true; + fragmentions[ms_Kminus].name = "[M+K-2H]-"; + fragmentions[ms_Kminus].massdifference = K - 2*H + e; + fragmentions[ms_Kminus].parent = ms_Kminus; + fragmentions[ms_Kminus].positive = false; + fragmentions[ms_Kminus].multiplier = 1; + fragmentions[ms_Kminus].summary = "KH-2+-1"; // initialize ion [M+Fe-2H]+ fragmentions[ms_MFe2H].nterminal = true; @@ -2433,6 +2453,16 @@ void cFragmentIons::recalculateFragments(bool cyclicnterminus, bool cyclicctermi fragmentions[ms_MGa4H].multiplier = 1; fragmentions[ms_MGa4H].summary = "GaH-3H-1+-1"; + // initialize ion [M+NH4]+ + fragmentions[ms_NH4plus].nterminal = true; + fragmentions[ms_NH4plus].cterminal = true; + fragmentions[ms_NH4plus].name = "[M+NH4]+"; + fragmentions[ms_NH4plus].massdifference = H + NH3 - e; + fragmentions[ms_NH4plus].parent = ms_NH4plus; + fragmentions[ms_NH4plus].positive = true; + fragmentions[ms_NH4plus].multiplier = 1; + fragmentions[ms_NH4plus].summary = "NH4+"; + // initialize l0h ion fragmentions[l0h_ion].nterminal = true; fragmentions[l0h_ion].cterminal = false; diff --git a/CycloBranch/core/cFragmentIons.h b/CycloBranch/core/cFragmentIons.h index 3eff7c8..336bb2d 100644 --- a/CycloBranch/core/cFragmentIons.h +++ b/CycloBranch/core/cFragmentIons.h @@ -982,10 +982,12 @@ enum eFragmentIonType { cyclic_precursor_ion_co_loss_and_dehydrated, cyclic_precursor_ion_co_loss_and_deamidated, cyclic_precursor_ion_co_loss_and_dehydrated_and_deamidated, - ms_hplus, - ms_naplus, - ms_kplus, - ms_hminus, + ms_Hplus, + ms_Naplus, + ms_Kplus, + ms_Hminus, + ms_Naminus, + ms_Kminus, ms_MFe2H, ms_MFe3HNa, ms_MFe3HK, @@ -1047,6 +1049,7 @@ enum eFragmentIonType { ms_MGa3HNa, ms_MGa3HK, ms_MGa4H, + ms_NH4plus, l0h_ion, l0h_ion_dehydrated, l0h_ion_deamidated, diff --git a/CycloBranch/core/cImzML.cpp b/CycloBranch/core/cImzML.cpp index ba4edf8..2ee647d 100644 --- a/CycloBranch/core/cImzML.cpp +++ b/CycloBranch/core/cImzML.cpp @@ -6,7 +6,8 @@ cImzML::cImzML() { profilespectra = false; - use_64bit_precision = false; + use_64bit_float_mz_precision = false; + use_64bit_float_intensity_precision = false; imzmlitems.clear(); @@ -20,7 +21,7 @@ cImzML::~cImzML() { } -int cImzML::parse(string& filename, int& maxcountx, int& maxcounty, eVendorType& vendor) { +int cImzML::parse(string& filename, int& defaultmaxx, int& defaultmaxy, int& pixelsize, eVendorType& vendor) { parser->parse(filename.c_str()); document = parser->getDocument(); @@ -31,9 +32,11 @@ int cImzML::parse(string& filename, int& maxcountx, int& maxcounty, eVendorType& } profilespectra = false; - use_64bit_precision = false; - maxcountx = 1; - maxcounty = 1; + use_64bit_float_mz_precision = false; + use_64bit_float_intensity_precision = false; + defaultmaxx = 1; + defaultmaxy = 1; + pixelsize = 1; vendor = unknownvendor; // childrens of mzML @@ -130,7 +133,44 @@ int cImzML::parse(string& filename, int& maxcountx, int& maxcounty, eVendorType& // 64-bit float if (accession.compare("MS:1000523") == 0) { - use_64bit_precision = true; + use_64bit_float_mz_precision = true; + } + + // zlib compression detected + if (accession.compare("MS:1000574") == 0) { + return 1; + } + + } + + } + + + currentNode3 = currentNode3->getNextSibling(); + + } + + + } + + if ((id.compare("intensities") == 0) || (id.compare("intensityArray") == 0)) { + + + // childrens of referenceableParamGroup + DOMNode* currentNode3 = currentNode2->getFirstChild(); + while (currentNode3) { + + + if (currentNode3->getNodeType() == DOMNode::ELEMENT_NODE) { + + DOMElement* currentElement3 = dynamic_cast(currentNode3); + if (compareElementTagName(currentElement3, "cvParam")) { + + string accession = getAttribute(currentElement3, "accession"); + + // 64-bit float + if (accession.compare("MS:1000523") == 0) { + use_64bit_float_intensity_precision = true; } // zlib compression detected @@ -284,12 +324,17 @@ int cImzML::parse(string& filename, int& maxcountx, int& maxcounty, eVendorType& // max count of pixel x if (accession.compare("IMS:1000042") == 0) { - maxcountx = stoi(value); + defaultmaxx = stoi(value); } // max count of pixel y if (accession.compare("IMS:1000043") == 0) { - maxcounty = stoi(value); + defaultmaxy = stoi(value); + } + + // pixel size + if (accession.compare("IMS:1000046") == 0) { + pixelsize = stoi(value); } } @@ -446,7 +491,7 @@ int cImzML::parse(string& filename, int& maxcountx, int& maxcounty, eVendorType& mzarray = true; } - if ((ref.compare("intensities") == 0) || (ref.compare("intensityArray") == 0)){ + if ((ref.compare("intensities") == 0) || (ref.compare("intensityArray") == 0)) { intensityarray = true; } @@ -556,9 +601,14 @@ void cImzML::updateRawDataToPeakList(vector& peaklists, string& conv unsigned long long offset = 16; int currentid = 0; - int size = 4; - if (use_64bit_precision) { - size = 8; + int mz_size = 4; + if (use_64bit_float_mz_precision) { + mz_size = 8; + } + + int intensity_size = 4; + if (use_64bit_float_intensity_precision) { + intensity_size = 8; } // childrens of mzML @@ -804,7 +854,7 @@ void cImzML::updateRawDataToPeakList(vector& peaklists, string& conv // external encoded length if (accession.compare("IMS:1000104") == 0) { stringstream ss; - ss << peaklists[currentid].size() * size; + ss << peaklists[currentid].size() * mz_size; setAttribute(currentElement6, "value", ss.str().c_str()); } @@ -820,14 +870,14 @@ void cImzML::updateRawDataToPeakList(vector& peaklists, string& conv // external offset if (accession.compare("IMS:1000102") == 0) { stringstream ss; - ss << offset + peaklists[currentid].size() * size; + ss << offset + peaklists[currentid].size() * mz_size; setAttribute(currentElement6, "value", ss.str().c_str()); } // external encoded length if (accession.compare("IMS:1000104") == 0) { stringstream ss; - ss << peaklists[currentid].size() * size; + ss << peaklists[currentid].size() * intensity_size; setAttribute(currentElement6, "value", ss.str().c_str()); } @@ -870,7 +920,7 @@ void cImzML::updateRawDataToPeakList(vector& peaklists, string& conv } - offset += peaklists[currentid].size() * size * 2; + offset += peaklists[currentid].size() * (mz_size + intensity_size); currentid++; @@ -917,8 +967,13 @@ bool cImzML::hasProfileSpectra() { } -bool cImzML::use64BitPrecision() { - return use_64bit_precision; +bool cImzML::use64BitMzPrecision() { + return use_64bit_float_mz_precision; +} + + +bool cImzML::use64BitIntensityPrecision() { + return use_64bit_float_intensity_precision; } diff --git a/CycloBranch/core/cImzML.h b/CycloBranch/core/cImzML.h index bac391a..768f9fb 100644 --- a/CycloBranch/core/cImzML.h +++ b/CycloBranch/core/cImzML.h @@ -98,7 +98,8 @@ class cImzML { DOMDocument* document; bool profilespectra; - bool use_64bit_precision; + bool use_64bit_float_mz_precision; + bool use_64bit_float_intensity_precision; vector imzmlitems; public: @@ -119,12 +120,13 @@ class cImzML { /** \brief Parse an imzml file. \param filename imzml filename - \param maxcountx max count of pixel x - parsed from imzML file - \param maxcounty max count of pixel y - parsed from imzML file + \param defaultmaxx max count of pixel x - parsed from imzML file + \param defaultmaxy max count of pixel y - parsed from imzML file + \param pixelsize pixel size \param vendor vendor type \retval 0 = success; 1 = failed (zlib compression detected) */ - int parse(string& filename, int& maxcountx, int& maxcounty, eVendorType& vendor); + int parse(string& filename, int& defaultmaxx, int& defaultmaxy, int& pixelsize, eVendorType& vendor); /** @@ -150,10 +152,17 @@ class cImzML { /** - \brief Check the precision of data. + \brief Check the precision of mz values. \retval bool if true, 64bit precision is used; if false, 32bit precision is used */ - bool use64BitPrecision(); + bool use64BitMzPrecision(); + + + /** + \brief Check the precision of intensity values. + \retval bool if true, 64bit precision is used; if false, 32bit precision is used + */ + bool use64BitIntensityPrecision(); /** diff --git a/CycloBranch/core/cParameters.cpp b/CycloBranch/core/cParameters.cpp index c81cc37..0831f17 100644 --- a/CycloBranch/core/cParameters.cpp +++ b/CycloBranch/core/cParameters.cpp @@ -25,6 +25,7 @@ void cParameters::clear() { fragmentmasserrortolerance = 5; masserrortolerancefordeisotoping = 0; minimumrelativeintensitythreshold = 1; + minimumabsoluteintensitythreshold = 0; minimummz = 150; fwhm = 0.05; bricksdatabasefilename = ""; @@ -34,14 +35,14 @@ void cParameters::clear() { maximumbricksincombinationend = 1; maximumbricksincombination = max(max(maximumbricksincombinationbegin, maximumbricksincombinationmiddle), maximumbricksincombinationend); maximumcumulativemass = 0; - generatebrickspermutations = true; modificationsfilename = ""; searchedmodifications.clear(); maximumnumberofthreads = 1; mode = denovoengine; scoretype = matched_peaks; clearhitswithoutparent = false; - generateisotopepattern = false; + generateisotopepattern = true; + minimumpatternsize = 1; cyclicnterminus = false; cycliccterminus = false; enablescrambling = false; @@ -66,8 +67,9 @@ void cParameters::clear() { peakidtodesc.clear(); peakdesctoid.clear(); - maxcountx = 1; - maxcounty = 1; + defaultmaxx = 1; + defaultmaxy = 1; + pixelsize = 1; vendor = unknownvendor; } @@ -125,6 +127,12 @@ int cParameters::checkAndPrepare(bool& terminatecomputation) { peaklistfileformat = baf; } + rx = "\\.[dD][aA][tT]$"; + // dat file in Waters raw directory + if (regex_search(peaklistfilename, rx)) { + peaklistfileformat = dat; + } + rx = "\\.[mM][iI][sS]$"; // flexImaging File if (regex_search(peaklistfilename, rx)) { @@ -225,6 +233,27 @@ int cParameters::checkAndPrepare(bool& terminatecomputation) { } #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 << "ok" << endl << endl; + string mgfname = foldername.substr(0, foldername.rfind('.')) + ".mgf"; + peakliststream.open(mgfname); + *os << mgfname << endl; + } + #endif + break; case mis: #if OS_TYPE == WIN foldername = peaklistfilename.substr(0, peaklistfilename.rfind('.')); @@ -287,11 +316,15 @@ int cParameters::checkAndPrepare(bool& terminatecomputation) { if (!error) { if (!peakliststream.good()) { error = true; - if ((peaklistfileformat == mis) || (peaklistfileformat == ser)) { + if ((peaklistfileformat == mis) || (peaklistfileformat == ser) || (peaklistfileformat == dat)) { errormessage = "Cannot open the folder '" + foldername + "'."; } else { errormessage = "Cannot open the file '" + peaklistfilename + "'."; + if (peaklistfileformat == baf) { + errormessage += "\n\nDo you have Bruker Daltonik's CompassXport installed ?\n"; + errormessage += "Do you have path to the CompassXport.exe in your PATH variable ?\n"; + } } } else { @@ -311,6 +344,11 @@ int cParameters::checkAndPrepare(bool& terminatecomputation) { peaklistseries.loadFromBAFStream(peakliststream); #endif break; + case dat: + #if OS_TYPE == WIN + peaklistseries.loadFromMGFStream(peakliststream); + #endif + break; case mis: #if OS_TYPE == WIN peaklistseries.loadFromBAFStream(peakliststream); @@ -380,7 +418,7 @@ int cParameters::checkAndPrepare(bool& terminatecomputation) { } break; case imzML: - errtype = peaklistseries.loadFromIMZMLStream(peaklistfilename, peakliststream, fwhm, maxcountx, maxcounty, vendor, os, terminatecomputation); + errtype = peaklistseries.loadFromIMZMLStream(peaklistfilename, peakliststream, fwhm, defaultmaxx, defaultmaxy, pixelsize, vendor, os, terminatecomputation); if (errtype == -1) { error = true; errormessage = "Aborted by user.\n"; @@ -665,16 +703,13 @@ string cParameters::printToString() { s += "m/z Error Tolerance: " + to_string(fragmentmasserrortolerance) + "\n"; s += "m/z Error Tolerance for Deisotoping: " + to_string(masserrortolerancefordeisotoping) + "\n"; 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 += "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"; s += "Maximum Cumulative Mass of Blocks: " + to_string(maximumcumulativemass) + "\n"; - s += "Generate Permutations of Combined Blocks: "; - s += generatebrickspermutations ? "on" : "off"; - s += "\n"; - s += "N-/C-terminal Modifications File: " + modificationsfilename + "\n"; s += "Incomplete Paths in De Novo Graph: "; @@ -787,6 +822,8 @@ string cParameters::printToString() { s += "Generate Full Isotope Patterns: "; s += generateisotopepattern ? "on" : "off"; s += "\n"; + + s += "Minimum Pattern Size: " + to_string(minimumpatternsize) + "\n"; s += "Searched Sequence: " + originalsearchedsequence + "\n"; s += "N-terminal Modification: " + searchedsequenceNtermmodif + "\n"; @@ -837,6 +874,7 @@ void cParameters::store(ofstream& os) { os.write((char *)&fragmentmasserrortolerance, sizeof(double)); os.write((char *)&masserrortolerancefordeisotoping, sizeof(double)); os.write((char *)&minimumrelativeintensitythreshold, sizeof(double)); + os.write((char *)&minimumabsoluteintensitythreshold, sizeof(unsigned)); os.write((char *)&minimummz, sizeof(double)); os.write((char *)&fwhm, sizeof(double)); @@ -848,7 +886,6 @@ void cParameters::store(ofstream& os) { os.write((char *)&maximumbricksincombinationend, sizeof(int)); os.write((char *)&maximumbricksincombination, sizeof(int)); os.write((char *)&maximumcumulativemass, sizeof(double)); - os.write((char *)&generatebrickspermutations, sizeof(bool)); storeString(modificationsfilename, os); size = (int)searchedmodifications.size(); @@ -862,6 +899,7 @@ void cParameters::store(ofstream& os) { os.write((char *)&scoretype, sizeof(eScoreType)); os.write((char *)&clearhitswithoutparent, sizeof(bool)); os.write((char *)&generateisotopepattern, sizeof(bool)); + os.write((char *)&minimumpatternsize, sizeof(int)); os.write((char *)&cyclicnterminus, sizeof(bool)); os.write((char *)&cycliccterminus, sizeof(bool)); os.write((char *)&enablescrambling, sizeof(bool)); @@ -910,8 +948,9 @@ void cParameters::store(ofstream& os) { os.write((char *)&it->second, sizeof(int)); } - os.write((char *)&maxcountx, sizeof(int)); - os.write((char *)&maxcounty, sizeof(int)); + os.write((char *)&defaultmaxx, sizeof(int)); + os.write((char *)&defaultmaxy, sizeof(int)); + os.write((char *)&pixelsize, sizeof(int)); os.write((char *)&vendor, sizeof(eVendorType)); } @@ -941,6 +980,7 @@ void cParameters::load(ifstream& is) { is.read((char *)&fragmentmasserrortolerance, sizeof(double)); is.read((char *)&masserrortolerancefordeisotoping, sizeof(double)); is.read((char *)&minimumrelativeintensitythreshold, sizeof(double)); + is.read((char *)&minimumabsoluteintensitythreshold, sizeof(unsigned)); is.read((char *)&minimummz, sizeof(double)); is.read((char *)&fwhm, sizeof(double)); @@ -952,7 +992,6 @@ void cParameters::load(ifstream& is) { is.read((char *)&maximumbricksincombinationend, sizeof(int)); is.read((char *)&maximumbricksincombination, sizeof(int)); is.read((char *)&maximumcumulativemass, sizeof(double)); - is.read((char *)&generatebrickspermutations, sizeof(bool)); loadString(modificationsfilename, is); is.read((char *)&size, sizeof(int)); @@ -966,6 +1005,7 @@ void cParameters::load(ifstream& is) { is.read((char *)&scoretype, sizeof(eScoreType)); is.read((char *)&clearhitswithoutparent, sizeof(bool)); is.read((char *)&generateisotopepattern, sizeof(bool)); + is.read((char *)&minimumpatternsize, sizeof(int)); is.read((char *)&cyclicnterminus, sizeof(bool)); is.read((char *)&cycliccterminus, sizeof(bool)); is.read((char *)&enablescrambling, sizeof(bool)); @@ -1015,8 +1055,9 @@ void cParameters::load(ifstream& is) { peakdesctoid[s] = value; } - is.read((char *)&maxcountx, sizeof(int)); - is.read((char *)&maxcounty, sizeof(int)); + is.read((char *)&defaultmaxx, sizeof(int)); + is.read((char *)&defaultmaxy, sizeof(int)); + is.read((char *)&pixelsize, sizeof(int)); is.read((char *)&vendor, sizeof(eVendorType)); } diff --git a/CycloBranch/core/cParameters.h b/CycloBranch/core/cParameters.h index 6e1e71b..0f444d1 100644 --- a/CycloBranch/core/cParameters.h +++ b/CycloBranch/core/cParameters.h @@ -27,13 +27,14 @@ using namespace boost; */ enum ePeakListFileFormat { txt = 0, - mgf = 1, - mzML = 2, - mzXML = 3, - baf = 4, - imzML = 5, - mis = 6, - ser = 7 + mgf, + mzML, + mzXML, + baf, + dat, + imzML, + mis, + ser }; @@ -127,8 +128,14 @@ class cParameters { /** \brief Minimum relative intensity threshold. - */ - double minimumrelativeintensitythreshold; + */ + double minimumrelativeintensitythreshold; + + + /** + \brief Minimum absolute intensity threshold. + */ + unsigned minimumabsoluteintensitythreshold; /** @@ -185,12 +192,6 @@ class cParameters { double maximumcumulativemass; - /** - \brief True when permutations of bricks are generated. - */ - bool generatebrickspermutations; - - /** \brief A file with modifications. */ @@ -223,8 +224,14 @@ class cParameters { /** \brief True when complete isotope pattern is generated. - */ - bool generateisotopepattern; + */ + bool generateisotopepattern; + + + /** + \brief The minimum number of peaks in a matched pattern. + */ + int minimumpatternsize; /** @@ -362,13 +369,19 @@ class cParameters { /** \brief Max count of pixel x - parsed from imzML file. */ - int maxcountx; + int defaultmaxx; /** \brief Max count of pixel y - parsed from imzML file. */ - int maxcounty; + int defaultmaxy; + + + /** + \brief Pixel size. + */ + int pixelsize; /** diff --git a/CycloBranch/core/cPeak.cpp b/CycloBranch/core/cPeak.cpp index cb730f2..8e6f574 100644 --- a/CycloBranch/core/cPeak.cpp +++ b/CycloBranch/core/cPeak.cpp @@ -23,6 +23,8 @@ void cPeak::clear() { isotope = false; removeme = false; scrambled = false; + decoy = false; + orderid = -1; rotationid = -1; seriesid = -1; @@ -56,6 +58,8 @@ void cPeak::store(ofstream& os) { os.write((char *)&isotope, sizeof(bool)); os.write((char *)&removeme, sizeof(bool)); os.write((char *)&scrambled, sizeof(bool)); + os.write((char *)&decoy, sizeof(bool)); + os.write((char *)&orderid, sizeof(int)); } @@ -79,5 +83,7 @@ void cPeak::load(ifstream& is) { is.read((char *)&isotope, sizeof(bool)); is.read((char *)&removeme, sizeof(bool)); is.read((char *)&scrambled, sizeof(bool)); + is.read((char *)&decoy, sizeof(bool)); + is.read((char *)&orderid, sizeof(int)); } diff --git a/CycloBranch/core/cPeak.h b/CycloBranch/core/cPeak.h index 411a9e6..9105eb1 100644 --- a/CycloBranch/core/cPeak.h +++ b/CycloBranch/core/cPeak.h @@ -132,23 +132,35 @@ struct cPeak { /** - \brief True when the peak is an isotope peak. + \brief True if the peak is an isotope peak. */ bool isotope; /** - \brief True when the peak should be removed. + \brief True if the peak should be removed. */ bool removeme; /** - \brief True when the peak corresponds to a scrambled fragment ion. - */ + \brief True if the peak corresponds to a scrambled fragment ion. + */ bool scrambled; + /** + \brief True if the peak corresponds to a decoy compound. + */ + bool decoy; + + + /** + \brief An order id of a peak in a peaklist. + */ + int orderid; + + /** \brief The constructor. */ diff --git a/CycloBranch/core/cPeakListSeries.cpp b/CycloBranch/core/cPeakListSeries.cpp index 3c286a3..8f9e45e 100644 --- a/CycloBranch/core/cPeakListSeries.cpp +++ b/CycloBranch/core/cPeakListSeries.cpp @@ -248,11 +248,11 @@ int cPeakListSeries::loadFromMZMLStream(string& mzmlfilename, ifstream &mzmlstre } -int cPeakListSeries::loadFromIMZMLStream(string& imzmlfilename, ifstream &ibdstream, double fwhm, int& maxcountx, int& maxcounty, eVendorType& vendor, cMainThread* os, bool& terminatecomputation) { +int cPeakListSeries::loadFromIMZMLStream(string& imzmlfilename, ifstream &ibdstream, double fwhm, int& defaultmaxx, int& defaultmaxy, int& pixelsize, eVendorType& vendor, cMainThread* os, bool& terminatecomputation) { *os << "Loading the imzML file... "; cImzML imzml; - if (imzml.parse(imzmlfilename, maxcountx, maxcounty, vendor)) { + if (imzml.parse(imzmlfilename, defaultmaxx, defaultmaxy, pixelsize, vendor)) { return -3; } @@ -270,7 +270,8 @@ int cPeakListSeries::loadFromIMZMLStream(string& imzmlfilename, ifstream &ibdstr int strip; bool rawdata = imzml.hasProfileSpectra(); - bool use_64bit_precision = imzml.use64BitPrecision(); + bool use_64bit_float_mz_precision = imzml.use64BitMzPrecision(); + bool use_64bit_float_intensity_precision = imzml.use64BitIntensityPrecision(); if (rawdata) { mgfname = imzmlfilename.substr(0, (int)imzmlfilename.size() - 5); @@ -299,7 +300,7 @@ int cPeakListSeries::loadFromIMZMLStream(string& imzmlfilename, ifstream &ibdstr } cPeaksList peaklist; - peaklist.loadFromIBDStream(imzml.getItems()[i], ibdstream, use_64bit_precision); + peaklist.loadFromIBDStream(imzml.getItems()[i], ibdstream, use_64bit_float_mz_precision, use_64bit_float_intensity_precision); if (!rawdata) { peaklists.push_back(peaklist); } @@ -394,7 +395,7 @@ int cPeakListSeries::loadFromIMZMLStream(string& imzmlfilename, ifstream &ibdstr // write peaklists for (int i = 0; i < (int)peaklists.size(); i++) { - peaklists[i].storeToIBDStream(ofibdstream, use_64bit_precision); + peaklists[i].storeToIBDStream(ofibdstream, use_64bit_float_mz_precision, use_64bit_float_intensity_precision); } ofibdstream.close(); diff --git a/CycloBranch/core/cPeakListSeries.h b/CycloBranch/core/cPeakListSeries.h index 5bf20d8..aa547c7 100644 --- a/CycloBranch/core/cPeakListSeries.h +++ b/CycloBranch/core/cPeakListSeries.h @@ -111,14 +111,15 @@ class cPeakListSeries { \param imzmlfilename imzML filename \param ibdstream ibd binary file stream \param fwhm FWHM - \param maxcountx max count of pixel x - parsed from imzML file - \param maxcounty max count of pixel y - parsed from imzML file + \param defaultmaxx max count of pixel x - parsed from imzML file + \param defaultmaxy max count of pixel y - parsed from imzML file + \param pixelsize pixel size \param vendor vendor type \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 int 0 = success; -1 = aborted by user, -2 = error */ - int loadFromIMZMLStream(string& imzmlfilename, ifstream &ibdstream, double fwhm, int& maxcountx, int& maxcounty, eVendorType& vendor, cMainThread* os, bool& terminatecomputation); + int loadFromIMZMLStream(string& imzmlfilename, ifstream &ibdstream, double fwhm, int& defaultmaxx, int& defaultmaxy, int& pixelsize, eVendorType& vendor, cMainThread* os, bool& terminatecomputation); /** diff --git a/CycloBranch/core/cPeaksList.cpp b/CycloBranch/core/cPeaksList.cpp index 96e64f8..5bdf794 100644 --- a/CycloBranch/core/cPeaksList.cpp +++ b/CycloBranch/core/cPeaksList.cpp @@ -2,31 +2,11 @@ #include "gui/cMainThread.h" -bool comparePeakMasses(const cPeak& a, const cPeak& b) { - return (a.mzratio < b.mzratio); -} - - bool compareRelativePeakIntensitiesDesc(const cPeak& a, const cPeak& b) { return (a.relativeintensity > b.relativeintensity); } -bool compareAbsolutePeakIntensitiesDesc(const cPeak& a, const cPeak& b) { - return (a.absoluteintensity > b.absoluteintensity); -} - - -bool comparePeakGroupId(const cPeak& a, const cPeak& b) { - return (a.groupid < b.groupid); -} - - -bool comparePeakRemoveMeFlag(const cPeak& a, const cPeak& b) { - return (a.removeme < b.removeme); -} - - bool isInPpmMassErrorTolerance(double experimentalmass, double theoreticalmass, double tolerance) { double errortolerance = experimentalmass*tolerance*0.000001f; return abs(experimentalmass - theoreticalmass) <= errortolerance; @@ -34,7 +14,7 @@ bool isInPpmMassErrorTolerance(double experimentalmass, double theoreticalmass, double ppmError(double experimentalmass, double theoreticalmass) { - return abs(experimentalmass - theoreticalmass)/experimentalmass*1000000.0f; + return (experimentalmass - theoreticalmass)/experimentalmass*1000000.0f; } @@ -139,95 +119,90 @@ void cPeaksList::loadFromBAFStream(ifstream &stream) { } -void cPeaksList::loadFromIBDStream(cImzMLItem& imzmlitem, ifstream &ibdstream, bool use_64bit_precision) { - if (use_64bit_precision) { - unsigned long long start; - double value; - +void cPeaksList::loadFromIBDStream(cImzMLItem& imzmlitem, ifstream &ibdstream, bool use_64bit_float_mz_precision, bool use_64bit_float_intensity_precision) { + unsigned long long start; + float flt; + double dbl; + + // mz values + if (use_64bit_float_mz_precision) { peaks.resize(imzmlitem.mzlength/8); - start = imzmlitem.mzstart; ibdstream.seekg(start, ibdstream.beg); for (int i = 0; i < (int)imzmlitem.mzlength/8; i++) { if (ibdstream.good()) { - ibdstream.read((char*)&value, 8); - peaks[i].mzratio = value; + ibdstream.read((char*)&dbl, 8); + peaks[i].mzratio = dbl; } } - - if (imzmlitem.mzlength != imzmlitem.intensitylength) { - return; - } - - start = imzmlitem.intensitystart; - ibdstream.seekg(start, ibdstream.beg); - for (int i = 0; i < (int)imzmlitem.intensitylength/8; i++) { - if (ibdstream.good()) { - ibdstream.read((char*)&value, 8); - peaks[i].absoluteintensity = value; - } - } - - x = imzmlitem.x; - y = imzmlitem.y; - title = imzmlitem.title; } else { - unsigned start; - float value; - peaks.resize(imzmlitem.mzlength/4); - start = imzmlitem.mzstart; ibdstream.seekg(start, ibdstream.beg); for (int i = 0; i < (int)imzmlitem.mzlength/4; i++) { if (ibdstream.good()) { - ibdstream.read((char*)&value, 4); - peaks[i].mzratio = value; + ibdstream.read((char*)&flt, 4); + peaks[i].mzratio = flt; } } + } - if (imzmlitem.mzlength != imzmlitem.intensitylength) { - return; - } + if (imzmlitem.mzlength != imzmlitem.intensitylength) { + return; + } + // intensities + if (use_64bit_float_intensity_precision) { start = imzmlitem.intensitystart; ibdstream.seekg(start, ibdstream.beg); - for (int i = 0; i < (int)imzmlitem.intensitylength/4; i++) { + for (int i = 0; i < (int)imzmlitem.intensitylength / 8; i++) { if (ibdstream.good()) { - ibdstream.read((char*)&value, 4); - peaks[i].absoluteintensity = value; + ibdstream.read((char*)&dbl, 8); + peaks[i].absoluteintensity = dbl; + } + } + } + else { + start = imzmlitem.intensitystart; + ibdstream.seekg(start, ibdstream.beg); + for (int i = 0; i < (int)imzmlitem.intensitylength / 4; i++) { + if (ibdstream.good()) { + ibdstream.read((char*)&flt, 4); + peaks[i].absoluteintensity = flt; } } - - x = imzmlitem.x; - y = imzmlitem.y; - title = imzmlitem.title; } + + x = imzmlitem.x; + y = imzmlitem.y; + title = imzmlitem.title; } -void cPeaksList::storeToIBDStream(ofstream &ibdstream, bool use_64bit_precision) { - if (use_64bit_precision) { - // store m/z values - for (int i = 0; i < (int)peaks.size(); i++) { - ibdstream.write((char *)&(peaks[i].mzratio), 8); - } +void cPeaksList::storeToIBDStream(ofstream &ibdstream, bool use_64bit_float_mz_precision, bool use_64bit_float_intensity_precision) { + float value; - // store intensities + // store m/z values + if (use_64bit_float_mz_precision) { for (int i = 0; i < (int)peaks.size(); i++) { - ibdstream.write((char *)&(peaks[i].absoluteintensity), 8); + ibdstream.write((char *)&(peaks[i].mzratio), 8); } } else { - float value; - // store m/z values for (int i = 0; i < (int)peaks.size(); i++) { value = peaks[i].mzratio; ibdstream.write((char *)&value, 4); } + } - // store intensities + // store intensities + if (use_64bit_float_intensity_precision) { + for (int i = 0; i < (int)peaks.size(); i++) { + ibdstream.write((char *)&(peaks[i].absoluteintensity), 8); + } + } + else { for (int i = 0; i < (int)peaks.size(); i++) { value = peaks[i].absoluteintensity; ibdstream.write((char *)&value, 4); @@ -326,11 +301,15 @@ string cPeaksList::print(bool htmlterminatelines) { void cPeaksList::sortbyMass(int limit) { + auto cmp = [](const cPeak& a, const cPeak& b) { + return (a.mzratio < b.mzratio); + }; + if (limit == -1) { - sort(peaks.begin(), peaks.end(), comparePeakMasses); + sort(peaks.begin(), peaks.end(), cmp); } else { - sort(peaks.begin(), peaks.begin() + limit, comparePeakMasses); + sort(peaks.begin(), peaks.begin() + limit, cmp); } } @@ -341,12 +320,29 @@ void cPeaksList::sortbyRelativeIntensityDesc() { void cPeaksList::sortbyAbsoluteIntensityDesc() { - sort(peaks.begin(), peaks.end(), compareAbsolutePeakIntensitiesDesc); + auto cmp = [](const cPeak& a, const cPeak& b) { + return (a.absoluteintensity > b.absoluteintensity); + }; + + sort(peaks.begin(), peaks.end(), cmp); } void cPeaksList::sortbyGroupId() { - sort(peaks.begin(), peaks.end(), comparePeakGroupId); + auto cmp = [](const cPeak& a, const cPeak& b) { + return (a.groupid < b.groupid); + }; + + sort(peaks.begin(), peaks.end(), cmp); +} + + +void cPeaksList::sortbyOrderId() { + auto cmp = [](const cPeak& a, const cPeak& b) { + return (a.orderid < b.orderid); + }; + + sort(peaks.begin(), peaks.end(), cmp); } @@ -373,9 +369,22 @@ int cPeaksList::normalizeIntenzity() { void cPeaksList::cropRelativeIntenzity(double minimumrelativeintensitythreshold) { sortbyRelativeIntensityDesc(); - + int i = (int)peaks.size() - 1; - while ((i > 0) && (peaks[i].relativeintensity < minimumrelativeintensitythreshold)) { + while ((i >= 0) && (peaks[i].relativeintensity < minimumrelativeintensitythreshold)) { + i--; + } + peaks.resize(i + 1); + + sortbyMass(); +} + + +void cPeaksList::cropAbsoluteIntenzity(unsigned minimumabsoluteintensitythreshold) { + sortbyAbsoluteIntensityDesc(); + + int i = (int)peaks.size() - 1; + while ((i >= 0) && (peaks[i].absoluteintensity < (double)minimumabsoluteintensitythreshold)) { i--; } peaks.resize(i + 1); @@ -385,14 +394,18 @@ void cPeaksList::cropRelativeIntenzity(double minimumrelativeintensitythreshold) void cPeaksList::cropMinimumMZRatio(double minimummz, double errortolerance) { - while ((int)peaks.size() > 0) { - if ((peaks[0].mzratio < minimummz) && (!isInPpmMassErrorTolerance(peaks[0].mzratio, minimummz, errortolerance))) { - peaks.erase(peaks.begin()); + int position = 0; + while (position < (int)peaks.size()) { + if ((peaks[position].mzratio < minimummz) && (!isInPpmMassErrorTolerance(peaks[position].mzratio, minimummz, errortolerance))) { + position++; } else { break; } } + if (position > 0) { + peaks.erase(peaks.begin(), peaks.begin() + position); + } } @@ -598,7 +611,11 @@ void cPeaksList::removeNeutralLoss(double loss, int maximumcharge, double fragme void cPeaksList::removeObsolete() { - sort(peaks.begin(), peaks.end(), comparePeakRemoveMeFlag); + auto cmp = [](const cPeak& a, const cPeak& b) { + return (a.removeme < b.removeme); + }; + + sort(peaks.begin(), peaks.end(), cmp); int items = 0; int size = (int)peaks.size(); @@ -650,7 +667,7 @@ void cPeaksList::maxHighestPeaksInWindow(int maximumnumberofpeaksinwindow, doubl } -double cPeaksList::getMaximumIntensityFromMZInterval(double minmz, double maxmz, bool hidematched, bool hideunmatched, ePeptideType peptidetype, bool hidescrambled) { +double cPeaksList::getMaximumRelativeIntensityFromMZInterval(double minmz, double maxmz, bool hidematched, bool hideunmatched, ePeptideType peptidetype, bool hidescrambled) { double intensity = 0; for (int i = 0; i < (int)peaks.size(); i++) { @@ -682,6 +699,37 @@ double cPeaksList::getMaximumIntensityFromMZInterval(double minmz, double maxmz, } +double cPeaksList::getMaximumAbsoluteIntensityFromMZInterval(double minmz, double maxmz, bool hidematched, bool hideunmatched, ePeptideType peptidetype, bool hidescrambled) { + double intensity = 0; + for (int i = 0; i < (int)peaks.size(); i++) { + // skip peaks which are out of range + if ((peaks[i].mzratio < minmz) || (peaks[i].mzratio > maxmz)) { + continue; + } + + // skip unmatched peaks if selected + if (hideunmatched && (peaks[i].matched <= 0)) { + continue; + } + + // skip matched peaks if selected + if (hidematched && (peaks[i].matched > 0)) { + continue; + } + + // skip scrambled peaks if selected + if ((peptidetype == cyclic) && hidescrambled && peaks[i].scrambled) { + continue; + } + + if (peaks[i].absoluteintensity > intensity) { + intensity = peaks[i].absoluteintensity; + } + } + return intensity; +} + + void cPeaksList::setCoordinates(int x, int y) { this->x = x; this->y = y; @@ -758,3 +806,11 @@ void cPeaksList::reducePeakDescriptions(map& peakidtodesc, map