libpappsomspp
Library for mass spectrometry
Loading...
Searching...
No Matches
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
33#include <QDebug>
34#include <QtConcurrent>
35
36using namespace pappso;
37
43
51
52void
54{
55 mpa_timsData = new TimsData(mcsp_msRunId.get()->getFileName());
56
57 mp_timsDdaPrecursors = mpa_timsData->getTimsDdaPrecursorsPtr();
58}
59
60void
62{
63 if(mp_timsDdaPrecursors != nullptr)
64 {
65 mp_timsDdaPrecursors->setMs2FilterCstSPtr(filter);
66 }
67 else
68 {
69 throw PappsoException(
70 QObject::tr("ERROR in TimsMsRunReaderMs2Selected::setMs2FilterCstSPtr "
71 "mp_timsDdaPrecursors is null"));
72 }
73}
74
75void
77{
78 if(mp_timsDdaPrecursors != nullptr)
79 {
80 mp_timsDdaPrecursors->setMs1FilterCstSPtr(filter);
81 }
82 else
83 {
84 throw PappsoException(
85 QObject::tr("ERROR in TimsMsRunReaderMs2Selected::setMs1FilterCstSPtr "
86 "mp_timsDdaPrecursors 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 = qualifiedMassSpectrum(spectrum_index, true);
102 return mass_spectrum.getMassSpectrumSPtr();
103}
104
105
108{
109 QualifiedMassSpectrum mass_spectrum = qualifiedMassSpectrum(spectrum_index, true);
110 return mass_spectrum.getMassSpectrumSPtr();
111}
112
113
116 bool want_binary_data) const
117{
118
119 std::size_t precursor_index = (spectrum_index / 2) + 1;
120
121 TimsDdaPrecursors::SpectrumDescr spectrum_descr =
122 mp_timsDdaPrecursors->getSpectrumDescrWithPrecursorId(precursor_index);
123
124 if(spectrum_index % 2 == 0)
125 {
126 qDebug();
127 // this is an MS1 spectrum
128 QualifiedMassSpectrum mass_spectrum_ms1;
129 mp_timsDdaPrecursors->getQualifiedMs1MassSpectrumBySpectrumDescr(
130 getMsRunId(), mass_spectrum_ms1, spectrum_descr, want_binary_data);
131 qDebug(); // << mass_spectrum_ms1.toString();
132
133 // qDebug() << mass_spectrum_ms1.getMassSpectrumSPtr().get()->toString();
134 return mass_spectrum_ms1;
135 }
136 else
137 {
138 qDebug();
139 QualifiedMassSpectrum mass_spectrum_ms2;
140 if(spectrum_descr.ms2_index != spectrum_index)
141 {
142 qDebug();
143 throw PappsoException(
144 QObject::tr("ERROR in %1 %2 %3 spectrum_descr.ms2_index != spectrum_index")
145 .arg(__FILE__)
146 .arg(__FUNCTION__)
147 .arg(__LINE__));
148 }
149 mp_timsDdaPrecursors->getQualifiedMs2MassSpectrumBySpectrumDescr(
150 getMsRunId(), mass_spectrum_ms2, spectrum_descr, want_binary_data);
151 qDebug(); // << mass_spectrum_ms2.toString();
152
153 // qDebug() << mass_spectrum_ms2.getMassSpectrumSPtr().get()->toString();
154 return mass_spectrum_ms2;
155 }
156}
157
158
159void
161{
162 const bool want_binary_data = handler.needPeakList();
163 // const bool want_binary_data = false;
164
165 // We'll need it to perform the looping in the spectrum list.
166 std::size_t spectrum_list_size = spectrumListSize();
167
168 // qDebug() << "The spectrum list has size:" << spectrum_list_size;
169
170 // Inform the handler of the spectrum list so that it can handle feedback to
171 // the user.
172 handler.spectrumListHasSize(spectrum_list_size);
173
174 std::vector<size_t> selected_precursor{63905,
175 73549,
176 105675,
177 130439,
178 177297,
179 177369,
180 177483,
181 190453,
182 196967,
183 246691,
184 271215,
185 289423,
186 310669};
187 // QFile temp_output("/data/temp.txt");
188 // temp_output.open(QIODevice::WriteOnly | QIODevice::Text);
189 // QTextStream out(&temp_output);
190
191 // Iterate in the full list of spectra.
192 bool readAhead = handler.isReadAhead();
193
194 if(readAhead)
195 {
196
197 std::size_t process_list_size = 300;
198
199 struct tmp_item
200 {
201 QualifiedMassSpectrum qualified_mass_spectrum;
202 std::size_t iter;
203 bool want_binary_data;
204 };
205
206 for(std::size_t i = 0; i < spectrum_list_size; i += process_list_size)
207 {
208 // QTextStream out(&temp_output);
209 qDebug();
210 // If the user of this reader instance wants to stop reading the
211 // spectra, then break this loop.
212 if(handler.shouldStop())
213 {
214 qDebug() << "The operation was cancelled. Breaking the loop.";
215 break;
216 }
217 std::vector<tmp_item> item_list;
218 for(std::size_t iter = 0; (iter < process_list_size) && ((iter + i) < spectrum_list_size);
219 iter++)
220 {
221 if(std::find(selected_precursor.begin(), selected_precursor.end(), iter + i) !=
222 selected_precursor.end())
223 {
224 bool get_data = want_binary_data;
225 if((iter + i) % 2 == 0)
226 { // MS1
227 get_data = handler.needMsLevelPeakList(1);
228 }
229 else
230 {
231 get_data = handler.needMsLevelPeakList(2);
232 }
233
234 item_list.push_back({QualifiedMassSpectrum(), iter + i, get_data});
235 }
236 }
237 qDebug() << item_list.size();
238 // Use QtConcurrentBlocking::mapped to apply the scale function to all
239 // the images in the list.
240 QtConcurrent::blockingMap(item_list.begin(), item_list.end(), [this](tmp_item &one_item) {
241 qDebug() << one_item.iter;
242 one_item.qualified_mass_spectrum =
243 qualifiedMassSpectrum(one_item.iter, one_item.want_binary_data);
244
245 // qDebug() << one_item.qualified_mass_spectrum.size() << " " <<
246 // one_item.qualified_mass_spectrum.getMassSpectrumSPtr().get()->toString();
247 });
248
249 qDebug() << item_list.size();
250 for(auto &item : item_list)
251 {
252 // qDebug() <<
253 // item.qualified_mass_spectrum.getMassSpectrumSPtr()
254 // .get()
255 // ->toString();
256 handler.setQualifiedMassSpectrum(item.qualified_mass_spectrum);
257 qDebug();
258 }
259 }
260 }
261 else
262 {
263 for(std::size_t iter = 0; iter < spectrum_list_size; iter++)
264 {
265 qDebug();
266 // If the user of this reader instance wants to stop reading the
267 // spectra, then break this loop.
268 if(handler.shouldStop())
269 {
270 qDebug() << "The operation was cancelled. Breaking the loop.";
271 break;
272 }
273 bool get_data = want_binary_data;
274 if(iter % 2 == 0)
275 { // MS1
276 if(!handler.needMsLevelPeakList(1))
277 {
278 get_data = false;
279 }
280 }
281 QualifiedMassSpectrum qualified_mass_spectrum = qualifiedMassSpectrum(iter, get_data);
282 handler.setQualifiedMassSpectrum(qualified_mass_spectrum);
283 qDebug();
284 }
285 }
286 // End of
287 // for(std::size_t iter = 0; iter < spectrum_list_size; iter++)
288
289 // Now let the loading handler know that the loading of the data has
290 // ended. The handler might need this "signal" to perform additional tasks
291 // or to cleanup cruft.
292
293 // qDebug() << "Loading ended";
294 // temp_output.close();
295 handler.loadingEnded();
296}
297
298void
304
305std::size_t
307{
308 return (mp_timsDdaPrecursors->getTotalPrecursorCount() * 2);
309}
310
311
312bool
314{
315 return false;
316}
317
318
319std::size_t
321 const QString &spectrum_identifier [[maybe_unused]])
322{
324 QObject::tr("%1 %2 %3 not implemented").arg(__FILE__).arg(__FUNCTION__).arg(__LINE__));
325}
MsRunIdCstSPtr mcsp_msRunId
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
virtual bool isReadAhead() const
tells if we want to read ahead spectrum
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
virtual void setQualifiedMassSpectrum(const QualifiedMassSpectrum &spectrum)=0
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 void readSpectrumCollection2(const MsRunReadConfig &config, SpectrumCollectionHandlerInterface &handler) override
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
TimsMsRunReaderMs2Selected(MsRunIdCstSPtr &msrun_id_csp)
virtual bool hasScanNumbers() const override
tells if spectra can be accessed using scan numbers by default, it returns false. Only overrided func...
virtual std::size_t spectrumStringIdentifier2SpectrumIndex(const QString &spectrum_identifier) override
if possible, get the spectrum index given a string identifier throw a not found exception if spectrum...
virtual void readSpectrumCollection(SpectrumCollectionHandlerInterface &handler) override
function to visit an MsRunReader and get each Spectrum in a spectrum collection handler
TimsMsRunReaderMs2(MsRunIdCstSPtr &msrun_id_csp)
TimsDdaPrecursors * mp_timsDdaPrecursors
tries to keep as much as possible monoisotopes, removing any possible C13 peaks and changes multichar...
Definition aa.cpp:39
@ filter
concerning filters (psm, peptide, protein validation)
std::shared_ptr< const MsRunId > MsRunIdCstSPtr
Definition msrunid.h:46
std::shared_ptr< const MassSpectrum > MassSpectrumCstSPtr
std::shared_ptr< const FilterInterface > FilterInterfaceCstSPtr
std::shared_ptr< MassSpectrum > MassSpectrumSPtr