diff --git a/src/input/pepxmlsaxhandler.cpp b/src/input/pepxmlsaxhandler.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0879a049fcc08354a7891461b2c419269a2c0fcf --- /dev/null +++ b/src/input/pepxmlsaxhandler.cpp @@ -0,0 +1,555 @@ +/** + * \file input/pepxmlsaxhandler.cpp + * \date 18/6/2018 + * \author Olivier Langella + * \brief parse pepxml result file + */ + + +/******************************************************************************* + * Copyright (c) 2018 Olivier Langella <Olivier.Langella@u-psud.fr>. + * + * This file is part of XTPcpp. + * + * XTPcpp is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * XTPcpp is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XTPcpp. If not, see <http://www.gnu.org/licenses/>. + * + ******************************************************************************/ + +#include "pepxmlsaxhandler.h" + + +#include <pappsomspp/exception/exceptionnotfound.h> +#include <cmath> +#include "../core/peptideevidence.h" +#include "../utils/peptidestore.h" +#include "../utils/proteinstore.h" + +PepXmlSaxHandler::PepXmlSaxHandler(WorkMonitorInterface *p_monitor, + Project *p_project) + : _p_project(p_project) +{ + qDebug() << __FILE__ << " " << __FUNCTION__ << " " << __LINE__; + _p_monitor = p_monitor; + qDebug() << __FILE__ << " " << __FUNCTION__ << " " << __LINE__; +} + +PepXmlSaxHandler::~PepXmlSaxHandler() +{ +} + + +bool +PepXmlSaxHandler::startElement(const QString &namespaceURI, + const QString &localName, const QString &qName, + const QXmlAttributes &attributes) +{ + qDebug() << __FILE__ << " " << __FUNCTION__ << " " << __LINE__; + _tag_stack.push_back(qName); + bool is_ok = true; + + try + { + // startElement_group + if(_tag_stack.size() == 1) + { + _is_xtpcpp_xpip = true; + if(qName != "xpip") + { + _is_xtpcpp_xpip = false; + throw pappso::ExceptionNotFound( + QObject::tr("ERROR this file is not a pep xml file %1") + .arg(qName)); + } + } + else if(qName == "protein_match") + { + if(_count_total % 100 == 0) + { + _p_monitor->message(QString("reading protein matches %1 on %2") + .arg(_count_protein_matches) + .arg(_total_protein_matches), + _count_total); + } + is_ok = startElement_protein_match(attributes); + } + else if(qName == "peptide_match") + { + is_ok = startElement_peptide_match(attributes); + } + else if(qName == "protein") + { + if(_count_total % 100 == 0) + { + _p_monitor->message(QString("reading proteins %1 on %2") + .arg(_count_proteins) + .arg(_total_proteins), + _count_total); + } + is_ok = startElement_protein(attributes); + } + else if(qName == "identification_source") + { + is_ok = startElement_identification_source(attributes); + } + else if(qName == "param") + { + is_ok = startElement_param(attributes); + } + else if(qName == "stat") + { + is_ok = startElement_stat(attributes); + } + else if(qName == "identification_group") + { + is_ok = startElement_identification_group(attributes); + } + else if(qName == "peptide_evidence_list") + { + is_ok = startElement_peptide_evidence_list(attributes); + } + else if(qName == "counts") + { + is_ok = startElement_counts(attributes); + } + else if(qName == "label_method") + { + is_ok = startElement_label_method(attributes); + } + //<sample value="P6_08_10"/> + else if(qName == "msrun") + { + is_ok = startElement_msrun(attributes); + } + else if(qName == "peptide") + { + if(_count_total % 100 == 0) + { + _p_monitor->message(QObject::tr("reading peptide %1 on %2") + .arg(_count_peptides) + .arg(_total_peptides), + _count_total); + } + is_ok = startElement_peptide(attributes); + } + else if(qName == "peptide_evidence") + { + if(_count_total % 100 == 0) + { + _p_monitor->message( + QObject::tr("reading peptide evidence %1 on %2") + .arg(_count_peptide_evidences) + .arg(_total_peptide_evidences), + _count_total); + } + is_ok = startElement_peptide_evidence(attributes); + } + else if(qName == "modification") + { + is_ok = startElement_modification(attributes); + } + else if(qName == "mod") + { + is_ok = startElement_mod(attributes); + } + else if(qName == "filter_params") + { + is_ok = startElement_filter_params(attributes); + } + else if(qName == "description") + { + is_ok = startElement_description(attributes); + } + else if(qName == "fasta_file") + { + is_ok = startElement_fasta_file(attributes); + } + else if(qName == "contaminants") + { + is_ok = startElement_contaminants(attributes); + } + else if(qName == "decoys") + { + is_ok = startElement_decoys(attributes); + } + + _current_text.clear(); + } + catch(pappso::PappsoException exception_pappso) + { + _errorStr = QObject::tr("ERROR in PepXmlSaxHandler::startElement tag " + "%1, PAPPSO exception:\n%2") + .arg(qName) + .arg(exception_pappso.qwhat()); + return false; + } + catch(std::exception exception_std) + { + _errorStr = + QObject::tr( + "ERROR in PepXmlSaxHandler::startElement tag %1, std exception:\n%2") + .arg(qName) + .arg(exception_std.what()); + return false; + } + return is_ok; +} + +bool +PepXmlSaxHandler::endElement(const QString &namespaceURI, + const QString &localName, const QString &qName) +{ + + qDebug() << __FILE__ << " " << __FUNCTION__ << " " << __LINE__; + bool is_ok = true; + // endElement_peptide_list + try + { + if(qName == "protein") + { + is_ok = endElement_protein(); + } + else if(qName == "peptide") + { + is_ok = endElement_peptide(); + } + else if(qName == "msrun") + { + is_ok = endElement_msrun(); + } + else if(qName == "sequence") + { + is_ok = endElement_sequence(); + } + else if(qName == "protein_match") + { + is_ok = endElement_protein_match(); + } + else if(qName == "peptide_evidence") + { + is_ok = endElement_peptide_evidence(); + } + else if(qName == "peptide_evidence_list") + { + is_ok = endElement_peptide_evidence_list(); + } + else if(qName == "identification_group") + { + is_ok = endElement_identification_group(); + } + else if(qName == "identification_source") + { + is_ok = endElement_identification_source(); + } + + // end of detection_moulon + // else if ((_tag_stack.size() > 1) && + // (_tag_stack[_tag_stack.size() - 2] == "detection_moulon")) + } + catch(pappso::PappsoException exception_pappso) + { + _errorStr = QObject::tr("ERROR in PepXmlSaxHandler::endElement tag %1, " + "PAPPSO exception:\n%2") + .arg(qName) + .arg(exception_pappso.qwhat()); + return false; + } + catch(std::exception exception_std) + { + _errorStr = + QObject::tr( + "ERROR in PepXmlSaxHandler::endElement tag %1, std exception:\n%2") + .arg(qName) + .arg(exception_std.what()); + return false; + } + + _current_text.clear(); + _tag_stack.pop_back(); + + return is_ok; +} + +// <msms_pipeline_analysis date="2015-01-19T13:28:41" +// xmlns="http://regis-web.systemsbiology.net/pepXML" +// xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +// xsi:schemaLocation="http://sashimi.sourceforge.net/schema_revision/pepXML/pepXML_v117.xsd" +// summary_xml="/gorgone/pappso/abrf_2015/mzXML/JD_06232014_sample1-A.pep.xml"> + +bool +PepXmlSaxHandler::startElement_msms_pipeline_analysis(QXmlAttributes attributes) +{ + QString original_filename = attributes.value("summary_xml"); +} + +// <msms_run_summary +// base_name="/gorgone/pappso/abrf_2015/mzXML/JD_06232014_sample1-A" +// msManufacturer="Thermo Scientific" msModel="Q Exactive" +// raw_data_type="raw" raw_data=".mzXML"> +bool +PepXmlSaxHandler::startElement_msms_run_summary(QXmlAttributes attributes) +{ + QString mz_datafile = QString("%1%2") + .arg(attributes.value("base_name")) + .arg(attributes.value("raw_data")); +} + +// <search_database +// local_path="/gorgone/pappso/abrf_2015/fasta/iPRG2015.fasta" type="AA"/> +bool +PepXmlSaxHandler::startElement_search_database(QXmlAttributes attributes) +{ + QString fastafile = attributes.value("local_path"); +} + +// <search_summary +// base_name="/gorgone/pappso/moulon/users/Olivier/Delphine_Pecqueur/mzXML/330_01_01_C3G3_150122_01" +// search_engine="X! Tandem (k-score)" precursor_mass_type="monoisotopic" +// fragment_mass_type="monoisotopic" search_id="1"> +bool +PepXmlSaxHandler::startElement_search_summary(QXmlAttributes attributes) +{ + _current_search_engine = attributes.value("search_engine"); +} + +// <spectrum_query spectrum="JD_06232014_sample1-A.00005.00005.2" +// start_scan="5" end_scan="5" precursor_neutral_mass="819.347822" +// assumed_charge="2" index="1" retention_time_sec="1.4"> +// <spectrum_query spectrum="JD_06232014_sample1-A.00006.00006.2" +// start_scan="6" end_scan="6" precursor_neutral_mass="870.405029296875" +// assumed_charge="2" index="1"> +bool +PepXmlSaxHandler::startElement_spectrum_query(QXmlAttributes attributes) +{ + unsigned int start_scan = attributes.value("start_scan").toUInt(); + unsigned int end_scan = attributes.value("end_scan").toUInt(); + if(start_scan != end_scan) + { + String message = "ERROR reading pepxml file :\n" + + "unable to read search results from '" + + this.currentSearchEngine + "' as start " + + currentStartScan + " and end " + currentEndScan + + " scans are different"; + logger.error(message); + throw new MSMSException(message); + } + currentZ = new Integer(attrs.getValue("assumed_charge")); + if(attrs.getValue("retention_time_sec") == null) + { + String message = + "ERROR reading pepxml file :\n" + + "unable to read search results from '" + this.currentSearchEngine + + "' as retention time is not given in spectrum_query elements"; + logger.warn(message); + // throw new MSMSException(message); + + currentRt = (double)0; + } + else + { + currentRt = new Double(attrs.getValue("retention_time_sec")); + } + currentPrecursorNeutralMass = + new Double(attrs.getValue("precursor_neutral_mass")) + Utils.mhplus; +} + +// <search_hit hit_rank="5" peptide="MKDFSTK" peptide_prev_aa="K" +// peptide_next_aa="R" protein="sp|P34218|SAS3_YEAST" num_tot_proteins="1" +// num_matched_ions="2" tot_num_ions="12" calc_neutral_pep_mass="871.410939" +// massdiff="-1.006264" num_tol_term="2" num_missed_cleavages="1" +// num_matched_peptides="190"> +bool +PepXmlSaxHandler::startElement_search_hit(QXmlAttributes attributes) +{ + QString proteinName = attributes.value("protein"); + + Protein protein = new Protein(); + protein.set_description(proteinName); + if(identification.contain_protein(protein)) + { + // new protein, new match + currentMatch = new Match(); + currentMatch.set_protein_match(protein); + identification.add_protein(protein, currentMatch); + } + + else + { + // get existing match for this protein + currentMatch = (Match)identification.get_match(protein); + } + protein = currentMatch.get_protein_match(); + protein.setDatabase( + identification.getDatabaseSet().getInstance(this.fastaFile.getName())); + + this.currentPeptide = new PeptideProphet(); + currentPeptide.set_sample_id( + identification.getMsRunSet().getInstance(identificationDataSource), + identificationDataSource); + + _current_peptide_sp = + PeptideXtp(attributes.value("peptide").simplified()).makePeptideXtpSp(); + + currentPeptide.set_pre(attrs.getValue("peptide_prev_aa")); + currentPeptide.set_post(attrs.getValue("peptide_next_aa")); + + currentPeptide.set_scan(this.currentEndScan.intValue()); + Double calc_neutral_pep_mass = + new Double(attrs.getValue("calc_neutral_pep_mass")) + Utils.mhplus; + Double massdiff = new Double(attrs.getValue("massdiff")); + + currentPeptide.set_mhplus_theo(calc_neutral_pep_mass); + currentPeptide.set_deltamass(massdiff); + currentPeptide.set_mhplus_obser(currentPrecursorNeutralMass); + currentPeptide.set_charge(this.currentZ); + currentPeptide.setRt(this.currentRt.floatValue()); + + /* + * if (Math.abs(massdiff) > 1) { String message = + * "massdiff is too high"; logger.error(message); throw new + * MSMSException(message); } + */ + // valeur specifique de la séquence matche + // peptide.set_start(Integer.parseInt(attrs.getValue("start"))); + // peptide.set_stop(Integer.parseInt(attrs.getValue("end"))); + // peptide.set_evalue(Float.valueOf(attrs.getValue("expect"))); + // peptide.set_hypercorr(Float.valueOf(attrs.getValue("hyperscore"))); +} + +bool +XtpXpipSaxHandler::endElement_search_hit() +{ + if(currentPeptideProphetProbability != null) + { + currentPeptide.setProphetProbability(currentPeptideProphetProbability); + } + if(currentPeptideInterProphetProbability != null) + { + currentPeptide.setInterProphetProbability( + currentPeptideInterProphetProbability); + } + currentPeptide.setSearchEngine(this.currentSearchEngine); + + identification.add_peptide(this.currentPeptide); + currentMatch.add_peptide_match(currentPeptide); + + currentPeptideProphetProbability = null; + currentPeptideInterProphetProbability = null; + currentExpectedValue = null; +} + +// <peptideprophet_result probability="0.0245" +// all_ntt_prob="(0.0000,0.0093,0.0245)"> +bool +PepXmlSaxHandler::startElement_peptideprophet_result(QXmlAttributes attributes) +{ + this.currentPeptideProphetProbability = + Double.parseDouble(attrs.getValue("probability")); +} + +// <interprophet_result probability="0.00886064" +// all_ntt_prob="(0,0.0033303,0.00886064)"> +bool +PepXmlSaxHandler::startElement_interprophet_result(QXmlAttributes attributes) +{ + this.currentPeptideInterProphetProbability = + Double.parseDouble(attrs.getValue("probability")); +} + +/* + * <search_score name="xcorr" value="0.528"/> <search_score name="deltacn" + * value="0.059"/> <search_score name="deltacnstar" value="0.000"/> + * <search_score name="spscore" value="29.4"/> <search_score name="sprank" + * value="2"/> <search_score name="expect" value="1.00E+00"/> + */ +bool +PepXmlSaxHandler::startElement_search_score(QXmlAttributes attributes) +{ + String name = attrs.getValue("name"); + String valueStr = attrs.getValue("value"); + if(!valueStr.isEmpty()) + { + if(name.equals("expect")) + { + currentExpectedValue = new Double(valueStr); + currentPeptide.set_evalue(currentExpectedValue.floatValue()); + } + // <search_score name="hyperscore" value="232"/> + if(name.equals("hyperscore")) + { + currentPeptide.set_hypercorr(Float.parseFloat(valueStr)); + } + } +} + +// <modification_info modified_peptide="SQRDCR"> <mod_aminoacid_mass +// position="5" mass="160.030649"/> </modification_info> +bool +PepXmlSaxHandler::startElement_mod_aminoacid_mass(QXmlAttributes attributes) +{ + double massFloat = attributes.value("mass").toDouble(); + int position = attributes.value("position").toUInt(); + String aa = _current_peptide_sp.get()->getSequence().substring(position - 1, position); + Float massDiff = massFloat - Utils.getAaMass(aa.charAt(0)); + + this.currentPeptide.set_Modifs(aa, position - 1, massDiff); + // modifs liste for isotopic analysis + identification.add_modifs_to_liste(new Modifs(massFloat)); + + pappso::AaModificationP modif = Utils::guessAaModificationPbyMonoisotopicMassDelta(attributes.value("modified").simplified().toDouble()); + +pappso::AaModificationP modif = pappso::AaModification::getInstance(attributes.value("mass").simplified()); + unsigned int position = attributes.value("position").simplified().toUInt(); + _current_peptide_sp.get()->addAaModification(modif, position-1); +} + + +bool +PepXmlSaxHandler::endElement_modification_info() +{ +} + + +bool PepXmlSaxHandler::error(const QXmlParseException &exception) { + _errorStr = QObject::tr("Parse error at line %1, column %2 :\n" + "%3").arg(exception.lineNumber()).arg(exception.columnNumber()).arg( + exception.message()); + + return false; +} + + +bool PepXmlSaxHandler::fatalError(const QXmlParseException &exception) { + _errorStr = QObject::tr("Parse error at line %1, column %2 :\n" + "%3").arg(exception.lineNumber()).arg(exception.columnNumber()).arg( + exception.message()); + return false; +} + +QString PepXmlSaxHandler::errorString() const { + return _errorStr; +} + + +bool PepXmlSaxHandler::endDocument() { + return true; +} + +bool PepXmlSaxHandler::startDocument() { + return true; +} + +bool PepXmlSaxHandler::characters(const QString &str) { + _current_text += str; + return true; +} diff --git a/src/input/pepxmlsaxhandler.h b/src/input/pepxmlsaxhandler.h new file mode 100644 index 0000000000000000000000000000000000000000..2892c9859612fd5b473bfbdfa88d0d6552cd27f3 --- /dev/null +++ b/src/input/pepxmlsaxhandler.h @@ -0,0 +1,106 @@ +/** + * \file input/pepxmlsaxhandler.h + * \date 18/6/2018 + * \author Olivier Langella + * \brief parse pepxml result file + */ + + +/******************************************************************************* +* Copyright (c) 2018 Olivier Langella <Olivier.Langella@u-psud.fr>. +* +* This file is part of XTPcpp. +* +* XTPcpp is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* XTPcpp is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with XTPcpp. If not, see <http://www.gnu.org/licenses/>. +* +******************************************************************************/ + + +#ifndef PEPXMLSAXHANDLER_H +#define PEPXMLSAXHANDLER_H + +#include <QXmlDefaultHandler> +#include <pappsomspp/pappsoexception.h> +#include "../core/proteinxtp.h" +#include "../core/peptidextp.h" +#include <pappsomspp/amino_acid/aamodification.h> +#include "../core/project.h" +#include "../core/proteinmatch.h" + +class PepXmlSaxHandler : public QXmlDefaultHandler +{ + public: + PepXmlSaxHandler(Project *p_project, + IdentificationGroup *p_identification_group, + IdentificationDataSource *p_identification_data_source); + ~PepXmlSaxHandler(); + + bool startElement(const QString &namespaceURI, const QString &localName, + const QString &qName, const QXmlAttributes &attributes); + + bool endElement(const QString &namespaceURI, const QString &localName, + const QString &qName); + + bool startDocument(); + + bool endDocument(); + + bool characters(const QString &str); + + bool fatalError(const QXmlParseException &exception); + bool error(const QXmlParseException &exception); + + QString errorString() const; + + + private: + bool startElement_msms_pipeline_analysis(QXmlAttributes attrs); + bool startElement_protein(QXmlAttributes attributes); + bool startElement_note(QXmlAttributes attributes); + bool startElement_file(QXmlAttributes attributes); + bool startElement_aa(QXmlAttributes attributes); + bool startElement_domain(QXmlAttributes attributes); + bool endElement_domain(); + bool endElement_note(); + + private: + std::vector<QString> _tag_stack; + QString _errorStr; + QString _current_text; + + Project *_p_project; + IdentificationGroup *_p_identification_group; + IdentificationDataSource *_p_identification_data_source; + MsRunSp _sp_msrun; + + ProteinMatch *_p_protein_match; + PeptideEvidence *_p_peptide_evidence; + PeptideMatch _current_peptide_match; + ProteinXtp _current_protein; + PeptideXtpSp _current_peptide_sp; + + QMap<QString, pappso::AaModificationP> _map_massstr_aamod; + + QString _current_group_label; + QString _current_group_type; + QString _current_note_label; + QString _current_note_type; + unsigned int _scan; + pappso::pappso_double _mhplus_obser; + unsigned int _charge; + pappso::pappso_double _retention_time; + bool _is_protein_description = false; +}; + +#endif // PEPXMLSAXHANDLER_H diff --git a/src/input/xtandemsaxhandler.h b/src/input/xtandemsaxhandler.h index a344676a7de3bec3f9f8e58e34e4dd4d901e664e..aa5bef914393fff6233b1a8225757724b35d384b 100644 --- a/src/input/xtandemsaxhandler.h +++ b/src/input/xtandemsaxhandler.h @@ -7,26 +7,27 @@ /******************************************************************************* -* Copyright (c) 2017 Olivier Langella <Olivier.Langella@u-psud.fr>. -* -* This file is part of XTPcpp. -* -* XTPcpp is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* XTPcpp is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with XTPcpp. If not, see <http://www.gnu.org/licenses/>. -* -* Contributors: -* Olivier Langella <Olivier.Langella@u-psud.fr> - initial API and implementation -******************************************************************************/ + * Copyright (c) 2017 Olivier Langella <Olivier.Langella@u-psud.fr>. + * + * This file is part of XTPcpp. + * + * XTPcpp is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * XTPcpp is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with XTPcpp. If not, see <http://www.gnu.org/licenses/>. + * + * Contributors: + * Olivier Langella <Olivier.Langella@u-psud.fr> - initial API and + *implementation + ******************************************************************************/ #ifndef XTANDEMSAXHANDLER_H #define XTANDEMSAXHANDLER_H @@ -40,68 +41,69 @@ #include "../core/project.h" #include "../core/proteinmatch.h" -class XtandemSaxHandler: public QXmlDefaultHandler +class XtandemSaxHandler : public QXmlDefaultHandler { -public: - XtandemSaxHandler(Project * p_project, IdentificationGroup * p_identification_group, - IdentificationDataSource * p_identification_data_source); - ~XtandemSaxHandler(); - - bool startElement(const QString & namespaceURI, const QString & localName, - const QString & qName, const QXmlAttributes & attributes); - - bool endElement(const QString & namespaceURI, const QString & localName, - const QString & qName); - - bool startDocument(); - - bool endDocument(); - - bool characters(const QString &str); - - bool fatalError(const QXmlParseException &exception); - bool error(const QXmlParseException &exception); - - QString errorString() const; - - -private: - bool startElement_group(QXmlAttributes attrs); - bool startElement_protein(QXmlAttributes attributes); - bool startElement_note(QXmlAttributes attributes); - bool startElement_file(QXmlAttributes attributes); - bool startElement_aa(QXmlAttributes attributes); - bool startElement_domain(QXmlAttributes attributes); - bool endElement_domain(); - bool endElement_note(); - -private: - std::vector<QString> _tag_stack; - QString _errorStr; - QString _current_text; - - Project * _p_project; - IdentificationGroup * _p_identification_group; - IdentificationDataSource * _p_identification_data_source; - MsRunSp _sp_msrun; - - ProteinMatch * _p_protein_match; - PeptideEvidence * _p_peptide_evidence; - PeptideMatch _current_peptide_match; - ProteinXtp _current_protein; - PeptideXtpSp _current_peptide_sp; - - QMap<QString, pappso::AaModificationP> _map_massstr_aamod; - - QString _current_group_label; - QString _current_group_type; - QString _current_note_label; - QString _current_note_type; - unsigned int _scan; - pappso::pappso_double _mhplus_obser; - unsigned int _charge; - pappso::pappso_double _retention_time; - bool _is_protein_description = false; + public: + XtandemSaxHandler(Project *p_project, + IdentificationGroup *p_identification_group, + IdentificationDataSource *p_identification_data_source); + ~XtandemSaxHandler(); + + bool startElement(const QString &namespaceURI, const QString &localName, + const QString &qName, const QXmlAttributes &attributes); + + bool endElement(const QString &namespaceURI, const QString &localName, + const QString &qName); + + bool startDocument(); + + bool endDocument(); + + bool characters(const QString &str); + + bool fatalError(const QXmlParseException &exception); + bool error(const QXmlParseException &exception); + + QString errorString() const; + + + private: + bool startElement_group(QXmlAttributes attrs); + bool startElement_protein(QXmlAttributes attributes); + bool startElement_note(QXmlAttributes attributes); + bool startElement_file(QXmlAttributes attributes); + bool startElement_aa(QXmlAttributes attributes); + bool startElement_domain(QXmlAttributes attributes); + bool endElement_domain(); + bool endElement_note(); + + private: + std::vector<QString> _tag_stack; + QString _errorStr; + QString _current_text; + + Project *_p_project; + IdentificationGroup *_p_identification_group; + IdentificationDataSource *_p_identification_data_source; + MsRunSp _sp_msrun; + + ProteinMatch *_p_protein_match; + PeptideEvidence *_p_peptide_evidence; + PeptideMatch _current_peptide_match; + ProteinXtp _current_protein; + PeptideXtpSp _current_peptide_sp; + + QMap<QString, pappso::AaModificationP> _map_massstr_aamod; + + QString _current_group_label; + QString _current_group_type; + QString _current_note_label; + QString _current_note_type; + unsigned int _scan; + pappso::pappso_double _mhplus_obser; + unsigned int _charge; + pappso::pappso_double _retention_time; + bool _is_protein_description = false; }; #endif // XTANDEMSAXHANDLER_H diff --git a/src/main.cpp b/src/main.cpp index cf3dac47b669a293b98f8491ddbd8e07577a8921..c42ce2257ee01f84d985c526d5c2ff38a0c6dbd2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,76 +1,79 @@ /******************************************************************************* -* Copyright (c) 2015 Olivier Langella <Olivier.Langella@moulon.inra.fr>. -* -* This file is part of PAPPSOms-tools. -* -* PAPPSOms-tools is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* PAPPSOms-tools is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with PAPPSOms-tools. If not, see <http://www.gnu.org/licenses/>. -* -* Contributors: -* Olivier Langella <Olivier.Langella@moulon.inra.fr> - initial API and implementation -******************************************************************************/ + * Copyright (c) 2015 Olivier Langella <Olivier.Langella@moulon.inra.fr>. + * + * This file is part of PAPPSOms-tools. + * + * PAPPSOms-tools is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * PAPPSOms-tools is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with PAPPSOms-tools. If not, see <http://www.gnu.org/licenses/>. + * + * Contributors: + * Olivier Langella <Olivier.Langella@moulon.inra.fr> - initial API and + *implementation + ******************************************************************************/ +#include "config.h" +#include "gui/mainwindow.h" +#include "utils/types.h" #include <QApplication> #include <QTimer> #include <iostream> #include <pappsomspp/pappsoexception.h> -#include "config.h" -#include "gui/mainwindow.h" -#include "utils/types.h" using namespace std; -int main(int argc, char *argv[]) +int +main(int argc, char *argv[]) { - QTextStream errorStream(stderr, QIODevice::WriteOnly); - QApplication app(argc, argv); + QTextStream errorStream(stderr, QIODevice::WriteOnly); + QApplication app(argc, argv); - qRegisterMetaType<TandemRunBatch>("TandemRunBatch"); - qRegisterMetaType<std::vector<pappso::mz>>("std::vector<pappso::mz>"); - qRegisterMetaType<pappso::PrecisionP>("pappso::PrecisionP"); - qRegisterMetaType<std::vector<pappso::XicSp>>("std::vector<pappso::XicSp>"); - qRegisterMetaType<pappso::PeptideSp>("pappso::PeptideSp"); - qRegisterMetaType<pappso::XicExtractMethod>("pappso::XicExtractMethod"); - qRegisterMetaType<pappso::SpectrumSp>("pappso::SpectrumSp"); - qRegisterMetaType<MsRunSp>("MsRunSp"); - qRegisterMetaType<std::vector<pappso::PeptideNaturalIsotopeAverageSp>>("std::vector<pappso::PeptideNaturalIsotopeAverageSp>"); - + qRegisterMetaType<TandemRunBatch>("TandemRunBatch"); + qRegisterMetaType<std::vector<pappso::mz>>("std::vector<pappso::mz>"); + qRegisterMetaType<pappso::PrecisionP>("pappso::PrecisionP"); + qRegisterMetaType<std::vector<pappso::XicSp>>("std::vector<pappso::XicSp>"); + qRegisterMetaType<pappso::PeptideSp>("pappso::PeptideSp"); + qRegisterMetaType<pappso::XicExtractMethod>("pappso::XicExtractMethod"); + qRegisterMetaType<pappso::SpectrumSp>("pappso::SpectrumSp"); + qRegisterMetaType<MsRunSp>("MsRunSp"); + qRegisterMetaType<std::vector<pappso::PeptideNaturalIsotopeAverageSp>>( + "std::vector<pappso::PeptideNaturalIsotopeAverageSp>"); - try { - QCoreApplication::setOrganizationName("PAPPSO"); - QCoreApplication::setOrganizationDomain("pappso.inra.fr"); - QCoreApplication::setApplicationName("xtpcpp"); - MainWindow window; - window.show(); + try + { + QCoreApplication::setOrganizationName("PAPPSO"); + QCoreApplication::setOrganizationDomain("pappso.inra.fr"); + QCoreApplication::setApplicationName("xtpcpp"); + MainWindow window; + window.show(); - // This code will start the messaging engine in QT and in - // 10ms it will start the execution in the MainClass.run routine; - QTimer::singleShot(10, &window, SLOT(run())); + // This code will start the messaging engine in QT and in + // 10ms it will start the execution in the MainClass.run routine; + QTimer::singleShot(10, &window, SLOT(run())); - return app.exec(); + return app.exec(); } - catch (pappso::PappsoException& error) + catch(pappso::PappsoException &error) { - errorStream << "Oops! an error occurred in XTPcpp. Dont Panic :" << endl; - errorStream << error.qwhat() << endl; - app.exit(1); + errorStream << "Oops! an error occurred in XTPcpp. Dont Panic :" << endl; + errorStream << error.qwhat() << endl; + app.exit(1); } - catch (std::exception& error) + catch(std::exception &error) { - errorStream << "Oops! an error occurred in XTPcpp. Dont Panic :" << endl; - errorStream << error.what() << endl; - app.exit(1); + errorStream << "Oops! an error occurred in XTPcpp. Dont Panic :" << endl; + errorStream << error.what() << endl; + app.exit(1); } }