DP3
StManParsetKeys.h
Go to the documentation of this file.
1 // Copyright (C) 2020 ASTRON (Netherlands Institute for Radio Astronomy)
2 // SPDX-License-Identifier: GPL-3.0-or-later
3 
4 #ifndef DPPP_STMANPARSETKEYS_H
5 #define DPPP_STMANPARSETKEYS_H
6 
7 #include "common/ParameterSet.h"
8 
9 #include <sstream>
10 #include <string>
11 
12 #include <casacore/casa/Containers/Record.h>
13 
14 #include <boost/algorithm/string/case_conv.hpp>
15 
16 namespace dp3 {
17 namespace base {
18 
19 enum class SiscoMode { Full, Diagonal, StokesI };
20 
21 inline SiscoMode GetSiscoMode(const std::string& mode_str) {
22  const std::string lowercase_str = boost::to_lower_copy(mode_str);
23  if (lowercase_str == "" || lowercase_str == "full")
24  return SiscoMode::Full;
25  else if (lowercase_str == "diagonal")
26  return SiscoMode::Diagonal;
27  else if (lowercase_str == "stokes_i")
28  return SiscoMode::StokesI;
29  else
30  throw std::runtime_error("Invalid mode specified for Sisco: " + mode_str);
31 }
32 
33 inline std::string ToString(SiscoMode mode) {
34  switch (mode) {
35  case SiscoMode::Full:
36  return "full";
38  return "diagonal";
39  case SiscoMode::StokesI:
40  return "stokes_i";
41  }
42  assert(false);
43  return {};
44 }
45 
47  std::string storage_manager_name;
49  unsigned int dysco_data_bit_rate;
51  unsigned int dysco_weight_bit_rate;
54  std::string dysco_distribution;
59  std::string dysco_normalization;
68 
69  explicit StManParsetKeys(const common::ParameterSet& parset,
70  const std::string& prefix) {
71  storage_manager_name = boost::to_lower_copy(parset.getString(
72  prefix + "storagemanager",
73  parset.getString(prefix + "storagemanager.name", std::string())));
74  if (storage_manager_name == "dysco") {
76  parset.getInt(prefix + "storagemanager.databitrate", 10);
78  parset.getInt(prefix + "storagemanager.weightbitrate", 12);
80  prefix + "storagemanager.distribution", "TruncatedGaussian");
82  parset.getDouble(prefix + "storagemanager.disttruncation", 2.5);
84  parset.getString(prefix + "storagemanager.normalization", "AF");
85  }
86  if (storage_manager_name == "sisco") {
88  parset.getInt(prefix + "storagemanager.deflate_level", 9);
90  parset.getInt(prefix + "storagemanager.predict_level", 2);
92  parset.getString(prefix + "storagemanager.sisco_mode", ""));
93  }
94  }
95 
96  std::string_view GetStorageManagerClassName() const {
97  if (storage_manager_name == "stokes_i")
98  return "StokesIStMan";
99  else if (storage_manager_name == "dysco")
100  return "DyscoStMan";
101  else if (storage_manager_name == "sisco")
102  return "SiscoStMan";
103  else if (!storage_manager_name.empty())
104  throw std::runtime_error("Unknown storage manager specified: " +
106  else
107  return {};
108  }
109 
110  casacore::Record GetSpecification() const {
111  if (storage_manager_name == "dysco")
112  return GetDyscoSpec();
113  else if (storage_manager_name == "sisco")
114  return GetSiscoSpec();
115  else
116  return casacore::Record();
117  }
118 
119  casacore::Record GetSiscoSpec() const {
120  casacore::Record result;
121  result.define("deflate_level", sisco_deflate_level);
122  result.define("predict_level", sisco_predict_level);
123  result.define("stokes_i", sisco_mode == SiscoMode::StokesI);
124  result.define("diagonal", sisco_mode == SiscoMode::Diagonal);
125  return result;
126  }
127 
128  casacore::Record GetDyscoSpec() const {
129  casacore::Record dyscoSpec;
130  dyscoSpec.define("distribution", dysco_distribution);
131  dyscoSpec.define("normalization", dysco_normalization);
132  dyscoSpec.define("distributionTruncation", dysco_dist_truncation);
137  unsigned int data_bit_rate = dysco_data_bit_rate;
138  if (data_bit_rate == 0) data_bit_rate = 16;
139  dyscoSpec.define("dataBitCount", data_bit_rate);
140  unsigned int weight_bit_rate = dysco_weight_bit_rate;
141  if (weight_bit_rate == 0) weight_bit_rate = 16;
142  dyscoSpec.define("weightBitCount", weight_bit_rate);
143  return dyscoSpec;
144  }
145 };
146 
147 inline std::string GetCompressionString(const StManParsetKeys& st_man_keys) {
148  std::ostringstream str;
149  if (st_man_keys.storage_manager_name == "dysco") {
150  str << " Compressed: yes (Dysco)\n"
151  << " Data bitrate: " << st_man_keys.dysco_data_bit_rate << '\n'
152  << " Weight bitrate:" << st_man_keys.dysco_weight_bit_rate << '\n'
153  << " Dysco mode: " << st_man_keys.dysco_normalization << ' '
154  << st_man_keys.dysco_distribution << '('
155  << st_man_keys.dysco_dist_truncation << ")\n";
156  } else if (st_man_keys.storage_manager_name == "sisco") {
157  str << " Compressed: yes (Sisco)\n"
158  << " Predict level: " << st_man_keys.sisco_predict_level << '\n'
159  << " Deflate level: " << st_man_keys.sisco_deflate_level << '\n'
160  << " Sisco mode: " << ToString(st_man_keys.sisco_mode) << '\n';
161  } else if (st_man_keys.storage_manager_name == "stokes_i") {
162  str << " Compressed: yes (Stokes I)\n";
163  } else {
164  str << " Compressed: no\n";
165  }
166  return str.str();
167 }
168 
169 } // namespace base
170 } // namespace dp3
171 #endif
Implements a map of Key-Value pairs.
Definition: ParameterSet.h:31
int getInt(const std::string &aKey) const
Definition: ParameterSet.h:490
double getDouble(const std::string &aKey) const
Definition: ParameterSet.h:588
std::string getString(const std::string &aKey) const
Definition: ParameterSet.h:599
SiscoMode GetSiscoMode(const std::string &mode_str)
Definition: StManParsetKeys.h:21
std::string GetCompressionString(const StManParsetKeys &st_man_keys)
Definition: StManParsetKeys.h:147
std::string ToString(CalType caltype)
Convert CalType to a string.
SiscoMode
Definition: StManParsetKeys.h:19
This file has generic helper routines for testing steps.
Definition: AntennaConfig.h:53
Definition: StManParsetKeys.h:46
std::string_view GetStorageManagerClassName() const
Definition: StManParsetKeys.h:96
SiscoMode sisco_mode
Will store just one value when set to true.
Definition: StManParsetKeys.h:67
std::string dysco_normalization
Kind of normalization; "AF", "RF" or "Row".
Definition: StManParsetKeys.h:59
int sisco_predict_level
Definition: StManParsetKeys.h:65
casacore::Record GetDyscoSpec() const
Definition: StManParsetKeys.h:128
int sisco_deflate_level
Deflate compression level for Sisco (only used for writing).
Definition: StManParsetKeys.h:61
std::string storage_manager_name
Definition: StManParsetKeys.h:47
std::string dysco_distribution
Definition: StManParsetKeys.h:54
unsigned int dysco_data_bit_rate
Bits per data float, or 0 if data column is not compressed.
Definition: StManParsetKeys.h:49
StManParsetKeys(const common::ParameterSet &parset, const std::string &prefix)
Definition: StManParsetKeys.h:69
double dysco_dist_truncation
Definition: StManParsetKeys.h:57
unsigned int dysco_weight_bit_rate
Bits per weight float, or 0 if weight column is not compressed.
Definition: StManParsetKeys.h:51
casacore::Record GetSiscoSpec() const
Definition: StManParsetKeys.h:119
casacore::Record GetSpecification() const
Definition: StManParsetKeys.h:110