libpappsomspp
Library for mass spectrometry
xtandeminputsaxhandler.cpp
Go to the documentation of this file.
1 /**
2  * \file pappsomspp/processing/tandemwrapper/xtandeminputsaxhandler.cpp
3  * \date 25/01/2020
4  * \author Olivier Langella
5  * \brief rewrites tandem xml input file with temporary files
6  */
7 
8 /*******************************************************************************
9  * Copyright (c) 2020 Olivier Langella <Olivier.Langella@u-psud.fr>.
10  *
11  * This file is part of PAPPSOms-tools.
12  *
13  * PAPPSOms-tools is free software: you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation, either version 3 of the License, or
16  * (at your option) any later version.
17  *
18  * PAPPSOms-tools is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with PAPPSOms-tools. If not, see <http://www.gnu.org/licenses/>.
25  *
26  ******************************************************************************/
27 
28 
29 #include "xtandeminputsaxhandler.h"
30 #include "../../pappsoexception.h"
31 #include <QFileInfo>
32 namespace pappso
33 {
35  const QString &destinationMzXmlFile,
36  const QString &destinationTandemInputFile,
37  const QString &destinationTandemOutputFile)
38  : m_destinationTandemInputFile(destinationTandemInputFile)
39 {
40  m_destinationMzXmlFileName = destinationMzXmlFile;
41  m_destinationTandemOutputFileName = destinationTandemOutputFile;
43  QFileInfo(destinationTandemInputFile).absoluteFilePath();
44 
45  if(destinationTandemInputFile.isEmpty())
46  {
48  QObject::tr("ERROR: X!Tandem input file path is empty"));
49  }
50 
51  if(!m_destinationTandemInputFile.open(QIODevice::WriteOnly))
52  {
54  QObject::tr("ERROR: unable to open %1 tandem output file for write")
55  .arg(destinationTandemInputFile));
56  }
57 
58  p_writeXmlTandemInput = new QXmlStreamWriter();
60 }
61 
63 {
64  if(p_writeXmlTandemInput != nullptr)
65  {
67  delete p_writeXmlTandemInput;
68  }
69 }
70 
71 void
73  const QXmlAttributes &attributes)
74 {
75  p_writeXmlTandemInput->writeStartElement(qName);
76  for(int i = 0; i < attributes.length(); i++)
77  {
78  p_writeXmlTandemInput->writeAttribute(attributes.qName(i),
79  attributes.value(i));
80  }
81 }
82 
83 bool
85  [[maybe_unused]] const QString &namespaceURI,
86  [[maybe_unused]] const QString &localName,
87  const QString &qName,
88  const QXmlAttributes &attributes)
89 {
90  /*
91 <?xml version="1.0" encoding="UTF-8"?>
92 <bioml label="20191222_18_EF1_test_condor_22janv_third_step.xml">
93 <note type="heading">Paths</note>
94 <note type="input" label="list path, default
95 parameters">/gorgone/pappso/jouy/presets/metapappso/Lumos_04112019_PROTEOCARDIS_THIRD_STEP_AB.xml</note>
96 <note type="input" label="list path, taxonomy
97 information">/gorgone/pappso/jouy/users/Celine/2019_Lumos/20191222_107_Juste_APD/metapappso_condor/params/xtandem_database_third_step_test_condor_22janv.database</note>
98 <note type="input" label="spectrum,
99 path">/gorgone/pappso/jouy/raw/2019_Lumos/20191222_107_Juste/20191222_18_EF1.mzXML</note>
100 <note type="heading">Protein general</note>
101 <note type="input" label="protein, taxon">usedefined</note>
102 <note type="heading">Output</note>
103 <note type="input" label="output,
104 path">/gorgone/pappso/jouy/users/Celine/2019_Lumos/20191222_107_Juste_APD/metapappso_condor/test_run/20191222_18_EF1_third_step_test_condor_22janv.xml</note>
105 </bioml>
106 */
107  m_tagStack.push_back(qName);
108  bool is_ok = true;
109 
110  try
111  {
112  m_currentText.clear();
113  //<bioml label="example api document">
114  if(m_tagStack.size() == 1)
115  {
116  if(qName != "bioml")
117  {
118  m_errorString = QObject::tr(
119  "ERROR in XtandemInputSaxHandler::startElement "
120  "root tag %1 is not <bioml>")
121  .arg(qName);
122  m_isTandemParameter = false;
123  return false;
124  }
125  else
126  {
127 
128  m_isTandemParameter = true;
129  // label="20191222_18_EF1_test_condor_22janv_third_step.xml"
130  m_labelName = attributes.value("label");
131 
132  writeOpenTag(qName, attributes);
133  }
134  }
135  // startElement_group
136 
137  if(qName == "note")
138  {
139  is_ok = startElement_note(attributes);
140  }
141  }
142  catch(pappso::PappsoException &exception_pappso)
143  {
144  m_errorString = QObject::tr(
145  "ERROR in XtandemInputSaxHandler::startElement "
146  "tag %1, PAPPSO exception:\n%2")
147  .arg(qName)
148  .arg(exception_pappso.qwhat());
149  return false;
150  }
151  catch(std::exception &exception_std)
152  {
153  m_errorString = QObject::tr(
154  "ERROR in XtandemInputSaxHandler::startElement "
155  "tag %1, std exception:\n%2")
156  .arg(qName)
157  .arg(exception_std.what());
158  return false;
159  }
160  return is_ok;
161 }
162 
163 bool
164 XtandemInputSaxHandler::endElement([[maybe_unused]] const QString &namespaceURI,
165  [[maybe_unused]] const QString &localName,
166  const QString &qName)
167 {
168 
169  bool is_ok = true;
170  // endElement_peptide_list
171  try
172  {
173 
174  if(qName == "note")
175  {
176  is_ok = endElement_note();
177  }
178  else
179  {
180  p_writeXmlTandemInput->writeCharacters(m_currentText);
181  p_writeXmlTandemInput->writeEndElement();
182  }
183  }
184  catch(pappso::PappsoException &exception_pappso)
185  {
186  m_errorString = QObject::tr(
187  "ERROR in XtandemInputSaxHandler::endElement tag "
188  "%1, PAPPSO exception:\n%2")
189  .arg(qName)
190  .arg(exception_pappso.qwhat());
191  return false;
192  }
193  catch(std::exception &exception_std)
194  {
195  m_errorString = QObject::tr(
196  "ERROR in XtandemInputSaxHandler::endElement tag "
197  "%1, std exception:\n%2")
198  .arg(qName)
199  .arg(exception_std.what());
200  return false;
201  }
202 
203  m_currentText.clear();
204  m_tagStack.pop_back();
205 
206  return is_ok;
207 }
208 
209 bool
211 {
212 
213  p_writeXmlTandemInput->setAutoFormatting(true);
214  p_writeXmlTandemInput->writeStartDocument("1.0");
215  return true;
216 }
217 
218 bool
220 {
221  p_writeXmlTandemInput->writeEndDocument();
222 
224  delete p_writeXmlTandemInput;
225  p_writeXmlTandemInput = nullptr;
226  return true;
227 }
228 
229 bool
231 {
232  m_currentText += str;
233  return true;
234 }
235 
236 
237 bool
238 XtandemInputSaxHandler::error(const QXmlParseException &exception)
239 {
240  m_errorString = QObject::tr(
241  "Parse error at line %1, column %2 :\n"
242  "%3")
243  .arg(exception.lineNumber())
244  .arg(exception.columnNumber())
245  .arg(exception.message());
246  qDebug() << m_errorString;
247  return false;
248 }
249 
250 
251 bool
252 XtandemInputSaxHandler::fatalError(const QXmlParseException &exception)
253 {
254  m_errorString = QObject::tr(
255  "Parse error at line %1, column %2 :\n"
256  "%3")
257  .arg(exception.lineNumber())
258  .arg(exception.columnNumber())
259  .arg(exception.message());
260  qDebug() << m_errorString;
261  return false;
262 }
263 
264 QString
266 {
267  return m_errorString;
268 }
269 
270 
271 bool
273 {
274  // qDebug() << "XtandemParamSaxHandler::startElement_note begin " <<
275  // <note type="input"
276  // label="output,path">/gorgone/pappso/jouy/users/Celine/2019_Lumos/20191222_107_Juste_APD/metapappso_condor/test_run/20191222_18_EF1_third_step_test_condor_22janv.xml</note>
277 
278  writeOpenTag("note", attributes);
279  m_currentLabel = "";
280 
281  if(attributes.value("type") == "input")
282  {
283  m_currentLabel = attributes.value("label");
284  }
285 
286  // qDebug() << "XtandemParamSaxHandler::startElement_note _current_label " <<
287  // _current_label;
288  return true;
289 }
290 
291 bool
293 {
294  // qDebug() << "XtandemParamSaxHandler::endElement_note begin " <<
295  // _current_label << " " << _current_text.simplified();
296  if(m_currentLabel == "output, path")
297  {
300  }
301  else if(m_currentLabel == "list path, default parameters")
302  {
303  // <note type="input" label="list path, default parameters">
304  p_writeXmlTandemInput->writeCharacters(m_currentText);
306  QFileInfo(m_currentText).absoluteFilePath();
307  }
308  else if(m_currentLabel == "spectrum, path")
309  {
310  //<note type="input"
311  // label="spectrum,path">/gorgone/pappso/jouy/raw/2019_Lumos/20191222_107_Juste/20191222_18_EF1.mzXML</note>
314  }
315  else
316  {
317  p_writeXmlTandemInput->writeCharacters(m_currentText);
318  }
319  p_writeXmlTandemInput->writeEndElement();
320  return true;
321 }
322 
323 
324 const QString &
326 {
327  return m_originMzDataFileName;
328 }
329 
330 const QString &
332 {
334 }
335 
336 const QString &
338 {
340 }
341 } // namespace pappso
pappso::XtandemInputSaxHandler::m_currentText
QString m_currentText
Definition: xtandeminputsaxhandler.h:97
pappso::XtandemInputSaxHandler::errorString
QString errorString() const
Definition: xtandeminputsaxhandler.cpp:265
xtandeminputsaxhandler.h
rewrites tandem xml input file with temporary files
pappso::XtandemInputSaxHandler::fatalError
bool fatalError(const QXmlParseException &exception) override
Definition: xtandeminputsaxhandler.cpp:252
pappso::XtandemInputSaxHandler::XtandemInputSaxHandler
XtandemInputSaxHandler(const QString &destinationMzXmlFile, const QString &destinationTandemInputFile, const QString &destinationTandemOutputFile)
Definition: xtandeminputsaxhandler.cpp:34
pappso::XtandemInputSaxHandler::m_destinationTandemInputFile
QFile m_destinationTandemInputFile
Definition: xtandeminputsaxhandler.h:92
pappso::XtandemInputSaxHandler::startDocument
bool startDocument() override
Definition: xtandeminputsaxhandler.cpp:210
pappso
tries to keep as much as possible monoisotopes, removing any possible C13 peaks and changes multichar...
Definition: aa.cpp:39
pappso::XtandemInputSaxHandler::endElement_note
bool endElement_note()
Definition: xtandeminputsaxhandler.cpp:292
pappso::XtandemInputSaxHandler::startElement
bool startElement(const QString &namespaceURI, const QString &localName, const QString &qName, const QXmlAttributes &attributes) override
Definition: xtandeminputsaxhandler.cpp:84
pappso::XtandemInputSaxHandler::~XtandemInputSaxHandler
~XtandemInputSaxHandler()
Definition: xtandeminputsaxhandler.cpp:62
pappso::XtandemInputSaxHandler::m_labelName
QString m_labelName
Definition: xtandeminputsaxhandler.h:99
pappso::XtandemInputSaxHandler::m_currentLabel
QString m_currentLabel
Definition: xtandeminputsaxhandler.h:98
pappso::XtandemInputSaxHandler::p_writeXmlTandemInput
QXmlStreamWriter * p_writeXmlTandemInput
Definition: xtandeminputsaxhandler.h:93
pappso::XtandemInputSaxHandler::m_originTandemOutpuFileName
QString m_originTandemOutpuFileName
Definition: xtandeminputsaxhandler.h:90
pappso::XtandemInputSaxHandler::writeOpenTag
void writeOpenTag(const QString &qName, const QXmlAttributes &attributes)
Definition: xtandeminputsaxhandler.cpp:72
pappso::XtandemInputSaxHandler::characters
bool characters(const QString &str) override
Definition: xtandeminputsaxhandler.cpp:230
pappso::XtandemInputSaxHandler::endElement
bool endElement(const QString &namespaceURI, const QString &localName, const QString &qName) override
Definition: xtandeminputsaxhandler.cpp:164
pappso::XtandemInputSaxHandler::getOriginalTandemOutputFileName
const QString & getOriginalTandemOutputFileName() const
Definition: xtandeminputsaxhandler.cpp:331
pappso::XtandemInputSaxHandler::startElement_note
bool startElement_note(QXmlAttributes attributes)
Definition: xtandeminputsaxhandler.cpp:272
pappso::PappsoException::qwhat
virtual const QString & qwhat() const
Definition: pappsoexception.h:66
pappso::XtandemInputSaxHandler::error
bool error(const QXmlParseException &exception) override
Definition: xtandeminputsaxhandler.cpp:238
pappso::XtandemInputSaxHandler::m_destinationMzXmlFileName
QString m_destinationMzXmlFileName
Definition: xtandeminputsaxhandler.h:86
pappso::XtandemInputSaxHandler::m_originMzDataFileName
QString m_originMzDataFileName
Definition: xtandeminputsaxhandler.h:87
pappso::XtandemInputSaxHandler::getOriginalTandemPresetFileName
const QString & getOriginalTandemPresetFileName() const
Definition: xtandeminputsaxhandler.cpp:337
pappso::XtandemInputSaxHandler::endDocument
bool endDocument() override
Definition: xtandeminputsaxhandler.cpp:219
pappso::XtandemInputSaxHandler::m_originTandemPresetFileName
QString m_originTandemPresetFileName
Definition: xtandeminputsaxhandler.h:89
pappso::XtandemInputSaxHandler::m_destinationTandemInputFileName
QString m_destinationTandemInputFileName
Definition: xtandeminputsaxhandler.h:88
pappso::XtandemInputSaxHandler::m_errorString
QString m_errorString
Definition: xtandeminputsaxhandler.h:96
pappso::XtandemInputSaxHandler::getOriginalMsDataFileName
const QString & getOriginalMsDataFileName() const
Definition: xtandeminputsaxhandler.cpp:325
pappso::XtandemInputSaxHandler::m_isTandemParameter
bool m_isTandemParameter
Definition: xtandeminputsaxhandler.h:95
pappso::PappsoException
Definition: pappsoexception.h:42
pappso::XtandemInputSaxHandler::m_tagStack
std::vector< QString > m_tagStack
Definition: xtandeminputsaxhandler.h:94
pappso::XtandemInputSaxHandler::m_destinationTandemOutputFileName
QString m_destinationTandemOutputFileName
Definition: xtandeminputsaxhandler.h:91