diff --git a/aartfaacreader/RCUMode.h b/aartfaacreader/RCUMode.h new file mode 100644 index 0000000000000000000000000000000000000000..04c2355a9b03747ccf600653f708076ef208317d --- /dev/null +++ b/aartfaacreader/RCUMode.h @@ -0,0 +1,134 @@ +// Copyright (C) 2023 ASTRON (Netherlands Institute for Radio Astronomy) +// SPDX-License-Identifier: GPL-3.0-or-later + +/// This code was taken from https://git.astron.nl/RD/aartfaac-tools.git +/// and adapted to fit into DP3 codebase. + +#ifndef AARTFAAC_MODE_H +#define AARTFAAC_MODE_H + +#include <string> +#include <stdexcept> + +class RCUMode { + public: + enum Mode { + Unused = 0, // 0 = Unused + LBAOuter10_90 = 1, // 1 = LBA_OUTER, 10-90 MHz Analog filter + LBAOuter30_90 = 2, // Mode 2 = LBA_OUTER, 30-90 MHz Analog filter + LBAInner10_90 = 3, // Mode 3 = LBA_INNER, 10-90 MHz Analog filter + LBAInner30_90 = 4, // Mode 4 = LBA_INNER, 30-90 MHz Analog filter + HBA110_190 = 5, // Mode 5 = HBA, 110-190MHz Analog filter + HBA170_230 = 6, // Mode 6 = HBA, 170-230MHz Analog filter + HBA210_270 = 7 // Mode 7 = HBA, 210-270MHz Analog filter + } mode; + + RCUMode(Mode m) : mode(m){}; + RCUMode(){}; + + std::string ToString() const { + switch (mode) { + default: + case Unused: + return "unused"; + case LBAOuter10_90: + return "LBA_OUTER 10-90 MHz"; + case LBAOuter30_90: + return "LBA_OUTER 30-90 MHz"; + case LBAInner10_90: + return "LBA_INNER 10-90 MHz"; + case LBAInner30_90: + return "LBA_INNER 30-90 MHz"; + case HBA110_190: + return "HBA 110-190 MHz"; + case HBA170_230: + return "HBA 170-230 MHz"; + case HBA210_270: + return "HBA 210-270 MHz"; + } + } + + std::string AntennaType() { + std::string antenna_type; + switch (mode) { + case RCUMode::LBAInner10_90: + case RCUMode::LBAInner30_90: + case RCUMode::LBAOuter10_90: + case RCUMode::LBAOuter30_90: + antenna_type = "LBA"; + break; + case RCUMode::HBA110_190: + case RCUMode::HBA170_230: + case RCUMode::HBA210_270: + antenna_type = "HBA"; + break; + default: + antenna_type = "?"; + break; + } + return antenna_type; + } + bool operator==(Mode _mode) const { return _mode == mode; } + + static RCUMode FromNumber(int modeNumber) { + return {static_cast<Mode>(modeNumber)}; + } + + double Bandwidth() const { + switch (mode) { + case RCUMode::LBAInner10_90: // 200 MHz clock, Nyquist zone 1 + case RCUMode::LBAInner30_90: + case RCUMode::LBAOuter10_90: + case RCUMode::LBAOuter30_90: + case RCUMode::HBA110_190: // 200 MHz clock, Nyquist zone 2 + case RCUMode::HBA210_270: // 200 MHz clock, Nyquist zone 3 + return 195312.5; // 1/1024 x nu_{clock} + case RCUMode::HBA170_230: // 160 MHz clock, Nyquist zone 3 + return 156250.0; + default: + throw std::runtime_error( + "Don't know how to handle this mode: not implemented yet"); + } + } + + double CentralFrequency() const { + switch (mode) { + case RCUMode::LBAOuter30_90: + case RCUMode::LBAInner30_90: + return 60.; + case RCUMode::LBAOuter10_90: + case RCUMode::LBAInner10_90: + return 50.; + case RCUMode::HBA110_190: + return 150.; + case RCUMode::HBA210_270: + return 240.; + case RCUMode::HBA170_230: + return 200.; + default: + throw std::runtime_error( + "Don't know how to handle this mode: not implemented yet"); + } + } + + double FrequencyOffset() const { + switch (mode) { + case RCUMode::LBAInner10_90: // 200 MHz clock, Nyquist zone 1 + case RCUMode::LBAInner30_90: + case RCUMode::LBAOuter10_90: + case RCUMode::LBAOuter30_90: + return 0.0; + case RCUMode::HBA110_190: // 200 MHz clock, Nyquist zone 2 + return 100e6; + case RCUMode::HBA170_230: // 160 MHz clock, Nyquist zone 3 + return 160e6; + case RCUMode::HBA210_270: // 200 MHz clock, Nyquist zone 3 + return 200e6; + default: + throw std::runtime_error( + "Don't know how to handle this mode: not implemented yet"); + } + } +}; + +#endif