From 2f221c97c49fff324c7cc0cc25466a0f2138fe7f Mon Sep 17 00:00:00 2001
From: Jan David Mol <mol@astron.nl>
Date: Mon, 27 Mar 2017 18:31:38 +0000
Subject: [PATCH] Task #10558: Cobalt now derives default values for
 rspBoardMap and rspSlotMap, making specifications easier

---
 RTCP/Cobalt/CoInterface/src/Parset.cc   | 23 ++++++++++++++-----
 RTCP/Cobalt/CoInterface/test/tParset.cc | 30 ++++++++++++++++++++++++-
 2 files changed, 47 insertions(+), 6 deletions(-)

diff --git a/RTCP/Cobalt/CoInterface/src/Parset.cc b/RTCP/Cobalt/CoInterface/src/Parset.cc
index 30c172cc2df..4361800531b 100644
--- a/RTCP/Cobalt/CoInterface/src/Parset.cc
+++ b/RTCP/Cobalt/CoInterface/src/Parset.cc
@@ -445,6 +445,24 @@ namespace LOFAR
           key = "Observation.rspBoardList";
         antennaField.rspBoardMap     = getUint32Vector(key, emptyVectorUnsigned, true);
 
+        key = std::string(str(format("Observation.Dataslots.%s.DataslotList") % antennaField.name));
+        if (!isDefined(key))
+          key = "Observation.rspSlotList";
+        antennaField.rspSlotMap = getUint32Vector(key, emptyVectorUnsigned, true);
+
+
+        if (antennaField.rspBoardMap.empty() && antennaField.rspSlotMap.empty()) {
+          // supply identity mapping
+          const size_t nrDataSlotsPerBoard = 61 * (16 / settings.nrBitsPerSample);
+
+          LOG_DEBUG_STR("Using identity mapping for rspBoardMap and rspSlotMap for " << antennaField.name << " using " << nrDataSlotsPerBoard << " slots/board");
+
+          for (size_t sb = 0; sb < settings.subbands.size(); sb++) {
+            antennaField.rspBoardMap.push_back(sb / nrDataSlotsPerBoard);
+            antennaField.rspSlotMap.push_back(sb % nrDataSlotsPerBoard);
+          }
+        }
+
         ASSERTSTR(antennaField.rspBoardMap.size() >= settings.subbands.size(),
                   "Observation has " << settings.subbands.size() <<
                   " subbands, but antenna field " << antennaField.name <<
@@ -452,11 +470,6 @@ namespace LOFAR
                   " subbands. Please correct either Observation.rspBoardList or Observation.Dataslots." <<
                   antennaField.name << ".RSPBoardList" );
 
-        key = std::string(str(format("Observation.Dataslots.%s.DataslotList") % antennaField.name));
-        if (!isDefined(key))
-          key = "Observation.rspSlotList";
-        antennaField.rspSlotMap = getUint32Vector(key, emptyVectorUnsigned, true);
-
         ASSERTSTR(antennaField.rspSlotMap.size() >= settings.subbands.size(),
                   "Observation has " << settings.subbands.size() <<
                   " subbands, but antenna field " << antennaField.name <<
diff --git a/RTCP/Cobalt/CoInterface/test/tParset.cc b/RTCP/Cobalt/CoInterface/test/tParset.cc
index eec988bf840..27cdfa55d96 100644
--- a/RTCP/Cobalt/CoInterface/test/tParset.cc
+++ b/RTCP/Cobalt/CoInterface/test/tParset.cc
@@ -450,7 +450,35 @@ SUITE(stations) {
     CHECK_CLOSE(3.0, ps.settings.antennaFields[0].phaseCenter[2], 0.01);
   }
 
-  TEST(default_map) {
+  TEST(empty_map) {
+    Parset ps = makeDefaultTestParset();
+
+    // add stations and default board/slot lists
+    ps.replace("Observation.VirtualInstrument.stationList", "[CS002, CS003, RS210]");
+    ps.replace("Observation.antennaSet", "LBA_INNER");
+    ps.replace("Observation.nrBeams", "1");
+    ps.replace("Observation.Beam[0].subbandList", "[20..29]");
+    ps.replace("Observation.rspBoardList", "");
+    ps.replace("Observation.rspSlotList",  "");
+    // turn off to avoid setting even more keys (fails with even stricter Parset checks)
+    ps.replace("Observation.DataProducts.Output_Correlated.enabled", "false");
+    ps.updateSettings();
+
+
+    // verify settings
+    CHECK_EQUAL(3U , ps.settings.antennaFields.size());
+
+    for (size_t st = 0; st < 3; st++) {
+      const size_t nrSubbands = 10;
+
+      CHECK_EQUAL(nrSubbands, ps.settings.antennaFields[st].rspBoardMap.size());
+      CHECK_ARRAY_EQUAL(zeroes(nrSubbands),   ps.settings.antennaFields[st].rspBoardMap, nrSubbands);
+      CHECK_EQUAL(nrSubbands, ps.settings.antennaFields[st].rspSlotMap.size());
+      CHECK_ARRAY_EQUAL(sequence(nrSubbands), ps.settings.antennaFields[st].rspSlotMap, nrSubbands);
+    }
+  }
+
+  TEST(identity_map) {
     Parset ps = makeDefaultTestParset();
 
     // add stations and default board/slot lists
-- 
GitLab