From 8f4d65c26fa3c5cee13cad7555df3fe5a21d6267 Mon Sep 17 00:00:00 2001
From: Jan David Mol <mol@astron.nl>
Date: Mon, 11 Nov 2013 10:33:42 +0000
Subject: [PATCH] Task #5105: Split geometric delay and clock corrections

---
 RTCP/Cobalt/InputProc/src/Delays/Delays.cc | 27 +++++++++++-----------
 RTCP/Cobalt/InputProc/src/Delays/Delays.h  | 12 +++++++---
 2 files changed, 23 insertions(+), 16 deletions(-)

diff --git a/RTCP/Cobalt/InputProc/src/Delays/Delays.cc b/RTCP/Cobalt/InputProc/src/Delays/Delays.cc
index b3f857d634a..702ad4da4fe 100644
--- a/RTCP/Cobalt/InputProc/src/Delays/Delays.cc
+++ b/RTCP/Cobalt/InputProc/src/Delays/Delays.cc
@@ -199,8 +199,7 @@ namespace LOFAR
         d.direction[2] = 0.0;
       }
 
-      // Add non-geometric delays
-      d.delay += baseDelay();
+      d.clockCorrection = clockCorrection();
 
       return d;
     }
@@ -251,11 +250,13 @@ namespace LOFAR
       (void)timestamp;
 
       for (size_t sap = 0; sap < result.SAPs.size(); ++sap) {
-        result.SAPs[sap].SAP.delay = baseDelay();
+        result.SAPs[sap].SAP.delay = 0.0;
+        result.SAPs[sap].SAP.clockCorrection = clockCorrection();
 
         if (parset.settings.beamFormer.enabled) {
           for (size_t tab = 0; tab < result.SAPs[sap].TABs.size(); tab++) {
-            result.SAPs[sap].TABs[tab].delay = baseDelay();
+            result.SAPs[sap].TABs[tab].delay = 0.0;
+            result.SAPs[sap].TABs[tab].clockCorrection = clockCorrection();
           }
         }
       }
@@ -263,11 +264,11 @@ namespace LOFAR
 #endif
 
 
-    double Delays::baseDelay() const
+    double Delays::clockCorrection() const
     {
-      double clockCorrection = parset.settings.corrections.clock ? parset.settings.stations[stationIdx].clockCorrection : 0.0;
+      double corr = parset.settings.corrections.clock ? parset.settings.stations[stationIdx].clockCorrection : 0.0;
 
-      return clockCorrection;
+      return corr;
     }
 
 
@@ -359,8 +360,8 @@ namespace LOFAR
       vector<ssize_t> coarseDelaysSamples(parset.settings.SAPs.size()); // [sap], in samples
       vector<double>  coarseDelaysSeconds(parset.settings.SAPs.size()); // [sap], in seconds
       for (size_t sap = 0; sap < parset.nrBeams(); ++sap) {
-        double delayAtBegin  = delaysAtBegin.SAPs[sap].SAP.delay;
-        double delayAfterEnd = delaysAfterEnd.SAPs[sap].SAP.delay;
+        double delayAtBegin  = delaysAtBegin.SAPs[sap].SAP.totalDelay();
+        double delayAfterEnd = delaysAfterEnd.SAPs[sap].SAP.totalDelay();
 
         // The coarse delay compensation is based on the average delay
         // between begin and end.
@@ -385,12 +386,12 @@ namespace LOFAR
         unsigned sap = parset.settings.subbands[subband].SAP;
         double coarseDelay = coarseDelaysSeconds[sap];
 
-        metaDatas[i].stationBeam.delayAtBegin  = delaysAtBegin.SAPs[sap].SAP.delay - coarseDelay;
-        metaDatas[i].stationBeam.delayAfterEnd = delaysAfterEnd.SAPs[sap].SAP.delay - coarseDelay;
+        metaDatas[i].stationBeam.delayAtBegin  = delaysAtBegin.SAPs[sap].SAP.totalDelay() - coarseDelay;
+        metaDatas[i].stationBeam.delayAfterEnd = delaysAfterEnd.SAPs[sap].SAP.totalDelay() - coarseDelay;
 
         for (size_t tab = 0; tab < metaDatas[i].TABs.size(); ++tab) {
-          metaDatas[i].TABs[tab].delayAtBegin  = delaysAtBegin.SAPs[sap].TABs[tab].delay - coarseDelay;
-          metaDatas[i].TABs[tab].delayAfterEnd = delaysAfterEnd.SAPs[sap].TABs[tab].delay - coarseDelay;
+          metaDatas[i].TABs[tab].delayAtBegin  = delaysAtBegin.SAPs[sap].TABs[tab].totalDelay() - coarseDelay;
+          metaDatas[i].TABs[tab].delayAfterEnd = delaysAfterEnd.SAPs[sap].TABs[tab].totalDelay() - coarseDelay;
         }
       }
     }
diff --git a/RTCP/Cobalt/InputProc/src/Delays/Delays.h b/RTCP/Cobalt/InputProc/src/Delays/Delays.h
index 3dbd72f1b5a..f81e491da03 100644
--- a/RTCP/Cobalt/InputProc/src/Delays/Delays.h
+++ b/RTCP/Cobalt/InputProc/src/Delays/Delays.h
@@ -97,12 +97,18 @@ namespace LOFAR
       struct Delay {
         double  direction[3];
         double  delay;
+        double  clockCorrection;
+
+        double  totalDelay() const {
+          return delay + clockCorrection;
+        }
 
         bool operator==(const Delay &other) const {
           return direction[0] == other.direction[0] &&
                  direction[1] == other.direction[1] &&
                  direction[2] == other.direction[2] &&
-                 delay == other.delay;
+                 delay == other.delay &&
+                 clockCorrection == other.clockCorrection;
         }
       };
 
@@ -186,8 +192,8 @@ namespace LOFAR
       // in `result'.
       void calcDelays( const TimeStamp &timestamp, AllDelays &result );
 
-      // Returns the non-geometric delay to add for this station
-      double baseDelay() const;
+      // Returns the clock correction delay to add for this station
+      double clockCorrection() const;
 
 #ifdef HAVE_CASACORE
       casa::MVEpoch                       toUTC( const TimeStamp &timestamp ) const;
-- 
GitLab