libpappsomspp
Library for mass spectrometry
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>
34#include "../peptide.h"
35#include "../peptideobservation.h"
36#include "../utils.h"
37#include "../../utils.h"
38#include "../../processing/filters/filterresample.h"
39
41{
43 mpa_writer->startMap();
44}
45
47{
48}
49
50void
52 double margin_in_seconds)
53{
54 m_isPeakShapeOutput = is_shape_output;
55 m_peakShapeMarginInSeconds = margin_in_seconds;
56}
57
58void
60{
61 m_isTraceOutput = is_trace_output;
62}
63
64void
66{
67 mpa_writer->writeInformations(
68 "masschroq", pappso::masschroq::Utils::getVersion(), "quantification", "quantification");
69}
70
71
72void
74{
75 mpa_writer->append(QLatin1String("end"));
76 mpa_writer->startMap();
77 mpa_writer->append(QLatin1String("timestamp"));
78 mpa_writer->append(QDateTime::currentDateTime().toString(Qt::ISODate));
79 mpa_writer->endMap();
80}
81void
83{
84 writeActionEnd();
85 mpa_writer->endMap();
86
87 delete mpa_writer;
88}
89
90void
92 const QJsonObject &json_object)
93{
94 mpa_writer->append(name);
95 QCborMap map;
96 map = map.fromJsonObject(json_object);
97 map.toCborValue().toCbor(*mpa_writer);
98}
99
100QCborStreamWriter &
102{
103 return (*mpa_writer);
104}
105
106
107void
109{
110 mpa_writer->append(QLatin1String("msrun"));
111 mpa_writer->startMap(3);
112 mpa_writer->append(QLatin1String("id"));
113 mpa_writer->append(msrun.getMsRunReaderSPtr().get()->getMsRunId().get()->getXmlId());
114 mpa_writer->append(QLatin1String("filename"));
115 mpa_writer->append(msrun.getMsRunReaderSPtr().get()->getMsRunId().get()->getFileName());
116 mpa_writer->append(QLatin1String("sample"));
117 mpa_writer->append(msrun.getMsRunReaderSPtr().get()->getMsRunId().get()->getSampleName());
118 mpa_writer->endMap();
119}
120
121
122void
124 const pappso::masschroq::PeptideMeasurements &peptide_measurements,
125 const pappso::MsRunRetentionTime<QString> *msrun_retention_time_p)
126{
128 peptide_measurements.getPeptideObservationSp().get()->getPeptideSp();
129
130 mpa_writer->append(peptide_sp.get()->getId());
131 mpa_writer->startMap();
132 // mpa_writer->append(QLatin1String("peptide_id"));
133 // mpa_writer->append(peptide_sp.get()->getId());
134 mpa_writer->append(QLatin1String("proforma"));
135 mpa_writer->append(peptide_sp.get()->getPappsoPeptideSp().get()->toProForma());
136
137
138 mpa_writer->append(QLatin1String("mods"));
139 mpa_writer->append(peptide_sp.get()->getMods());
140
141 std::size_t size_measurement = peptide_measurements.getMeasurementList().size();
142 if(size_measurement > 0)
143 {
144 mpa_writer->append(QLatin1String("rt_target"));
145 mpa_writer->append(
146 peptide_measurements.getMeasurementList().at(0).msp_xicCoord.get()->rtTarget);
147 }
148
149 mpa_writer->append(QLatin1String("xics"));
150 mpa_writer->startArray(size_measurement);
152 peptide_measurements.getMeasurementList())
153 {
154 // write(peptide_sp, measure, msrun_retention_time_p);
155 writeMeasurement(measure, msrun_retention_time_p);
156 }
157 mpa_writer->endArray();
158
159 mpa_writer->endMap();
160}
161
162void
165 const pappso::MsRunRetentionTime<QString> *msrun_retention_time_p)
166{
167
168 mpa_writer->startMap();
169 mpa_writer->append(QLatin1String("charge"));
170 mpa_writer->append(measurement.m_charge);
171
172 mpa_writer->append(QLatin1String("mz"));
173 mpa_writer->append(measurement.msp_xicCoord.get()->mzRange.getMz());
174
175 if(m_isXicCoordOutput)
176 {
177 measurement.msp_xicCoord.get()->writeCborStream(*mpa_writer);
178 }
179
180 if(measurement.m_peptideNaturalIsotopeAverageSp.get() != nullptr)
181 {
182 mpa_writer->append(QLatin1String("isotope"));
183 mpa_writer->append(measurement.m_peptideNaturalIsotopeAverageSp.get()->getIsotopeNumber());
184
185 mpa_writer->append(QLatin1String("rank"));
186 mpa_writer->append(measurement.m_peptideNaturalIsotopeAverageSp.get()->getIsotopeRank());
187
188 mpa_writer->append(QLatin1String("th_ratio"));
189 mpa_writer->append(measurement.m_peptideNaturalIsotopeAverageSp.get()->getIntensityRatio());
190 }
191
192
193 mpa_writer->append(QLatin1String("quality"));
194 mpa_writer->append(pappso::masschroq::Utils::enumToString(measurement.m_peakQualityCategory));
195
196 // label
197 if(measurement.mp_peptideLabel != nullptr)
198 {
199 mpa_writer->append(QLatin1String("label"));
200 mpa_writer->append(measurement.mp_peptideLabel->getLabel());
201 }
202
203 if(m_isTraceOutput && (measurement.msp_xicCoord.get()->xicSptr.get() != nullptr))
204 {
205 mpa_writer->append(QLatin1String("trace"));
206 writeTrace(*(measurement.msp_xicCoord.get()->xicSptr.get()));
207 }
208
209
210 if(measurement.m_tracePeakSp.get() != nullptr)
211 {
212
213 if(m_isPeakShapeOutput && (measurement.msp_xicCoord.get()->xicSptr.get() != nullptr))
214 {
215
216 mpa_writer->append(QLatin1String("peak_shape"));
217 mpa_writer->startMap();
218 mpa_writer->append(QLatin1String("trace"));
219
220 pappso::TraceSPtr trace_sp;
221
223 measurement.m_tracePeakSp.get()->getLeftBoundary().x - m_peakShapeMarginInSeconds,
224 measurement.m_tracePeakSp.get()->getRightBoundary().x + m_peakShapeMarginInSeconds);
225
226 trace_sp = measurement.msp_xicCoord.get()->xicSptr;
227 trace_sp.get()->filter(cut_xic);
228
229
230 writeTrace(*(trace_sp.get()));
231 mpa_writer->endMap();
232 }
233
234 mpa_writer->append(QLatin1String("peak"));
235 writeTracePeak(*(measurement.m_tracePeakSp.get()), msrun_retention_time_p);
236 }
237 mpa_writer->endMap();
238}
239
240
241void
243{
244 mpa_writer->startMap(2);
245 mpa_writer->append(QLatin1String("x"));
246 mpa_writer->startArray(trace.size());
247 for(double x : trace.xValues())
248 {
249 mpa_writer->append(x);
250 }
251 mpa_writer->endArray();
252
253
254 mpa_writer->append(QLatin1String("y"));
255 mpa_writer->startArray(trace.size());
256 for(double y : trace.yValues())
257 {
258 mpa_writer->append(y);
259 }
260 mpa_writer->endArray();
261 mpa_writer->endMap();
262}
263
264void
266 const pappso::TracePeak &peak, const pappso::MsRunRetentionTime<QString> *msrun_retention_time_p)
267{
268 mpa_writer->startMap();
269 mpa_writer->append(QLatin1String("area"));
270 mpa_writer->append(peak.getArea());
271
272 mpa_writer->append(QLatin1String("max_intensity"));
273 mpa_writer->append(peak.getMaxXicElement().y);
274
275 mpa_writer->append(QLatin1String("rt"));
276 mpa_writer->startArray();
277 mpa_writer->append(peak.getLeftBoundary().x);
278 mpa_writer->append(peak.getMaxXicElement().x);
279 mpa_writer->append(peak.getRightBoundary().x);
280 mpa_writer->endArray();
281
282 if((msrun_retention_time_p != nullptr) && msrun_retention_time_p->isAligned())
283 {
284 mpa_writer->append(QLatin1String("aligned_rt"));
285 mpa_writer->startArray();
286 mpa_writer->append(
287 msrun_retention_time_p->translateOriginal2AlignedRetentionTime(peak.getLeftBoundary().x));
288 mpa_writer->append(
289 msrun_retention_time_p->translateOriginal2AlignedRetentionTime(peak.getMaxXicElement().x));
290 mpa_writer->append(
291 msrun_retention_time_p->translateOriginal2AlignedRetentionTime(peak.getRightBoundary().x));
292 mpa_writer->endArray();
293 }
294
295 mpa_writer->endMap();
296}
297
298
299void
301 const pappso::masschroq::MbrPeptideMeasurements &mbr_peptide_measurements,
302 const pappso::MsRunRetentionTime<QString> *msrun_retention_time_p)
303{
304 pappso::masschroq::PeptideSp peptide_sp = mbr_peptide_measurements.getPeptideSp();
305
306 mpa_writer->append(peptide_sp.get()->getId());
307 mpa_writer->startMap();
308 mpa_writer->append(QLatin1String("proforma"));
309 mpa_writer->append(peptide_sp.get()->getPappsoPeptideSp().get()->toProForma());
310
311
312 mpa_writer->append(QLatin1String("mods"));
313 mpa_writer->append(peptide_sp.get()->getMods());
314
315
316 std::size_t size_measurement = mbr_peptide_measurements.getMeasurementList().size();
317 if(size_measurement > 0)
318 {
319 mpa_writer->append(QLatin1String("rt_target"));
320 mpa_writer->append(
321 mbr_peptide_measurements.getMeasurementList().at(0).msp_xicCoord.get()->rtTarget);
322 }
323
324 mpa_writer->append(QLatin1String("xics"));
325 mpa_writer->startArray(mbr_peptide_measurements.getMeasurementList().size());
327 mbr_peptide_measurements.getMeasurementList())
328 {
329 // write(peptide_sp, measure, msrun_retention_time_p);
330 writeMeasurement(measure, msrun_retention_time_p);
331 }
332 mpa_writer->endArray();
333
334 mpa_writer->endMap();
335}
336
337void
340 const pappso::masschroq::MsRunPeptideList &msrun_peptide_list,
341 bool is_mbr)
342{
343
344 quint64 size;
345 if(is_mbr)
346 {
347 size = msrun_peptide_list.getMbrPeptideMeasurementsList().size();
348
349 monitor.setStatus(QString("Writing MBR quantification results for msrun %1")
350 .arg(msrun_peptide_list.getMsRunSp()
351 .get()
352 ->getMsRunReaderSPtr()
353 .get()
354 ->getMsRunId()
355 .get()
356 ->getSampleName()));
357 }
358 else
359 {
360 size = msrun_peptide_list.getPeptideMeasurementsList().size();
361
362 monitor.setStatus(QString("Writing quantification results for msrun %1")
363 .arg(msrun_peptide_list.getMsRunSp()
364 .get()
365 ->getMsRunReaderSPtr()
366 .get()
367 ->getMsRunId()
368 .get()
369 ->getSampleName()));
370 }
371 monitor.setTotalSteps(size);
372 mpa_writer->append(msrun_peptide_list.getMsRunSp()
373 .get()
374 ->getMsRunReaderSPtr()
375 .get()
376 ->getMsRunId()
377 .get()
378 ->getXmlId());
379 mpa_writer->startMap();
380 writeMsRun(*(msrun_peptide_list.getMsRunSp().get()));
381
382
383 mpa_writer->append("peptide_measurements");
384 mpa_writer->startMap(size);
385 if(is_mbr)
386 {
388 msrun_peptide_list.getMbrPeptideMeasurementsList())
389 {
390 writeMbrPeptideMeasurements(*(measures.get()),
391 msrun_peptide_list.getMsRunRetentionTimeConstPtr());
392
393 monitor.count();
394 }
395 }
396 else
397 {
398 for(const pappso::masschroq::PeptideMeasurementsSp &measures :
399 msrun_peptide_list.getPeptideMeasurementsList())
400 {
401 writePeptideMeasurements(*(measures.get()),
402 msrun_peptide_list.getMsRunRetentionTimeConstPtr());
403
404 monitor.count();
405 }
406 }
407 monitor.setTotalSteps(0);
408 mpa_writer->endMap();
409
410 mpa_writer->endMap();
411}
412
413void
415{
416 mpa_writer->startArray(vector.size());
417 for(double x : vector)
418 {
419 mpa_writer->append(x);
420 }
421 mpa_writer->endArray();
422}
423
424void
426 const pappso::ProjectParameters &project_parameters)
427{
428 project_parameters.writeParameters(*mpa_writer);
429}
430
431void
433 const pappso::Trace &report_common_ms2,
434 const pappso::MsRunRetentionTime<QString> &msrun_retention_time)
435{
436 mpa_writer->startMap(5);
437 mpa_writer->append(QLatin1String("original"));
438 writeVectorDouble(msrun_retention_time.getMs1RetentionTimeVector());
439 mpa_writer->append(QLatin1String("aligned"));
440 writeVectorDouble(msrun_retention_time.getAlignedRetentionTimeVector());
441 mpa_writer->append(QLatin1String("ms2_delta_rt"));
442 writeTrace(report_common_ms2);
443
444 pappso::Trace median(report_common_ms2);
445 msrun_retention_time.getMs2MedianFilter().filter(median);
446
447 mpa_writer->append(QLatin1String("ms2_median"));
448 writeVectorDouble(median.yValues());
449
450 msrun_retention_time.getMs2MeanFilter().filter(median);
451 mpa_writer->append(QLatin1String("ms2_mean"));
452 writeVectorDouble(median.yValues());
453
454
455 mpa_writer->endMap();
456}
quantification result cbor writer for MassChroqLight
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
Definition: tracepeak.cpp:119
DataPoint & getMaxXicElement()
Definition: tracepeak.cpp:83
DataPoint & getRightBoundary()
Definition: tracepeak.cpp:104
A simple container of DataPoint instances.
Definition: trace.h:148
std::vector< pappso_double > xValues() const
Definition: trace.cpp:688
std::vector< pappso_double > yValues() const
Definition: trace.cpp:702
size_t append(const DataPoint &data_point)
appends a datapoint and return new size
Definition: trace.cpp:648
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
const QString & getLabel() const
virtual const std::vector< Measurement > & getMeasurementList() const
const PeptideObservationSp & getPeptideObservationSp() const
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
std::shared_ptr< Trace > TraceSPtr
Definition: trace.h:135
pappso_double x
Definition: datapoint.h:23
pappso_double y
Definition: datapoint.h:24
pappso::PeptideNaturalIsotopeAverageSp m_peptideNaturalIsotopeAverageSp