24 #include "cheetah/sigproc/SigProcWriter.h" 26 #include <boost/units/cmath.hpp> 31 template<
typename IteratorType,
typename IteratorTag>
33 static void exec(IteratorType begin, IteratorType
const end, std::ostream& os) {
43 template<
typename IteratorType>
44 struct do_write<IteratorType,
std::random_access_iterator_tag>
46 static void exec(IteratorType begin, IteratorType
const end, std::ostream& os) {
47 os.write(reinterpret_cast<const char*>(&(*begin)), std::distance(begin, end) *
sizeof(
typename std::iterator_traits<
typename std::remove_reference<IteratorType>::type>::value_type));
52 template<
typename IteratorType>
53 void write_out(IteratorType begin, IteratorType
const end, std::ostream& os) {
54 do_write<IteratorType, typename std::iterator_traits<typename std::remove_reference<IteratorType>::type>::iterator_category>::exec(begin, end, os);
62 template<
typename HeaderType>
63 SigProcWriter<HeaderType>::SigProcWriter(WriterConfig
const& config)
64 : _extension(config.extension())
66 , _max_samples_per_file(config.max_count())
68 set_dir(config.dir());
71 template<
typename HeaderType>
72 SigProcWriter<HeaderType>::SigProcWriter(std::string
const& filename)
78 template<
typename HeaderType>
79 SigProcWriter<HeaderType>::SigProcWriter(boost::filesystem::path
const& filename)
85 template<
typename HeaderType>
86 SigProcWriter<HeaderType>::~SigProcWriter()
90 template<
typename HeaderType>
96 template<
typename HeaderType>
100 if(!boost::filesystem::is_directory(_dir)) {
101 panda::Error e(
"SigProcWriter: directory does not exist:");
107 template<
typename HeaderType>
110 std::time_t ttp = std::chrono::system_clock::to_time_t(time);
112 std::strftime(stem,
sizeof(stem),
"%Y_%m_%d_%H:%M:%S", std::gmtime(&ttp));
113 boost::filesystem::path file = _dir / boost::filesystem::path(std::string(stem) + _extension);
114 if(boost::filesystem::exists(file)) {
117 file = _dir / boost::filesystem::path(std::string(stem) +
"_" + std::to_string(++count) + _extension);
118 }
while( boost::filesystem::exists(file));
120 return file.native();
123 template<
typename HeaderType>
124 template<
typename Arch,
typename NumericalRep>
129 file_write(h,
static_cast<pss::astrotypes::TimeFrequency<NumericalRep> const&
>(tf));
133 template<
typename HeaderType>
134 template<
typename DerivedType,
typename NumericalRep,
typename Alloc>
138 h.number_of_channels(spectrum.template dimension<data::Frequency>());
139 h.number_of_bits(
sizeof(NumericalRep)*8);
142 file_write(h, spectrum);
146 template<
typename HeaderType>
149 if((h.tstart().is_set() && (_header.sample_interval().value() > 0.0) && (abs(*h.tstart() - *_header.tstart()) >= 0.5 * _header.sample_interval())) || _header != h )
151 if(_file_stream.is_open()) {
152 PANDA_LOG_WARN <<
"break in data stream: creating new file with updated parameters: expected:\n" << pss::astrotypes::sigproc::Header::Info() << _header
153 <<
" got:\n" << pss::astrotypes::sigproc::Header::Info() << h;
156 _file_stream.close();
159 if(!_file_stream.is_open()) {
162 _file_stream.open(next_file(*(h.tstart())), std::ios::binary);
163 _header.
write(_file_stream);
167 template<
typename HeaderType>
169 typename std::enable_if<pss::astrotypes::has_exact_dimensions<T, data::Time, data::Frequency>::value,
SigProcWriter<HeaderType>&>::type
174 std::size_t n_spectra = tf.template dimension<data::Time>() - spectrum;
175 bool break_file =
false;
176 if(_max_samples_per_file != 0 ) {
177 auto remaining_file_space = _max_samples_per_file - _sample_count;
178 if(n_spectra > remaining_file_space) {
179 n_spectra = remaining_file_space;
182 else if( n_spectra == remaining_file_space)
187 for(std::size_t i=spectrum; i < n_spectra + spectrum; ++i) {
189 auto sample = tf[data::DimensionIndex<data::Time>(i)];
190 write_out(sample.begin(), sample.end(), _file_stream);
193 _header.tstart(*_header.tstart() + (_header.sample_interval() * (double)n_spectra));
195 _file_stream.close();
196 if(tf.template dimension<data::Time>() > n_spectra) {
198 return file_write(_header, tf, n_spectra);
202 _sample_count+=n_spectra;
208 template<
typename HeaderType>
210 typename std::enable_if<pss::astrotypes::has_exact_dimensions<T, data::Frequency>::value,
SigProcWriter<HeaderType>&>::type
214 write_out(sample.begin(), sample.end(), _file_stream);
215 if(_max_samples_per_file != 0 && ++_sample_count >= _max_samples_per_file) {
216 _file_stream.close();
221 template<
typename HeaderType>
222 template<
typename Arch,
typename NumericalRep>
226 h.number_of_bits(
sizeof(NumericalRep)*8);
240 template<
typename HeaderType>
242 typename std::enable_if<pss::astrotypes::has_exact_dimensions<T, data::Time, data::Frequency>::value,
SigProcWriter<HeaderType>&>::type
245 return file_write(header, t);
A single dimension representation of a Spectrum.
TimePointType const & start_time() const
Some limits and constants for FLDO.
std::size_t number_of_channels() const
TimeType sample_interval() const
std::vector< FrequencyType > const & channel_frequencies() const
TimePointType const & start_time() const
std::enable_if< pss::astrotypes::has_exact_dimensions< T, data::Time, data::Frequency >::value, SigProcWriter & >::type write(HeaderType const &, T const &t)
write the data out to file using the meta data from the header provided
Writes data types to a sigproc format file.