libpappsomspp
Library for mass spectrometry
Loading...
Searching...
No Matches
cboroutputstream.cpp
Go to the documentation of this file.
1
2/**
3 * \file pappsomspp/masschroq/output/cboroutputstream.cpp
4 * \date 02/01/2025
5 * \author Olivier Langella
6 * \brief quantification result cbor writer for MassChroqLight
7 */
8
9/*******************************************************************************
10 * Copyright (c) 2025 Olivier Langella
11 *<Olivier.Langella@universite-paris-saclay.fr>.
12 *
13 * This file is part of MassChroQ.
14 *
15 * MassChroQ is free software: you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation, either version 3 of the License, or
18 * (at your option) any later version.
19 *
20 * MassChroQ is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 * You should have received a copy of the GNU General Public License
26 * along with MassChroQ. If not, see <http://www.gnu.org/licenses/>.
27 *
28 ******************************************************************************/
29
30#include "cboroutputstream.h"
31#include <QDateTime>
32#include <QCborMap>
33#include <QThreadPool>
39
40namespace pappso
41{
43{
45 mpa_writer->startMap();
46}
47
51
52void
54 double margin_in_seconds)
55{
56 m_isPeakShapeOutput = is_shape_output;
57 m_peakShapeMarginInSeconds = margin_in_seconds;
58}
59
60void
62{
63 m_isTraceOutput = is_trace_output;
64}
65
66void
68{
69 mpa_writer->writeInformations(
70 "masschroq", masschroq::Utils::getVersion(), "quantification", "quantification");
71}
72
73
74void
76{
77 mpa_writer->append(QLatin1String("end"));
78 mpa_writer->startMap();
79 mpa_writer->append(QLatin1String("timestamp"));
80 mpa_writer->append(QDateTime::currentDateTime().toString(Qt::ISODate));
81 mpa_writer->endMap();
82}
83void
85{
87 mpa_writer->endMap();
88
89 delete mpa_writer;
90}
91
92void
94 const QJsonObject &json_object)
95{
96 mpa_writer->append(name);
97 QCborMap map;
98 map = map.fromJsonObject(json_object);
99 map.toCborValue().toCbor(*mpa_writer);
100}
101
102QCborStreamWriter &
107
108
109void
111{
112 mpa_writer->append(QLatin1String("msrun"));
113 mpa_writer->startMap(3);
114 mpa_writer->append(QLatin1String("id"));
115 mpa_writer->append(msrun.getMsRunReaderSPtr().get()->getMsRunId().get()->getXmlId());
116 mpa_writer->append(QLatin1String("filename"));
117 mpa_writer->append(msrun.getMsRunReaderSPtr().get()->getMsRunId().get()->getFileName());
118 mpa_writer->append(QLatin1String("sample"));
119 mpa_writer->append(msrun.getMsRunReaderSPtr().get()->getMsRunId().get()->getSampleName());
120 mpa_writer->endMap();
121}
122
123
124void
126 const masschroq::PeptideMeasurements &peptide_measurements,
127 const MsRunRetentionTime<QString> *msrun_retention_time_p)
128{
129 masschroq::PeptideSp peptide_sp =
130 peptide_measurements.getPeptideObservationSp().get()->getPeptideSp();
131
132 mpa_writer->append(peptide_sp.get()->getId());
133 mpa_writer->startMap();
134 // mpa_writer->append(QLatin1String("peptide_id"));
135 // mpa_writer->append(peptide_sp.get()->getId());
136 mpa_writer->append(QLatin1String("proforma"));
137 mpa_writer->append(peptide_sp.get()->getPappsoPeptideSp().get()->toProForma());
138
139
140 mpa_writer->append(QLatin1String("mods"));
141 mpa_writer->append(peptide_sp.get()->getMods());
142
143 std::size_t size_measurement = peptide_measurements.getMeasurementList().size();
144 if(size_measurement > 0)
145 {
146 mpa_writer->append(QLatin1String("rt_target"));
147 mpa_writer->append(
148 peptide_measurements.getMeasurementList().at(0).msp_xicCoord.get()->rtTarget);
149 }
150
151 mpa_writer->append(QLatin1String("xics"));
152 mpa_writer->startArray(size_measurement);
154 peptide_measurements.getMeasurementList())
155 {
156 // write(peptide_sp, measure, msrun_retention_time_p);
157 writeMeasurement(measure, msrun_retention_time_p);
158 }
159 mpa_writer->endArray();
160
161 mpa_writer->endMap();
162}
163
164void
167 const MsRunRetentionTime<QString> *msrun_retention_time_p)
168{
169
170 mpa_writer->startMap();
171 mpa_writer->append(QLatin1String("charge"));
172 mpa_writer->append(measurement.m_charge);
173
174 mpa_writer->append(QLatin1String("mz"));
175 mpa_writer->append(measurement.msp_xicCoord.get()->mzRange.getMz());
176
178 {
179 measurement.msp_xicCoord.get()->writeCborStream(*mpa_writer);
180 }
181
182 if(measurement.m_peptideNaturalIsotopeAverageSp.get() != nullptr)
183 {
184 mpa_writer->append(QLatin1String("isotope"));
185 mpa_writer->append(measurement.m_peptideNaturalIsotopeAverageSp.get()->getIsotopeNumber());
186
187 mpa_writer->append(QLatin1String("rank"));
188 mpa_writer->append(measurement.m_peptideNaturalIsotopeAverageSp.get()->getIsotopeRank());
189
190 mpa_writer->append(QLatin1String("th_ratio"));
191 mpa_writer->append(measurement.m_peptideNaturalIsotopeAverageSp.get()->getIntensityRatio());
192 }
193
194
195 mpa_writer->append(QLatin1String("quality"));
197
198 // label
199 if(measurement.mp_peptideLabel != nullptr)
200 {
201 mpa_writer->append(QLatin1String("label"));
202 mpa_writer->append(measurement.mp_peptideLabel->getLabel());
203 }
204
205 if(m_isTraceOutput && (measurement.msp_xicCoord.get()->xicSptr.get() != nullptr))
206 {
207 mpa_writer->append(QLatin1String("trace"));
208 writeTrace(*(measurement.msp_xicCoord.get()->xicSptr.get()));
209 }
210
211
212 if(measurement.m_tracePeakSp.get() != nullptr)
213 {
214
215 if(m_isPeakShapeOutput && (measurement.msp_xicCoord.get()->xicSptr.get() != nullptr))
216 {
217
218 mpa_writer->append(QLatin1String("peak_shape"));
219 mpa_writer->startMap();
220 mpa_writer->append(QLatin1String("trace"));
221
222 TraceSPtr trace_sp;
223
225 measurement.m_tracePeakSp.get()->getLeftBoundary().x - m_peakShapeMarginInSeconds,
226 measurement.m_tracePeakSp.get()->getRightBoundary().x + m_peakShapeMarginInSeconds);
227
228 trace_sp = measurement.msp_xicCoord.get()->xicSptr;
229 trace_sp.get()->filter(cut_xic);
230
231
232 writeTrace(*(trace_sp.get()));
233 mpa_writer->endMap();
234 }
235
236 mpa_writer->append(QLatin1String("peak"));
237 writeTracePeak(*(measurement.m_tracePeakSp.get()), msrun_retention_time_p);
238 }
239 mpa_writer->endMap();
240}
241
242
243void
245{
246 mpa_writer->startMap(2);
247 mpa_writer->append(QLatin1String("x"));
248 mpa_writer->startArray(trace.size());
249 for(double x : trace.xValues())
250 {
251 mpa_writer->append(x);
252 }
253 mpa_writer->endArray();
254
255
256 mpa_writer->append(QLatin1String("y"));
257 mpa_writer->startArray(trace.size());
258 for(double y : trace.yValues())
259 {
260 mpa_writer->append(y);
261 }
262 mpa_writer->endArray();
263 mpa_writer->endMap();
264}
265
266void
268 const TracePeak &peak, const MsRunRetentionTime<QString> *msrun_retention_time_p)
269{
270 mpa_writer->startMap();
271 mpa_writer->append(QLatin1String("area"));
272 mpa_writer->append(peak.getArea());
273
274 mpa_writer->append(QLatin1String("max_intensity"));
275 mpa_writer->append(peak.getMaxXicElement().y);
276
277 mpa_writer->append(QLatin1String("rt"));
278 mpa_writer->startArray();
279 mpa_writer->append(peak.getLeftBoundary().x);
280 mpa_writer->append(peak.getMaxXicElement().x);
281 mpa_writer->append(peak.getRightBoundary().x);
282 mpa_writer->endArray();
283
284 if((msrun_retention_time_p != nullptr) && msrun_retention_time_p->isAligned())
285 {
286 mpa_writer->append(QLatin1String("aligned_rt"));
287 mpa_writer->startArray();
288 mpa_writer->append(
289 msrun_retention_time_p->translateOriginal2AlignedRetentionTime(peak.getLeftBoundary().x));
290 mpa_writer->append(
291 msrun_retention_time_p->translateOriginal2AlignedRetentionTime(peak.getMaxXicElement().x));
292 mpa_writer->append(
293 msrun_retention_time_p->translateOriginal2AlignedRetentionTime(peak.getRightBoundary().x));
294 mpa_writer->endArray();
295 }
296
297 mpa_writer->endMap();
298}
299
300
301void
303 const masschroq::MbrPeptideMeasurements &mbr_peptide_measurements,
304 const MsRunRetentionTime<QString> *msrun_retention_time_p)
305{
306 masschroq::PeptideSp peptide_sp = mbr_peptide_measurements.getPeptideSp();
307
308 mpa_writer->append(peptide_sp.get()->getId());
309 mpa_writer->startMap();
310 mpa_writer->append(QLatin1String("proforma"));
311 mpa_writer->append(peptide_sp.get()->getPappsoPeptideSp().get()->toProForma());
312
313
314 mpa_writer->append(QLatin1String("mods"));
315 mpa_writer->append(peptide_sp.get()->getMods());
316
317
318 std::size_t size_measurement = mbr_peptide_measurements.getMeasurementList().size();
319 if(size_measurement > 0)
320 {
321 mpa_writer->append(QLatin1String("rt_target"));
322 mpa_writer->append(
323 mbr_peptide_measurements.getMeasurementList().at(0).msp_xicCoord.get()->rtTarget);
324 }
325
326 mpa_writer->append(QLatin1String("xics"));
327 mpa_writer->startArray(mbr_peptide_measurements.getMeasurementList().size());
329 mbr_peptide_measurements.getMeasurementList())
330 {
331 // write(peptide_sp, measure, msrun_retention_time_p);
332 writeMeasurement(measure, msrun_retention_time_p);
333 }
334 mpa_writer->endArray();
335
336 mpa_writer->endMap();
337}
338
339void
341 UiMonitorInterface &monitor,
342 const masschroq::MsRunPeptideList &msrun_peptide_list,
343 bool is_mbr)
344{
345
346 quint64 size;
347 if(is_mbr)
348 {
349 size = msrun_peptide_list.getMbrPeptideMeasurementsList().size();
350
351 monitor.setStatus(QString("Writing MBR quantification results for msrun %1")
352 .arg(msrun_peptide_list.getMsRunSp()
353 .get()
355 .get()
356 ->getMsRunId()
357 .get()
358 ->getSampleName()));
359 }
360 else
361 {
362 size = msrun_peptide_list.getPeptideMeasurementsList().size();
363
364 monitor.setStatus(QString("Writing quantification results for msrun %1")
365 .arg(msrun_peptide_list.getMsRunSp()
366 .get()
368 .get()
369 ->getMsRunId()
370 .get()
371 ->getSampleName()));
372 }
373 monitor.setTotalSteps(size);
374 mpa_writer->append(msrun_peptide_list.getMsRunSp()
375 .get()
377 .get()
378 ->getMsRunId()
379 .get()
380 ->getXmlId());
381 mpa_writer->startMap();
382 writeMsRun(*(msrun_peptide_list.getMsRunSp().get()));
383
384
385 mpa_writer->append("peptide_measurements");
386 mpa_writer->startMap(size);
387 if(is_mbr)
388 {
389 for(const masschroq::MbrPeptideMeasurementsSp &measures :
390 msrun_peptide_list.getMbrPeptideMeasurementsList())
391 {
392 writeMbrPeptideMeasurements(*(measures.get()),
393 msrun_peptide_list.getMsRunRetentionTimeConstPtr());
394
395 monitor.count();
396 }
397 }
398 else
399 {
400 for(const masschroq::PeptideMeasurementsSp &measures :
401 msrun_peptide_list.getPeptideMeasurementsList())
402 {
403 writePeptideMeasurements(*(measures.get()),
404 msrun_peptide_list.getMsRunRetentionTimeConstPtr());
405
406 monitor.count();
407 }
408 }
409 monitor.setTotalSteps(0);
410 mpa_writer->endMap();
411
412 mpa_writer->endMap();
413}
414
415void
416masschroq::CborOutputStream::writeVectorDouble(const std::vector<double> &vector)
417{
418 mpa_writer->startArray(vector.size());
419 for(double x : vector)
420 {
421 mpa_writer->append(x);
422 }
423 mpa_writer->endArray();
424}
425
426void
428 const ProjectParameters &project_parameters)
429{
430 project_parameters.writeParameters(*mpa_writer);
431}
432
433void
435 const Trace &report_common_ms2,
436 const MsRunRetentionTime<QString> &msrun_retention_time)
437{
438 mpa_writer->startMap(5);
439 mpa_writer->append(QLatin1String("original"));
440 writeVectorDouble(msrun_retention_time.getMs1RetentionTimeVector());
441 mpa_writer->append(QLatin1String("aligned"));
442 writeVectorDouble(msrun_retention_time.getAlignedRetentionTimeVector());
443 mpa_writer->append(QLatin1String("ms2_delta_rt"));
444 writeTrace(report_common_ms2);
445
446 Trace median(report_common_ms2);
447 msrun_retention_time.getMs2MedianFilter().filter(median);
448
449 mpa_writer->append(QLatin1String("ms2_median"));
450 writeVectorDouble(median.yValues());
451
452 msrun_retention_time.getMs2MeanFilter().filter(median);
453 mpa_writer->append(QLatin1String("ms2_mean"));
454 writeVectorDouble(median.yValues());
455
456
457 mpa_writer->endMap();
458}
459
460} // namespace pappso
virtual Trace & filter(Trace &data_points) const override
const FilterMorphoMedian & getMs2MedianFilter() const
const std::vector< double > & getAlignedRetentionTimeVector() const
get aligned retention time vector
double translateOriginal2AlignedRetentionTime(double original_retention_time) const
const std::vector< double > & getMs1RetentionTimeVector() const
get orginal retention time vector (not aligned)
const FilterMorphoMean & getMs2MeanFilter() const
void writeParameters(CalcWriterInterface &writer) const
DataPoint & getLeftBoundary()
Definition tracepeak.cpp:93
pappso_double getArea() const
DataPoint & getMaxXicElement()
Definition tracepeak.cpp:83
DataPoint & getRightBoundary()
A simple container of DataPoint instances.
Definition trace.h:148
std::vector< pappso_double > xValues() const
Definition trace.cpp:663
std::vector< pappso_double > yValues() const
Definition trace.cpp:677
virtual void setStatus(const QString &status)=0
current status of the process
virtual void setTotalSteps(std::size_t total_number_of_steps)
use it if the number of steps is known in an algorithm the total number of steps is usefull to report...
virtual void count()=0
count steps report when a step is computed in an algorithm
void setIsTraceOutput(bool is_trace_output)
set trace output flag
void writeMbrPeptideMeasurements(const MbrPeptideMeasurements &peptide_measurements, const pappso::MsRunRetentionTime< QString > *msrun_retention_time_p)
void setIsPeakShapeOutput(bool is_shape_output, double margin_in_seconds)
set peak shape output flag
pappso::cbor::CborStreamWriter * mpa_writer
void writeJsonObject(const QString &name, const QJsonObject &json_object)
void writeTrace(const pappso::Trace &trace)
void writeMeasurement(const PeptideMeasurements::Measurement &measurement, const pappso::MsRunRetentionTime< QString > *msrun_retention_time_p)
void writeProjectParameters(const pappso::ProjectParameters &project_parameters)
void writeMsRunRetentionTime(const pappso::Trace &report_common_ms2, const pappso::MsRunRetentionTime< QString > &msrun_retention_time)
void writeVectorDouble(const std::vector< double > &vector)
void writeActionBegin(const QString &operation)
void writeTracePeak(const pappso::TracePeak &peak, const pappso::MsRunRetentionTime< QString > *msrun_retention_time_p)
void writeQrDataBlock(pappso::UiMonitorInterface &m_uiMonitor, const MsRunPeptideList &msrun_peptide_list, bool is_mbr)
void writePeptideMeasurements(const PeptideMeasurements &peptide_measurements, const pappso::MsRunRetentionTime< QString > *msrun_retention_time_p)
const std::vector< MbrPeptideMeasurementsSp > & getMbrPeptideMeasurementsList() const
const std::vector< PeptideMeasurementsSp > & getPeptideMeasurementsList() const
const pappso::MsRunRetentionTime< QString > * getMsRunRetentionTimeConstPtr() const
const pappso::MsRunReaderSPtr & getMsRunReaderSPtr() const
Definition msrun.cpp:62
virtual const pappso::PeptideSp & getPappsoPeptideSp() const
get the peptide sequence
const QString & getLabel() const
virtual const std::vector< Measurement > & getMeasurementList() const
const PeptideObservationSp & getPeptideObservationSp() const
const QString & getMods() const
get optional information as text
Definition peptide.cpp:94
const QString & getId() const
get peptide unique identifier
Definition peptide.cpp:82
static QString getVersion()
Definition utils.cpp:37
static QString enumToString(PeakQualityCategory peak_category)
Convenience function to return a string describing the specglob alingment type.
Definition utils.cpp:44
std::shared_ptr< PeptideMeasurements > PeptideMeasurementsSp
std::shared_ptr< MbrPeptideMeasurements > MbrPeptideMeasurementsSp
std::shared_ptr< Peptide > PeptideSp
Definition peptide.h:46
tries to keep as much as possible monoisotopes, removing any possible C13 peaks and changes multichar...
Definition aa.cpp:39
std::shared_ptr< Trace > TraceSPtr
Definition trace.h:135
pappso_double x
Definition datapoint.h:24
pappso_double y
Definition datapoint.h:25
pappso::PeptideNaturalIsotopeAverageSp m_peptideNaturalIsotopeAverageSp