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>
34 
35 using namespace pappso;
36 
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 
52 void
54 {
55  mpa_timsData = new TimsData(mcsp_msRunId.get()->getFileName());
56 }
57 
58 void
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 
74 void
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 
90 bool
91 TimsMsRunReaderMs2Selected::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 
162 void
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 
308 std::size_t
310 {
312 }
313 
314 
315 bool
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:64
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:70
virtual void spectrumListHasSize(std::size_t size)
Definition: msrunreader.cpp:53
virtual void setQualifiedMassSpectrum(const QualifiedMassSpectrum &spectrum)=0
void getQualifiedMs1MassSpectrumByPrecursorId(const MsRunIdCstSPtr &msrun_id, QualifiedMassSpectrum &mass_spectrum, const SpectrumDescr &spectrum_descr, bool want_binary_data)
Definition: timsdata.cpp:972
SpectrumDescr getSpectrumDescrWithPrecursorId(std::size_t precursor_id)
get an intermediate structure describing a spectrum
Definition: timsdata.cpp:1897
void getQualifiedMs2MassSpectrumByPrecursorId(const MsRunIdCstSPtr &msrun_id, QualifiedMassSpectrum &mass_spectrum, const SpectrumDescr &spectrum_descr, bool want_binary_data)
Definition: timsdata.cpp:1416
std::size_t getTotalNumberOfPrecursors() const
get the number of precursors analyzes by PASEF
Definition: timsdata.cpp:638
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:1176
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:1171
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
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 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:44
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