casacore
Loading...
Searching...
No Matches
SiscoReader.h
Go to the documentation of this file.
1#ifndef SISCO_SISCO_READER_H_
2#define SISCO_SISCO_READER_H_
3
4#include <complex>
5#include <fstream>
6#include <list>
7#include <map>
8#include <set>
9#include <span>
10#include <string>
11#include <vector>
12
13#include "ConditionalQueue.h"
14#include "Deflate.h"
15#include "Lane.h"
16#include "Sisco.h"
17
18namespace casacore::sisco {
19
25 struct Chunk {
30 std::vector<std::byte> read_buffer;
31 std::vector<std::byte> decompress_buffer;
32
33 bool operator<(const Chunk& rhs) const {
34 return chunk_index < rhs.chunk_index;
35 }
36 };
37
38 private:
47
48 public:
49 SiscoReader(const std::string& filename);
53
54 void Open(std::span<std::byte> header_data);
55
56 size_t GetRequestBufferSize() const { return kRequestBufferSize; }
57
68 void Request(size_t baseline_index, size_t n_values);
69
70 void GetNextResult(std::span<std::complex<float>> data);
71
72 int PredictLevel() const { return predict_level_; }
73
74 private:
75 void Close();
76
77 void ResultLoop();
78
79 struct Result {
80 std::vector<float> real_data;
81 std::vector<float> imaginary_data;
82 size_t result_index = 0;
83 bool operator<(const Result& rhs) const {
84 return result_index < rhs.result_index;
85 }
86 };
87 void ReadLoop();
89 void GetNextChunk(Chunk& chunk);
91 size_t ReadChunk(std::vector<std::byte>& buffer);
92
93 static constexpr size_t kRequestBufferSize = 4096;
94 std::set<Chunk> decompressed_queue;
95
97 std::list<Chunk> chunks_;
98
100 size_t chunk_sequence = 0;
102 size_t result_counter_ = 0;
105
106 bool open_ = false;
107
112 std::set<Result> result_queue;
113
114 std::thread read_thread_;
115 std::vector<std::thread> result_workers_;
116 std::mutex mutex_;
117 std::set<size_t> busy_baselines_;
118
123
124 // Indexed by baseline_index.
125 std::map<size_t, BaselineData> baseline_data_;
126 std::string filename_;
127 std::ifstream file_;
128};
129
130} // namespace casacore::sisco
131
132#endif
Internal header file for the Lane.
The Lane is an efficient cyclic buffer that is synchronized.
Definition Lane.h:100
A queue with a limited size and the ability to query only specific values.
std::set< Result > result_queue
std::list< Chunk > chunks_
Definition SiscoReader.h:97
std::vector< std::thread > result_workers_
aocommon::Lane< Chunk > decompress_lane_
void GetNextResult(std::span< std::complex< float > > data)
SiscoReader(SiscoReader &&)=default
size_t GetRequestBufferSize() const
Definition SiscoReader.h:56
void Open(std::span< std::byte > header_data)
void GetNextChunk(Chunk &chunk)
std::set< Chunk > decompressed_queue
Definition SiscoReader.h:94
std::map< size_t, BaselineData > baseline_data_
Indexed by baseline_index.
size_t ReadChunk(std::vector< std::byte > &buffer)
Read current chunk and returns the decompressed size.
SiscoReader & operator=(SiscoReader &&)=default
std::set< size_t > busy_baselines_
ConditionalQueue< RequestData > request_queue_
aocommon::Lane< Chunk > read_lane_
static constexpr size_t kRequestBufferSize
Definition SiscoReader.h:93
void Request(size_t baseline_index, size_t n_values)
This is an interface that allow parallelism over the decompression.
SiscoReader(const std::string &filename)
aocommon::Lane< Result > result_lane_
std::vector< std::byte > decompress_buffer
Definition SiscoReader.h:31
bool operator<(const Chunk &rhs) const
Definition SiscoReader.h:33
std::vector< std::byte > read_buffer
Definition SiscoReader.h:30
bool operator<(const Result &rhs) const
Definition SiscoReader.h:83
std::vector< float > imaginary_data
Definition SiscoReader.h:81