libpappsomspp
Library for mass spectrometry
Loading...
Searching...
No Matches
msfileaccessor.cpp
Go to the documentation of this file.
1// #include <proteowizard/pwiz/data/msdata/DefaultReaderList.hpp>
2
3#include <QDebug>
4#include <QFile>
5#include <QFileInfo>
6
7
8#include "msfileaccessor.h"
9#include "pwizmsfilereader.h"
10#include "timsmsfilereader.h"
11#include "xymsfilereader.h"
12
13
14#include "../exception/exceptionnotfound.h"
15#include "../exception/exceptionnotpossible.h"
16#include "../msrun/msrunid.h"
17#include "../msrun/private/timsframesmsrunreader.h"
18
19#include "../msrun/private/pwizmsrunreader.h"
20#include "../msrun/private/timsmsrunreader.h"
21#include "../msrun/private/timsmsrunreaderms2.h"
22#include "../msrun/xymsrunreader.h"
23
24#include "../utils.h"
25
26
27namespace pappso
28{
29
30
31MsFileAccessor::MsFileAccessor(const QString &file_name,
32 const QString &xml_prefix)
33 : m_fileName(file_name), m_xmlPrefix(xml_prefix)
34{
35 QFile file(file_name);
36 if(!file.exists())
37 throw(ExceptionNotFound(QObject::tr("File %1 not found.")
38 .arg(QFileInfo(file_name).absoluteFilePath())));
39}
40
41
43 : m_fileName(other.m_fileName),
44 m_xmlPrefix(other.m_xmlPrefix),
45 m_fileFormat(other.m_fileFormat),
46 m_fileReaderType(other.m_fileReaderType)
47{
48}
49
53
54
55const QString &
57{
58 return m_fileName;
59}
60
61
67
68
69std::vector<MsRunIdCstSPtr>
71{
72 // qDebug();
73
74 // Try the PwizMsFileReader
75
76 PwizMsFileReader pwiz_ms_file_reader(m_fileName);
77
78 std::vector<MsRunIdCstSPtr> ms_run_ids =
79 pwiz_ms_file_reader.getMsRunIds(m_xmlPrefix);
80 if(ms_run_ids.size())
81 {
82 // qDebug() << "Might well be handled using the Pwiz code.";
83 m_fileFormat = pwiz_ms_file_reader.getFileFormat();
85
86 // But the user might have configured one preferred reader type.
87
89 if(pref != m_preferredFileReaderTypeMap.end())
90 {
91 m_fileReaderType = pref->second;
92 }
93
94 return ms_run_ids;
95 }
96
97 // qDebug() << "The Pwiz reader did not work.";
98
99 // Try the TimsData reader
100
101 QString tims_dir = m_fileName;
102 if(!QFileInfo(tims_dir).isDir())
103 {
104 tims_dir = QFileInfo(m_fileName).absolutePath();
105 }
106
107 TimsMsFileReader tims_file_reader(tims_dir);
108
109 ms_run_ids = tims_file_reader.getMsRunIds(m_xmlPrefix);
110
111 if(ms_run_ids.size())
112 {
113 // qDebug() << "Might well be handled using the Bruker code";
114
115 m_fileName = tims_dir;
116 m_fileFormat = tims_file_reader.getFileFormat();
118
120 if(pref != m_preferredFileReaderTypeMap.end())
121 {
122 m_fileReaderType = pref->second;
123 }
124
125 // qDebug() << "Returning Bruker::tims ms run(s)."
126 // << "with preferred reader type:"
127 // << Utils::fileReaderTypeAsString(m_fileReaderType);
128
129 return ms_run_ids;
130 }
131
132 // qDebug() << "The Tims reader did not work.";
133
134 // At this point try the XyMsFileReader
135
136 XyMsFileReader xy_ms_file_reader(m_fileName);
137
138 ms_run_ids = xy_ms_file_reader.getMsRunIds(m_xmlPrefix);
139
140 if(ms_run_ids.size())
141 {
142 // qDebug() << "Might well be handled using the XY code";
144
145 m_fileFormat = xy_ms_file_reader.getFileFormat();
146
147 return ms_run_ids;
148 }
149
150 // qDebug() << "The XY reader did not work.";
151
152 return ms_run_ids;
153}
154
155
156void
158 FileReaderType reader_type)
159{
160 auto ret = m_preferredFileReaderTypeMap.insert(
161 std::pair<MzFormat, FileReaderType>(format, reader_type));
162
163 if(!ret.second)
164 {
165 // replace
166 ret.first->second = reader_type;
167 }
168}
169
170
173{
174 auto ret = m_preferredFileReaderTypeMap.find(format);
175
176 if(ret != m_preferredFileReaderTypeMap.end())
177 {
178 return ret->second;
179 }
180
181 return m_fileReaderType;
182}
183
184
190
191
192void
194{
196}
197
198
199std::size_t
204
205
208{
209 if(m_selectedMsRunIdIndex >= getMsRunIds().size())
210 throw PappsoException(QObject::tr("MsRunId request out-of-bound error."));
211
213}
214
217{
218 // try TimsData reader
219 QString tims_dir = m_fileName;
220 if(!QFileInfo(tims_dir).isDir())
221 {
222 tims_dir = QFileInfo(m_fileName).absolutePath();
223 }
224 TimsMsFileReader tims_file_reader(tims_dir);
225
226 std::vector<MsRunIdCstSPtr> ms_run_ids =
227 tims_file_reader.getMsRunIds(m_xmlPrefix);
228
229 if(ms_run_ids.size())
230 {
231 // qDebug() << "Might well be handled using the Bruker code";
233 m_fileFormat = tims_file_reader.getFileFormat();
234 m_fileName = tims_dir;
235
236 return std::make_shared<TimsMsRunReaderMs2>(ms_run_ids.front());
237 }
238 else
239 {
241 QObject::tr("Unable to read mz data directory %1 with TimsTOF reader.")
242 .arg(tims_dir)));
243 }
244}
245
246
249{
250 // We want to return a MsRunReader that accounts for the configuration that
251 // the user might have set.
252
253 if(m_fileName != ms_run_id->getFileName())
255 QObject::tr("The MsRunId instance must have the name file name as the "
256 "MsFileAccessor.")));
257
259 {
260 // qDebug() << "Returning a PwizMsRunReader.";
261
262 return std::make_shared<PwizMsRunReader>(ms_run_id);
263 }
265 {
266 // qDebug() << "Returning a XyMsRunReader.";
267
268 return std::make_shared<XyMsRunReader>(ms_run_id);
269 }
271 {
272 // qDebug() << "Returning a TimsMsRunReader.";
273
274 return std::make_shared<TimsMsRunReader>(ms_run_id);
275 }
278 {
279 // qDebug() << "Returning a TimsFramesMsRunReader.";
280
281 return std::make_shared<TimsFramesMsRunReader>(ms_run_id);
282 }
284 {
285 // qDebug() << "Returning a TimsMsRunReaderMs2.";
286
287 return std::make_shared<TimsMsRunReaderMs2>(ms_run_id);
288 }
290 {
291 if(ms_run_id.get()->getMzFormat() == MzFormat::xy)
292 {
293 return std::make_shared<XyMsRunReader>(ms_run_id);
294 }
295 else
296 {
297 return std::make_shared<PwizMsRunReader>(ms_run_id);
298 }
299 }
300 else
301 {
302 throw PappsoException(QObject::tr("No file format was found."));
303 }
304
305 return nullptr;
306}
307
308
310MsFileAccessor::msRunReaderSPtr(std::size_t ms_run_id_index)
311{
312 std::vector<MsRunIdCstSPtr> ms_run_ids = getMsRunIds();
313 if(ms_run_id_index >= ms_run_ids.size())
314 throw PappsoException(QObject::tr("MsRunId request out-of-bound error."));
315
316 return msRunReaderSPtr(ms_run_ids.at(ms_run_id_index));
317}
318
319
322{
323 std::vector<MsRunIdCstSPtr> ms_run_ids = getMsRunIds();
324 if(m_selectedMsRunIdIndex >= ms_run_ids.size())
325 throw PappsoException(QObject::tr("MsRunId request out-of-bound error."));
326
327 return msRunReaderSPtr(ms_run_ids.at(m_selectedMsRunIdIndex));
328}
329
330
336
339 MsRunIdCstSPtr ms_run_id, pappso::FileReaderType preferred_file_reader_type)
340{
341 QFile file(ms_run_id.get()->getFileName());
342 if(!file.exists())
343 throw(ExceptionNotFound(
344 QObject::tr("unable to build a reader : file %1 not found.")
345 .arg(QFileInfo(ms_run_id.get()->getFileName()).absoluteFilePath())));
346
347 MzFormat file_format = ms_run_id.get()->getMzFormat();
348
349 if(file_format == MzFormat::xy)
350 {
351 // qDebug() << "Returning a XyMsRunReader.";
352
353 return std::make_shared<XyMsRunReader>(ms_run_id);
354 }
355 else if(file_format == MzFormat::unknown)
356 {
357 throw(PappsoException(
358 QObject::tr("unable to build a reader for %1 : unknown file format")
359 .arg(QFileInfo(ms_run_id.get()->getFileName()).absoluteFilePath())));
360 }
361
362 else if(file_format == MzFormat::brukerTims)
363 {
364 if(preferred_file_reader_type == pappso::FileReaderType::tims)
365 {
366 return std::make_shared<TimsMsRunReader>(ms_run_id);
367 }
368 else if(preferred_file_reader_type == pappso::FileReaderType::tims_ms2)
369 {
370 return std::make_shared<TimsMsRunReaderMs2>(ms_run_id);
371 }
372
373 // qDebug() << "by default, build a TimsMsRunReader.";
374 return std::make_shared<TimsMsRunReader>(ms_run_id);
375 }
376 else
377 {
378 // qDebug() << "Returning a PwizMsRunReader .";
379
380 return std::make_shared<PwizMsRunReader>(ms_run_id);
381 }
382}
383
384
387 const QString &xml_id)
388{
389 std::vector<MsRunIdCstSPtr> run_list = getMsRunIds();
390 MsRunReaderSPtr reader_sp;
391 for(MsRunIdCstSPtr &original_run_id : run_list)
392 {
393 if(original_run_id.get()->getRunId() == run_id)
394 {
395 MsRunId new_run_id(*original_run_id.get());
396 new_run_id.setXmlId(xml_id);
397
398 return msRunReaderSPtr(std::make_shared<MsRunId>(new_run_id));
399 }
400 }
401
402 if((run_id.isEmpty()) && (run_list.size() == 1))
403 {
404 MsRunId new_run_id(*run_list[0].get());
405 new_run_id.setXmlId(xml_id);
406
407 return msRunReaderSPtr(std::make_shared<MsRunId>(new_run_id));
408 }
409
410
411 if(reader_sp == nullptr)
412 {
413 throw(
414 ExceptionNotFound(QObject::tr("run id %1 not found in file %2")
415 .arg(run_id)
416 .arg(QFileInfo(m_fileName).absoluteFilePath())));
417 }
418 return reader_sp;
419}
420
421
422} // namespace pappso
MsRunReaderSPtr msRunReaderSPtrForSelectedMsRunIdIndex()
void setSelectedMsRunIdIndex(std::size_t index)
MzFormat getFileFormat() const
get the raw format of mz data
MsRunReaderSPtr msRunReaderSPtr(MsRunIdCstSPtr ms_run_id)
std::size_t m_selectedMsRunIdIndex
std::size_t getSelectedMsRunIdIndex() const
MsRunIdCstSPtr getSelectedMsRunId()
FileReaderType getFileReaderType() const
get the file reader type
std::vector< MsRunIdCstSPtr > getMsRunIds()
FileReaderType m_fileReaderType
void setPreferredFileReaderType(MzFormat format, FileReaderType reader_type)
given an mz format, explicitly set the preferred reader
MsRunReaderSPtr getMsRunReaderSPtrByRunId(const QString &run_id, const QString &xml_id)
get an msrun reader by finding the run_id in file
std::map< MzFormat, FileReaderType > m_preferredFileReaderTypeMap
MsFileAccessor(const QString &file_name, const QString &xml_prefix)
static MsRunReaderSPtr buildMsRunReaderSPtr(MsRunIdCstSPtr ms_run_id)
get an MsRunReader directly from a valid MsRun ID
FileReaderType getpreferredFileReaderType(MzFormat format)
TimsMsRunReaderMs2SPtr buildTimsMsRunReaderMs2SPtr()
if possible, builds directly a dedicated Tims TOF tdf file reader
const QString & getFileName() const
MS run identity MsRunId identifies an MS run with a unique ID (XmlId) and contains eventually informa...
Definition msrunid.h:54
void setXmlId(const QString &xml_id)
set an XML unique identifier for this MsRunId
Definition msrunid.cpp:137
virtual std::vector< MsRunIdCstSPtr > getMsRunIds(const QString &run_prefix) override
virtual MzFormat getFileFormat() override
virtual std::vector< MsRunIdCstSPtr > getMsRunIds(const QString &run_prefix) override
virtual MzFormat getFileFormat() override
virtual std::vector< MsRunIdCstSPtr > getMsRunIds(const QString &run_prefix) override
virtual MzFormat getFileFormat() override
tries to keep as much as possible monoisotopes, removing any possible C13 peaks and changes multichar...
Definition aa.cpp:39
std::shared_ptr< MsRunReader > MsRunReaderSPtr
Definition msrunreader.h:56
std::shared_ptr< TimsMsRunReaderMs2 > TimsMsRunReaderMs2SPtr
MzFormat
Definition types.h:120
@ xy
(x,y) format
@ unknown
unknown format
std::shared_ptr< const MsRunId > MsRunIdCstSPtr
Definition msrunid.h:46
FileReaderType
Definition types.h:146
MSrun file reader for native Bruker TimsTOF raw data.