libpappsomspp
Library for mass spectrometry
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
51{
52}
53
54
55const QString &
57{
58 return m_fileName;
59}
60
61
64{
65 return m_fileFormat;
66}
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_preferedFileReaderTypeMap.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_preferedFileReaderTypeMap.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_preferedFileReaderTypeMap.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_preferedFileReaderTypeMap.find(format);
175
176 if(ret != m_preferedFileReaderTypeMap.end())
177 {
178 return ret->second;
179 }
180
181 return m_fileReaderType;
182}
183
184
187{
188 return m_fileReaderType;
189}
190
191
194{
195 // try TimsData reader
196 QString tims_dir = m_fileName;
197 if(!QFileInfo(tims_dir).isDir())
198 {
199 tims_dir = QFileInfo(m_fileName).absolutePath();
200 }
201 TimsMsFileReader tims_file_reader(tims_dir);
202
203 std::vector<MsRunIdCstSPtr> ms_run_ids =
204 tims_file_reader.getMsRunIds(m_xmlPrefix);
205
206 if(ms_run_ids.size())
207 {
208 // qDebug() << "Might well be handled using the Bruker code";
210 m_fileFormat = tims_file_reader.getFileFormat();
211 m_fileName = tims_dir;
212
213 return std::make_shared<TimsMsRunReaderMs2>(ms_run_ids.front());
214 }
215 else
216 {
218 QObject::tr("Unable to read mz data directory %1 with TimsTOF reader.")
219 .arg(tims_dir)));
220 }
221}
222
223
226{
227 // We want to return a MsRunReader that accounts for the configuration that
228 // the user might have set.
229
230 if(m_fileName != ms_run_id->getFileName())
232 QObject::tr("The MsRunId instance must have the name file name as the "
233 "MsFileAccessor.")));
234
236 {
237 // qDebug() << "Returning a PwizMsRunReader.";
238
239 return std::make_shared<PwizMsRunReader>(ms_run_id);
240 }
242 {
243 // qDebug() << "Returning a XyMsRunReader.";
244
245 return std::make_shared<XyMsRunReader>(ms_run_id);
246 }
248 {
249 // qDebug() << "Returning a TimsMsRunReader.";
250
251 return std::make_shared<TimsMsRunReader>(ms_run_id);
252 }
254 {
255 // qDebug() << "Returning a TimsFramesMsRunReader.";
256
257 return std::make_shared<TimsFramesMsRunReader>(ms_run_id);
258 }
260 {
261 // qDebug() << "Returning a TimsMsRunReaderMs2.";
262
263 return std::make_shared<TimsMsRunReaderMs2>(ms_run_id);
264 }
266 {
267 if(ms_run_id.get()->getMzFormat() == MzFormat::xy)
268 {
269 return std::make_shared<XyMsRunReader>(ms_run_id);
270 }
271 else
272 {
273 return std::make_shared<PwizMsRunReader>(ms_run_id);
274 }
275 }
276 else
277 {
278 throw PappsoException(QObject::tr("No file format was found."));
279 }
280
281 return nullptr;
282}
283
284
287{
289}
290
293 MsRunIdCstSPtr ms_run_id, pappso::FileReaderType prefered_file_reader_type)
294{
295 QFile file(ms_run_id.get()->getFileName());
296 if(!file.exists())
297 throw(ExceptionNotFound(
298 QObject::tr("unable to build a reader : file %1 not found.")
299 .arg(QFileInfo(ms_run_id.get()->getFileName()).absoluteFilePath())));
300
301 MzFormat file_format = ms_run_id.get()->getMzFormat();
302
303 if(file_format == MzFormat::xy)
304 {
305 // qDebug() << "Returning a XyMsRunReader.";
306
307 return std::make_shared<XyMsRunReader>(ms_run_id);
308 }
309 else if(file_format == MzFormat::unknown)
310 {
311 throw(PappsoException(
312 QObject::tr("unable to build a reader for %1 : unknown file format")
313 .arg(QFileInfo(ms_run_id.get()->getFileName()).absoluteFilePath())));
314 }
315
316 else if(file_format == MzFormat::brukerTims)
317 {
318 if(prefered_file_reader_type == pappso::FileReaderType::tims)
319 {
320 return std::make_shared<TimsMsRunReader>(ms_run_id);
321 }
322 else if(prefered_file_reader_type == pappso::FileReaderType::tims_ms2)
323 {
324 return std::make_shared<TimsMsRunReaderMs2>(ms_run_id);
325 }
326
327 // qDebug() << "by default, build a TimsMsRunReader.";
328 return std::make_shared<TimsMsRunReader>(ms_run_id);
329 }
330 else
331 {
332 // qDebug() << "Returning a PwizMsRunReader .";
333
334 return std::make_shared<PwizMsRunReader>(ms_run_id);
335 }
336}
337
338
341 const QString &xml_id)
342{
343 std::vector<MsRunIdCstSPtr> run_list = getMsRunIds();
344 MsRunReaderSPtr reader_sp;
345 for(MsRunIdCstSPtr &original_run_id : run_list)
346 {
347 if(original_run_id.get()->getRunId() == run_id)
348 {
349 MsRunId new_run_id(*original_run_id.get());
350 new_run_id.setXmlId(xml_id);
351
352 return msRunReaderSp(std::make_shared<MsRunId>(new_run_id));
353 }
354 }
355
356 if((run_id.isEmpty()) && (run_list.size() == 1))
357 {
358 MsRunId new_run_id(*run_list[0].get());
359 new_run_id.setXmlId(xml_id);
360
361 return msRunReaderSp(std::make_shared<MsRunId>(new_run_id));
362 }
363
364
365 if(reader_sp == nullptr)
366 {
367 throw(
368 ExceptionNotFound(QObject::tr("run id %1 not found in file %2")
369 .arg(run_id)
370 .arg(QFileInfo(m_fileName).absoluteFilePath())));
371 }
372 return reader_sp;
373}
374
375
376} // namespace pappso
MzFormat getFileFormat() const
get the raw format of mz data
MsRunReaderSPtr msRunReaderSp(MsRunIdCstSPtr ms_run_id)
const QString m_xmlPrefix
void setPreferedFileReaderType(MzFormat format, FileReaderType reader_type)
given an mz format, explicitly set the prefered reader
FileReaderType getFileReaderType() const
get the file reader type
std::map< MzFormat, FileReaderType > m_preferedFileReaderTypeMap
FileReaderType getPreferedFileReaderType(MzFormat format)
std::vector< MsRunIdCstSPtr > getMsRunIds()
FileReaderType m_fileReaderType
MsRunReaderSPtr getMsRunReaderSPtrByRunId(const QString &run_id, const QString &xml_id)
get an msrun reader by finding the run_id in file
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
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.