diff --git a/CEP/BB/BBSControl/include/BBSControl/BBSKernelProcessControl.h b/CEP/BB/BBSControl/include/BBSControl/BBSKernelProcessControl.h index 7609cf92940f43e56bbb91f13e4e20f85de9315e..3ddec86d287f2dcc5dd42be486ce4958ec530445 100644 --- a/CEP/BB/BBSControl/include/BBSControl/BBSKernelProcessControl.h +++ b/CEP/BB/BBSControl/include/BBSControl/BBSKernelProcessControl.h @@ -30,6 +30,7 @@ //# Includes #include <PLC/ProcessControl.h> #include <APS/ParameterSet.h> +#include <BBSControl/BBSStructs.h> namespace LOFAR { @@ -99,13 +100,15 @@ namespace LOFAR // Receive a BlobStreamable object, e.g., a BBSStatus. BlobStreamable* recvObject(); - // Parameter set for this process controller. ACC::APS::ParameterSet itsParameterSet; // Prediffer Prediffer* itsPrediffer; + // Work domain size + DomainSize itsWorkDomainSize; + // History database. LOFAR::ParmDB::ParmDB* itsHistory; diff --git a/CEP/BB/BBSControl/include/BBSControl/KernelProcessControl.h b/CEP/BB/BBSControl/include/BBSControl/KernelProcessControl.h index 7609cf92940f43e56bbb91f13e4e20f85de9315e..3ddec86d287f2dcc5dd42be486ce4958ec530445 100644 --- a/CEP/BB/BBSControl/include/BBSControl/KernelProcessControl.h +++ b/CEP/BB/BBSControl/include/BBSControl/KernelProcessControl.h @@ -30,6 +30,7 @@ //# Includes #include <PLC/ProcessControl.h> #include <APS/ParameterSet.h> +#include <BBSControl/BBSStructs.h> namespace LOFAR { @@ -99,13 +100,15 @@ namespace LOFAR // Receive a BlobStreamable object, e.g., a BBSStatus. BlobStreamable* recvObject(); - // Parameter set for this process controller. ACC::APS::ParameterSet itsParameterSet; // Prediffer Prediffer* itsPrediffer; + // Work domain size + DomainSize itsWorkDomainSize; + // History database. LOFAR::ParmDB::ParmDB* itsHistory; diff --git a/CEP/BB/BBSControl/src/BBSKernelProcessControl.cc b/CEP/BB/BBSControl/src/BBSKernelProcessControl.cc index d77963561252dda4694599f56b2e1088a40c89cd..16037d7fa92c15d0193a5c4936779773fb917915 100644 --- a/CEP/BB/BBSControl/src/BBSKernelProcessControl.cc +++ b/CEP/BB/BBSControl/src/BBSKernelProcessControl.cc @@ -275,10 +275,12 @@ namespace BBS 0, false); - // Set data selection and work domain. - DomainSize workDomainSize = strategy->domainSize(); - return (itsPrediffer->setSelection(strategy->stations(), strategy->correlation()) - && itsPrediffer->setWorkDomainSize(workDomainSize.bandWidth, workDomainSize.timeInterval)); + // Store work domain size. + itsWorkDomainSize = strategy->domainSize(); + + // Select stations and correlations. + return itsPrediffer->setSelection(strategy->stations(), strategy->correlation()); +// && itsPrediffer->setWorkDomainSize(workDomainSize.bandWidth, workDomainSize.timeInterval)); // && itsPrediffer->setWorkDomain(-1, -1, 0, 1e12)); // && itsPrediffer->setWorkDomain(4, 59, 0, 1e12)); } @@ -293,40 +295,75 @@ namespace BBS bool BBSKernelProcessControl::handle(const BBSStep* bs) { LOG_TRACE_FLOW(AUTO_FUNCTION_NAME); - + ASSERT(itsPrediffer); + + const MSDesc &descriptor = itsPrediffer->getMSDescriptor(); + + LOG_DEBUG_STR("MS descriptor:" << endl << descriptor); + + double startFreq = descriptor.startFreq[0]; + double endFreq = descriptor.endFreq[0]; + + /* + (Some?) Westerbork measurement sets store the channels + in reverse order. In this case, start and end frequency + need to be exchanged. + */ + if(startFreq > endFreq) { - const BBSPredictStep* step = dynamic_cast<const BBSPredictStep*>(bs); - if(step) - { - return doHandle(step); - } + double tmp; + tmp = startFreq; + startFreq = endFreq; + endFreq = tmp; } - + + double startTime = descriptor.startTime; + double endTime = descriptor.endTime; + double time = startTime; + + bool result = true; + while(result && (time < endTime)) { - const BBSSubtractStep* step = dynamic_cast<const BBSSubtractStep*>(bs); - if(step) + ASSERT(itsPrediffer->setWorkDomain(startFreq, endFreq, time, time + itsWorkDomainSize.timeInterval)); + + result = false; + { - return doHandle(step); + const BBSPredictStep* step = dynamic_cast<const BBSPredictStep*>(bs); + if(step) + { + result = doHandle(step); + } } - } - - { - const BBSCorrectStep* step = dynamic_cast<const BBSCorrectStep*>(bs); - if(step) + { - return doHandle(step); + const BBSSubtractStep* step = dynamic_cast<const BBSSubtractStep*>(bs); + if(step) + { + result = doHandle(step); + } } - } - - { - const BBSSolveStep* step = dynamic_cast<const BBSSolveStep*>(bs); - if(step) + { - return doHandle(step); + const BBSCorrectStep* step = dynamic_cast<const BBSCorrectStep*>(bs); + if(step) + { + result = doHandle(step); + } } + + { + const BBSSolveStep* step = dynamic_cast<const BBSSolveStep*>(bs); + if(step) + { + result = doHandle(step); + } + } + + time += itsWorkDomainSize.timeInterval; } - return false; + return result; } @@ -351,7 +388,8 @@ namespace BBS context.sources = step->sources(); context.instrumentModel = step->instrumentModels(); } - + + bool BBSKernelProcessControl::sendObject(const BlobStreamable& bs) { LOG_TRACE_LIFETIME(TRACE_LEVEL_FLOW, ""); diff --git a/CEP/BB/BBSControl/src/KernelProcessControl.cc b/CEP/BB/BBSControl/src/KernelProcessControl.cc index d77963561252dda4694599f56b2e1088a40c89cd..16037d7fa92c15d0193a5c4936779773fb917915 100644 --- a/CEP/BB/BBSControl/src/KernelProcessControl.cc +++ b/CEP/BB/BBSControl/src/KernelProcessControl.cc @@ -275,10 +275,12 @@ namespace BBS 0, false); - // Set data selection and work domain. - DomainSize workDomainSize = strategy->domainSize(); - return (itsPrediffer->setSelection(strategy->stations(), strategy->correlation()) - && itsPrediffer->setWorkDomainSize(workDomainSize.bandWidth, workDomainSize.timeInterval)); + // Store work domain size. + itsWorkDomainSize = strategy->domainSize(); + + // Select stations and correlations. + return itsPrediffer->setSelection(strategy->stations(), strategy->correlation()); +// && itsPrediffer->setWorkDomainSize(workDomainSize.bandWidth, workDomainSize.timeInterval)); // && itsPrediffer->setWorkDomain(-1, -1, 0, 1e12)); // && itsPrediffer->setWorkDomain(4, 59, 0, 1e12)); } @@ -293,40 +295,75 @@ namespace BBS bool BBSKernelProcessControl::handle(const BBSStep* bs) { LOG_TRACE_FLOW(AUTO_FUNCTION_NAME); - + ASSERT(itsPrediffer); + + const MSDesc &descriptor = itsPrediffer->getMSDescriptor(); + + LOG_DEBUG_STR("MS descriptor:" << endl << descriptor); + + double startFreq = descriptor.startFreq[0]; + double endFreq = descriptor.endFreq[0]; + + /* + (Some?) Westerbork measurement sets store the channels + in reverse order. In this case, start and end frequency + need to be exchanged. + */ + if(startFreq > endFreq) { - const BBSPredictStep* step = dynamic_cast<const BBSPredictStep*>(bs); - if(step) - { - return doHandle(step); - } + double tmp; + tmp = startFreq; + startFreq = endFreq; + endFreq = tmp; } - + + double startTime = descriptor.startTime; + double endTime = descriptor.endTime; + double time = startTime; + + bool result = true; + while(result && (time < endTime)) { - const BBSSubtractStep* step = dynamic_cast<const BBSSubtractStep*>(bs); - if(step) + ASSERT(itsPrediffer->setWorkDomain(startFreq, endFreq, time, time + itsWorkDomainSize.timeInterval)); + + result = false; + { - return doHandle(step); + const BBSPredictStep* step = dynamic_cast<const BBSPredictStep*>(bs); + if(step) + { + result = doHandle(step); + } } - } - - { - const BBSCorrectStep* step = dynamic_cast<const BBSCorrectStep*>(bs); - if(step) + { - return doHandle(step); + const BBSSubtractStep* step = dynamic_cast<const BBSSubtractStep*>(bs); + if(step) + { + result = doHandle(step); + } } - } - - { - const BBSSolveStep* step = dynamic_cast<const BBSSolveStep*>(bs); - if(step) + { - return doHandle(step); + const BBSCorrectStep* step = dynamic_cast<const BBSCorrectStep*>(bs); + if(step) + { + result = doHandle(step); + } } + + { + const BBSSolveStep* step = dynamic_cast<const BBSSolveStep*>(bs); + if(step) + { + result = doHandle(step); + } + } + + time += itsWorkDomainSize.timeInterval; } - return false; + return result; } @@ -351,7 +388,8 @@ namespace BBS context.sources = step->sources(); context.instrumentModel = step->instrumentModels(); } - + + bool BBSKernelProcessControl::sendObject(const BlobStreamable& bs) { LOG_TRACE_LIFETIME(TRACE_LEVEL_FLOW, "");