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 {
47 QObject::tr("compression type %1 not handled by this library")
48 .arg(timsCompressionType));
49 }
50 if(m_timsBinFile.isEmpty())
51 {
53 QObject::tr("No TIMS binary file name specified"));
54 }
55 QFile file(m_timsBinFile);
56 if(!file.open(QIODevice::ReadOnly))
57 {
58 throw PappsoException(
59 QObject::tr("ERROR opening TIMS binary file %1 for read")
60 .arg(timsBinFile.absoluteFilePath()));
61 }
62}

References m_timsBinFile, and m_timsCompressionType.

◆ TimsBinDec() [2/2]

TimsBinDec::TimsBinDec ( const TimsBinDec other)

Copy constructor

Parameters
otherTODO

Definition at line 65 of file timsbindec.cpp.

67{
68}

◆ ~TimsBinDec()

TimsBinDec::~TimsBinDec ( )
virtual

Destructor

Definition at line 70 of file timsbindec.cpp.

71{
72
73
74 if(mpa_decompressMemoryBuffer != nullptr)
75 {
77 }
78
79 if(mp_fileLinear != nullptr)
80 {
81 mp_fileLinear->close();
82 delete mp_fileLinear;
83 }
84 if(mp_fileRandom != nullptr)
85 {
86 mp_fileRandom->close();
87 delete mp_fileRandom;
88 }
89}
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 92 of file timsbindec.cpp.

93{
94 // qDebug();
95 if(mp_fileLinear != nullptr)
96 {
97 mp_fileLinear->close();
98 delete mp_fileLinear;
99 }
100 mp_fileLinear = nullptr;
101 m_firstFrameId = 0;
102 m_lastFrameId = 0;
104 // qDebug();
105}
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

Referenced by pappso::TimsDdaPrecursors::ms2ReaderSpectrumCollectionByMsLevel().

◆ 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 109 of file timsbindec.cpp.

112{
113 if(mp_fileLinear == nullptr)
114 {
115 mp_fileLinear = new QFile(m_timsBinFile);
116 if(!mp_fileLinear->open(QIODevice::ReadOnly))
117 {
118 throw PappsoException(
119 QObject::tr("ERROR opening TIMS binary file %1 for read")
120 .arg(m_timsBinFile));
121 }
122
124 frameId, m_linearAccessRawDataChunckDequeSize, frame_record_list);
125 }
126
127 return mp_fileLinear;
128}
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 131 of file timsbindec.cpp.

132{
133 if(mp_fileRandom == nullptr)
134 {
135 mp_fileRandom = new QFile(m_timsBinFile);
136 if(!mp_fileRandom->open(QIODevice::ReadOnly))
137 {
138 throw PappsoException(
139 QObject::tr("ERROR opening TIMS binary file %1 for read")
140 .arg(m_timsBinFile));
141 }
142 }
143 return mp_fileRandom;
144}

Referenced by getTimsFrameSPtrByOffset().

◆ getTimsFrameFromRawDataChunck()

TimsFrameSPtr TimsBinDec::getTimsFrameFromRawDataChunck ( const TimsFrameRawDataChunck raw_data_chunck)
private

Definition at line 254 of file timsbindec.cpp.

256{
257 // qDebug();
258 TimsFrameSPtr frame_sptr;
259 if(raw_data_chunck.getCompressedSize() > 0)
260 {
261 // qDebug();
262 if(m_timsCompressionType == 2)
263 {
264 auto decompressed_size2 =
265 ZSTD_getFrameContentSize(raw_data_chunck.getMemoryBuffer(),
266 raw_data_chunck.getCompressedSize());
267 // qDebug();
268 if(decompressed_size2 == ZSTD_CONTENTSIZE_UNKNOWN)
269 {
270 throw PappsoException(
271 QObject::tr("ERROR TimsBinDec::getTimsFrameFromRawDataChunck "
272 "reading TIMS frame %1 TIMS binary file %2: "
273 " decompressed_size2 == ZSTD_CONTENTSIZE_UNKNOWN, "
274 "frame_length=%3")
275 .arg(raw_data_chunck.getFrameId())
276 .arg(m_timsBinFile)
277 .arg(raw_data_chunck.getFrameLength()));
278 }
279 // qDebug();
280 if(decompressed_size2 == ZSTD_CONTENTSIZE_ERROR)
281 {
282 // qDebug();
283 throw PappsoException(
284 QObject::tr("ERROR TimsBinDec::getTimsFrameFromRawDataChunck "
285 "reading TIMS frame %1 TIMS binary file %2: "
286 " decompressed_size2 == ZSTD_CONTENTSIZE_ERROR, "
287 "frame_length=%3")
288 .arg(raw_data_chunck.getFrameId())
289 .arg(m_timsBinFile)
290 .arg(raw_data_chunck.getFrameLength()));
291 }
292 qDebug() << " decompressed_size2=" << decompressed_size2;
293
294 if(m_decompressMemoryBufferSize < (decompressed_size2 + 10))
295 {
296 if(mpa_decompressMemoryBuffer != nullptr)
297 {
299 }
300 m_decompressMemoryBufferSize = decompressed_size2 + 10;
303 }
304 std::size_t decompressed_size =
305 ZSTD_decompress(mpa_decompressMemoryBuffer,
307 raw_data_chunck.getMemoryBuffer(),
308 raw_data_chunck.getCompressedSize());
309 // qDebug();
310
311 if(decompressed_size != decompressed_size2)
312 {
313 throw PappsoException(
314 QObject::tr("ERROR TimsBinDec::getTimsFrameFromRawDataChunck "
315 "reading TIMS frame %1 TIMS binary file %2: "
316 "decompressed_size != decompressed_size2")
317 .arg(raw_data_chunck.getFrameId())
318 .arg(m_timsBinFile)
319 .arg(decompressed_size)
320 .arg(decompressed_size2));
321 }
322
323 // qDebug();
324
325 frame_sptr =
326 std::make_shared<TimsFrame>(raw_data_chunck.getFrameId(),
327 raw_data_chunck.getFrameNumberOfScans(),
329 decompressed_size);
330 }
331 else
332 {
333
334 if(m_timsCompressionType == 1)
335 {
336 frame_sptr = std::make_shared<TimsFrameType1>(
337 raw_data_chunck.getFrameId(),
338 raw_data_chunck.getFrameNumberOfScans(),
339 raw_data_chunck.getMemoryBuffer(),
340 raw_data_chunck.getCompressedSize());
341 }
342 }
343 // delete[] mpa_decompressMemoryBuffer;
344 }
345 else
346 {
347 frame_sptr =
348 std::make_shared<TimsFrame>(raw_data_chunck.getFrameId(),
349 raw_data_chunck.getFrameNumberOfScans(),
350 nullptr,
351 0);
352 }
353 return frame_sptr;
354}
std::size_t m_decompressMemoryBufferSize
Definition timsbindec.h:107
std::shared_ptr< TimsFrame > TimsFrameSPtr
Definition timsframe.h:42

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 147 of file timsbindec.cpp.

150{
151
152 qDebug() << "frameId:" << frameId;
153
154 // QMutexLocker locker(&m_mutex);
155 QFile *p_file = getQfileLinear(frameId, frame_record_list);
156
157 if(mp_fileLinear->pos() <
158 (qint64)frame_record_list[m_firstFrameId].tims_offset)
159 {
160 }
161 else
162 {
163 if(frameId > m_lastFrameId)
164 {
166 {
167 // move forward
168 moveLinearReadForward(frame_record_list);
169 }
170 }
171 }
172
173 auto it = std::find_if(m_linearAccessRawDataChunckList.begin(),
175 [frameId](const TimsFrameRawDataChunck &chunck) {
176 if(chunck.getFrameId() == frameId)
177 return true;
178 return false;
179 });
180 if(it != m_linearAccessRawDataChunckList.end())
181 {
182 try
183 {
185 }
186 catch(PappsoException &error)
187 {
188
189 throw PappsoException(
190 QObject::tr("ERROR reading TIMS binary file %1 with linear QFile: "
191 "%2")
192 .arg(m_timsBinFile)
193 .arg(error.qwhat()));
194 }
195 }
196
197 // random access file
198 // qDebug();
199 p_file = getQfileRandom();
200 bool seekpos_ok = p_file->seek(frame_record_list[frameId].tims_offset);
201 if(!seekpos_ok)
202 {
203 throw PappsoException(
204 QObject::tr("ERROR reading TIMS frame %1 TIMS binary file %2: "
205 "m_timsBinFile.seek(%3) failed")
206 .arg(frameId)
207 .arg(m_timsBinFile)
208 .arg(frame_record_list[frameId].tims_offset));
209 }
210
211
212 try
213 {
215 p_file, frameId, frame_record_list);
216 }
217 catch(PappsoException &error)
218 {
219
220 throw PappsoException(
221 QObject::tr("ERROR reading TIMS binary file %1 with random QFile: "
222 "%2")
223 .arg(m_timsBinFile)
224 .arg(error.qwhat()));
225 }
226
228}
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
bool readTimsFrame(QFile *p_file, std::size_t frameId, const std::vector< pappso::TimsFrameRecord > &frame_record_list)

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

Referenced by pappso::TimsData::getTimsFrameCstSPtr().

◆ moveLinearReadForward()

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

Definition at line 231 of file timsbindec.cpp.

233{
234 // qDebug();
235 for(std::size_t i = 0; i < m_linearForwardThreshold; i++)
236 {
237 auto it = std::min_element(
241 return a.getFrameId() < b.getFrameId();
242 });
245 if(m_lastFrameId >= frame_record_list.size())
246 break;
247 it->readTimsFrame(mp_fileLinear, m_lastFrameId, frame_record_list);
248 }
249 // qDebug();
250}

References pappso::a, and pappso::b.

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 364 of file timsbindec.cpp.

368{
369 // qDebug();
370 m_linearAccessRawDataChunckList.resize(chunk_deque_size);
371 m_firstFrameId = start_frame_id;
372 m_lastFrameId = start_frame_id;
373
374 QFile *p_file = mp_fileLinear;
375 if(p_file == nullptr)
376 {
377 throw PappsoException(QObject::tr("ERROR mp_fileLinear == nullptr"));
378 }
379
380 bool seekpos_ok = p_file->seek(frame_record_list[start_frame_id].tims_offset);
381 if(!seekpos_ok)
382 {
383 throw PappsoException(
384 QObject::tr("ERROR reading TIMS frame %1 TIMS binary file %2: "
385 "m_timsBinFile.seek(%3) failed")
386 .arg(start_frame_id)
387 .arg(m_timsBinFile)
388 .arg(frame_record_list[start_frame_id].tims_offset));
389 }
390
391 try
392 {
394 {
395
396 chunck.readTimsFrame(p_file, start_frame_id, frame_record_list);
397 m_lastFrameId = start_frame_id;
398 start_frame_id++;
399 }
400 }
401 catch(PappsoException &error)
402 {
403
404 throw PappsoException(
405 QObject::tr(
406 "ERROR in TimsBinDec::startLinearRead reading TIMS binary file %1:\n "
407 " start_frame_id=%2 m_firstFrameId=%3 m_lastFrameId=%4 "
408 "%5")
409 .arg(m_timsBinFile)
410 .arg(start_frame_id)
411 .arg(m_firstFrameId)
412 .arg(m_lastFrameId)
413 .arg(error.qwhat()));
414 }
415
416 // qDebug();
417}

References 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

Definition at line 113 of file timsbindec.h.

Referenced by getTimsFrameSPtrByOffset().

◆ m_lastFrameId

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

Definition at line 114 of file timsbindec.h.

Referenced by getTimsFrameSPtrByOffset().

◆ 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

Definition at line 112 of file timsbindec.h.

Referenced by getTimsFrameSPtrByOffset().

◆ m_linearForwardThreshold

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

Definition at line 116 of file timsbindec.h.

Referenced by getTimsFrameSPtrByOffset().

◆ 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

Definition at line 102 of file timsbindec.h.

Referenced by ~TimsBinDec(), getQfileLinear(), and getTimsFrameSPtrByOffset().

◆ mp_fileRandom

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

Definition at line 103 of file timsbindec.h.

Referenced by ~TimsBinDec().

◆ 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: