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