DP3
baseline_indices.h
Go to the documentation of this file.
1 /*
2  * File taken from Aartfaac2ms repository:
3  * https://git.astron.nl/RD/aartfaac-tools/-/blob/master/common/baseline_indices.h
4  */
5 
6 #ifndef DP3_COMMON_BASELINE_INDICES_H_
7 #define DP3_COMMON_BASELINE_INDICES_H_
8 
9 #include <algorithm>
10 #include <cmath>
11 #include <cstdint>
12 #include <utility>
13 #include <vector>
14 
15 namespace dp3 {
16 namespace common {
17 
18 /*
19  * Baselines are typically ordered in either column-major (e.g. for LOFAR), or
20  * in row-major order (e.g. for AARTFAAC). In both cases, for any baseline
21  * (antenna1,antenna2): antenna1 < antenna2 (i.e. there is a baseline (0,1), but
22  * not its mirror (1,0)).
23  *
24  * This is an example of column-major ordering with
25  * 5 antennas in the format "index:(antenna1,antenna2)":
26  * 0:(0,0)
27  * 1:(0,1) 2:(1,1)
28  * 3:(0,2) 4:(1,2) 5:(2,2)
29  * 6:(0,3) 7:(1,3) 8:(2,3) 9:(3,3)
30  * 10:(0,4) 11:(1,4) 12:(2,4) 13:(3,4) 14:(4,4)
31  * The first column has all the baselines with antenna1 == 0
32  *
33  * And similarly for the row-major ordering:
34  * 0:(0,0) 1:(0,1) 2:(0,2) 3:(0,3) 4:(0,4)
35  * 5:(1,1) 6:(1,2) 7:(1,3) 8:(1,4)
36  * 9:(2,2) 10:(2,3) 11:(2,4)
37  * 12:(3,3) 13:(3,4)
38  * 14:(4,4)
39  * The first row has all the baselines with antenna1 == 0
40  *
41  * Next, we list all baselines that contain a given antenna.
42  * The format is as follows: "antenna: [indices] [baselines]".
43  *
44  * First, column-major ordering:
45  * 0: [ 0, 1, 3, 6, 10] [(0,0), (0,1), (0,2), (0,3), (0,4)]
46  * 1: [ 1, 2, 4, 7, 11] [(0,1), (1,1), (1,2), (1,3), (1,4)]
47  * 2: [ 3, 4, 5, 8, 12] [(0,2), (1,2), (2,2), (2,3), (2,4)]
48  * 3: [ 6, 7, 8, 9, 13] [(0,3), (1,3), (2,3), (3,3), (3,4)]
49  * 4: [10, 11, 12, 13, 14] [(0,4), (1,4), (2,4), (3,4), (4,4)]
50  *
51  * Next, row-major ordering:
52  * 0: [0, 1, 2, 3, 4] [(0,0], (0,1), (0,2), (0,3), (0,4)]
53  * 1: [1, 5, 6, 7, 8] [(0,1], (1,1), (1,2), (1,3), (1,4)]
54  * 2: [2, 6, 9, 10, 11] [(0,2], (1,2), (2,2), (2,3), (2,4)]
55  * 3: [3, 7, 10, 12, 13] [(0,3], (1,3), (2,3), (3,3), (3,4)]
56  * 4: [4, 8, 11, 13, 14] [(0,4], (1,4), (2,4), (3,4), (4,4)]
57  *
58  * This file contains several helper functions to go from index
59  * to baseline, from baseline to index or to get all the baselines
60  * for a given antenna.
61  */
62 
64 
65 /*
66  * Computes the number of baselines, including auto-correlations.
67  */
68 inline size_t ComputeNBaselines(size_t n_antennas) {
69  const size_t n_correlations = (n_antennas * (n_antennas - 1)) / 2;
70  const size_t n_autocorrelations = n_antennas;
71  return n_correlations + n_autocorrelations;
72 }
73 
74 /*
75  * Computes the baseline index corresponding to antenna a and b, given the
76  * number of antennas. It assumes that auto-correlations of antennas are
77  * included.
78  */
79 inline size_t ComputeBaselineIndex(size_t antenna_a, size_t antenna_b,
80  size_t n_antennas, BaselineOrder order) {
81  size_t row = std::min(antenna_a, antenna_b);
82  size_t col = std::max(antenna_a, antenna_b);
83  if (order == BaselineOrder::kRowMajor) {
84  return size_t((row * n_antennas) + col - row * (row + 1) / 2);
85  } else {
86  return size_t((col * (col + 1)) / 2) + row;
87  }
88 }
89 
90 /*
91  * Computes the antenna pair (baseline) given the baseline index. It assumes
92  * that auto-correlations of antennas are included.
93  */
94 inline std::pair<size_t, size_t> ComputeBaseline(size_t baseline_index,
95  size_t n_antennas,
96  BaselineOrder order) {
97  if (order == BaselineOrder::kRowMajor) {
98  const size_t n_baselines = ComputeNBaselines(n_antennas);
99  const size_t antenna =
100  (1 + std::sqrt(1 + 8 * (n_baselines - baseline_index - 1))) / 2;
101  const size_t antenna1 = n_antennas - antenna;
102  // n is the number of baselines (a,b) with a < antenna
103  const size_t n = n_baselines - n_antennas - (antenna * (antenna - 1)) / 2;
104  const size_t antenna2 = baseline_index - n;
105  return {antenna1, antenna2};
106  } else {
107  const size_t antenna2 = (1 + std::sqrt(1 + 8 * baseline_index)) / 2;
108  // n is the number of baselines (a,b) with b < antenna2
109  const size_t n = int((antenna2 * (antenna2 - 1)) / 2);
110  const size_t antenna1 = baseline_index - n;
111  return {antenna1, antenna2 - 1};
112  }
113 }
114 
115 /*
116  * Computes the list of baselines for a given antenna. It assumes that
117  * auto-correlations are included.
118  */
119 inline std::vector<size_t> ComputeBaselineList(size_t antenna,
120  size_t n_antennas,
121  BaselineOrder order) {
122  std::vector<size_t> indices;
123  indices.reserve(n_antennas);
124 
125  for (size_t i = 0; i < n_antennas; i++) {
126  indices.push_back(ComputeBaselineIndex(antenna, i, n_antennas, order));
127  }
128 
129  return indices;
130 }
131 
132 } // namespace common
133 } // namespace dp3
134 
135 #endif // DP3_COMMON_BASELINE_INDICES_H_
size_t ComputeNBaselines(size_t n_antennas)
Definition: baseline_indices.h:68
std::pair< size_t, size_t > ComputeBaseline(size_t baseline_index, size_t n_antennas, BaselineOrder order)
Definition: baseline_indices.h:94
size_t ComputeBaselineIndex(size_t antenna_a, size_t antenna_b, size_t n_antennas, BaselineOrder order)
Definition: baseline_indices.h:79
BaselineOrder
Definition: baseline_indices.h:63
std::vector< size_t > ComputeBaselineList(size_t antenna, size_t n_antennas, BaselineOrder order)
Definition: baseline_indices.h:119
This file has generic helper routines for testing steps.
Definition: AntennaConfig.h:53