libpappsomspp
Library for mass spectrometry
timsmsrunreaderms2selected.cpp
Go to the documentation of this file.
1/**
2 * \file pappsomspp/msrun/private/timsmsrunreaderms2.cpp
3 * \date 10/09/2019
4 * \author Olivier Langella
5 * \brief MSrun file reader for native Bruker TimsTOF specialized for MS2
6 * purpose
7 */
8
9
10/*******************************************************************************
11 * Copyright (c) 2019 Olivier Langella <Olivier.Langella@u-psud.fr>.
12 *
13 * This file is part of the PAPPSOms++ library.
14 *
15 * PAPPSOms++ 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 * PAPPSOms++ 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 PAPPSOms++. If not, see <http://www.gnu.org/licenses/>.
27 *
28 ******************************************************************************/
29
31#include "../../exception/exceptionnotimplemented.h"
32#include <QDebug>
33#include <QtConcurrent/QtConcurrent>
34
35using namespace pappso;
36
37TimsMsRunReaderMs2Selected::TimsMsRunReaderMs2Selected(
38 MsRunIdCstSPtr &msrun_id_csp)
39 : TimsMsRunReaderMs2(msrun_id_csp)
40{
41 initialize();
42}
43
45{
46 if(mpa_timsData != nullptr)
47 {
48 delete mpa_timsData;
49 }
50}
51
52void
54{
55 mpa_timsData = new TimsData(mcsp_msRunId.get()->getFileName());
56}
57
58void
61{
62 if(mpa_timsData != nullptr)
63 {
65 }
66 else
67 {
68 throw PappsoException(
69 QObject::tr("ERROR in TimsMsRunReaderMs2Selected::setMs2FilterCstSPtr "
70 "mpa_timsData is null"));
71 }
72}
73
74void
77{
78 if(mpa_timsData != nullptr)
79 {
81 }
82 else
83 {
84 throw PappsoException(
85 QObject::tr("ERROR in TimsMsRunReaderMs2Selected::setMs1FilterCstSPtr "
86 "mpa_timsData is null"));
87 }
88}
89
90bool
91TimsMsRunReaderMs2Selected::accept(const QString &file_name) const
92{
93 qDebug() << file_name;
94 return true;
95}
96
97
100{
101 QualifiedMassSpectrum mass_spectrum =
102 qualifiedMassSpectrum(spectrum_index, true);
103 return mass_spectrum.getMassSpectrumSPtr();
104}
105
106
109{
110 QualifiedMassSpectrum mass_spectrum =
111 qualifiedMassSpectrum(spectrum_index, true);
112 return mass_spectrum.getMassSpectrumSPtr();
113}
114
115
118 bool want_binary_data) const
119{
120
121 std::size_t precursor_index = (spectrum_index / 2) + 1;
122
123 TimsData::SpectrumDescr spectrum_descr =
125
126 if(spectrum_index % 2 == 0)
127 {
128 qDebug();
129 // this is an MS1 spectrum
130 QualifiedMassSpectrum mass_spectrum_ms1;
132 getMsRunId(), mass_spectrum_ms1, spectrum_descr, want_binary_data);
133 qDebug(); // << mass_spectrum_ms1.toString();
134
135 // qDebug() << mass_spectrum_ms1.getMassSpectrumSPtr().get()->toString();
136 return mass_spectrum_ms1;
137 }
138 else
139 {
140 qDebug();
141 QualifiedMassSpectrum mass_spectrum_ms2;
142 if(spectrum_descr.ms2_index != spectrum_index)
143 {
144 qDebug();
145 throw PappsoException(
146 QObject::tr(
147 "ERROR in %1 %2 %3 spectrum_descr.ms2_index != spectrum_index")
148 .arg(__FILE__)
149 .arg(__FUNCTION__)
150 .arg(__LINE__));
151 }
153 getMsRunId(), mass_spectrum_ms2, spectrum_descr, want_binary_data);
154 qDebug(); // << mass_spectrum_ms2.toString();
155
156 // qDebug() << mass_spectrum_ms2.getMassSpectrumSPtr().get()->toString();
157 return mass_spectrum_ms2;
158 }
159}
160
161
162void
165{
166 const bool want_binary_data = handler.needPeakList();
167 // const bool want_binary_data = false;
168
169 // We'll need it to perform the looping in the spectrum list.
170 std::size_t spectrum_list_size = spectrumListSize();
171
172 // qDebug() << "The spectrum list has size:" << spectrum_list_size;
173
174 // Inform the handler of the spectrum list so that it can handle feedback to
175 // the user.
176 handler.spectrumListHasSize(spectrum_list_size);
177
178 std::vector<size_t> selected_precursor{63905,
179 73549,
180 105675,
181 130439,
182 177297,
183 177369,
184 177483,
185 190453,
186 196967,
187 246691,
188 271215,
189 289423,
190 310669};
191 // QFile temp_output("/data/temp.txt");
192 // temp_output.open(QIODevice::WriteOnly | QIODevice::Text);
193 // QTextStream out(&temp_output);
194
195 // Iterate in the full list of spectra.
196 bool readAhead = handler.isReadAhead();
197
198 if(readAhead)
199 {
200
201 std::size_t process_list_size = 300;
202
203 struct tmp_item
204 {
205 QualifiedMassSpectrum qualified_mass_spectrum;
206 std::size_t iter;
207 bool want_binary_data;
208 };
209
210 for(std::size_t i = 0; i < spectrum_list_size; i += process_list_size)
211 {
212 // QTextStream out(&temp_output);
213 qDebug();
214 // If the user of this reader instance wants to stop reading the
215 // spectra, then break this loop.
216 if(handler.shouldStop())
217 {
218 qDebug() << "The operation was cancelled. Breaking the loop.";
219 break;
220 }
221 std::vector<tmp_item> item_list;
222 for(std::size_t iter = 0;
223 (iter < process_list_size) && ((iter + i) < spectrum_list_size);
224 iter++)
225 {
226 if(std::find(selected_precursor.begin(),
227 selected_precursor.end(),
228 iter + i) != selected_precursor.end())
229 {
230 bool get_data = want_binary_data;
231 if((iter + i) % 2 == 0)
232 { // MS1
233 get_data = handler.needMsLevelPeakList(1);
234 }
235 else
236 {
237 get_data = handler.needMsLevelPeakList(2);
238 }
239
240 item_list.push_back(
241 {QualifiedMassSpectrum(), iter + i, get_data});
242 }
243 }
244 qDebug() << item_list.size();
245 // Use QtConcurrentBlocking::mapped to apply the scale function to all
246 // the images in the list.
247 QtConcurrent::blockingMap(
248 item_list.begin(), item_list.end(), [this](tmp_item &one_item) {
249 qDebug() << one_item.iter;
250 one_item.qualified_mass_spectrum =
251 qualifiedMassSpectrum(one_item.iter, one_item.want_binary_data);
252
253 // qDebug() << one_item.qualified_mass_spectrum.size() << " " <<
254 // one_item.qualified_mass_spectrum.getMassSpectrumSPtr().get()->toString();
255 });
256
257 qDebug() << item_list.size();
258 for(auto &item : item_list)
259 {
260 // qDebug() <<
261 // item.qualified_mass_spectrum.getMassSpectrumSPtr()
262 // .get()
263 // ->toString();
264 handler.setQualifiedMassSpectrum(item.qualified_mass_spectrum);
265 qDebug();
266 }
267 }
268 }
269 else
270 {
271 for(std::size_t iter = 0; iter < spectrum_list_size; iter++)
272 {
273 qDebug();
274 // If the user of this reader instance wants to stop reading the
275 // spectra, then break this loop.
276 if(handler.shouldStop())
277 {
278 qDebug() << "The operation was cancelled. Breaking the loop.";
279 break;
280 }
281 bool get_data = want_binary_data;
282 if(iter % 2 == 0)
283 { // MS1
284 if(!handler.needMsLevelPeakList(1))
285 {
286 get_data = false;
287 }
288 }
289 QualifiedMassSpectrum qualified_mass_spectrum =
290 qualifiedMassSpectrum(iter, get_data);
291 handler.setQualifiedMassSpectrum(qualified_mass_spectrum);
292 qDebug();
293 }
294 }
295 // End of
296 // for(std::size_t iter = 0; iter < spectrum_list_size; iter++)
297
298 // Now let the loading handler know that the loading of the data has
299 // ended. The handler might need this "signal" to perform additional tasks
300 // or to cleanup cruft.
301
302 // qDebug() << "Loading ended";
303 // temp_output.close();
304 handler.loadingEnded();
305}
306
307
308std::size_t
310{
312}
313
314
315bool
317{
318 return false;
319}
const MsRunIdCstSPtr & getMsRunId() const
Class representing a fully specified mass spectrum.
MassSpectrumSPtr getMassSpectrumSPtr() const
Get the MassSpectrumSPtr.
interface to collect spectrums from the MsRunReader class
Definition: msrunreader.h:56
virtual bool isReadAhead() const
tells if we want to read ahead spectrum
Definition: msrunreader.cpp:63
virtual bool needPeakList() const =0
tells if we need the peak list (if we want the binary data) for each spectrum
virtual bool needMsLevelPeakList(unsigned int ms_level) const final
tells if we need the peak list (if we want the binary data) for each spectrum, given an MS level
Definition: msrunreader.cpp:69
virtual void spectrumListHasSize(std::size_t size)
Definition: msrunreader.cpp:52
virtual void setQualifiedMassSpectrum(const QualifiedMassSpectrum &spectrum)=0
SpectrumDescr getSpectrumDescrWithPrecursorId(std::size_t precursor_id)
get an intermediate structure describing a spectrum
Definition: timsdata.cpp:1882
std::size_t getTotalNumberOfPrecursors() const
get the number of precursors analyzes by PASEF
Definition: timsdata.cpp:632
void getQualifiedMs1MassSpectrumByPrecursorId(const MsRunIdCstSPtr &msrun_id, QualifiedMassSpectrum &mass_spectrum, SpectrumDescr &spectrum_descr, bool want_binary_data)
Definition: timsdata.cpp:966
void setMs1FilterCstSPtr(pappso::FilterInterfaceCstSPtr &filter)
filter interface to apply just after raw MS1 specturm extraction the filter can be a list of filters ...
Definition: timsdata.cpp:1170
void setMs2FilterCstSPtr(pappso::FilterInterfaceCstSPtr &filter)
filter interface to apply just after raw MS2 specturm extraction the filter can be a list of filters ...
Definition: timsdata.cpp:1165
void getQualifiedMs2MassSpectrumByPrecursorId(const MsRunIdCstSPtr &msrun_id, QualifiedMassSpectrum &mass_spectrum, SpectrumDescr &spectrum_descr, bool want_binary_data)
Definition: timsdata.cpp:1410
virtual MassSpectrumCstSPtr massSpectrumCstSPtr(std::size_t spectrum_index) override
virtual std::size_t spectrumListSize() const override
get the totat number of spectrum conained in the MSrun data file
virtual bool accept(const QString &file_name) const override
tells if the reader is able to handle this file must be implemented by private MS run reader,...
void setMs2FilterCstSPtr(pappso::FilterInterfaceCstSPtr filter)
void setMs1FilterCstSPtr(pappso::FilterInterfaceCstSPtr filter)
virtual QualifiedMassSpectrum qualifiedMassSpectrum(std::size_t spectrum_index, bool want_binary_data=true) const override
get a QualifiedMassSpectrum class given its scan number
virtual MassSpectrumSPtr massSpectrumSPtr(std::size_t spectrum_index) override
get a MassSpectrumSPtr class given its spectrum index
virtual bool hasScanNumbers() const override
tells if spectra can be accessed using scan numbers by default, it returns false. Only overrided func...
virtual void readSpectrumCollection(SpectrumCollectionHandlerInterface &handler) override
function to visit an MsRunReader and get each Spectrum in a spectrum collection handler
tries to keep as much as possible monoisotopes, removing any possible C13 peaks and changes multichar...
Definition: aa.cpp:39
std::shared_ptr< const MsRunId > MsRunIdCstSPtr
Definition: msrunid.h:45
std::shared_ptr< const MassSpectrum > MassSpectrumCstSPtr
Definition: massspectrum.h:55
std::shared_ptr< const FilterInterface > FilterInterfaceCstSPtr
std::shared_ptr< MassSpectrum > MassSpectrumSPtr
Definition: massspectrum.h:54