libpappsomspp
Library for mass spectrometry
Loading...
Searching...
No Matches
pappso::TimsBinDec Class Reference

#include <timsbindec.h>

Public Member Functions

 TimsBinDec (const QFileInfo &timsBinFile, int timsCompressionType)
 TimsBinDec (const TimsBinDec &other)
virtual ~TimsBinDec ()
TimsFrameSPtr getTimsFrameSPtrByOffset (std::size_t frameId, const std::vector< pappso::TimsFrameRecord > &frame_record_list)
void closeLinearRead ()
 close file access and flush cache

Private Member Functions

QFile * getQfileLinear (std::size_t frameId, const std::vector< pappso::TimsFrameRecord > &frame_record_list)
 open one QFile handler for linear read
QFile * getQfileRandom ()
 open one QFile handler for random read
void startLinearRead (std::size_t start_frame_id, std::size_t chunk_deque_size, const std::vector< pappso::TimsFrameRecord > &frame_record_list)
 populate a fifo buffer with TimsFrameRawDataChunck accelerates inputs from file
TimsFrameSPtr getTimsFrameFromRawDataChunck (const TimsFrameRawDataChunck &raw_data_chunck)
void moveLinearReadForward (const std::vector< pappso::TimsFrameRecord > &frame_record_list)

Private Attributes

int m_timsCompressionType
QString m_timsBinFile
QFile * mp_fileLinear = nullptr
QFile * mp_fileRandom = nullptr
char * mpa_decompressMemoryBuffer = nullptr
std::size_t m_decompressMemoryBufferSize = 0
TimsFrameRawDataChunck m_randemAccessFrameRawDataChunck
std::vector< TimsFrameRawDataChunckm_linearAccessRawDataChunckList
std::size_t m_firstFrameId = 0
std::size_t m_lastFrameId = 0
std::size_t m_linearAccessRawDataChunckDequeSize = 100
std::size_t m_linearForwardThreshold = 30

Detailed Description

Todo
write docs

Definition at line 44 of file timsbindec.h.

Constructor & Destructor Documentation

◆ TimsBinDec() [1/2]

TimsBinDec::TimsBinDec ( const QFileInfo & timsBinFile,
int timsCompressionType )

Default constructor

Definition at line 40 of file timsbindec.cpp.

41 : m_timsBinFile(timsBinFile.absoluteFilePath())
42{
43 m_timsCompressionType = timsCompressionType;
44 if((timsCompressionType != 1) && (timsCompressionType != 2))
45 {
46 throw pappso::ExceptionNotImplemented(
47 QObject::tr("compression type %1 not handled by this library").arg(timsCompressionType));
48 }
49 if(m_timsBinFile.isEmpty())
50 {
51 throw pappso::PappsoException(QObject::tr("No TIMS binary file name specified"));
52 }
53 QFile file(m_timsBinFile);
54 if(!file.open(QIODevice::ReadOnly))
55 {
56 throw PappsoException(QObject::tr("ERROR opening TIMS binary file %1 for read")
57 .arg(timsBinFile.absoluteFilePath()));
58 }
59}

References m_timsBinFile, and m_timsCompressionType.

Referenced by TimsBinDec().

◆ TimsBinDec() [2/2]

TimsBinDec::TimsBinDec ( const TimsBinDec & other)

Copy constructor

Parameters
otherTODO

Definition at line 62 of file timsbindec.cpp.

63{
64}

References TimsBinDec(), and m_timsBinFile.

◆ ~TimsBinDec()

TimsBinDec::~TimsBinDec ( )
virtual

Destructor

Definition at line 66 of file timsbindec.cpp.

67{
68
69
70 if(mpa_decompressMemoryBuffer != nullptr)
71 {
73 }
74
75 if(mp_fileLinear != nullptr)
76 {
77 mp_fileLinear->close();
78 delete mp_fileLinear;
79 }
80 if(mp_fileRandom != nullptr)
81 {
82 mp_fileRandom->close();
83 delete mp_fileRandom;
84 }
85}
char * mpa_decompressMemoryBuffer
Definition timsbindec.h:106

References mp_fileLinear, mp_fileRandom, and mpa_decompressMemoryBuffer.

Member Function Documentation

◆ closeLinearRead()

void pappso::TimsBinDec::closeLinearRead ( )

close file access and flush cache

Definition at line 88 of file timsbindec.cpp.

89{
90 // qDebug();
91 if(mp_fileLinear != nullptr)
92 {
93 mp_fileLinear->close();
94 delete mp_fileLinear;
95 }
96 mp_fileLinear = nullptr;
98 m_lastFrameId = 0;
100 // qDebug();
101}
std::size_t m_firstFrameId
Definition timsbindec.h:113
std::size_t m_lastFrameId
Definition timsbindec.h:114
std::vector< TimsFrameRawDataChunck > m_linearAccessRawDataChunckList
Definition timsbindec.h:112

References m_firstFrameId, m_lastFrameId, m_linearAccessRawDataChunckList, and mp_fileLinear.

◆ getQfileLinear()

QFile * TimsBinDec::getQfileLinear ( std::size_t frameId,
const std::vector< pappso::TimsFrameRecord > & frame_record_list )
private

open one QFile handler for linear read

Definition at line 105 of file timsbindec.cpp.

107{
108 if(mp_fileLinear == nullptr)
109 {
110 mp_fileLinear = new QFile(m_timsBinFile);
111 if(!mp_fileLinear->open(QIODevice::ReadOnly))
112 {
113 throw PappsoException(
114 QObject::tr("ERROR opening TIMS binary file %1 for read").arg(m_timsBinFile));
115 }
116
117 startLinearRead(frameId, m_linearAccessRawDataChunckDequeSize, frame_record_list);
118 }
119
120 return mp_fileLinear;
121}
void startLinearRead(std::size_t start_frame_id, std::size_t chunk_deque_size, const std::vector< pappso::TimsFrameRecord > &frame_record_list)
populate a fifo buffer with TimsFrameRawDataChunck accelerates inputs from file
std::size_t m_linearAccessRawDataChunckDequeSize
Definition timsbindec.h:115

References m_linearAccessRawDataChunckDequeSize, m_timsBinFile, mp_fileLinear, and startLinearRead().

Referenced by getTimsFrameSPtrByOffset().

◆ getQfileRandom()

QFile * pappso::TimsBinDec::getQfileRandom ( )
private

open one QFile handler for random read

Definition at line 124 of file timsbindec.cpp.

125{
126 if(mp_fileRandom == nullptr)
127 {
128 mp_fileRandom = new QFile(m_timsBinFile);
129 if(!mp_fileRandom->open(QIODevice::ReadOnly))
130 {
131 throw PappsoException(
132 QObject::tr("ERROR opening TIMS binary file %1 for read").arg(m_timsBinFile));
133 }
134 }
135 return mp_fileRandom;
136}

References m_timsBinFile, and mp_fileRandom.

Referenced by getTimsFrameSPtrByOffset().

◆ getTimsFrameFromRawDataChunck()

TimsFrameSPtr TimsBinDec::getTimsFrameFromRawDataChunck ( const TimsFrameRawDataChunck & raw_data_chunck)
private

Definition at line 240 of file timsbindec.cpp.

241{
242 // qDebug();
243 TimsFrameSPtr frame_sptr;
244 if(raw_data_chunck.getCompressedSize() > 0)
245 {
246 // qDebug();
247 if(m_timsCompressionType == 2)
248 {
249 auto decompressed_size2 = ZSTD_getFrameContentSize(raw_data_chunck.getMemoryBuffer(),
250 raw_data_chunck.getCompressedSize());
251 // qDebug();
252 if(decompressed_size2 == ZSTD_CONTENTSIZE_UNKNOWN)
253 {
254 throw PappsoException(QObject::tr("ERROR TimsBinDec::getTimsFrameFromRawDataChunck "
255 "reading TIMS frame %1 TIMS binary file %2: "
256 " decompressed_size2 == ZSTD_CONTENTSIZE_UNKNOWN, "
257 "frame_length=%3")
258 .arg(raw_data_chunck.getFrameId())
259 .arg(m_timsBinFile)
260 .arg(raw_data_chunck.getFrameLength()));
261 }
262 // qDebug();
263 if(decompressed_size2 == ZSTD_CONTENTSIZE_ERROR)
264 {
265 // qDebug();
266 throw PappsoException(QObject::tr("ERROR TimsBinDec::getTimsFrameFromRawDataChunck "
267 "reading TIMS frame %1 TIMS binary file %2: "
268 " decompressed_size2 == ZSTD_CONTENTSIZE_ERROR, "
269 "frame_length=%3")
270 .arg(raw_data_chunck.getFrameId())
271 .arg(m_timsBinFile)
272 .arg(raw_data_chunck.getFrameLength()));
273 }
274 qDebug() << " decompressed_size2=" << decompressed_size2;
275
276 if(m_decompressMemoryBufferSize < (decompressed_size2 + 10))
277 {
278 if(mpa_decompressMemoryBuffer != nullptr)
279 {
281 }
282 m_decompressMemoryBufferSize = decompressed_size2 + 10;
284 }
285 std::size_t decompressed_size = ZSTD_decompress(mpa_decompressMemoryBuffer,
287 raw_data_chunck.getMemoryBuffer(),
288 raw_data_chunck.getCompressedSize());
289 // qDebug();
290
291 if(decompressed_size != decompressed_size2)
292 {
293 throw PappsoException(QObject::tr("ERROR TimsBinDec::getTimsFrameFromRawDataChunck "
294 "reading TIMS frame %1 TIMS binary file %2: "
295 "decompressed_size != decompressed_size2")
296 .arg(raw_data_chunck.getFrameId())
297 .arg(m_timsBinFile)
298 .arg(decompressed_size)
299 .arg(decompressed_size2));
300 }
301
302 // qDebug();
303
304 frame_sptr = std::make_shared<TimsFrame>(raw_data_chunck.getFrameId(),
305 raw_data_chunck.getFrameNumberOfScans(),
307 decompressed_size);
308 }
309 else
310 {
311
312 if(m_timsCompressionType == 1)
313 {
314 frame_sptr = std::make_shared<TimsFrameType1>(raw_data_chunck.getFrameId(),
315 raw_data_chunck.getFrameNumberOfScans(),
316 raw_data_chunck.getMemoryBuffer(),
317 raw_data_chunck.getCompressedSize());
318 }
319 }
320 // delete[] mpa_decompressMemoryBuffer;
321 }
322 else
323 {
324 frame_sptr = std::make_shared<TimsFrame>(
325 raw_data_chunck.getFrameId(), raw_data_chunck.getFrameNumberOfScans(), nullptr, 0);
326 }
327 return frame_sptr;
328}
std::size_t m_decompressMemoryBufferSize
Definition timsbindec.h:107
std::shared_ptr< TimsFrame > TimsFrameSPtr
Definition timsframe.h:43

References pappso::TimsFrameRawDataChunck::getCompressedSize(), pappso::TimsFrameRawDataChunck::getFrameId(), pappso::TimsFrameRawDataChunck::getFrameLength(), pappso::TimsFrameRawDataChunck::getFrameNumberOfScans(), pappso::TimsFrameRawDataChunck::getMemoryBuffer(), m_decompressMemoryBufferSize, m_timsBinFile, m_timsCompressionType, and mpa_decompressMemoryBuffer.

Referenced by getTimsFrameSPtrByOffset().

◆ getTimsFrameSPtrByOffset()

TimsFrameSPtr TimsBinDec::getTimsFrameSPtrByOffset ( std::size_t frameId,
const std::vector< pappso::TimsFrameRecord > & frame_record_list )

Definition at line 139 of file timsbindec.cpp.

141{
142
143 qDebug() << "frameId:" << frameId;
144
145 // QMutexLocker locker(&m_mutex);
146 QFile *p_file = getQfileLinear(frameId, frame_record_list);
147
148 if(mp_fileLinear->pos() < (qint64)frame_record_list[m_firstFrameId].tims_offset)
149 {
150 }
151 else
152 {
153 if(frameId > m_lastFrameId)
154 {
156 {
157 // move forward
158 moveLinearReadForward(frame_record_list);
159 }
160 }
161 }
162
163 auto it = std::find_if(m_linearAccessRawDataChunckList.begin(),
165 [frameId](const TimsFrameRawDataChunck &chunck) {
166 if(chunck.getFrameId() == frameId)
167 return true;
168 return false;
169 });
170 if(it != m_linearAccessRawDataChunckList.end())
171 {
172 try
173 {
175 }
176 catch(PappsoException &error)
177 {
178
179 throw PappsoException(QObject::tr("ERROR reading TIMS binary file %1 with linear QFile: "
180 "%2")
181 .arg(m_timsBinFile)
182 .arg(error.qwhat()));
183 }
184 }
185
186 // random access file
187 // qDebug();
188 p_file = getQfileRandom();
189 bool seekpos_ok = p_file->seek(frame_record_list[frameId].tims_offset);
190 if(!seekpos_ok)
191 {
192 throw PappsoException(QObject::tr("ERROR reading TIMS frame %1 TIMS binary file %2: "
193 "m_timsBinFile.seek(%3) failed")
194 .arg(frameId)
195 .arg(m_timsBinFile)
196 .arg(frame_record_list[frameId].tims_offset));
197 }
198
199
200 try
201 {
202 m_randemAccessFrameRawDataChunck.readTimsFrame(p_file, frameId, frame_record_list);
203 }
204 catch(PappsoException &error)
205 {
206
207 throw PappsoException(QObject::tr("ERROR reading TIMS binary file %1 with random QFile: "
208 "%2")
209 .arg(m_timsBinFile)
210 .arg(error.qwhat()));
211 }
212
214}
virtual const QString & qwhat() const
QFile * getQfileRandom()
open one QFile handler for random read
std::size_t m_linearForwardThreshold
Definition timsbindec.h:116
QFile * getQfileLinear(std::size_t frameId, const std::vector< pappso::TimsFrameRecord > &frame_record_list)
open one QFile handler for linear read
void moveLinearReadForward(const std::vector< pappso::TimsFrameRecord > &frame_record_list)
TimsFrameSPtr getTimsFrameFromRawDataChunck(const TimsFrameRawDataChunck &raw_data_chunck)
TimsFrameRawDataChunck m_randemAccessFrameRawDataChunck
Definition timsbindec.h:109

References getQfileLinear(), getQfileRandom(), getTimsFrameFromRawDataChunck(), m_firstFrameId, m_lastFrameId, m_linearAccessRawDataChunckList, m_linearForwardThreshold, m_randemAccessFrameRawDataChunck, m_timsBinFile, moveLinearReadForward(), mp_fileLinear, and pappso::PappsoException::qwhat().

◆ moveLinearReadForward()

void pappso::TimsBinDec::moveLinearReadForward ( const std::vector< pappso::TimsFrameRecord > & frame_record_list)
private

Definition at line 217 of file timsbindec.cpp.

219{
220 // qDebug();
221 for(std::size_t i = 0; i < m_linearForwardThreshold; i++)
222 {
223 auto it =
224 std::min_element(m_linearAccessRawDataChunckList.begin(),
226 [](const TimsFrameRawDataChunck &a, const TimsFrameRawDataChunck &b) {
227 return a.getFrameId() < b.getFrameId();
228 });
231 if(m_lastFrameId >= frame_record_list.size())
232 break;
233 it->readTimsFrame(mp_fileLinear, m_lastFrameId, frame_record_list);
234 }
235 // qDebug();
236}

References pappso::a, pappso::b, m_firstFrameId, m_lastFrameId, m_linearAccessRawDataChunckList, m_linearForwardThreshold, and mp_fileLinear.

Referenced by getTimsFrameSPtrByOffset().

◆ startLinearRead()

void pappso::TimsBinDec::startLinearRead ( std::size_t start_frame_id,
std::size_t chunk_deque_size,
const std::vector< pappso::TimsFrameRecord > & frame_record_list )
private

populate a fifo buffer with TimsFrameRawDataChunck accelerates inputs from file

Definition at line 338 of file timsbindec.cpp.

341{
342 // qDebug();
343 m_linearAccessRawDataChunckList.resize(chunk_deque_size);
344 m_firstFrameId = start_frame_id;
345 m_lastFrameId = start_frame_id;
346
347 QFile *p_file = mp_fileLinear;
348 if(p_file == nullptr)
349 {
350 throw PappsoException(QObject::tr("ERROR mp_fileLinear == nullptr"));
351 }
352
353 bool seekpos_ok = p_file->seek(frame_record_list[start_frame_id].tims_offset);
354 if(!seekpos_ok)
355 {
356 throw PappsoException(QObject::tr("ERROR reading TIMS frame %1 TIMS binary file %2: "
357 "m_timsBinFile.seek(%3) failed")
358 .arg(start_frame_id)
359 .arg(m_timsBinFile)
360 .arg(frame_record_list[start_frame_id].tims_offset));
361 }
362
363 try
364 {
365 for(TimsFrameRawDataChunck &chunck : m_linearAccessRawDataChunckList)
366 {
367
368 chunck.readTimsFrame(p_file, start_frame_id, frame_record_list);
369 m_lastFrameId = start_frame_id;
370 start_frame_id++;
371 }
372 }
373 catch(PappsoException &error)
374 {
375
376 throw PappsoException(
377 QObject::tr("ERROR in TimsBinDec::startLinearRead reading TIMS binary file %1:\n "
378 " start_frame_id=%2 m_firstFrameId=%3 m_lastFrameId=%4 "
379 "%5")
380 .arg(m_timsBinFile)
381 .arg(start_frame_id)
382 .arg(m_firstFrameId)
383 .arg(m_lastFrameId)
384 .arg(error.qwhat()));
385 }
386
387 // qDebug();
388}

References m_firstFrameId, m_lastFrameId, m_linearAccessRawDataChunckList, m_timsBinFile, mp_fileLinear, and pappso::PappsoException::qwhat().

Referenced by getQfileLinear().

Member Data Documentation

◆ m_decompressMemoryBufferSize

std::size_t pappso::TimsBinDec::m_decompressMemoryBufferSize = 0
private

Definition at line 107 of file timsbindec.h.

Referenced by getTimsFrameFromRawDataChunck().

◆ m_firstFrameId

std::size_t pappso::TimsBinDec::m_firstFrameId = 0
private

◆ m_lastFrameId

std::size_t pappso::TimsBinDec::m_lastFrameId = 0
private

◆ m_linearAccessRawDataChunckDequeSize

std::size_t pappso::TimsBinDec::m_linearAccessRawDataChunckDequeSize = 100
private

Definition at line 115 of file timsbindec.h.

Referenced by getQfileLinear().

◆ m_linearAccessRawDataChunckList

std::vector<TimsFrameRawDataChunck> pappso::TimsBinDec::m_linearAccessRawDataChunckList
private

◆ m_linearForwardThreshold

std::size_t pappso::TimsBinDec::m_linearForwardThreshold = 30
private

Definition at line 116 of file timsbindec.h.

Referenced by getTimsFrameSPtrByOffset(), and moveLinearReadForward().

◆ m_randemAccessFrameRawDataChunck

TimsFrameRawDataChunck pappso::TimsBinDec::m_randemAccessFrameRawDataChunck
private

Definition at line 109 of file timsbindec.h.

Referenced by getTimsFrameSPtrByOffset().

◆ m_timsBinFile

QString pappso::TimsBinDec::m_timsBinFile
private

◆ m_timsCompressionType

int pappso::TimsBinDec::m_timsCompressionType
private

Definition at line 100 of file timsbindec.h.

Referenced by TimsBinDec(), and getTimsFrameFromRawDataChunck().

◆ mp_fileLinear

QFile* pappso::TimsBinDec::mp_fileLinear = nullptr
private

◆ mp_fileRandom

QFile* pappso::TimsBinDec::mp_fileRandom = nullptr
private

Definition at line 103 of file timsbindec.h.

Referenced by ~TimsBinDec(), and getQfileRandom().

◆ mpa_decompressMemoryBuffer

char* pappso::TimsBinDec::mpa_decompressMemoryBuffer = nullptr
private

Definition at line 106 of file timsbindec.h.

Referenced by ~TimsBinDec(), and getTimsFrameFromRawDataChunck().


The documentation for this class was generated from the following files: