From a49ebb1743fa0ade1123b17a99168ebd31743009 Mon Sep 17 00:00:00 2001
From: Jiri Novak
Date: Wed, 21 Feb 2018 15:01:36 +0100
Subject: [PATCH] release 1.0.850
---
CycloBranch/CycloBranch.vcxproj | 60 ++
CycloBranch/CycloBranch.vcxproj.filters | 42 ++
CycloBranch/core/cBrick.cpp | 94 +--
CycloBranch/core/cBrick.h | 8 +
CycloBranch/core/cBricksDatabase.cpp | 19 +-
CycloBranch/core/cBricksDatabase.h | 13 +-
CycloBranch/core/cCandidate.cpp | 51 +-
CycloBranch/core/cCandidate.h | 18 +-
CycloBranch/core/cDeNovoGraph.cpp | 49 +-
CycloBranch/core/cDeNovoGraph.h | 12 +-
CycloBranch/core/cFragmentIons.cpp | 226 +++++++-
CycloBranch/core/cFragmentIons.h | 60 +-
CycloBranch/core/cParameters.cpp | 411 +++++++-------
CycloBranch/core/cParameters.h | 30 +-
CycloBranch/core/cPeak.cpp | 26 +-
CycloBranch/core/cSequence.cpp | 189 +++++++
CycloBranch/core/cSequence.h | 186 ++++++
CycloBranch/core/cSequenceDatabase.cpp | 194 +++++++
CycloBranch/core/cSequenceDatabase.h | 97 ++++
CycloBranch/core/cSummaryFormula.cpp | 12 +-
CycloBranch/core/cTheoreticalSpectrum.cpp | 202 ++++---
CycloBranch/core/cTheoreticalSpectrum.h | 15 +
CycloBranch/core/cTheoreticalSpectrumList.cpp | 27 +-
CycloBranch/core/utilities.cpp | 36 ++
CycloBranch/core/utilities.h | 51 ++
CycloBranch/gui/cBricksDatabaseWidget.cpp | 456 +++++++++++++++
CycloBranch/gui/cBricksDatabaseWidget.h | 116 ++++
CycloBranch/gui/cGraphWidget.cpp | 12 +-
CycloBranch/gui/cGraphWidget.h | 1 +
CycloBranch/gui/cMainThread.cpp | 506 +++++++++++------
CycloBranch/gui/cMainThread.h | 6 +
CycloBranch/gui/cMainWindow.cpp | 284 +++++++---
CycloBranch/gui/cMainWindow.h | 12 +
CycloBranch/gui/cParametersWidget.cpp | 309 +++++++---
CycloBranch/gui/cParametersWidget.h | 13 +-
CycloBranch/gui/cSequenceDatabaseWidget.cpp | 534 ++++++++++++++++++
CycloBranch/gui/cSequenceDatabaseWidget.h | 110 ++++
CycloBranch/gui/cSpectrumDetailWidget.cpp | 350 +++++++-----
CycloBranch/parallel/cGraphReaderThread.cpp | 89 +--
CycloBranch/parallel/cGraphReaderThread.h | 11 +-
.../parallel/cSpectrumComparatorThread.cpp | 4 +-
.../parallel/cSpectrumComparatorThread.h | 4 +-
42 files changed, 3925 insertions(+), 1020 deletions(-)
create mode 100644 CycloBranch/core/cSequence.cpp
create mode 100644 CycloBranch/core/cSequence.h
create mode 100644 CycloBranch/core/cSequenceDatabase.cpp
create mode 100644 CycloBranch/core/cSequenceDatabase.h
create mode 100644 CycloBranch/core/utilities.cpp
create mode 100644 CycloBranch/core/utilities.h
create mode 100644 CycloBranch/gui/cBricksDatabaseWidget.cpp
create mode 100644 CycloBranch/gui/cBricksDatabaseWidget.h
create mode 100644 CycloBranch/gui/cSequenceDatabaseWidget.cpp
create mode 100644 CycloBranch/gui/cSequenceDatabaseWidget.h
diff --git a/CycloBranch/CycloBranch.vcxproj b/CycloBranch/CycloBranch.vcxproj
index 8f40608..23c88a4 100644
--- a/CycloBranch/CycloBranch.vcxproj
+++ b/CycloBranch/CycloBranch.vcxproj
@@ -157,9 +157,12 @@
+
+
+
true
true
@@ -168,6 +171,10 @@
true
true
+
+ true
+ true
+
true
true
@@ -208,6 +215,10 @@
true
true
+
+ true
+ true
+
true
true
@@ -224,6 +235,10 @@
true
true
+
+ true
+ true
+
true
true
@@ -264,6 +279,10 @@
true
true
+
+ true
+ true
+
true
true
@@ -274,6 +293,7 @@
+
@@ -283,6 +303,7 @@
+
@@ -299,8 +320,47 @@
+
+
+
+
+ $(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 "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets"
+ $(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 "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets"
+ $(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 "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets"
+ $(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 "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets"
+
+
+ $(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 "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets"
+ $(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 "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets"
+ $(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 "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets"
+ $(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 "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets"
+
$(QTDIR)\bin\moc.exe;%(FullPath)
Moc%27ing cLassoWidget.h...
diff --git a/CycloBranch/CycloBranch.vcxproj.filters b/CycloBranch/CycloBranch.vcxproj.filters
index 8b5ead7..a06dc21 100644
--- a/CycloBranch/CycloBranch.vcxproj.filters
+++ b/CycloBranch/CycloBranch.vcxproj.filters
@@ -212,6 +212,33 @@
Source Files\core
+
+ Source Files\gui
+
+
+ Generated Files\Debug
+
+
+ Generated Files\Release
+
+
+ Source Files\core
+
+
+ Source Files\core
+
+
+ Source Files\core
+
+
+ Source Files\gui
+
+
+ Generated Files\Debug
+
+
+ Generated Files\Release
+
@@ -259,6 +286,12 @@
Header Files\gui
+
+ Header Files\gui
+
+
+ Header Files\gui
+
@@ -297,5 +330,14 @@
Header Files\core
+
+ Header Files\core
+
+
+ Header Files\core
+
+
+ Header Files\core
+
\ No newline at end of file
diff --git a/CycloBranch/core/cBrick.cpp b/CycloBranch/core/cBrick.cpp
index 504e093..4b6c764 100644
--- a/CycloBranch/core/cBrick.cpp
+++ b/CycloBranch/core/cBrick.cpp
@@ -127,6 +127,7 @@ void cBrick::setSummary(string& summary) {
void cBrick::setAcronyms(string& acronyms) {
+ this->acronyms.clear();
string s = "";
int i = 0;
while (i < (int)acronyms.size()) {
@@ -148,6 +149,7 @@ void cBrick::setAcronyms(string& acronyms) {
void cBrick::setReferences(string& references) {
+ this->references.clear();
string s = "";
int i = 0;
while (i < (int)references.size()) {
@@ -235,6 +237,18 @@ string cBrick::getAcronymsAsString() {
}
+string cBrick::getReferencesAsString() {
+ string s = "";
+ for (int i = 0; i < (int)references.size(); i++) {
+ s += references[i];
+ if (i < (int)references.size() - 1) {
+ s += "/";
+ }
+ }
+ return s;
+}
+
+
string cBrick::getFirstAcronymAsString() {
if (acronyms.size() == 0) {
return "";
@@ -244,6 +258,10 @@ string cBrick::getFirstAcronymAsString() {
string cBrick::getAcronymsWithReferencesAsHTMLString() {
+ if (acronyms.size() != references.size()) {
+ return "";
+ }
+
string s = "";
regex rx;
bool correctreference;
@@ -278,9 +296,9 @@ string cBrick::getAcronymsWithReferencesAsHTMLString() {
// PDB
if (!correctreference) {
- rx = "^PDB: [A-Z]+$";
+ rx = "^PDB: ([A-Z]|[0-9])+$";
if (regex_search(references[i], rx)) {
- s += "";
+ s += "";
s += acronyms[i];
s += "";
correctreference = true;
@@ -349,75 +367,23 @@ bool cBrick::isArtificial() {
void cBrick::store(ofstream& os) {
- int size;
-
- size = (int)name.size();
- os.write((char *)&size, sizeof(int));
- os.write(name.c_str(), name.size());
-
- size = (int)acronyms.size();
- os.write((char *)&size, sizeof(int));
- for (int i = 0; i < (int)acronyms.size(); i++) {
- size = (int)acronyms[i].size();
- os.write((char *)&size, sizeof(int));
- os.write(acronyms[i].c_str(), acronyms[i].size());
- }
-
- size = (int)references.size();
- os.write((char *)&size, sizeof(int));
- for (int i = 0; i < (int)references.size(); i++) {
- size = (int)references[i].size();
- os.write((char *)&size, sizeof(int));
- os.write(references[i].c_str(), references[i].size());
- }
-
- size = (int)summary.size();
- os.write((char *)&size, sizeof(int));
- os.write(summary.c_str(), summary.size());
-
+ storeString(name, os);
+ storeStringVector(acronyms, os);
+ storeStringVector(references, os);
+ storeString(summary, os);
os.write((char *)&mass, sizeof(double));
-
- size = (int)composition.size();
- os.write((char *)&size, sizeof(int));
- os.write(composition.c_str(), composition.size());
-
+ storeString(composition, os);
os.write((char *)&artificial, sizeof(bool));
}
void cBrick::load(ifstream& is) {
- int size;
-
- is.read((char *)&size, sizeof(int));
- name.resize(size);
- is.read(&name[0], name.size());
-
- is.read((char *)&size, sizeof(int));
- acronyms.resize(size);
- for (int i = 0; i < (int)acronyms.size(); i++) {
- is.read((char *)&size, sizeof(int));
- acronyms[i].resize(size);
- is.read(&acronyms[i][0], acronyms[i].size());
- }
-
- is.read((char *)&size, sizeof(int));
- references.resize(size);
- for (int i = 0; i < (int)references.size(); i++) {
- is.read((char *)&size, sizeof(int));
- references[i].resize(size);
- is.read(&references[i][0], references[i].size());
- }
-
- is.read((char *)&size, sizeof(int));
- summary.resize(size);
- is.read(&summary[0], summary.size());
-
+ loadString(name, is);
+ loadStringVector(acronyms, is);
+ loadStringVector(references, is);
+ loadString(summary, is);
is.read((char *)&mass, sizeof(double));
-
- is.read((char *)&size, sizeof(int));
- composition.resize(size);
- is.read(&composition[0], composition.size());
-
+ loadString(composition, is);
is.read((char *)&artificial, sizeof(bool));
}
diff --git a/CycloBranch/core/cBrick.h b/CycloBranch/core/cBrick.h
index d586515..fcbfd9d 100644
--- a/CycloBranch/core/cBrick.h
+++ b/CycloBranch/core/cBrick.h
@@ -13,6 +13,7 @@
#include
#include
#include
+#include "core/utilities.h"
using namespace std;
@@ -185,6 +186,13 @@ class cBrick {
string getAcronymsAsString();
+ /**
+ \brief Get all references.
+ \retval string references of all izomers separated by '/'
+ */
+ string getReferencesAsString();
+
+
/**
\brief Get the first acronym.
\retval string acronym of the first izomer
diff --git a/CycloBranch/core/cBricksDatabase.cpp b/CycloBranch/core/cBricksDatabase.cpp
index 6e462d6..6702b0d 100644
--- a/CycloBranch/core/cBricksDatabase.cpp
+++ b/CycloBranch/core/cBricksDatabase.cpp
@@ -105,7 +105,7 @@ bool cBricksDatabase::nextCombination(vector& combarray, int numberofbasicb
cBricksDatabase::cBricksDatabase() {
- bricks.clear();
+ clear();
}
@@ -119,6 +119,7 @@ int cBricksDatabase::loadFromPlainTextStream(ifstream &stream, string& errormess
errormessage = "";
cSummaryFormula formula;
+ bricks.clear();
while (stream.good()) {
getline(stream,s);
@@ -207,12 +208,21 @@ int cBricksDatabase::loadFromPlainTextStream(ifstream &stream, string& errormess
return -1;
}
- sortbyMass();
-
return 0;
}
+void cBricksDatabase::storeToPlainTextStream(ofstream &stream) {
+ for (int i = 0; i < bricks.size(); i++) {
+ stream << bricks[i].getName() << "\t";
+ stream << bricks[i].getAcronymsAsString() << "\t";
+ stream << bricks[i].getSummary() << "\t";
+ stream << std::fixed << std::setprecision(10) << bricks[i].getMass() << "\t";
+ stream << bricks[i].getReferencesAsString() << endl;
+ }
+}
+
+
int cBricksDatabase::size() {
return (int)bricks.size();
}
@@ -409,7 +419,7 @@ void cBricksDatabase::clear() {
}
-bool cBricksDatabase::replaceAcronymsByIDs(string& sequence) {
+bool cBricksDatabase::replaceAcronymsByIDs(string& sequence, string& errormessage) {
string s = "";
string acronym;
bool insidebrick = false;
@@ -447,6 +457,7 @@ bool cBricksDatabase::replaceAcronymsByIDs(string& sequence) {
//}
if (!found) {
+ errormessage = "Invalid brick acronym '" + acronym + "' typed in the sequence: " + sequence + ".";
return false;
}
diff --git a/CycloBranch/core/cBricksDatabase.h b/CycloBranch/core/cBricksDatabase.h
index 1d39c27..a9fd148 100644
--- a/CycloBranch/core/cBricksDatabase.h
+++ b/CycloBranch/core/cBricksDatabase.h
@@ -1,6 +1,6 @@
/**
\file cBricksDatabase.h
- \brief The representation of a database of bricks.
+ \brief The database of building blocks.
*/
@@ -12,6 +12,7 @@
#include
#include
#include
+#include
#include "core/cBrick.h"
@@ -94,6 +95,13 @@ class cBricksDatabase {
int loadFromPlainTextStream(ifstream &stream, string& errormessage);
+ /**
+ \brief Store the database of bricks into a plain text stream.
+ \param stream reference to an output file stream
+ */
+ void storeToPlainTextStream(ofstream &stream);
+
+
/**
\brief Get the number of bricks in the database.
\retval int number of bricks
@@ -181,9 +189,10 @@ class cBricksDatabase {
/**
\brief Replace acronyms of bricks by ids.
\param sequence reference to an input/output string containing acronyms/ids of bricks
+ \param errormessage reference to a string where an error message is stored when \a sequence contains an unknown building block
\retval bool true when the replacement was successful, false when an acronym of a brick is unknown
*/
- bool replaceAcronymsByIDs(string& sequence);
+ bool replaceAcronymsByIDs(string& sequence, string& errormessage);
/**
diff --git a/CycloBranch/core/cCandidate.cpp b/CycloBranch/core/cCandidate.cpp
index 7c96f73..80b391f 100644
--- a/CycloBranch/core/cCandidate.cpp
+++ b/CycloBranch/core/cCandidate.cpp
@@ -244,6 +244,7 @@ void cCandidate::clear() {
branchstart = -1;
branchend = -1;
path.clear();
+ name = "";
}
@@ -699,6 +700,10 @@ double cCandidate::getPrecursorMass(cBricksDatabase& brickdatabasewithcombinatio
case lasso:
mass = parameters->fragmentdefinitions[cyclic_precursor_ion].massdifference + parameters->searchedmodifications[middlemodifID].massdifference;
break;
+ case other:
+ break;
+ default:
+ break;
}
for (int i = 0; i < (int)bricks.size(); i++) {
@@ -873,7 +878,7 @@ void cCandidate::getLassoRotations(vector& lassorotations, bool incl
}
-string cCandidate::getSummaryFormula(cParameters& parameters) {
+string cCandidate::getSummaryFormula(cParameters& parameters, peptideType peptidetype) {
cBrick b;
vector bricks;
b.setComposition(internalcomposition, false);
@@ -882,7 +887,7 @@ string cCandidate::getSummaryFormula(cParameters& parameters) {
cSummaryFormula formula;
string summary;
- switch (parameters.peptidetype)
+ switch (peptidetype)
{
case linear:
case linearpolysaccharide:
@@ -903,6 +908,10 @@ string cCandidate::getSummaryFormula(cParameters& parameters) {
case lasso:
formula.addFormula(parameters.searchedmodifications[middlemodifID].summary);
break;
+ case other:
+ break;
+ default:
+ break;
}
bool partial = false;
@@ -934,17 +943,9 @@ void cCandidate::store(ofstream& os) {
path[i].store(os);
}
- size = (int)composition.size();
- os.write((char *)&size, sizeof(int));
- for (int i = 0; i < (int)composition.size(); i++) {
- size = (int)composition[i].size();
- os.write((char *)&size, sizeof(int));
- os.write(composition[i].c_str(), composition[i].size());
- }
-
- size = (int)internalcomposition.size();
- os.write((char *)&size, sizeof(int));
- os.write(internalcomposition.c_str(), internalcomposition.size());
+ storeString(name, os);
+ storeStringVector(composition, os);
+ storeString(internalcomposition, os);
os.write((char *)&numberofinternalbricks, sizeof(int));
}
@@ -965,22 +966,24 @@ void cCandidate::load(ifstream& is) {
path[i].load(is);
}
- is.read((char *)&size, sizeof(int));
- composition.resize(size);
- for (int i = 0; i < (int)composition.size(); i++) {
- is.read((char *)&size, sizeof(int));
- composition[i].resize(size);
- is.read(&composition[i][0], composition[i].size());
- }
-
- is.read((char *)&size, sizeof(int));
- internalcomposition.resize(size);
- is.read(&internalcomposition[0], internalcomposition.size());
+ loadString(name, is);
+ loadStringVector(composition, is);
+ loadString(internalcomposition, is);
is.read((char *)&numberofinternalbricks, sizeof(int));
}
+void cCandidate::setName(string& name) {
+ this->name = name;
+}
+
+
+string& cCandidate::getName() {
+ return name;
+}
+
+
bool operator == (cCandidate const& a, cCandidate const& b) {
return ((cCandidate &)a).isEqualTo((cCandidate &)b);
}
diff --git a/CycloBranch/core/cCandidate.h b/CycloBranch/core/cCandidate.h
index f9f06fd..110a3f8 100644
--- a/CycloBranch/core/cCandidate.h
+++ b/CycloBranch/core/cCandidate.h
@@ -134,6 +134,7 @@ class cCandidate {
int branchstart;
int branchend;
vector path;
+ string name;
vector composition;
string internalcomposition;
@@ -413,9 +414,10 @@ class cCandidate {
/**
\brief Get the summary formula of the peptide sequence candidate.
\param parameters a reference to the parameters of the application
+ \param peptidetype the type of peptide
\retval string the summary formula
*/
- string getSummaryFormula(cParameters& parameters);
+ string getSummaryFormula(cParameters& parameters, peptideType peptidetype);
/**
@@ -431,6 +433,20 @@ class cCandidate {
*/
void load(ifstream& is);
+
+ /**
+ \brief Set the name of peptide.
+ \param name name
+ */
+ void setName(string& name);
+
+
+ /**
+ \brief Get the name of peptide.
+ \retval string name
+ */
+ string& getName();
+
};
diff --git a/CycloBranch/core/cDeNovoGraph.cpp b/CycloBranch/core/cDeNovoGraph.cpp
index cf97657..c9c1039 100644
--- a/CycloBranch/core/cDeNovoGraph.cpp
+++ b/CycloBranch/core/cDeNovoGraph.cpp
@@ -22,23 +22,34 @@ cDeNovoGraph::cDeNovoGraph() {
}
-bool cDeNovoGraph::findPath(int sourcenodeid, int edgeid, int targetnodeid, string& composition, string brickspath, int maximumbricksincombination, int depth) {
+bool cDeNovoGraph::findPath(int sourcenodeid, int edgeid, int targetnodeid, string& composition, string brickspath, int maximumbricksincombination, vector& path) {
string localbrickpath;
-
+ bool found;
+ bool badpath;
int count = getNumberOfBricks(brickspath);
- if ((depth > 1) && (sourcenodeid == targetnodeid)) {
+ if ((path.size() > 1) && (sourcenodeid == targetnodeid)) {
cBrick b;
b.setComposition(brickspath, true);
if (composition.compare(b.getComposition()) == 0) {
- //*os << endl << "brick: " << brickspath << " path: " << sourcenodeid << " ";
+ //*os << " path: " << graph[sourcenodeid].getMZRatio() << " ";
return true;
}
}
if (count < maximumbricksincombination) {
for (int i = 0; i < (int)graph[sourcenodeid].size(); i++) {
- if ((i == edgeid) && (depth == 0)) {
+ if ((i == edgeid) && (path.size() == 0)) {
+ continue;
+ }
+ badpath = false;
+ for (int j = 0; j < (int)path.size(); j++) {
+ if (path[j] == sourcenodeid) {
+ badpath = true;
+ break;
+ }
+ }
+ if (badpath) {
continue;
}
localbrickpath = brickspath;
@@ -46,8 +57,11 @@ bool cDeNovoGraph::findPath(int sourcenodeid, int edgeid, int targetnodeid, stri
localbrickpath += '-';
}
localbrickpath += graph[sourcenodeid][i].composition;
- if (findPath(graph[sourcenodeid][i].targetnode, i, targetnodeid, composition, localbrickpath, maximumbricksincombination, depth + 1)) {
- //*os << sourcenodeid << " ";
+ path.push_back(sourcenodeid);
+ found = findPath(graph[sourcenodeid][i].targetnode, i, targetnodeid, composition, localbrickpath, maximumbricksincombination, path);
+ path.pop_back();
+ if (found) {
+ //*os << graph[sourcenodeid].getMZRatio() << " ";
return true;
}
}
@@ -124,13 +138,13 @@ int cDeNovoGraph::createGraph(bool& terminatecomputation) {
sortedpeaklist.removeChargeVariants(parameters->precursorcharge, parameters->fragmentmasserrortolerance);
*os << "Number of nodes after deconvolution: " << sortedpeaklist.size() << endl;
- // remove water loss peaks
+ // remove dehydrated peaks
sortedpeaklist.removeNeutralLoss(- H2O, parameters->precursorcharge, parameters->fragmentmasserrortolerance);
- *os << "Number of nodes when water loss ions are removed: " << sortedpeaklist.size() << endl;
+ *os << "Number of nodes when dehydrated ions are removed: " << sortedpeaklist.size() << endl;
- // remove ammonia loss peaks
+ // remove deamidated peaks
sortedpeaklist.removeNeutralLoss(- NH3, parameters->precursorcharge, parameters->fragmentmasserrortolerance);
- *os << "Number of nodes when ammonia loss ions are removed: " << sortedpeaklist.size() << endl;
+ *os << "Number of nodes when deamidated ions are removed: " << sortedpeaklist.size() << endl;
// insert system nodes
switch (parameters->peptidetype)
@@ -317,6 +331,9 @@ int cDeNovoGraph::createGraph(bool& terminatecomputation) {
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;
@@ -832,6 +849,7 @@ int cDeNovoGraph::removePathsWhichCanBeSubstitutedByLongerPath(bool& terminateco
*os << "Removing edges forming paths which can be substituted by longer paths... ";
int edgesremoved = 0;
int j;
+ vector path;
for (int i = startnode; i < (int)graph.size(); i++) {
@@ -844,8 +862,9 @@ int cDeNovoGraph::removePathsWhichCanBeSubstitutedByLongerPath(bool& terminateco
while (j < (int)graph[i].size()) {
cBrick b;
b.setComposition(graph[i][j].composition, true);
- if (findPath(i, j, graph[i][j].targetnode, b.getComposition(), "", parameters->maximumbricksincombination, 0)) {
- //*os << endl << "removing edge: " << i << "->" << graph[i][j].targetnode << " ";
+ path.clear();
+ if (findPath(i, j, graph[i][j].targetnode, b.getComposition(), "", parameters->maximumbricksincombination, path)) {
+ //*os << "removing edge: " << graph[i].getMZRatio() << "->" << graph[graph[i][j].targetnode].getMZRatio() << " " << bricksdatabasewithcombinations.getTagName(b.getComposition()) << endl;
graph[i].removeEdge(j);
edgesremoved++;
}
@@ -862,9 +881,9 @@ int cDeNovoGraph::removePathsWhichCanBeSubstitutedByLongerPath(bool& terminateco
}
-void cDeNovoGraph::startGraphReader(cCandidateSet& candidates, bool& terminatecomputation) {
+void cDeNovoGraph::startGraphReader(cCandidateSet& candidates, long long unsigned& count, int scanmode, bool& terminatecomputation) {
graphreaderthread = new cGraphReaderThread();
- graphreaderthread->initialize(graph, bricksdatabasewithcombinations, candidates, parameters, os, lastsystemnode, terminatecomputation);
+ graphreaderthread->initialize(graph, bricksdatabasewithcombinations, candidates, parameters, os, lastsystemnode, count, scanmode, terminatecomputation);
os->connect(graphreaderthread, SIGNAL(finished()), os, SLOT(graphReaderFinished()));
os->setGraphReaderIsWorking(true);
graphreaderthread->start();
diff --git a/CycloBranch/core/cDeNovoGraph.h b/CycloBranch/core/cDeNovoGraph.h
index 92cadcb..422bf77 100644
--- a/CycloBranch/core/cDeNovoGraph.h
+++ b/CycloBranch/core/cDeNovoGraph.h
@@ -25,6 +25,12 @@ class cMainThread;
using namespace std;
+/**
+ \brief Maximum number of candidates to be read from the graph.
+*/
+const long long unsigned maximumcandidates = 1000000000;
+
+
/**
\brief Compare two nodes.
\param node1 reference to the first node
@@ -49,7 +55,7 @@ class cDeNovoGraph {
cGraphReaderThread* graphreaderthread;
- bool findPath(int sourcenodeid, int edgeid, int targetnodeid, string& composition, string brickspath, int maximumbricksincombination, int depth);
+ bool findPath(int sourcenodeid, int edgeid, int targetnodeid, string& composition, string brickspath, int maximumbricksincombination, vector& path);
// create vectors of edges from temporary unordered_sets
void createVectorsOfEdges();
@@ -124,9 +130,11 @@ class cDeNovoGraph {
/**
\brief Start the graph reader.
\param candidates output set of candidates
+ \param count an output number of peptide sequence candidates
+ \param scanmode 0 = get candidates; 1 = calculate the number of peptide sequence candidates
\param terminatecomputation reference to a variable determining that the computation must be stopped
*/
- void startGraphReader(cCandidateSet& candidates, bool& terminatecomputation);
+ void startGraphReader(cCandidateSet& candidates, long long unsigned& count, int scanmode, bool& terminatecomputation);
/**
diff --git a/CycloBranch/core/cFragmentIons.cpp b/CycloBranch/core/cFragmentIons.cpp
index 82758cf..9531dbc 100644
--- a/CycloBranch/core/cFragmentIons.cpp
+++ b/CycloBranch/core/cFragmentIons.cpp
@@ -3,6 +3,7 @@
cPeriodicTableMap::cPeriodicTableMap() {
table["H"] = H;
+ table["D"] = D;
table["Li"] = Li;
table["Be"] = Be;
table["B"] = B;
@@ -46,6 +47,59 @@ int cPeriodicTableMap::count(string& element) {
}
+peptideType getPeptideTypeFromString(string s) {
+ if (s.compare("linear") == 0) {
+ return linear;
+ }
+ if (s.compare("cyclic") == 0) {
+ return cyclic;
+ }
+ if (s.compare("branched") == 0) {
+ return branched;
+ }
+ if (s.compare("lasso") == 0) {
+ return lasso;
+ }
+ if (s.compare("linearpolysaccharide") == 0) {
+ return linearpolysaccharide;
+ }
+ if (s.compare("other") == 0) {
+ return other;
+ }
+
+ return other;
+}
+
+
+string getStringFromPeptideType(peptideType peptidetype) {
+ switch (peptidetype)
+ {
+ case linear:
+ return "linear";
+ break;
+ case cyclic:
+ return "cyclic";
+ break;
+ case branched:
+ return "branched";
+ break;
+ case lasso:
+ return "lasso";
+ break;
+ case linearpolysaccharide:
+ return "linearpolysaccharide";
+ break;
+ case other:
+ return "other";
+ break;
+ default:
+ break;
+ }
+
+ return "other";
+}
+
+
double charge(double mass, int charge) {
return (mass + ((double)(charge - 1))*Hplus)/(double)charge;
}
@@ -57,38 +111,26 @@ double uncharge(double mass, int charge) {
void fragmentDescription::store(ofstream& os) {
- int size;
-
- size = (int)name.size();
- os.write((char *)&size, sizeof(int));
- os.write(name.c_str(), (int)name.size());
-
- size = (int)summary.size();
- os.write((char *)&size, sizeof(int));
- os.write(summary.c_str(), (int)summary.size());
-
+ storeString(name, os);
+ storeString(summary, os);
os.write((char *)&massdifference, sizeof(double));
os.write((char *)&nterminal, sizeof(bool));
os.write((char *)&cterminal, sizeof(bool));
os.write((char *)&parent, sizeof(fragmentIonType));
+ os.write((char *)&positive, sizeof(bool));
+ os.write((char *)&multiplier, sizeof(int));
}
void fragmentDescription::load(ifstream& is) {
- int size;
-
- is.read((char *)&size, sizeof(int));
- name.resize(size);
- is.read(&name[0], name.size());
-
- is.read((char *)&size, sizeof(int));
- summary.resize(size);
- is.read(&summary[0], summary.size());
-
+ loadString(name, is);
+ loadString(summary, is);
is.read((char *)&massdifference, sizeof(double));
is.read((char *)&nterminal, sizeof(bool));
is.read((char *)&cterminal, sizeof(bool));
is.read((char *)&parent, sizeof(fragmentIonType));
+ is.read((char *)&positive, sizeof(bool));
+ is.read((char *)&multiplier, sizeof(int));
}
@@ -352,6 +394,150 @@ void cFragmentIons::recalculateFragments(bool cyclicnterminus, bool cyclicctermi
fragmentions[ms_cterminal_ion_kplus].massdifference = H2O + Kplus;
fragmentions[ms_cterminal_ion_kplus].parent = ms_cterminal_ion_kplus;
+ // initialize ion H+
+ fragmentions[ms_hplus].nterminal = true;
+ fragmentions[ms_hplus].cterminal = true;
+ fragmentions[ms_hplus].name = "[M+H]+";
+ fragmentions[ms_hplus].massdifference = Hplus;
+ fragmentions[ms_hplus].parent = ms_hplus;
+ fragmentions[ms_hplus].positive = true;
+ fragmentions[ms_hplus].multiplier = 1;
+
+ // initialize ion Na+
+ fragmentions[ms_naplus].nterminal = true;
+ fragmentions[ms_naplus].cterminal = true;
+ fragmentions[ms_naplus].name = "[M+Na]+";
+ fragmentions[ms_naplus].massdifference = Naplus;
+ fragmentions[ms_naplus].parent = ms_naplus;
+ fragmentions[ms_naplus].positive = true;
+ fragmentions[ms_naplus].multiplier = 1;
+
+ // initialize ion K+
+ fragmentions[ms_kplus].nterminal = true;
+ fragmentions[ms_kplus].cterminal = true;
+ fragmentions[ms_kplus].name = "[M+K]+";
+ fragmentions[ms_kplus].massdifference = Kplus;
+ fragmentions[ms_kplus].parent = ms_kplus;
+ fragmentions[ms_kplus].positive = true;
+ fragmentions[ms_kplus].multiplier = 1;
+
+ // initialize ion H-
+ fragmentions[ms_hminus].nterminal = true;
+ fragmentions[ms_hminus].cterminal = true;
+ fragmentions[ms_hminus].name = "[M-H]-";
+ fragmentions[ms_hminus].massdifference = -Hplus;
+ fragmentions[ms_hminus].parent = ms_hminus;
+ fragmentions[ms_hminus].positive = false;
+ fragmentions[ms_hminus].multiplier = 1;
+
+ // initialize ion [3M+2Fe-5H]+
+ fragmentions[ms_3M2Fe5H].nterminal = true;
+ fragmentions[ms_3M2Fe5H].cterminal = true;
+ fragmentions[ms_3M2Fe5H].name = "[3M+2Fe-5H]+";
+ fragmentions[ms_3M2Fe5H].massdifference = 2*Fe - 6*H + Hplus;
+ fragmentions[ms_3M2Fe5H].parent = ms_3M2Fe5H;
+ fragmentions[ms_3M2Fe5H].positive = true;
+ fragmentions[ms_3M2Fe5H].multiplier = 3;
+
+ // initialize ion [2M+Fe-2H]+
+ fragmentions[ms_2MFe2H].nterminal = true;
+ fragmentions[ms_2MFe2H].cterminal = true;
+ fragmentions[ms_2MFe2H].name = "[2M+Fe-2H]+";
+ fragmentions[ms_2MFe2H].massdifference = Fe - 3*H + Hplus;
+ fragmentions[ms_2MFe2H].parent = ms_2MFe2H;
+ fragmentions[ms_2MFe2H].positive = true;
+ fragmentions[ms_2MFe2H].multiplier = 2;
+
+ // initialize ion [3M+Fe-2H]+
+ fragmentions[ms_3MFe2H].nterminal = true;
+ fragmentions[ms_3MFe2H].cterminal = true;
+ fragmentions[ms_3MFe2H].name = "[3M+Fe-2H]+";
+ fragmentions[ms_3MFe2H].massdifference = Fe - 3*H + Hplus;
+ fragmentions[ms_3MFe2H].parent = ms_3MFe2H;
+ fragmentions[ms_3MFe2H].positive = true;
+ fragmentions[ms_3MFe2H].multiplier = 3;
+
+ // initialize ion [M+Fe-2H]+
+ fragmentions[ms_MFe2H].nterminal = true;
+ fragmentions[ms_MFe2H].cterminal = true;
+ fragmentions[ms_MFe2H].name = "[M+Fe-2H]+";
+ fragmentions[ms_MFe2H].massdifference = Fe - 3*H + Hplus;
+ fragmentions[ms_MFe2H].parent = ms_MFe2H;
+ fragmentions[ms_MFe2H].positive = true;
+ fragmentions[ms_MFe2H].multiplier = 1;
+
+ // initialize ion [3M+2Fe-6H+Na]+
+ fragmentions[ms_3M2Fe6HNa].nterminal = true;
+ fragmentions[ms_3M2Fe6HNa].cterminal = true;
+ fragmentions[ms_3M2Fe6HNa].name = "[3M+2Fe-6H+Na]+";
+ fragmentions[ms_3M2Fe6HNa].massdifference = 2*Fe - 6*H + Naplus;
+ fragmentions[ms_3M2Fe6HNa].parent = ms_3M2Fe6HNa;
+ fragmentions[ms_3M2Fe6HNa].positive = true;
+ fragmentions[ms_3M2Fe6HNa].multiplier = 3;
+
+ // initialize ion [2M+Fe-3H+Na]+
+ fragmentions[ms_2MFe3HNa].nterminal = true;
+ fragmentions[ms_2MFe3HNa].cterminal = true;
+ fragmentions[ms_2MFe3HNa].name = "[2M+Fe-3H+Na]+";
+ fragmentions[ms_2MFe3HNa].massdifference = Fe - 3*H + Naplus;
+ fragmentions[ms_2MFe3HNa].parent = ms_2MFe3HNa;
+ fragmentions[ms_2MFe3HNa].positive = true;
+ fragmentions[ms_2MFe3HNa].multiplier = 2;
+
+ // initialize ion [3M+Fe-3H+Na]+
+ fragmentions[ms_3MFe3HNa].nterminal = true;
+ fragmentions[ms_3MFe3HNa].cterminal = true;
+ fragmentions[ms_3MFe3HNa].name = "[3M+Fe-3H+Na]+";
+ fragmentions[ms_3MFe3HNa].massdifference = Fe - 3*H + Naplus;
+ fragmentions[ms_3MFe3HNa].parent = ms_3MFe3HNa;
+ fragmentions[ms_3MFe3HNa].positive = true;
+ fragmentions[ms_3MFe3HNa].multiplier = 3;
+
+ // initialize ion [M+Fe-3H+Na]+
+ fragmentions[ms_MFe3HNa].nterminal = true;
+ fragmentions[ms_MFe3HNa].cterminal = true;
+ fragmentions[ms_MFe3HNa].name = "[M+Fe-3H+Na]+";
+ fragmentions[ms_MFe3HNa].massdifference = Fe - 3*H + Naplus;
+ fragmentions[ms_MFe3HNa].parent = ms_MFe3HNa;
+ fragmentions[ms_MFe3HNa].positive = true;
+ fragmentions[ms_MFe3HNa].multiplier = 1;
+
+ // initialize ion [3M+2Fe-7H]-
+ fragmentions[ms_3M2Fe7H].nterminal = true;
+ fragmentions[ms_3M2Fe7H].cterminal = true;
+ fragmentions[ms_3M2Fe7H].name = "[3M+2Fe-7H]-";
+ fragmentions[ms_3M2Fe7H].massdifference = 2*Fe - 6*H - Hplus;
+ fragmentions[ms_3M2Fe7H].parent = ms_3M2Fe7H;
+ fragmentions[ms_3M2Fe7H].positive = false;
+ fragmentions[ms_3M2Fe7H].multiplier = 3;
+
+ // initialize ion [2M+Fe-4H]-
+ fragmentions[ms_2MFe4H].nterminal = true;
+ fragmentions[ms_2MFe4H].cterminal = true;
+ fragmentions[ms_2MFe4H].name = "[2M+Fe-4H]-";
+ fragmentions[ms_2MFe4H].massdifference = Fe - 3*H - Hplus;
+ fragmentions[ms_2MFe4H].parent = ms_2MFe4H;
+ fragmentions[ms_2MFe4H].positive = false;
+ fragmentions[ms_2MFe4H].multiplier = 2;
+
+ // initialize ion [3M+Fe-4H]-
+ fragmentions[ms_3MFe4H].nterminal = true;
+ fragmentions[ms_3MFe4H].cterminal = true;
+ fragmentions[ms_3MFe4H].name = "[3M+Fe-4H]-";
+ fragmentions[ms_3MFe4H].massdifference = Fe - 3*H - Hplus;
+ fragmentions[ms_3MFe4H].parent = ms_3MFe4H;
+ fragmentions[ms_3MFe4H].positive = false;
+ fragmentions[ms_3MFe4H].multiplier = 3;
+
+ // initialize ion [M+Fe-4H]-
+ fragmentions[ms_MFe4H].nterminal = true;
+ fragmentions[ms_MFe4H].cterminal = true;
+ fragmentions[ms_MFe4H].name = "[M+Fe-4H]-";
+ fragmentions[ms_MFe4H].massdifference = Fe - 3*H - Hplus;
+ fragmentions[ms_MFe4H].parent = ms_MFe4H;
+ fragmentions[ms_MFe4H].positive = false;
+ fragmentions[ms_MFe4H].multiplier = 1;
+
// initialize B-2H ion
//fragmentions[b_ion_2H_loss].nterminal = true;
//fragmentions[b_ion_2H_loss].cterminal = false;
diff --git a/CycloBranch/core/cFragmentIons.h b/CycloBranch/core/cFragmentIons.h
index 77597c7..66cda9b 100644
--- a/CycloBranch/core/cFragmentIons.h
+++ b/CycloBranch/core/cFragmentIons.h
@@ -14,6 +14,7 @@
#include
";
- if (parameters.mode == 0) {
+ if (parameters.mode == denovoengine) {
out << "De Novo Graph
\n";
@@ -600,6 +692,12 @@ void cMainWindow::saveResultsFile() {
if (outfile.is_open()) {
int size;
+ // write the application name and version
+ QString appinfo = appname + " " + appversion;
+ size = (int)appinfo.toStdString().size();
+ outfile.write((char *)&size, sizeof(int));
+ outfile.write(appinfo.toStdString().c_str(), size);
+
// store graph window
graph->store(outfile);
@@ -643,6 +741,23 @@ void cMainWindow::openResultsFile() {
string s;
cTheoreticalSpectrum theoreticalspectrum;
+ // read the application name and version
+ infile.read((char *)&size, sizeof(int));
+ s.resize(size);
+ infile.read(&s[0], s.size());
+ QString appinfo = appname + " " + appversion;
+ if (appinfo.toStdString().compare(s) != 0) {
+ QMessageBox msgBox;
+ QString errstr = "The results file cannot be read because it was created by different version ";
+ errstr += s.c_str();
+ errstr += ".";
+ msgBox.setText(errstr);
+ msgBox.exec();
+
+ infile.close();
+ return;
+ }
+
deleteResults();
resultsDetails.clear();
@@ -696,6 +811,7 @@ cMainWindow::~cMainWindow() {
delete menuFile;
delete menuSearch;
+ delete menuTools;
delete menuView;
delete menuHelp;
@@ -706,6 +822,8 @@ cMainWindow::~cMainWindow() {
delete actionQuit;
delete actionProperties;
delete actionRun;
+ delete actionBricksDatabase;
+ delete actionSequenceDatabase;
delete actionGraph;
delete actionLog;
delete actionHTMLDocumentation;
@@ -718,6 +836,8 @@ cMainWindow::~cMainWindow() {
delete about;
delete graph;
+ delete bricksdatabasewidget;
+ delete sequencedatabasewidget;
delete parameterswidget;
}
diff --git a/CycloBranch/gui/cMainWindow.h b/CycloBranch/gui/cMainWindow.h
index 779a713..6a780ee 100644
--- a/CycloBranch/gui/cMainWindow.h
+++ b/CycloBranch/gui/cMainWindow.h
@@ -16,6 +16,8 @@
#include "gui/cGraphWidget.h"
#include "gui/cParametersWidget.h"
#include "gui/cSpectrumDetailWidget.h"
+#include "gui/cBricksDatabaseWidget.h"
+#include "gui/cSequenceDatabaseWidget.h"
#include "gui/cMainThread.h"
// forward declaration
@@ -54,6 +56,7 @@ class cMainWindow : public QMainWindow
// items in the menu
QMenu* menuFile;
QMenu* menuSearch;
+ QMenu* menuTools;
QMenu* menuView;
QMenu* menuHelp;
@@ -66,6 +69,8 @@ class cMainWindow : public QMainWindow
QAction* actionRun;
QAction* actionStop;
QAction* actionProperties;
+ QAction* actionBricksDatabase;
+ QAction* actionSequenceDatabase;
QAction* actionGraph;
QAction* actionLog;
QAction* actionHTMLDocumentation;
@@ -82,10 +87,13 @@ class cMainWindow : public QMainWindow
cAboutWidget* about;
cGraphWidget* graph;
+ cBricksDatabaseWidget* bricksdatabasewidget;
+ cSequenceDatabaseWidget* sequencedatabasewidget;
cParametersWidget* parameterswidget;
int resultsbasecolumncount;
int resultsspecificcolumncount;
+ int dbsearchspecificcolumncount;
vector resultsheadersort;
@@ -103,6 +111,10 @@ private slots:
void showAbout();
+ void showBricksDatabase();
+
+ void showSequenceDatabase();
+
void showGraph();
void showProperties();
diff --git a/CycloBranch/gui/cParametersWidget.cpp b/CycloBranch/gui/cParametersWidget.cpp
index f5b17b8..6848117 100644
--- a/CycloBranch/gui/cParametersWidget.cpp
+++ b/CycloBranch/gui/cParametersWidget.cpp
@@ -16,6 +16,7 @@
#include
#include
#include
+#include
cParametersWidget::cParametersWidget() {
@@ -25,6 +26,7 @@ cParametersWidget::cParametersWidget() {
oldsettingsfile = "";
peaklistfilename = "";
brickdatabasefilename = "";
+ sequencedatabasefilename = "";
stdbuttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Apply | QDialogButtonBox::Cancel);
stdbuttons->button(QDialogButtonBox::Ok)->setToolTip("Accept changes and hide window.");
@@ -54,6 +56,7 @@ cParametersWidget::cParametersWidget() {
peptidetype->addItem(tr("Branched"));
peptidetype->addItem(tr("Lasso"));
peptidetype->addItem(tr("Linear polysaccharide (beta version)"));
+ //peptidetype->addItem(tr("Other"));
peaklistformlayout->addRow(tr("Peptide Type: "), peptidetype);
peaklistline = new QLineEdit();
@@ -201,9 +204,11 @@ cParametersWidget::cParametersWidget() {
applicationformlayout = new QFormLayout();
mode = new QComboBox();
- mode->setToolTip("De Novo Search Engine (identification mode) - the default mode of the application.\nCompare Spectrum of Searched Sequence with Peaklist (annotation mode) - a theoretical spectrum is generated for an input \"Searched Peptide Sequence\" and it is compared with the peaklist.");
+ mode->setToolTip("De Novo Search Engine (identification mode) - the default mode of the application.\nCompare Peaklist with Spectrum of Searched Sequence (annotation mode) - a theoretical spectrum is generated for an input \"Searched Peptide Sequence\" and it is compared with the peaklist.\nCompare Peaklist with Database - MS/MS data (identification mode) - the peaklist is compared with theoretical spectra generated from a database of sequences.\nCompare Peaklist with Database - MS data (identification mode) - the peaklist is compared with theoretical peaks generated from a database of sequences.");
mode->addItem(tr("De Novo Search Engine"));
- mode->addItem(tr("Compare Spectrum of Searched Sequence with Peaklist"));
+ mode->addItem(tr("Compare Peaklist with Spectrum of Searched Sequence"));
+ mode->addItem(tr("Compare Peaklist with Database - MS/MS data"));
+ mode->addItem(tr("Compare Peaklist with Database - MS data"));
applicationformlayout->addRow(tr("Mode: "), mode);
maximumnumberofthreads = new QSpinBox();
@@ -215,8 +220,8 @@ cParametersWidget::cParametersWidget() {
scoretype = new QComboBox();
scoretype->setToolTip("A score for peptide-spectrum matches.");
scoretype->addItem(tr("Number of b-ions"));
- scoretype->addItem(tr("Number of b-ions + water loss b-ions"));
- scoretype->addItem(tr("Number of b-ions + ammonia loss b-ions"));
+ scoretype->addItem(tr("Number of b-ions + dehydrated b-ions"));
+ scoretype->addItem(tr("Number of b-ions + deamidated b-ions"));
scoretype->addItem(tr("Number of y-ions + b-ions (not for cyclic peptides)"));
scoretype->addItem(tr("Number of y-ions (not for cyclic peptides)"));
scoretype->addItem(tr("Sum of relative intensities of matched peaks"));
@@ -240,7 +245,7 @@ cParametersWidget::cParametersWidget() {
applicationformlayout->addRow(tr("Fragment Ion Types in Theoretical Spectra: "), fragmentiontypes);
clearhitswithoutparent = new QCheckBox();
- clearhitswithoutparent->setToolTip("When checked, a hit of a peak is not considered when corresponding parent peak is not hit (e.g., a hit of a water loss b-ion is not considered as a hit when corresponding b-ion has not been hit).");
+ clearhitswithoutparent->setToolTip("When checked, a hit of a peak is not considered when corresponding parent peak is not hit (e.g., a hit of a dehydrated b-ion is not considered as a hit when corresponding b-ion has not been hit).");
applicationformlayout->addRow(tr("Remove Hits of Fragments without Hits of Parent Fragments: "), clearhitswithoutparent);
cyclicnterminus = new QCheckBox();
@@ -272,10 +277,25 @@ cParametersWidget::cParametersWidget() {
denovographgroupbox->setLayout(denovographformlayout);
+ databasesearchformlayout = new QFormLayout();
+
+ sequencedatabaseline = new QLineEdit();
+ sequencedatabaseline->setToolTip("Select the txt file containing a database of sequences.");
+ sequencedatabasebutton = new QPushButton("Select");
+ sequencedatabasebutton->setToolTip("Select the txt file containing a database of sequences.");
+ sequencedatabaselayout = new QHBoxLayout();
+ sequencedatabaselayout->addWidget(sequencedatabaseline);
+ sequencedatabaselayout->addWidget(sequencedatabasebutton);
+ databasesearchformlayout->addRow(tr("Sequence Database File: "), sequencedatabaselayout);
+
+ databasesearchgroupbox = new QGroupBox("Database Search");
+ databasesearchgroupbox->setLayout(databasesearchformlayout);
+
+
searchedsequenceformlayout = new QFormLayout();
searchedsequence = new QLineEdit();
- searchedsequence->setToolTip("A peptide sequence which you are searching for or a peptide sequence tag.\nA peptide sequence must be entered when \"Mode\" is set up to \"Compare Spectrum of Searched Sequence with Peaklist\".\nOtherwise, it is similar to the option \"Peptide Sequence Tag\" with a difference that a peptide sequence candidate is not removed from the search but it is just highlighted in an output report of peptide sequence candidates.");
+ searchedsequence->setToolTip("A peptide sequence which you are searching for or a peptide sequence tag.\nA peptide sequence must be entered when \"Mode\" is set up to \"Compare Peaklist with Spectrum of Searched Sequence\".\nOtherwise, it is similar to the option \"Peptide Sequence Tag\" with a difference that a peptide sequence candidate is not removed from the search but it is just highlighted in an output report of peptide sequence candidates.");
searchedsequence->setMaxLength(1024*1024);
searchedsequenceformlayout->addRow(tr("Sequence: "), searchedsequence);
@@ -303,6 +323,7 @@ cParametersWidget::cParametersWidget() {
vlayout2 = new QVBoxLayout();
vlayout2->addWidget(applicationgroupbox);
vlayout2->addWidget(denovographgroupbox);
+ vlayout2->addWidget(databasesearchgroupbox);
vlayout2->addWidget(searchedsequencegroupbox);
vlayout2->addStretch(1);
@@ -334,6 +355,7 @@ cParametersWidget::cParametersWidget() {
connect(peptidetype, SIGNAL(currentIndexChanged(int)), this, SLOT(updateSettingsWhenPeptideTypeChanged(int)));
connect(mode, SIGNAL(currentIndexChanged(int)), this, SLOT(updateSettingsWhenModeChanged(int)));
connect(fragmentiontypes, SIGNAL(resetReleased()), this, SLOT(resetFragmentIonTypes()));
+ connect(sequencedatabasebutton, SIGNAL(released()), this, SLOT(sequenceDatabaseButtonReleased()));
updateSettingsWhenPeptideTypeChanged(peptidetype->currentIndex());
@@ -346,6 +368,7 @@ cParametersWidget::cParametersWidget() {
lastdirsavesettings = "./Settings/";
lastdirselectpeaklist = "./PeakLists/";
lastdirselectbricksdatabase = "./BrickDatabases/";
+ lastdirselectsequencedatabase = "./SequenceDatabases/";
}
@@ -412,6 +435,12 @@ cParametersWidget::~cParametersWidget() {
delete denovographformlayout;
delete denovographgroupbox;
+ delete sequencedatabaseline;
+ delete sequencedatabasebutton;
+ delete sequencedatabaselayout;
+ delete databasesearchformlayout;
+ delete databasesearchgroupbox;
+
delete searchedsequence;
delete searchedsequenceNtermmodif;
delete searchedsequenceCtermmodif;
@@ -572,6 +601,8 @@ void cParametersWidget::loadSettings() {
blindedges->setCurrentIndex(settings.value("blindedges", 2).toInt());
+ sequencedatabaseline->setText(settings.value("sequencedatabase", "").toString());
+
searchedsequence->setText(settings.value("searchedsequence", "").toString());
searchedsequenceNtermmodif->setText(settings.value("searchedsequenceNtermmodif", "").toString());
searchedsequenceCtermmodif->setText(settings.value("searchedsequenceCtermmodif", "").toString());
@@ -651,6 +682,8 @@ void cParametersWidget::saveSettings() {
settings.setValue("blindedges", blindedges->currentIndex());
+ settings.setValue("sequencedatabase", sequencedatabaseline->text());
+
settings.setValue("searchedsequence", searchedsequence->text());
settings.setValue("searchedsequenceNtermmodif", searchedsequenceNtermmodif->text());
settings.setValue("searchedsequenceCtermmodif", searchedsequenceCtermmodif->text());
@@ -683,7 +716,7 @@ void cParametersWidget::peaklistButtonReleased() {
void cParametersWidget::brickDatabaseButtonReleased() {
- QString filename = QFileDialog::getOpenFileName(this, tr("Select Brick Database..."), lastdirselectbricksdatabase, tr("Text Files (*.txt)"));
+ QString filename = QFileDialog::getOpenFileName(this, tr("Select Building Blocks Database..."), lastdirselectbricksdatabase, tr("Text Files (*.txt)"));
lastdirselectbricksdatabase = filename;
if (filename.toStdString().compare("") != 0) {
@@ -693,6 +726,17 @@ void cParametersWidget::brickDatabaseButtonReleased() {
}
+void cParametersWidget::sequenceDatabaseButtonReleased() {
+ QString filename = QFileDialog::getOpenFileName(this, tr("Select Sequence Database..."), lastdirselectsequencedatabase, tr("Text Files (*.txt)"));
+ lastdirselectsequencedatabase = filename;
+
+ if (filename.toStdString().compare("") != 0) {
+ sequencedatabasefilename = filename.toStdString();
+ sequencedatabaseline->setText(filename);
+ }
+}
+
+
void cParametersWidget::modificationsInsertButtonReleased() {
modificationsTableInsertRow();
}
@@ -703,7 +747,31 @@ void cParametersWidget::modificationsRemoveButtonReleased() {
}
-void cParametersWidget::updateParameters() {
+bool cParametersWidget::updateParameters() {
+ QMessageBox msgBox;
+ QString errstr;
+
+ if (peaklistline->text().toStdString().compare("") == 0) {
+ errstr = "A peaklist must be specified.";
+ msgBox.setText(errstr);
+ msgBox.exec();
+ return false;
+ }
+
+ if ((brickdatabaseline->text().toStdString().compare("") == 0) && (((modeType)mode->currentIndex() == denovoengine) || ((modeType)mode->currentIndex() == singlecomparison) || ((modeType)mode->currentIndex() == databasesearch))) {
+ errstr = "A database of building blocks must be specified.";
+ msgBox.setText(errstr);
+ msgBox.exec();
+ return false;
+ }
+
+ if ((sequencedatabaseline->text().toStdString().compare("") == 0) && (((modeType)mode->currentIndex() == databasesearch) || ((modeType)mode->currentIndex() == dereplication))) {
+ errstr = "A sequence database must be specified.";
+ msgBox.setText(errstr);
+ msgBox.exec();
+ return false;
+ }
+
parameters.peptidetype = (peptideType)peptidetype->currentIndex();
parameters.peaklistfilename = peaklistline->text().toStdString();
parameters.precursormass = precursormass->value();
@@ -740,7 +808,7 @@ void cParametersWidget::updateParameters() {
i++;
}
- parameters.mode = mode->currentIndex();
+ parameters.mode = (modeType)mode->currentIndex();
parameters.maximumnumberofthreads = maximumnumberofthreads->value();
parameters.scoretype = (scoreType)scoretype->currentIndex();
parameters.hitsreported = hitsreported->value();
@@ -749,23 +817,30 @@ void cParametersWidget::updateParameters() {
parameters.fragmentionsfortheoreticalspectra.clear();
int start;
- switch ((peptideType)peptidetype->currentIndex())
- {
- case linear:
- case branched:
- start = b_ion;
- break;
- case cyclic:
- start = b_ion;
- break;
- case lasso:
- start = b_ion;
- break;
- case linearpolysaccharide:
- start = ms_nterminal_ion_hplus;
- break;
- default:
- break;
+
+ if ((modeType)mode->currentIndex() == dereplication) {
+ start = ms_hplus;
+ }
+ else {
+ switch ((peptideType)peptidetype->currentIndex())
+ {
+ case linear:
+ case branched:
+ start = b_ion;
+ break;
+ case cyclic:
+ start = b_ion;
+ break;
+ case lasso:
+ start = b_ion;
+ break;
+ case linearpolysaccharide:
+ start = ms_nterminal_ion_hplus;
+ break;
+ case other:
+ default:
+ break;
+ }
}
for (int i = 0; i < fragmentiontypes->getList()->count(); i++) {
@@ -783,6 +858,8 @@ void cParametersWidget::updateParameters() {
parameters.blindedges = blindedges->currentIndex();
+ parameters.sequencedatabasefilename = sequencedatabaseline->text().toStdString();
+
parameters.searchedsequence = searchedsequence->text().toStdString();
parameters.originalsearchedsequence = parameters.searchedsequence;
parameters.searchedsequenceNtermmodif = searchedsequenceNtermmodif->text().toStdString();
@@ -790,12 +867,15 @@ void cParametersWidget::updateParameters() {
parameters.searchedsequenceTmodif = searchedsequenceTmodif->text().toStdString();
oldsettingsfile = settingsfile;
+
+ return true;
}
void cParametersWidget::updateParametersAndHide() {
- updateParameters();
- hide();
+ if (updateParameters()) {
+ hide();
+ }
}
@@ -845,23 +925,29 @@ void cParametersWidget::restoreParameters() {
sequencetag->setText(parameters.sequencetag.c_str());
int start;
- switch (parameters.peptidetype)
- {
- case linear:
- case branched:
- start = b_ion;
- break;
- case cyclic:
- start = b_ion;
- break;
- case lasso:
- start = b_ion;
- break;
- case linearpolysaccharide:
- start = ms_nterminal_ion_hplus;
- break;
- default:
- break;
+ if (parameters.mode == dereplication) {
+ start = ms_hplus;
+ }
+ else {
+ switch (parameters.peptidetype)
+ {
+ case linear:
+ case branched:
+ start = b_ion;
+ break;
+ case cyclic:
+ start = b_ion;
+ break;
+ case lasso:
+ start = b_ion;
+ break;
+ case linearpolysaccharide:
+ start = ms_nterminal_ion_hplus;
+ break;
+ case other:
+ default:
+ break;
+ }
}
for (int i = 0; i < (int)parameters.fragmentionsfortheoreticalspectra.size(); i++) {
@@ -875,6 +961,8 @@ void cParametersWidget::restoreParameters() {
blindedges->setCurrentIndex(parameters.blindedges);
+ sequencedatabaseline->setText(parameters.sequencedatabasefilename.c_str());
+
searchedsequence->setText(parameters.searchedsequence.c_str());
searchedsequenceNtermmodif->setText(parameters.searchedsequenceNtermmodif.c_str());
searchedsequenceCtermmodif->setText(parameters.searchedsequenceCtermmodif.c_str());
@@ -943,6 +1031,7 @@ void cParametersWidget::updateSettingsWhenPeptideTypeChanged(int index) {
cycliccterminus->setDisabled(true);
enablescrambling->setDisabled(true);
break;
+ case other:
default:
break;
}
@@ -951,11 +1040,15 @@ void cParametersWidget::updateSettingsWhenPeptideTypeChanged(int index) {
void cParametersWidget::updateSettingsWhenModeChanged(int index) {
- switch (index)
+ switch ((modeType)index)
{
- case 0:
+ case denovoengine:
+ peptidetype->setDisabled(false);
precursormass->setDisabled(false);
+ precursorcharge->setDisabled(false);
precursormasserrortolerance->setDisabled(false);
+ brickdatabaseline->setDisabled(false);
+ brickdatabasebutton->setDisabled(false);
maximumbricksincombinationbegin->setDisabled(false);
maximumbricksincombinationmiddle->setDisabled(false);
maximumbricksincombinationend->setDisabled(false);
@@ -965,11 +1058,69 @@ void cParametersWidget::updateSettingsWhenModeChanged(int index) {
scoretype->setDisabled(false);
hitsreported->setDisabled(false);
sequencetag->setDisabled(false);
+ fragmentiontypes->setDisabled(false);
+ clearhitswithoutparent->setDisabled(false);
denovographgroupbox->setDisabled(false);
+ databasesearchgroupbox->setDisabled(true);
+ searchedsequence->setDisabled(false);
+
+ updateSettingsWhenPeptideTypeChanged(peptidetype->currentIndex());
+ break;
+ case singlecomparison:
+ peptidetype->setDisabled(false);
+ precursormass->setDisabled(true);
+ precursorcharge->setDisabled(false);
+ precursormasserrortolerance->setDisabled(true);
+ brickdatabaseline->setDisabled(false);
+ brickdatabasebutton->setDisabled(false);
+ maximumbricksincombinationbegin->setDisabled(true);
+ maximumbricksincombinationmiddle->setDisabled(true);
+ maximumbricksincombinationend->setDisabled(true);
+ maximumcumulativemass->setDisabled(true);
+ generatebrickspermutations->setDisabled(true);
+ maximumnumberofthreads->setDisabled(true);
+ scoretype->setDisabled(true);
+ hitsreported->setDisabled(true);
+ sequencetag->setDisabled(true);
+ fragmentiontypes->setDisabled(false);
+ clearhitswithoutparent->setDisabled(false);
+ denovographgroupbox->setDisabled(true);
+ databasesearchgroupbox->setDisabled(true);
+ searchedsequence->setDisabled(false);
+
+ updateSettingsWhenPeptideTypeChanged(peptidetype->currentIndex());
+ break;
+ case databasesearch:
+ peptidetype->setDisabled(false);
+ precursormass->setDisabled(false);
+ precursorcharge->setDisabled(false);
+ precursormasserrortolerance->setDisabled(false);
+ brickdatabaseline->setDisabled(false);
+ brickdatabasebutton->setDisabled(false);
+ maximumbricksincombinationbegin->setDisabled(true);
+ maximumbricksincombinationmiddle->setDisabled(true);
+ maximumbricksincombinationend->setDisabled(true);
+ maximumcumulativemass->setDisabled(true);
+ generatebrickspermutations->setDisabled(true);
+ maximumnumberofthreads->setDisabled(false);
+ scoretype->setDisabled(false);
+ hitsreported->setDisabled(false);
+ sequencetag->setDisabled(false);
+ fragmentiontypes->setDisabled(false);
+ clearhitswithoutparent->setDisabled(false);
+ denovographgroupbox->setDisabled(true);
+ databasesearchgroupbox->setDisabled(false);
+ searchedsequence->setDisabled(false);
+
+ updateSettingsWhenPeptideTypeChanged(peptidetype->currentIndex());
break;
- case 1:
+ case dereplication:
+ peptidetype->setDisabled(true);
precursormass->setDisabled(true);
+ precursorcharge->setDisabled(false);
precursormasserrortolerance->setDisabled(true);
+ brickdatabaseline->setDisabled(true);
+ brickdatabasebutton->setDisabled(true);
maximumbricksincombinationbegin->setDisabled(true);
maximumbricksincombinationmiddle->setDisabled(true);
maximumbricksincombinationend->setDisabled(true);
@@ -979,7 +1130,21 @@ void cParametersWidget::updateSettingsWhenModeChanged(int index) {
scoretype->setDisabled(true);
hitsreported->setDisabled(true);
sequencetag->setDisabled(true);
+ fragmentiontypes->setDisabled(false);
+ clearhitswithoutparent->setDisabled(true);
denovographgroupbox->setDisabled(true);
+ databasesearchgroupbox->setDisabled(false);
+ searchedsequence->setDisabled(true);
+
+ resetFragmentIonTypes();
+
+ modificationsgroupbox->setDisabled(true);
+ searchedsequenceNtermmodif->setDisabled(true);
+ searchedsequenceCtermmodif->setDisabled(true);
+ searchedsequenceTmodif->setDisabled(true);
+ cyclicnterminus->setDisabled(true);
+ cycliccterminus->setDisabled(true);
+ enablescrambling->setDisabled(true);
break;
default:
break;
@@ -992,26 +1157,34 @@ void cParametersWidget::resetFragmentIonTypes() {
fragmentiontypes->getList()->clear();
fragmentIonType start, end;
- switch ((peptideType)peptidetype->currentIndex()) {
- case linear:
- case branched:
- start = b_ion;
- end = y_ion_water_and_ammonia_loss;
- break;
- case cyclic:
- start = b_ion;
- end = a_ion_water_and_ammonia_loss;
- break;
- case lasso:
- start = b_ion;
- end = y_ion_water_and_ammonia_loss;
- break;
- case linearpolysaccharide:
- start = ms_nterminal_ion_hplus;
- end = ms_cterminal_ion_kplus;
- break;
- default:
- break;
+
+ if ((modeType)mode->currentIndex() == dereplication) {
+ start = ms_hplus;
+ end = ms_MFe4H;
+ }
+ else {
+ switch ((peptideType)peptidetype->currentIndex()) {
+ case linear:
+ case branched:
+ start = b_ion;
+ end = y_ion_water_and_ammonia_loss;
+ break;
+ case cyclic:
+ start = b_ion;
+ end = a_ion_water_and_ammonia_loss;
+ break;
+ case lasso:
+ start = b_ion;
+ end = y_ion_water_and_ammonia_loss;
+ break;
+ case linearpolysaccharide:
+ start = ms_nterminal_ion_hplus;
+ end = ms_cterminal_ion_kplus;
+ break;
+ case other:
+ default:
+ break;
+ }
}
for (int i = start; i <= end; i++) {
diff --git a/CycloBranch/gui/cParametersWidget.h b/CycloBranch/gui/cParametersWidget.h
index c2ece92..b5661da 100644
--- a/CycloBranch/gui/cParametersWidget.h
+++ b/CycloBranch/gui/cParametersWidget.h
@@ -35,6 +35,7 @@ class QGroupBox;
class QCheckBox;
class QTableWidget;
class QListWidget;
+class QMessageBox;
/**
@@ -148,6 +149,13 @@ class cParametersWidget : public QWidget
QFormLayout* denovographformlayout;
QComboBox* blindedges;
+ QGroupBox* databasesearchgroupbox;
+ QFormLayout* databasesearchformlayout;
+ QLineEdit* sequencedatabaseline;
+ QPushButton* sequencedatabasebutton;
+ QHBoxLayout* sequencedatabaselayout;
+ string sequencedatabasefilename;
+
QGroupBox* searchedsequencegroupbox;
QFormLayout* searchedsequenceformlayout;
QLineEdit* searchedsequence;
@@ -159,6 +167,7 @@ class cParametersWidget : public QWidget
QString lastdirsavesettings;
QString lastdirselectpeaklist;
QString lastdirselectbricksdatabase;
+ QString lastdirselectsequencedatabase;
void deleteRow(int number);
@@ -181,11 +190,13 @@ private slots:
void brickDatabaseButtonReleased();
+ void sequenceDatabaseButtonReleased();
+
void modificationsInsertButtonReleased();
void modificationsRemoveButtonReleased();
- void updateParameters();
+ bool updateParameters();
void updateParametersAndHide();
diff --git a/CycloBranch/gui/cSequenceDatabaseWidget.cpp b/CycloBranch/gui/cSequenceDatabaseWidget.cpp
new file mode 100644
index 0000000..819b1ea
--- /dev/null
+++ b/CycloBranch/gui/cSequenceDatabaseWidget.cpp
@@ -0,0 +1,534 @@
+#include "gui/cSequenceDatabaseWidget.h"
+#include "gui/cMainThread.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+
+cSequenceDatabaseWidget::cSequenceDatabaseWidget(QWidget* parent) {
+ this->parent = parent;
+
+ setWindowTitle("Sequence Database Editor");
+
+ insertrow = new QPushButton(tr("Add Row"));
+ insertrow->setToolTip("Add a new row.");
+ removechecked = new QPushButton(tr(" Remove Rows "));
+ removechecked->setToolTip("Remove selected rows.");
+
+ close = new QPushButton(tr("Close"));
+ close->setToolTip("Close the window.");
+ load = new QPushButton(tr("Load"));
+ load->setToolTip("Load the database of sequences.");
+ save = new QPushButton(QString("Save"));
+ save->setToolTip("Save the database of sequences in the current file. When a file has not been loaded yet, the \"Save As ...\" file dialog is opened.");
+ saveas = new QPushButton(tr("Save As..."));
+ saveas->setToolTip("Save the database of sequences into a file.");
+
+ buttons = new QHBoxLayout();
+ buttons->addWidget(close);
+ buttons->addStretch(1);
+ buttons->addWidget(insertrow);
+ buttons->addWidget(removechecked);
+ buttons->addStretch(10);
+ buttons->addWidget(load);
+ buttons->addWidget(save);
+ buttons->addWidget(saveas);
+
+ database = new QTableWidget(0, 0, this);
+ database->setColumnCount(11);
+ database->setHorizontalHeaderItem(0, new QTableWidgetItem(""));
+ database->setHorizontalHeaderItem(1, new QTableWidgetItem("Type"));
+ database->setHorizontalHeaderItem(2, new QTableWidgetItem("Name"));
+ database->setHorizontalHeaderItem(3, new QTableWidgetItem("Summary Formula"));
+ database->setHorizontalHeaderItem(4, new QTableWidgetItem("Monoisotopic Mass"));
+ database->setHorizontalHeaderItem(5, new QTableWidgetItem("Sequence"));
+ database->setHorizontalHeaderItem(6, new QTableWidgetItem("N-terminal Modification"));
+ database->setHorizontalHeaderItem(7, new QTableWidgetItem("C-terminal Modification"));
+ database->setHorizontalHeaderItem(8, new QTableWidgetItem("Branch Modification"));
+ database->setHorizontalHeaderItem(9, new QTableWidgetItem("Reference"));
+ database->setHorizontalHeaderItem(10, new QTableWidgetItem("Preview"));
+ database->horizontalHeader()->setStretchLastSection(true);
+ for (int i = 0; i < database->columnCount(); i++) {
+ database->resizeColumnToContents(i);
+ }
+
+ headersort.resize(database->columnCount());
+ for (int i = 0; i < database->columnCount(); i++) {
+ headersort[i] = -1;
+ }
+
+ mainlayout = new QVBoxLayout();
+ mainlayout->addWidget(database);
+ mainlayout->addLayout(buttons);
+
+ progress = new QProgressDialog(this);
+ progress->setCancelButton(0);
+ progress->setMinimumDuration(1000);
+ progress->setWindowModality(Qt::WindowModal);
+
+ connect(database->horizontalHeader(), SIGNAL(sectionDoubleClicked(int)), this, SLOT(headerItemDoubleClicked(int)));
+ connect(database, SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(itemChanged(QTableWidgetItem *)));
+ connect(insertrow, SIGNAL(released()), this, SLOT(addRow()));
+ connect(removechecked, SIGNAL(released()), this, SLOT(removeEmptyRows()));
+ connect(close, SIGNAL(released()), this, SLOT(closeWindow()));
+ connect(load, SIGNAL(released()), this, SLOT(loadDatabase()));
+ connect(save, SIGNAL(released()), this, SLOT(saveDatabase()));
+ connect(saveas, SIGNAL(released()), this, SLOT(saveDatabaseAs()));
+
+ setLayout(mainlayout);
+
+ resize(1280, 700);
+
+ databasefile = "";
+ lastdir = "./SequenceDatabases/";
+ sequences.clear();
+}
+
+
+cSequenceDatabaseWidget::~cSequenceDatabaseWidget() {
+ deleteTable(false);
+
+ for (int i = 0; i < database->columnCount(); i++) {
+ delete database->horizontalHeaderItem(i);
+ }
+
+ database->setColumnCount(0);
+
+ delete insertrow;
+ delete removechecked;
+ delete close;
+ delete load;
+ delete save;
+ delete saveas;
+ delete database;
+ delete buttons;
+ delete mainlayout;
+ delete progress;
+}
+
+
+void cSequenceDatabaseWidget::closeEvent(QCloseEvent *event) {
+ closeWindow();
+}
+
+
+void cSequenceDatabaseWidget::deleteTable(bool enableprogress) {
+ if (enableprogress) {
+ progress->setLabelText("Clearing the table...");
+ progress->setMinimum(0);
+ progress->setValue(1);
+ progress->setMaximum(database->rowCount());
+ progress->show();
+ }
+
+ for (int i = 0; i < database->rowCount(); i++) {
+ for (int j = 0; j < database->columnCount(); j++) {
+ if ((j == 0) || (j == 1) || (j == 10)) {
+ delete database->cellWidget(i, j);
+ }
+ else {
+ delete database->item(i, j);
+ }
+ }
+
+ if (enableprogress && ((i == 0) || ((i - 1)/100 != i/100))) {
+ progress->setValue(i);
+ }
+ }
+
+ if (enableprogress) {
+ progress->setValue(database->rowCount());
+ progress->hide();
+ }
+ database->setRowCount(0);
+}
+
+
+void cSequenceDatabaseWidget::removeRow(int row) {
+ for (int i = 0; i < database->columnCount(); i++) {
+ if ((i == 0) || (i == 1) || (i == 10)) {
+ delete database->cellWidget(row, i);
+ }
+ else {
+ delete database->item(row, i);
+ }
+ }
+ database->removeRow(row);
+}
+
+
+bool cSequenceDatabaseWidget::checkTable() {
+
+ // check summary formulas
+ for (int i = 0; i < database->rowCount(); i++) {
+ if (!checkFormula(i, database->item(i, 3)->text().toStdString())) {
+ return false;
+ }
+ }
+
+ // check sequences
+ for (int i = 0; i < database->rowCount(); i++) {
+ if (!checkSequence(i)) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+
+bool cSequenceDatabaseWidget::checkFormula(int row, string& summary) {
+ cSummaryFormula formula;
+ string errmsg;
+ formula.setFormula(summary);
+ if (!formula.isValid(errmsg)) {
+ QMessageBox msgBox;
+ QString errstr = "Syntax error in the row no. ";
+ errstr += to_string(row + 1).c_str();
+ errstr += ": ";
+ errstr += errmsg.c_str();
+ msgBox.setText(errstr);
+ msgBox.exec();
+ return false;
+ }
+ if (database->item(row, 4)) {
+ database->item(row, 4)->setData(Qt::DisplayRole, formula.getMass());
+ }
+ return true;
+}
+
+
+bool cSequenceDatabaseWidget::checkSequence(int row) {
+ regex rx;
+ // [^\\[\\]]+ is used instead of .+ to prevent from a too complex regex error
+ switch ((peptideType)((QComboBox *)database->cellWidget(row, 1))->currentIndex())
+ {
+ case linear:
+ case cyclic:
+ case linearpolysaccharide:
+ rx = "^\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*$";
+ break;
+ case branched:
+ rx = "^\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*\\\\\\(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*\\\\\\)\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*$";
+ break;
+ case lasso:
+ rx = "(^(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*)?\\\\\\(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*\\\\\\)\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*$|^\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*\\\\\\(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*\\\\\\)(\\[[^\\[\\]]+\\](-\\[[^\\[\\]]+\\])*)?$)";
+ break;
+ case other:
+ default:
+ rx = ".*";
+ break;
+ }
+
+ try {
+ if (!(regex_search(database->item(row, 5)->text().toStdString(), rx))) {
+ QMessageBox msgBox;
+ QString errstr = "Row no. ";
+ errstr += to_string(row + 1).c_str();
+ errstr += ". The format of sequence '";
+ errstr += database->item(row, 5)->text().toStdString().c_str();
+ errstr += "' does not correspond to the sequence type '";
+ errstr += getStringFromPeptideType((peptideType)((QComboBox *)database->cellWidget(row, 1))->currentIndex()).c_str();
+ errstr += "'.";
+ msgBox.setText(errstr);
+ msgBox.exec();
+ return false;
+ }
+ }
+ catch (std::regex_error& e) {
+ QMessageBox msgBox;
+ QString errstr = "Row no. ";
+ errstr += to_string(row + 1).c_str();
+ errstr += ". cSequenceDatabaseWidget::checkSequence: regex_search failed, error no. ";
+ errstr += to_string(e.code()).c_str();
+ errstr += ". Please, check the sequence: '";
+ errstr += database->item(row, 5)->text().toStdString().c_str();
+ errstr += "'.";
+ msgBox.setText(errstr);
+ msgBox.exec();
+ return false;
+ }
+
+ return true;
+}
+
+
+void cSequenceDatabaseWidget::closeWindow() {
+ hide();
+}
+
+
+void cSequenceDatabaseWidget::loadDatabase() {
+ QString filename = QFileDialog::getOpenFileName(this, tr("Load the Database of Sequences"), lastdir, tr("Database of Sequences (*.txt)"));
+ lastdir = filename;
+
+ if (filename.toStdString().compare("") != 0) {
+
+ databasefile = filename;
+ save->setText(QString(" Save '") + QString(databasefile.toStdString().substr(databasefile.toStdString().rfind('/') + 1, databasefile.toStdString().size()).c_str()) + QString("' "));
+
+ inputstream.open(filename.toStdString().c_str());
+
+ if (!inputstream.good()) {
+ QMessageBox msgBox;
+ msgBox.setText("Cannot open the file '" + databasefile + "'.");
+ msgBox.exec();
+ }
+ else {
+
+ deleteTable(true);
+
+ sequences.clear();
+ sequences.loadFromPlainTextStream(inputstream);
+
+ progress->setLabelText("Loading the Sequence Databatase...");
+ progress->setMinimum(0);
+ progress->setValue(1);
+ progress->setMaximum(sequences.size());
+ progress->show();
+
+ cSummaryFormula formula;
+ database->setRowCount(sequences.size());
+ for (int i = 0; i < sequences.size(); i++) {
+ QCheckBox* checkbox = new QCheckBox();
+ database->setCellWidget(i, 0, checkbox);
+
+ QComboBox* combo = new QComboBox();
+ for (int j = 0; j <= (int)other; j++) {
+ combo->addItem(QString(getStringFromPeptideType((peptideType)j).c_str()));
+ }
+ combo->setCurrentIndex((int)sequences[i].getPeptideType());
+ database->setCellWidget(i, 1, combo);
+
+ database->setItem(i, 2, new QTableWidgetItem(sequences[i].getName().c_str()));
+ database->setItem(i, 3, new QTableWidgetItem(sequences[i].getSummaryFormula().c_str()));
+ formula.setFormula(sequences[i].getSummaryFormula());
+ database->setItem(i, 4, new QTableWidgetItem());
+ database->item(i, 4)->setData(Qt::DisplayRole, formula.getMass());
+ database->setItem(i, 5, new QTableWidgetItem(sequences[i].getSequence().c_str()));
+ database->setItem(i, 6, new QTableWidgetItem(sequences[i].getNTterminalModification().c_str()));
+ database->setItem(i, 7, new QTableWidgetItem(sequences[i].getCTterminalModification().c_str()));
+ database->setItem(i, 8, new QTableWidgetItem(sequences[i].getBranchModification().c_str()));
+ database->setItem(i, 9, new QTableWidgetItem(sequences[i].getReference().c_str()));
+
+ database->setCellWidget(i, 10, new QLabel(sequences[i].getNameWithReferenceAsHTMLString().c_str()));
+ ((QLabel *)database->cellWidget(i, 10))->setTextFormat(Qt::RichText);
+ ((QLabel *)database->cellWidget(i, 10))->setTextInteractionFlags(Qt::TextBrowserInteraction);
+ ((QLabel *)database->cellWidget(i, 10))->setOpenExternalLinks(true);
+
+ if ((i == 0) || ((i - 1)/100 != i/100)) {
+ progress->setValue(i);
+ }
+ }
+
+ for (int i = 0; i < database->columnCount(); i++) {
+ database->resizeColumnToContents(i);
+ }
+
+ progress->setValue(sequences.size());
+ progress->hide();
+
+ }
+
+ inputstream.close();
+
+ }
+}
+
+
+void cSequenceDatabaseWidget::saveDatabase() {
+
+ if (!checkTable()) {
+ return;
+ }
+
+ if (databasefile.compare("") == 0) {
+ saveDatabaseAs();
+ return;
+ }
+
+ outputstream.open(databasefile.toStdString().c_str());
+ if (!outputstream.good()) {
+ QMessageBox msgBox;
+ msgBox.setText("Cannot open the file '" + databasefile + "'.");
+ msgBox.exec();
+ }
+ else {
+
+ progress->setLabelText("Saving the Sequence Databatase...");
+ progress->setMinimum(0);
+ progress->setMaximum(100);
+ progress->setValue(1);
+ progress->show();
+
+ cSequence seq;
+ sequences.clear();
+
+ removeEmptyRows();
+
+ progress->setMaximum(database->rowCount());
+
+ for (int i = 0; i < database->rowCount(); i++) {
+ seq.clear();
+ for (int j = 0; j < database->columnCount(); j++) {
+ switch (j)
+ {
+ case 0:
+ // nothing to do
+ break;
+ case 1:
+ seq.setPeptideType((peptideType)(((QComboBox *)database->cellWidget(i,j))->currentIndex()));
+ break;
+ case 2:
+ seq.setName(database->item(i,j)->text().toStdString());
+ break;
+ case 3:
+ seq.setSummaryFormula(database->item(i,j)->text().toStdString());
+ break;
+ case 4:
+ // nothing to do
+ break;
+ case 5:
+ seq.setSequence(database->item(i,j)->text().toStdString());
+ break;
+ case 6:
+ seq.setNTterminalModification(database->item(i,j)->text().toStdString());
+ break;
+ case 7:
+ seq.setCTterminalModification(database->item(i,j)->text().toStdString());
+ break;
+ case 8:
+ seq.setBranchModification(database->item(i,j)->text().toStdString());
+ break;
+ case 9:
+ seq.setReference(database->item(i,j)->text().toStdString());
+ break;
+ default:
+ break;
+ }
+ }
+ sequences.push_back(seq);
+
+ if ((i == 0) || ((i - 1)/100 != i/100)) {
+ progress->setValue(i);
+ }
+ }
+
+ sequences.storeToPlainTextStream(outputstream);
+
+ progress->setValue(database->rowCount());
+ progress->hide();
+
+ }
+ outputstream.close();
+}
+
+
+void cSequenceDatabaseWidget::saveDatabaseAs() {
+
+ if (!checkTable()) {
+ return;
+ }
+
+ QString filename = QFileDialog::getSaveFileName(this, tr("Save Settings As..."), lastdir, tr("Database of Sequences (*.txt)"));
+ lastdir = filename;
+
+ if (filename.toStdString().compare("") != 0) {
+ databasefile = filename;
+ save->setText(QString(" Save '") + QString(databasefile.toStdString().substr(databasefile.toStdString().rfind('/') + 1, databasefile.toStdString().size()).c_str()) + QString("' "));
+ saveDatabase();
+ }
+}
+
+
+void cSequenceDatabaseWidget::addRow() {
+ int row = database->rowCount();
+ database->insertRow(row);
+
+ QCheckBox* checkbox = new QCheckBox();
+ database->setCellWidget(row, 0, checkbox);
+
+ QComboBox* combo = new QComboBox();
+ for (int i = 0; i <= (int)other; i++) {
+ combo->addItem(QString(getStringFromPeptideType((peptideType)i).c_str()));
+ }
+ combo->setCurrentIndex((int)other);
+ database->setCellWidget(row, 1, combo);
+
+ database->setItem(row, 2, new QTableWidgetItem());
+ database->setItem(row, 3, new QTableWidgetItem());
+ database->setItem(row, 4, new QTableWidgetItem());
+ database->setItem(row, 5, new QTableWidgetItem());
+ database->setItem(row, 6, new QTableWidgetItem());
+ database->setItem(row, 7, new QTableWidgetItem());
+ database->setItem(row, 8, new QTableWidgetItem());
+ database->setItem(row, 9, new QTableWidgetItem());
+
+ database->setCellWidget(row, 10, new QLabel());
+ ((QLabel *)database->cellWidget(row, 10))->setTextFormat(Qt::RichText);
+ ((QLabel *)database->cellWidget(row, 10))->setTextInteractionFlags(Qt::TextBrowserInteraction);
+ ((QLabel *)database->cellWidget(row, 10))->setOpenExternalLinks(true);
+}
+
+
+void cSequenceDatabaseWidget::removeEmptyRows() {
+ int i = 0;
+ while (i < database->rowCount()) {
+ if (((QCheckBox *)(database->cellWidget(i, 0)))->isChecked()) {
+ removeRow(i);
+ }
+ else {
+ i++;
+ }
+ }
+}
+
+
+void cSequenceDatabaseWidget::itemChanged(QTableWidgetItem* item) {
+ // recalculate mass when formula is changed
+ if (item->column() == 3) {
+ checkFormula(item->row(), item->text().toStdString());
+ }
+
+ // check sequence
+ if (item->column() == 5) {
+ checkSequence(item->row());
+ }
+
+ // update references preview
+ if (((item->column() == 2) || (item->column() == 9)) && database->cellWidget(item->row(), 10)) {
+ cSequence seq;
+ seq.setName(database->item(item->row(), 2)->text().toStdString());
+ seq.setReference(database->item(item->row(), 9)->text().toStdString());
+ ((QLabel *)database->cellWidget(item->row(), 10))->setText(seq.getNameWithReferenceAsHTMLString().c_str());
+ }
+}
+
+
+void cSequenceDatabaseWidget::headerItemDoubleClicked(int index) {
+ if (headersort[index] == -1) {
+ database->sortByColumn(index, Qt::AscendingOrder);
+ headersort[index] = 1;
+ return;
+ }
+
+ if (headersort[index] == 0) {
+ database->sortByColumn(index, Qt::AscendingOrder);
+ headersort[index] = 1;
+ }
+ else {
+ database->sortByColumn(index, Qt::DescendingOrder);
+ headersort[index] = 0;
+ }
+}
+
diff --git a/CycloBranch/gui/cSequenceDatabaseWidget.h b/CycloBranch/gui/cSequenceDatabaseWidget.h
new file mode 100644
index 0000000..d568f39
--- /dev/null
+++ b/CycloBranch/gui/cSequenceDatabaseWidget.h
@@ -0,0 +1,110 @@
+/**
+ \file cSequenceDatabaseWidget.h
+ \brief Visualization of the database of sequences.
+*/
+
+
+#ifndef _CSEQUENCEDATABASEWIDGET_H
+#define _CSEQUENCEDATABASEWIDGET_H
+
+#include
+#include
+#include "core/cSequenceDatabase.h"
+
+using namespace std;
+
+
+// forward declaration
+class QHBoxLayout;
+class QVBoxLayout;
+class QTableWidget;
+class QTableWidgetItem;
+class QDialogButtonBox;
+class QPushButton;
+class QLabel;
+class QComboBox;
+class QProgressDialog;
+
+
+/**
+ \brief The widget representing the dialog 'About'.
+*/
+class cSequenceDatabaseWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+
+
+ /**
+ \brief The constructor.
+ \param parent pointer to a parent widget
+ */
+ cSequenceDatabaseWidget(QWidget* parent = (QWidget *)0);
+
+
+ /**
+ \brief The destructor.
+ */
+ ~cSequenceDatabaseWidget();
+
+
+ /**
+ \brief Handle the window close event.
+ \param event pointer to QCloseEvent
+ */
+ void closeEvent(QCloseEvent *event);
+
+
+private:
+ QWidget* parent;
+ QPushButton* insertrow;
+ QPushButton* removechecked;
+ QPushButton* close;
+ QPushButton* load;
+ QPushButton* save;
+ QPushButton* saveas;
+ QTableWidget* database;
+ QHBoxLayout* buttons;
+ QVBoxLayout* mainlayout;
+ QProgressDialog* progress;
+
+ QString databasefile;
+ QString lastdir;
+ ifstream inputstream;
+ ofstream outputstream;
+ cSequenceDatabase sequences;
+
+ vector headersort;
+
+ void deleteTable(bool enableprogress);
+
+ void removeRow(int row);
+
+ bool checkTable();
+
+ bool checkFormula(int row, string& summary);
+
+ bool checkSequence(int row);
+
+private slots:
+
+ void closeWindow();
+
+ void loadDatabase();
+
+ void saveDatabase();
+
+ void saveDatabaseAs();
+
+ void addRow();
+
+ void removeEmptyRows();
+
+ void itemChanged(QTableWidgetItem* item);
+
+ void headerItemDoubleClicked(int index);
+
+};
+
+#endif
\ No newline at end of file
diff --git a/CycloBranch/gui/cSpectrumDetailWidget.cpp b/CycloBranch/gui/cSpectrumDetailWidget.cpp
index bd8881b..a3b82b3 100644
--- a/CycloBranch/gui/cSpectrumDetailWidget.cpp
+++ b/CycloBranch/gui/cSpectrumDetailWidget.cpp
@@ -59,19 +59,24 @@ string cSpectrumDetailWidget::getDetailsAsHTMLString() {
string s = "";
if (theoreticalspectrum) {
- s += "Acronym Peptide Name:
";
- s += theoreticalspectrum->getAcronymPeptideNameWithHTMLReferences();
- s += "
";
- s += "Full Peptide Name:
";
- s += theoreticalspectrum->getRealPeptideName() + "
";
- if ((int)theoreticalspectrum->getPath().size() > 0) {
+ if (parameters && ((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch))) {
+
+ s += "Acronym Peptide Name:
";
+ s += theoreticalspectrum->getAcronymPeptideNameWithHTMLReferences();
+ s += "
";
+ s += "Full Peptide Name:
";
+ s += theoreticalspectrum->getRealPeptideName() + "
";
+
+ if ((int)theoreticalspectrum->getPath().size() > 0) {
+ s += "
";
+ s += "Path in the De Novo Graph:
";
+ s += theoreticalspectrum->getPath();
+ }
+
s += "
";
- s += "Path in the De Novo Graph:
";
- s += theoreticalspectrum->getPath();
+
}
-
- s += "
";
s += "Unmatched Measured Peaks:
" + theoreticalspectrum->getUnmatchedPeaks() + "
";
s += "Theoretical Peaks:
" + theoreticalspectrum->getTheoreticalPeaks()->print(true);
@@ -90,7 +95,10 @@ cSpectrumDetailWidget::~cSpectrumDetailWidget() {
delete graphicalspectrum;
delete graphicalspectrumscroll;
- delete textedit;
+ if (parameters && ((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch))) {
+ delete textedit;
+ }
+
delete textbrowser;
delete zoomin;
@@ -118,7 +126,8 @@ cSpectrumDetailWidget::~cSpectrumDetailWidget() {
delete formlayout;
delete formwidget;
- if (parameters) {
+ if (parameters && ((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch))) {
+
switch (parameters->peptidetype)
{
case linear:
@@ -135,9 +144,12 @@ cSpectrumDetailWidget::~cSpectrumDetailWidget() {
break;
case linearpolysaccharide:
break;
+ case other:
+ break;
default:
break;
}
+
}
delete vsplitter1;
@@ -168,24 +180,28 @@ void cSpectrumDetailWidget::prepareToShow(peptideType peptidetype) {
vsplitter2 = new QSplitter();
vsplitter2->setOrientation(Qt::Vertical);
- switch (peptidetype)
- {
- case linear:
- linearwidget = new cLinearWidget();
- break;
- case cyclic:
- cyclicwidget = new cCyclicWidget();
- break;
- case branched:
- branchedwidget = new cBranchedWidget();
- break;
- case lasso:
- lassowidget = new cLassoWidget();
- break;
- case linearpolysaccharide:
- break;
- default:
- break;
+ if (parameters && ((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch))) {
+ switch (peptidetype)
+ {
+ case linear:
+ linearwidget = new cLinearWidget();
+ break;
+ case cyclic:
+ cyclicwidget = new cCyclicWidget();
+ break;
+ case branched:
+ branchedwidget = new cBranchedWidget();
+ break;
+ case lasso:
+ lassowidget = new cLassoWidget();
+ break;
+ case linearpolysaccharide:
+ break;
+ case other:
+ break;
+ default:
+ break;
+ }
}
graphicalspectrumscroll = new QScrollArea();
@@ -193,10 +209,12 @@ void cSpectrumDetailWidget::prepareToShow(peptideType peptidetype) {
graphicalspectrumscroll->setWidget(graphicalspectrum);
//graphicalspectrumscroll->setWidgetResizable(true);
- textedit = new QTextEdit();
- textedit->setReadOnly(true);
- textedit->setFont(QFont("Courier", 9));
- textedit->setLineWrapMode(QTextEdit::NoWrap);
+ if (parameters && ((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch))) {
+ textedit = new QTextEdit();
+ textedit->setReadOnly(true);
+ textedit->setFont(QFont("Courier", 9));
+ textedit->setLineWrapMode(QTextEdit::NoWrap);
+ }
textbrowser = new QTextBrowser();
textbrowser->setReadOnly(true);
@@ -260,77 +278,81 @@ void cSpectrumDetailWidget::prepareToShow(peptideType peptidetype) {
formlayout->addRow(tr("Hide matched peaks: "), hidematched);
formlayout->addRow(tr("Hide unmatched peaks: "), hideunmatched);
- // cyclic
- if (parameters && theoreticalspectrum && (parameters->peptidetype == cyclic)) {
- int r = (int)theoreticalspectrum->getAcronyms().size();
- int hint = (int)theoreticalspectrum->getVisualCoverage().size()/(2*r);
+ if (parameters && ((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch))) {
- rotation = new QComboBox();
- rotation->addItem(tr("all"));
+ // cyclic
+ if (parameters && theoreticalspectrum && (parameters->peptidetype == cyclic)) {
+ int r = (int)theoreticalspectrum->getAcronyms().size();
+ int hint = (int)theoreticalspectrum->getVisualCoverage().size()/(2*r);
- 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('_'));
- rotation->addItem(tr(s.c_str()));
+ rotation = new QComboBox();
+ rotation->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('_'));
+ rotation->addItem(tr(s.c_str()));
+ }
}
- }
- connect(rotation, SIGNAL(currentIndexChanged(int)), graphicalspectrum, SLOT(rotationChanged(int)));
- connect(rotation, SIGNAL(currentIndexChanged(QString)), graphicalspectrum, SLOT(rotationChanged(QString)));
- connect(rotation, SIGNAL(currentIndexChanged(int)), cyclicwidget, SLOT(rotationChanged(int)));
- formlayout->addRow(tr("Ring break up point: "), rotation);
- }
+ connect(rotation, SIGNAL(currentIndexChanged(int)), graphicalspectrum, SLOT(rotationChanged(int)));
+ connect(rotation, SIGNAL(currentIndexChanged(QString)), graphicalspectrum, SLOT(rotationChanged(QString)));
+ connect(rotation, SIGNAL(currentIndexChanged(int)), cyclicwidget, SLOT(rotationChanged(int)));
+ formlayout->addRow(tr("Ring break up point: "), rotation);
+ }
- // branched
- if (parameters && (parameters->peptidetype == branched)) {
- trotation = new QComboBox();
- trotation->addItem(tr("all"));
- trotation->addItem(tr("1 (left-to-right)"));
- trotation->addItem(tr("2 (top-to-right)"));
- trotation->addItem(tr("3 (right-to-left)"));
- trotation->addItem(tr("4 (left-to-top)"));
- trotation->addItem(tr("5 (top-to-left)"));
- trotation->addItem(tr("6 (right-to-top)"));
-
- connect(trotation, SIGNAL(currentIndexChanged(int)), graphicalspectrum, SLOT(trotationChanged(int)));
- connect(trotation, SIGNAL(currentIndexChanged(int)), branchedwidget, SLOT(trotationChanged(int)));
- formlayout->addRow(tr("Linearized sequence: "), trotation);
- }
+ // branched
+ if (parameters && (parameters->peptidetype == branched)) {
+ trotation = new QComboBox();
+ trotation->addItem(tr("all"));
+ trotation->addItem(tr("1 (left-to-right)"));
+ trotation->addItem(tr("2 (top-to-right)"));
+ trotation->addItem(tr("3 (right-to-left)"));
+ trotation->addItem(tr("4 (left-to-top)"));
+ trotation->addItem(tr("5 (top-to-left)"));
+ trotation->addItem(tr("6 (right-to-top)"));
+
+ connect(trotation, SIGNAL(currentIndexChanged(int)), graphicalspectrum, SLOT(trotationChanged(int)));
+ connect(trotation, SIGNAL(currentIndexChanged(int)), branchedwidget, SLOT(trotationChanged(int)));
+ formlayout->addRow(tr("Linearized sequence: "), trotation);
+ }
- // lasso
- if (parameters && theoreticalspectrum && (parameters->peptidetype == lasso)) {
- int r = (int)theoreticalspectrum->getAcronyms().size() - (int)theoreticalspectrum->getCandidate().getBranchSize();
- int hint = (int)theoreticalspectrum->getVisualCoverage().size()/(2*r);
+ // lasso
+ if (parameters && theoreticalspectrum && (parameters->peptidetype == lasso)) {
+ int r = (int)theoreticalspectrum->getAcronyms().size() - (int)theoreticalspectrum->getCandidate().getBranchSize();
+ int hint = (int)theoreticalspectrum->getVisualCoverage().size()/(2*r);
- rotation = new QComboBox();
- rotation->addItem(tr("all"));
+ rotation = new QComboBox();
+ rotation->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('_'));
- rotation->addItem(tr(s.c_str()));
+ 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('_'));
+ rotation->addItem(tr(s.c_str()));
+ }
}
+
+ connect(rotation, SIGNAL(currentIndexChanged(int)), graphicalspectrum, SLOT(rotationChanged(int)));
+ connect(rotation, SIGNAL(currentIndexChanged(QString)), graphicalspectrum, SLOT(rotationChanged(QString)));
+ connect(rotation, SIGNAL(currentIndexChanged(int)), lassowidget, SLOT(rotationChanged(int)));
+ formlayout->addRow(tr("Ring break up point: "), rotation);
+
+ trotation = new QComboBox();
+ trotation->addItem(tr("all"));
+ trotation->addItem(tr("1 (left-to-right)"));
+ trotation->addItem(tr("2 (top-to-right)"));
+ trotation->addItem(tr("3 (right-to-left)"));
+ trotation->addItem(tr("4 (left-to-top)"));
+ trotation->addItem(tr("5 (top-to-left)"));
+ trotation->addItem(tr("6 (right-to-top)"));
+
+ connect(trotation, SIGNAL(currentIndexChanged(int)), graphicalspectrum, SLOT(trotationChanged(int)));
+ connect(trotation, SIGNAL(currentIndexChanged(int)), lassowidget, SLOT(trotationChanged(int)));
+ formlayout->addRow(tr("Linearized sequence: "), trotation);
}
- connect(rotation, SIGNAL(currentIndexChanged(int)), graphicalspectrum, SLOT(rotationChanged(int)));
- connect(rotation, SIGNAL(currentIndexChanged(QString)), graphicalspectrum, SLOT(rotationChanged(QString)));
- connect(rotation, SIGNAL(currentIndexChanged(int)), lassowidget, SLOT(rotationChanged(int)));
- formlayout->addRow(tr("Ring break up point: "), rotation);
-
- trotation = new QComboBox();
- trotation->addItem(tr("all"));
- trotation->addItem(tr("1 (left-to-right)"));
- trotation->addItem(tr("2 (top-to-right)"));
- trotation->addItem(tr("3 (right-to-left)"));
- trotation->addItem(tr("4 (left-to-top)"));
- trotation->addItem(tr("5 (top-to-left)"));
- trotation->addItem(tr("6 (right-to-top)"));
-
- connect(trotation, SIGNAL(currentIndexChanged(int)), graphicalspectrum, SLOT(trotationChanged(int)));
- connect(trotation, SIGNAL(currentIndexChanged(int)), lassowidget, SLOT(trotationChanged(int)));
- formlayout->addRow(tr("Linearized sequence: "), trotation);
}
formwidget = new QWidget();
@@ -341,86 +363,102 @@ void cSpectrumDetailWidget::prepareToShow(peptideType peptidetype) {
vsplitter1->setStretchFactor(0, 7);
vsplitter1->setStretchFactor(1, 3);
- switch (peptidetype)
- {
- case linear:
- vsplitter2->addWidget(formwidget);
- vsplitter2->addWidget(linearwidget);
- vsplitter2->addWidget(textedit);
- vsplitter2->setStretchFactor(0, 2);
- vsplitter2->setStretchFactor(1, 3);
- vsplitter2->setStretchFactor(2, 5);
- break;
- case cyclic:
- vsplitter2->addWidget(formwidget);
- vsplitter2->addWidget(cyclicwidget);
- vsplitter2->addWidget(textedit);
- vsplitter2->setStretchFactor(0, 2);
- vsplitter2->setStretchFactor(1, 3);
- vsplitter2->setStretchFactor(2, 5);
- break;
- case branched:
- vsplitter2->addWidget(formwidget);
- vsplitter2->addWidget(branchedwidget);
- vsplitter2->addWidget(textedit);
- vsplitter2->setStretchFactor(0, 2);
- vsplitter2->setStretchFactor(1, 3);
- vsplitter2->setStretchFactor(2, 5);
- break;
- case lasso:
- vsplitter2->addWidget(formwidget);
- vsplitter2->addWidget(lassowidget);
- vsplitter2->addWidget(textedit);
- vsplitter2->setStretchFactor(0, 2);
- vsplitter2->setStretchFactor(1, 3);
- vsplitter2->setStretchFactor(2, 5);
- break;
- case linearpolysaccharide:
- vsplitter2->addWidget(formwidget);
- vsplitter2->addWidget(textedit);
- vsplitter2->setStretchFactor(0, 2);
- vsplitter2->setStretchFactor(1, 8);
- break;
- default:
- break;
- }
-
- hsplitter->addWidget(vsplitter1);
- hsplitter->addWidget(vsplitter2);
- hsplitter->setStretchFactor(0, 6);
- hsplitter->setStretchFactor(1, 4);
-
- mainbox = new QHBoxLayout();
- mainbox->addWidget(hsplitter);
- setLayout(mainbox);
-
- resize(1280, 700);
-
- if (parameters && theoreticalspectrum) {
+ if (parameters && ((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch))) {
switch (peptidetype)
{
case linear:
- linearwidget->initialize(parameters, theoreticalspectrum);
+ vsplitter2->addWidget(formwidget);
+ vsplitter2->addWidget(linearwidget);
+ vsplitter2->addWidget(textedit);
+ vsplitter2->setStretchFactor(0, 2);
+ vsplitter2->setStretchFactor(1, 3);
+ vsplitter2->setStretchFactor(2, 5);
break;
case cyclic:
- cyclicwidget->initialize(parameters, theoreticalspectrum);
+ vsplitter2->addWidget(formwidget);
+ vsplitter2->addWidget(cyclicwidget);
+ vsplitter2->addWidget(textedit);
+ vsplitter2->setStretchFactor(0, 2);
+ vsplitter2->setStretchFactor(1, 3);
+ vsplitter2->setStretchFactor(2, 5);
break;
case branched:
- branchedwidget->initialize(parameters, theoreticalspectrum);
+ vsplitter2->addWidget(formwidget);
+ vsplitter2->addWidget(branchedwidget);
+ vsplitter2->addWidget(textedit);
+ vsplitter2->setStretchFactor(0, 2);
+ vsplitter2->setStretchFactor(1, 3);
+ vsplitter2->setStretchFactor(2, 5);
break;
case lasso:
- lassowidget->initialize(parameters, theoreticalspectrum);
+ vsplitter2->addWidget(formwidget);
+ vsplitter2->addWidget(lassowidget);
+ vsplitter2->addWidget(textedit);
+ vsplitter2->setStretchFactor(0, 2);
+ vsplitter2->setStretchFactor(1, 3);
+ vsplitter2->setStretchFactor(2, 5);
break;
case linearpolysaccharide:
+ vsplitter2->addWidget(formwidget);
+ vsplitter2->addWidget(textedit);
+ vsplitter2->setStretchFactor(0, 2);
+ vsplitter2->setStretchFactor(1, 8);
+ break;
+ case other:
break;
default:
break;
}
+
+ }
+
+ if (parameters && (parameters->mode == dereplication)) {
+ vsplitter2->addWidget(formwidget);
+ }
+
+ hsplitter->addWidget(vsplitter1);
+ hsplitter->addWidget(vsplitter2);
+ hsplitter->setStretchFactor(0, 6);
+ hsplitter->setStretchFactor(1, 4);
+
+ mainbox = new QHBoxLayout();
+ mainbox->addWidget(hsplitter);
+ setLayout(mainbox);
+
+ resize(1280, 700);
+
+ if (parameters && theoreticalspectrum) {
+
+ if ((parameters->mode == denovoengine) || (parameters->mode == singlecomparison) || (parameters->mode == databasesearch)) {
+
+ switch (peptidetype)
+ {
+ case linear:
+ linearwidget->initialize(parameters, theoreticalspectrum);
+ break;
+ case cyclic:
+ cyclicwidget->initialize(parameters, theoreticalspectrum);
+ break;
+ case branched:
+ branchedwidget->initialize(parameters, theoreticalspectrum);
+ break;
+ case lasso:
+ lassowidget->initialize(parameters, theoreticalspectrum);
+ break;
+ case linearpolysaccharide:
+ break;
+ case other:
+ break;
+ default:
+ break;
+ }
- graphicalspectrum->initialize(parameters, theoreticalspectrum);
+ textedit->setHtml(theoreticalspectrum->getCoverageBySeries().c_str());
+
+ }
- textedit->setHtml(theoreticalspectrum->getCoverageBySeries().c_str());
+ graphicalspectrum->initialize(parameters, theoreticalspectrum);
textbrowser->setHtml(getDetailsAsHTMLString().c_str());
}
diff --git a/CycloBranch/parallel/cGraphReaderThread.cpp b/CycloBranch/parallel/cGraphReaderThread.cpp
index 6697502..17f4316 100644
--- a/CycloBranch/parallel/cGraphReaderThread.cpp
+++ b/CycloBranch/parallel/cGraphReaderThread.cpp
@@ -3,7 +3,7 @@
#include "gui/cMainThread.h"
-int cGraphReaderThread::getTheoreticalSpectraIter(bool cterminalstartingnode, cCandidateSet* candidates, int nodeid, vector& composition, double precursormass, long long &count, int startmodifID, int endmodifID, int middlemodifID, int middlepos, vector& perspectivepath, double cummass, bool* terminatecomputation) {
+int cGraphReaderThread::getTheoreticalSpectraIter(bool cterminalstartingnode, cCandidateSet* candidates, int nodeid, vector& composition, double precursormass, int startmodifID, int endmodifID, int middlemodifID, int middlepos, vector& perspectivepath, double cummass, bool* terminatecomputation) {
nodeEdge ne;
int tmpmiddlemodifID = 0;
int finish;
@@ -52,7 +52,7 @@ int cGraphReaderThread::getTheoreticalSpectraIter(bool cterminalstartingnode, cC
}
composition.push_back((*graph)[nodeid][i].composition);
- finish = getTheoreticalSpectraIter(cterminalstartingnode, candidates, (*graph)[nodeid][i].targetnode, composition, precursormass, count, startmodifID, (*graph)[nodeid][i].endmodifID, tmpmiddlemodifID, middlepos, perspectivepath, cummass + (*graph)[nodeid][i].massdifference, terminatecomputation);
+ finish = getTheoreticalSpectraIter(cterminalstartingnode, candidates, (*graph)[nodeid][i].targetnode, composition, precursormass, startmodifID, (*graph)[nodeid][i].endmodifID, tmpmiddlemodifID, middlepos, perspectivepath, cummass + (*graph)[nodeid][i].massdifference, terminatecomputation);
composition.pop_back();
perspectivepath.pop_back();
@@ -78,34 +78,48 @@ int cGraphReaderThread::getTheoreticalSpectraIter(bool cterminalstartingnode, cC
if ((parameters->peptidetype == branched) || (parameters->peptidetype == lasso)) {
result.getSet().clear();
candidate.prepareBranchedCandidate(result, parameters->peptidetype, terminatecomputation);
- candidates->lock();
- for (auto i = result.getSet().begin(); i != result.getSet().end(); ++i) {
- candidates->getSet().insert(*i);
+ if (scanmode == 0) {
+ candidates->lock();
+ for (auto i = result.getSet().begin(); i != result.getSet().end(); ++i) {
+ candidates->getSet().insert(*i);
+ }
+ candidates->unlock();
+ }
+ else {
+ *count += (long long unsigned)result.getSet().size();
+ if (*count > maximumcandidates) {
+ return -1;
+ }
}
- candidates->unlock();
}
else {
- candidates->lock();
- candidates->getSet().insert(candidate);
- candidates->unlock();
- }
-
- count++;
-
- candidates->lock();
- size = candidates->size();
- candidates->unlock();
-
- while (size >= parameters->maximumnumberofcandidates) {
- usleep(1000);
-
- if (*terminatecomputation) {
- return -1;
+ if (scanmode == 0) {
+ candidates->lock();
+ candidates->getSet().insert(candidate);
+ candidates->unlock();
+ }
+ else {
+ *count += 1;
+ if (*count > maximumcandidates) {
+ return -1;
+ }
}
+ }
+ if (scanmode == 0) {
candidates->lock();
size = candidates->size();
candidates->unlock();
+ while (size >= parameters->maximumnumberofcandidates) {
+ usleep(1000);
+
+ if (*terminatecomputation) {
+ return -1;
+ }
+ candidates->lock();
+ size = candidates->size();
+ candidates->unlock();
+ }
}
}
@@ -118,11 +132,11 @@ int cGraphReaderThread::getTheoreticalSpectraIter(bool cterminalstartingnode, cC
}
-int cGraphReaderThread::reverseCTerminalCandidates(int nodeid, cCandidateSet* candidates, double precursormass, long long &count, int startmodifID, bool* terminatecomputation) {
+int cGraphReaderThread::reverseCTerminalCandidates(int nodeid, cCandidateSet* candidates, double precursormass, int startmodifID, bool* terminatecomputation) {
vector composition;
vector perspectivepath;
- if (getTheoreticalSpectraIter((*graph)[nodeid].checkIonAnnotation(y_ion), candidates, nodeid, composition, precursormass, count, startmodifID, 0, 0, -1, perspectivepath, (*graph)[nodeid].getMZRatio(), terminatecomputation) == -1) {
+ if (getTheoreticalSpectraIter((*graph)[nodeid].checkIonAnnotation(y_ion), candidates, nodeid, composition, precursormass, startmodifID, 0, 0, -1, perspectivepath, (*graph)[nodeid].getMZRatio(), terminatecomputation) == -1) {
return -1;
}
@@ -137,22 +151,24 @@ cGraphReaderThread::cGraphReaderThread() {
parameters = 0;
os = 0;
lastsystemnode = 0;
- mode = 0;
+ scanmode = 0;
terminatecomputation = 0;
+ count = 0;
// delete thread when run is finished
connect(this, SIGNAL(finished()), this, SLOT(deleteLater()));
}
-void cGraphReaderThread::initialize(vector& graph, cBricksDatabase& bricksdatabasewithcombinations, cCandidateSet& candidates, cParameters* parameters, cMainThread* os, int lastsystemnode, bool& terminatecomputation) {
+void cGraphReaderThread::initialize(vector& graph, cBricksDatabase& bricksdatabasewithcombinations, cCandidateSet& candidates, cParameters* parameters, cMainThread* os, int lastsystemnode, long long unsigned& count, int scanmode, bool& terminatecomputation) {
this->graph = &graph;
this->bricksdatabasewithcombinations = &bricksdatabasewithcombinations;
this->candidates = &candidates;
this->parameters = parameters;
this->os = os;
this->lastsystemnode = lastsystemnode;
- this->mode = mode;
+ this->count = &count;
+ this->scanmode = scanmode;
this->terminatecomputation = &terminatecomputation;
}
@@ -160,15 +176,14 @@ void cGraphReaderThread::initialize(vector& graph, cBricksData
void cGraphReaderThread::run() {
vector composition;
vector perspectivepath;
- long long count = 0;
int startmodifID = 0;
double unchargedprecursormass = uncharge(parameters->precursormass, parameters->precursorcharge);
switch (parameters->peptidetype)
{
case cyclic:
- if (getTheoreticalSpectraIter(false, candidates, 0, composition, unchargedprecursormass, count, 0, 0, 0, -1, perspectivepath, (*graph)[0].getMZRatio(), terminatecomputation) == -1) {
- // terminated by user
+ if (getTheoreticalSpectraIter(false, candidates, 0, composition, unchargedprecursormass, 0, 0, 0, -1, perspectivepath, (*graph)[0].getMZRatio(), terminatecomputation) == -1) {
+ // terminated
return;
}
break;
@@ -178,8 +193,8 @@ void cGraphReaderThread::run() {
if (i - 2 > 0) {
startmodifID = i - 2;
}
- if (reverseCTerminalCandidates(i, candidates, unchargedprecursormass, count, startmodifID, terminatecomputation) == -1) {
- // terminated by user
+ if (reverseCTerminalCandidates(i, candidates, unchargedprecursormass, startmodifID, terminatecomputation) == -1) {
+ // terminated
return;
}
}
@@ -189,8 +204,8 @@ void cGraphReaderThread::run() {
if (i - 1/*2*/ > 0) {
startmodifID = i - 1/*2*/;
}
- if (reverseCTerminalCandidates(i, candidates, unchargedprecursormass, count, startmodifID, terminatecomputation) == -1) {
- // terminated by user
+ if (reverseCTerminalCandidates(i, candidates, unchargedprecursormass, startmodifID, terminatecomputation) == -1) {
+ // terminated
return;
}
}
@@ -200,12 +215,14 @@ void cGraphReaderThread::run() {
if (i - 1 > 0) {
startmodifID = i - 1;
}
- if (reverseCTerminalCandidates(i, candidates, unchargedprecursormass, count, startmodifID, terminatecomputation) == -1) {
- // terminated by user
+ if (reverseCTerminalCandidates(i, candidates, unchargedprecursormass, startmodifID, terminatecomputation) == -1) {
+ // terminated
return;
}
}
break;
+ case other:
+ break;
default:
break;
}
diff --git a/CycloBranch/parallel/cGraphReaderThread.h b/CycloBranch/parallel/cGraphReaderThread.h
index 4084b04..fbaa489 100644
--- a/CycloBranch/parallel/cGraphReaderThread.h
+++ b/CycloBranch/parallel/cGraphReaderThread.h
@@ -40,12 +40,13 @@ class cGraphReaderThread : public QThread {
cParameters* parameters;
cMainThread* os;
int lastsystemnode;
- int mode;
+ long long unsigned* count;
+ int scanmode;
bool* terminatecomputation;
- int getTheoreticalSpectraIter(bool cterminalstartingnode, cCandidateSet* candidates, int nodeid, vector& composition, double precursormass, long long &count, int startmodifID, int endmodifID, int middlemodifID, int middlepos, vector& perspectivepath, double cummass, bool* terminatecomputation);
+ int getTheoreticalSpectraIter(bool cterminalstartingnode, cCandidateSet* candidates, int nodeid, vector& composition, double precursormass, int startmodifID, int endmodifID, int middlemodifID, int middlepos, vector& perspectivepath, double cummass, bool* terminatecomputation);
- int reverseCTerminalCandidates(int nodeid, cCandidateSet* candidates, double precursormass, long long& count, int startmodifID, bool* terminatecomputation);
+ int reverseCTerminalCandidates(int nodeid, cCandidateSet* candidates, double precursormass, int startmodifID, bool* terminatecomputation);
public:
@@ -64,9 +65,11 @@ class cGraphReaderThread : public QThread {
\param parameters pointer to program parameters
\param os pointer to the main thread of the application
\param lastsystemnode position of the last system node in the de novo graph
+ \param count an output number of peptide sequence candidates
+ \param scanmode 0 = get candidates; 1 = calculate the number of peptide sequence candidates
\param terminatecomputation reference to a variable determining that the thread must be stopped
*/
- void initialize(vector& graph, cBricksDatabase& bricksdatabasewithcombinations, cCandidateSet& candidates, cParameters* parameters, cMainThread* os, int lastsystemnode, bool& terminatecomputation);
+ void initialize(vector& graph, cBricksDatabase& bricksdatabasewithcombinations, cCandidateSet& candidates, cParameters* parameters, cMainThread* os, int lastsystemnode, long long unsigned& count, int scanmode, bool& terminatecomputation);
protected:
diff --git a/CycloBranch/parallel/cSpectrumComparatorThread.cpp b/CycloBranch/parallel/cSpectrumComparatorThread.cpp
index 1ea74cd..f519934 100644
--- a/CycloBranch/parallel/cSpectrumComparatorThread.cpp
+++ b/CycloBranch/parallel/cSpectrumComparatorThread.cpp
@@ -106,7 +106,7 @@ void cSpectrumComparatorThread::run() {
double score;
permutations.getSet().clear();
- if ((parameters->mode == 0) && (parameters->generatebrickspermutations)) {
+ if ((parameters->mode == denovoengine) && (parameters->generatebrickspermutations)) {
candidate.getPermutations(permutations, terminatecomputation);
}
else {
@@ -145,6 +145,8 @@ void cSpectrumComparatorThread::run() {
case linearpolysaccharide:
theoreticalpeaksrealsize = tsp.compareLinearPolysaccharide(peaklist, *bricksdatabasewithcombinations, false, *rxsequencetag, *rxsearchedsequence);
break;
+ case other:
+ break;
default:
break;
}
diff --git a/CycloBranch/parallel/cSpectrumComparatorThread.h b/CycloBranch/parallel/cSpectrumComparatorThread.h
index b716ec4..5431536 100644
--- a/CycloBranch/parallel/cSpectrumComparatorThread.h
+++ b/CycloBranch/parallel/cSpectrumComparatorThread.h
@@ -26,7 +26,7 @@ bool compareBandAllIonsDesc(cTheoreticalSpectrum& a, cTheoreticalSpectrum& b);
/**
- \brief Compare scores of two theoretical spectra (number of b-ions + water loss b-ions and all ions as a secondary score).
+ \brief Compare scores of two theoretical spectra (number of b-ions + dehydrated b-ions and all ions as a secondary score).
\param a first theoretical spectrum
\param b second theoretical spectrum
\retval bool true if the score of \a a is greater than the score of \a b
@@ -35,7 +35,7 @@ bool compareBBwaterLossAndAllIonsDesc(cTheoreticalSpectrum& a, cTheoreticalSpect
/**
- \brief Compare scores of two theoretical spectra (number of b-ions + ammonia loss b-ions and all ions as a secondary score).
+ \brief Compare scores of two theoretical spectra (number of b-ions + deamidated b-ions and all ions as a secondary score).
\param a first theoretical spectrum
\param b second theoretical spectrum
\retval bool true if the score of \a a is greater than the score of \a b