ddt  0.1
imageBuffer.hpp
Go to the documentation of this file.
1 // @copyright
2 // (c) Copyright ESO 2020
3 // All Rights Reserved
4 // ESO (eso.org) is an Intergovernmental Organization, and therefore special
5 // legal conditions apply.
6 //
7 // @file imageBuffer.hpp
8 // @brief Image Buffer class, handles internal CPL image.
9 //
10 // This file is part of the DDT Image Handling Library and
11 // provides a class that handles the internal CPL image.
12 //
13 // @author Christoph Bortlisz, CGI
14 // @since 2020/10/01
15 //
16 
17 #ifndef IMAGEBUFFER_HPP
18 #define IMAGEBUFFER_HPP
19 
20 #include <cpl.h>
21 #include <sys/stat.h>
22 
23 #include <algorithm>
24 #include <cctype>
25 #undef I
26 #undef arg
27 
29 #include "ddt/dataAcquisition.hpp"
30 #include "ddt/dataFile.hpp"
32 #include "ddt/ddtEncDecImage2D.hpp"
33 #include "ddt/ddtEncDecImage3D.hpp"
34 #include "ddt/ddtLogger.hpp"
35 #include "ddt/imageColor.hpp"
36 #include "ddt/imageCoords.hpp"
37 #include "ddt/imageError.hpp"
38 #include "ddt/imageIO.hpp"
39 #include "ddt/imageProc.hpp"
40 #include "ddt/imageStats.hpp"
41 #include "ddt/informationMaps.hpp"
42 
43 namespace ddt {
44 
52 class ImageBuffer {
53  public:
58  ImageBuffer();
59 
63  virtual ~ImageBuffer();
64 
69  void set_logger(ddt::DdtLogger* const in_logger);
70 
80  bool LoadFile(const std::string& file_name, const int position = 0);
81 
90  bool LoadFilePlane(const std::string& file_name, const int position = 0,
91  const int plane = 0);
92 
99  bool LoadImageExtensionsAsOne(const std::string& file_name);
100 
106  bool LoadCPLImage(cpl_image* const image);
107 
114  bool LoadActualConfigurationMap(const std::string configuration_map_name);
115 
120  bool LoadConfigurationMaps(const std::string configuration_map_source);
121 
126  bool LoadInformationMaps(const std::string information_map_source);
127 
131  void* get_ImageData();
132 
136  cpl_image* get_Image();
137 
141  std::string LastTimestampFromBuffer() const;
142 
146  cpl_table* get_BinaryTable();
147 
154  FitsExtension* get_FitsExtensionInfo(const int extension_number);
155 
161 
165  int get_ImageWidth() const;
166 
170  int get_ImageHeight() const;
171 
175  int get_NumberPlanes() const;
176 
181  int get_CurrentPlane() const;
182 
187  void set_CurrentPlane(const int plane);
188 
192  int get_NumberExtensions();
193 
197  int get_NumberAxis() const;
198 
203  cpl_wcs* get_Wcs();
204 
209  cpl_propertylist* get_PropertyList();
210 
216  cpl_apertures* get_CircularObjects(const double sigma);
217 
226  double get_PixelValue(const int x_image, const int y_image,
227  int* const is_rejected);
228 
234  bool get_AttachedToStream() const;
235 
241  bool get_LastSegment() const;
242 
248  bool get_FirstSegmentReceived() const;
249 
259  bool get_ConfigurationMap_Value(const double x, const double y,
260  double* const value) const;
261 
269  std::list<std::string> get_TextInformation(const double x,
270  const double y) const;
271 
276  std::vector<int> get_invalid_image_hdus() const;
277 
282  void AttachDataStream(const std::string data_stream_id);
283 
288  void DetachDataStream(const std::string data_stream_id);
289 
294 
295  void FreeResources();
296 
297  // Add meta data items related to the WCS (World Coordinate System)
298  // information to the actual property list
299  static void addWCSItemsToPropList(cpl_propertylist* const prop_list,
300  const DdtEncDec* const encDec);
301 
302  // Determine the number of bits per pixel from the data type
303  static int32_t bitsPerPixelFromDataType(const uint32_t data_type);
304 
305  protected:
310 
311  private:
315  void initialize();
316 
321  bool loadFileData();
322 
327  bool loadFileDataVector();
328 
335  bool loadFileDataImage(const int plane_number);
336 
341  bool loadImageExtensionsAsOne();
342 
347  bool loadWCS();
348 
353  bool loadPropertyList();
354 
355  bool loadWCSFromMetadata(const DdtEncDecImage2D* const encDec2D);
356 
357  bool loadWCSFromMetadata(const DdtEncDecImage3D* const encDec3D);
358 
359  bool loadWCSFromMetadata(const DdtEncDecBinaryxD* const encDecxD);
360 
361  bool assignPropListAndWcs(cpl_propertylist* const prop_list);
362 
366  boost::signals2::connection connect(
367  const signal_t::slot_type& event_listener);
368 
372  void dataAvailable();
373 
381  void checkByteOrder(const int topic_id, ddt::DataSample* const data_sample,
382  const std::vector<uint8_t> tmpData);
383 
396  void changeByteOrder(ddt::DataSample* const data_sample,
397  const int bytes_per_pixel,
398  const uint32_t data_type) const;
399 
405  void handleMultiLayer(ddt::DataSample* const data_sample);
406 
412  void handleMultiDim(ddt::DataSample* const data_sample);
413 
419  void handleBiDim(ddt::DataSample* const data_sample);
420 
430  void handleSingleDim(ddt::DataSample* const data_sample,
431  const std::string config_map_name,
432  const std::string dimension, const uint32_t data_type);
433 
438  void deleteCplImage(cpl_image** const image, const bool only_unwrap) const;
439 
447  void applyConfigMap(ddt::DataSample* const data_sample,
448  const cpl_image* const config_map,
449  const uint32_t data_type, const int dataDim);
450 
457  std::list<std::string> get_TextInformationForValue(const double value) const;
458 
466  void createAndInitNewImage(const uint32_t complete_pixels_x,
467  const uint32_t complete_pixels_y,
468  const uint32_t data_type);
469 
479  cpl_image* createNewImageFromDataSample(ddt::DataSample* const data_sample,
480  const int bytes_per_pixel,
481  const int number_pixels_x,
482  const int number_pixels_y,
483  const uint32_t data_type,
484  bool* const only_unwrap);
485 
492  cpl_image* createNewImageFromLastImage(const uint32_t complete_pixels_y,
493  const int number_pixels_x,
494  const int number_pixels_y);
495 
505  void copySegmentToImage(const cpl_image* const tmp_image,
506  const uint32_t first_pixel_x,
507  const uint32_t first_pixel_y,
508  const uint32_t complete_pixels_y,
509  const int number_pixels_y);
510 
520  void freeAndCreateNew(const uint32_t complete_pixels_x,
521  const uint32_t complete_pixels_y,
522  const uint32_t data_type, const uint32_t image_id,
523  const bool complete_flag);
524 
525  void logMetaDataBase(const DdtEncDec* const encDec);
526 
530  void logMetaDataImage2D(DdtEncDecImage2D* const encDec2D);
531 
535  void logMetaDataImage3D(DdtEncDecImage3D* const encDec3D);
536 
540  void logMetaDataBinaryxD(DdtEncDecBinaryxD* const encDecxD);
541 
545  ddt::DataAcquisition* data_acquisition;
546 
550  ddt::DataFile* data_file;
551 
556  ddt::ConfigurationMaps* configuration_maps;
557 
561  ddt::InformationMaps* information_maps;
562 
566  boost::signals2::connection connection;
567 
572  signal_t image_data_available;
573 
577  cpl_image* internal_image[2];
578  int current_index;
579  int next_index;
580 
584  cpl_vector* internal_vector;
585 
589  cpl_table* internal_binary_table;
590 
594  int actual_plane[2];
595 
599  cpl_wcs* wcs[2];
600 
604  int number_axis[2];
605 
609  int number_planes[2];
610 
614  int current_plane;
615 
619  int number_extensions[2];
620 
624  int image_width[2];
625 
629  int image_height[2];
630 
631  bool unwrap_only[2];
632 
636  std::list<std::string> config_maps;
637 
641  cpl_image* actual_configuration_map;
642 
646  std::string actual_configuration;
647 
651  boost::property_tree::ptree* actual_information_map;
652 
656  std::string actual_configuration_map_source;
657 
661  std::string actual_information_map_source;
662 
666  int actual_image_id;
667 
671  std::string last_timestamp;
672 
677  bool last_segment;
678 
687  bool first_segment_received;
688 
689  /*
690  * Flag indicating if a new image cycle has started
691  */
692  bool new_image_cycle;
693 
698  bool copy_last_segment;
699 
703  uint32_t last_first_pixel_x;
704 
708  uint32_t last_first_pixel_y;
709 
713  cpl_propertylist* property_list[2];
714 
718  std::mutex mtx;
719  std::mutex mtx2;
720 };
721 
722 } // namespace ddt
723 
724 #endif /* IMAGEBUFFER_HPP */
imageProc.hpp
ddt::ImageBuffer::get_LastSegment
bool get_LastSegment() const
Definition: imageBuffer.cpp:1805
ddt::ImageBuffer::get_NumberAxis
int get_NumberAxis() const
Definition: imageBuffer.cpp:1802
signal_t
boost::signals2::signal< void()> signal_t
Definition: ddtMemoryAccessor.hpp:79
ddt::ImageBuffer::LoadFile
bool LoadFile(const std::string &file_name, const int position=0)
Definition: imageBuffer.cpp:987
testPyDdtDataTransfer.configuration_map_name
configuration_map_name
Definition: testPyDdtDataTransfer.py:67
testPyDdtDataTransfer.data_type
data_type
Definition: testPyDdtDataTransfer.py:43
ddt::ImageBuffer::LoadInformationMaps
bool LoadInformationMaps(const std::string information_map_source)
Definition: imageBuffer.cpp:963
ddt::ImageBuffer::~ImageBuffer
virtual ~ImageBuffer()
Definition: imageBuffer.cpp:72
ddt::ImageBuffer::get_PixelValue
double get_PixelValue(const int x_image, const int y_image, int *const is_rejected)
Definition: imageBuffer.cpp:1208
DdtEncDec
Definition: ddtEncDec.hpp:60
testPyDdtDataTransfer.number_pixels_x
number_pixels_x
Definition: testPyDdtDataTransfer.py:53
ddt::ImageBuffer::get_PropertyList
cpl_propertylist * get_PropertyList()
Definition: imageBuffer.cpp:1188
ddt::ImageBuffer::bitsPerPixelFromDataType
static int32_t bitsPerPixelFromDataType(const uint32_t data_type)
Definition: imageBuffer.cpp:1584
ddt::DdtLogger
Definition: ddtLogger.hpp:48
ddt
Definition: ddtClient.hpp:36
ddt::ImageBuffer::logger
ddt::DdtLogger * logger
Definition: imageBuffer.hpp:309
ddtEncDecImage3D.hpp
ddt::ImageBuffer::get_CircularObjects
cpl_apertures * get_CircularObjects(const double sigma)
Definition: imageBuffer.cpp:1193
testPyDdtDataTransfer.image_id
image_id
Definition: testPyDdtDataTransfer.py:61
ddt::FitsExtension
Definition: dataFile.hpp:36
ddt::ImageBuffer::get_Wcs
cpl_wcs * get_Wcs()
Definition: imageBuffer.cpp:1185
DdtEncDecImage3D
Definition: ddtEncDecImage3D.hpp:51
ddt::ImageBuffer::get_invalid_image_hdus
std::vector< int > get_invalid_image_hdus() const
Definition: imageBuffer.cpp:1305
imageIO.hpp
imageColor.hpp
testPyDdtDataTransfer.first_pixel_x
first_pixel_x
Definition: testPyDdtDataTransfer.py:57
ddt::ImageBuffer::set_logger
void set_logger(ddt::DdtLogger *const in_logger)
Definition: imageBuffer.cpp:143
ddt::ImageBuffer::addWCSItemsToPropList
static void addWCSItemsToPropList(cpl_propertylist *const prop_list, const DdtEncDec *const encDec)
Definition: imageBuffer.cpp:1554
ddt::ImageBuffer::LastTimestampFromBuffer
std::string LastTimestampFromBuffer() const
Definition: imageBuffer.cpp:479
ddt::DataAcquisition
Definition: dataAcquisition.hpp:50
testPyDdtDataTransfer.number_pixels_y
number_pixels_y
Definition: testPyDdtDataTransfer.py:54
ddtEncDecImage2D.hpp
ddt::ImageBuffer::get_Image
cpl_image * get_Image()
Definition: imageBuffer.cpp:1774
ddt::DataSample
Definition: ddtMemoryAccessor.hpp:173
imageError.hpp
ddt::ImageBuffer::get_TextInformation
std::list< std::string > get_TextInformation(const double x, const double y) const
Definition: imageBuffer.cpp:1243
ddtEncDecBinaryxD.hpp
ddt::ImageBuffer::AttachDataStream
void AttachDataStream(const std::string data_stream_id)
Definition: imageBuffer.cpp:1680
ddt::ImageBuffer::get_ImageData
void * get_ImageData()
ddt::ImageBuffer::get_NumberExtensions
int get_NumberExtensions()
Definition: imageBuffer.cpp:1797
ddt::ImageBuffer::get_FirstSegmentReceived
bool get_FirstSegmentReceived() const
Definition: imageBuffer.cpp:1808
ddt::ImageBuffer::get_ImageHeight
int get_ImageHeight() const
Definition: imageBuffer.cpp:1783
ddt::ImageBuffer::get_ConfigurationMap_Value
bool get_ConfigurationMap_Value(const double x, const double y, double *const value) const
Definition: imageBuffer.cpp:1224
dataAcquisition.hpp
ddt::ImageBuffer::get_BinaryTable
cpl_table * get_BinaryTable()
Definition: imageBuffer.cpp:1777
ddt::ImageBuffer::get_PrimaryHDUInfo
FitsExtension get_PrimaryHDUInfo() const
Definition: imageBuffer.cpp:1127
ddt::DataFile
Definition: dataFile.hpp:71
testPyDdtDataTransfer.bytes_per_pixel
bytes_per_pixel
Definition: testPyDdtDataTransfer.py:37
DdtEncDecBinaryxD
Definition: ddtEncDecBinaryxD.hpp:47
imageStats.hpp
ddt::ImageBuffer
Definition: imageBuffer.hpp:52
ddt::ImageBuffer::ImageBuffer
ImageBuffer()
Definition: imageBuffer.cpp:70
ddt::ImageBuffer::get_ImageWidth
int get_ImageWidth() const
Definition: imageBuffer.cpp:1780
configurationMaps.hpp
ddt::ImageBuffer::get_NumberPlanes
int get_NumberPlanes() const
Definition: imageBuffer.cpp:1786
ddt::ImageBuffer::ImageDataAvailableSignal
signal_t * ImageDataAvailableSignal()
Definition: imageBuffer.cpp:1675
ddtLogger.hpp
testPyDdtDataTransfer.complete_flag
complete_flag
Definition: testPyDdtDataTransfer.py:40
ddt::ConfigurationMaps
Definition: configurationMaps.hpp:37
ddt::ImageBuffer::get_CurrentPlane
int get_CurrentPlane() const
Definition: imageBuffer.cpp:1791
ddt::ImageBuffer::get_AttachedToStream
bool get_AttachedToStream() const
Definition: imageBuffer.cpp:1713
ddt::ImageBuffer::set_CurrentPlane
void set_CurrentPlane(const int plane)
Definition: imageBuffer.cpp:1794
ddt::ImageBuffer::LoadConfigurationMaps
bool LoadConfigurationMaps(const std::string configuration_map_source)
Definition: imageBuffer.cpp:948
testPyDdtDataTransfer.first_pixel_y
first_pixel_y
Definition: testPyDdtDataTransfer.py:58
dataFile.hpp
DdtEncDecImage2D
Definition: ddtEncDecImage2D.hpp:54
imageCoords.hpp
ddt::ImageBuffer::FreeResources
void FreeResources()
Definition: imageBuffer.cpp:919
ddt::ImageBuffer::LoadImageExtensionsAsOne
bool LoadImageExtensionsAsOne(const std::string &file_name)
Definition: imageBuffer.cpp:1064
informationMaps.hpp
ddt::ImageBuffer::LoadFilePlane
bool LoadFilePlane(const std::string &file_name, const int position=0, const int plane=0)
Definition: imageBuffer.cpp:979
ddt::ImageBuffer::LoadCPLImage
bool LoadCPLImage(cpl_image *const image)
Definition: imageBuffer.cpp:1132
ddt::ImageBuffer::LoadActualConfigurationMap
bool LoadActualConfigurationMap(const std::string configuration_map_name)
Definition: imageBuffer.cpp:924
ddt::ImageBuffer::DetachDataStream
void DetachDataStream(const std::string data_stream_id)
Definition: imageBuffer.cpp:1708
ddt::InformationMaps
Definition: informationMaps.hpp:37
ddt::ImageBuffer::get_FitsExtensionInfo
FitsExtension * get_FitsExtensionInfo(const int extension_number)
Definition: imageBuffer.cpp:1123