From fb8f0eee8699a011d50cf48a271acf071ece199c Mon Sep 17 00:00:00 2001
From: Ger van Diepen <diepen@astron.nl>
Date: Tue, 6 Jun 2006 13:02:33 +0000
Subject: [PATCH] BugID: 593 Added funklet type tabular

---
 CEP/BB/BBS/src/MNS/MeqFunklet.cc              | 11 ++-
 CEP/BB/BBS/src/MNS/MeqTabular.cc              | 97 +++++++++++++++++++
 CEP/BB/BBS/src/MNS/MeqTabular.h               | 68 +++++++++++++
 CEP/BB/BBS/src/Makefile.am                    |  4 +-
 .../include/BBSKernel/MNS/MeqTabular.h        | 68 +++++++++++++
 CEP/BB/BBSKernel/src/MNS/MeqFunklet.cc        | 11 ++-
 CEP/BB/BBSKernel/src/MNS/MeqTabular.cc        | 97 +++++++++++++++++++
 CEP/BB/BBSKernel/src/MNS/MeqTabular.h         | 68 +++++++++++++
 CEP/BB/BBSKernel/src/Makefile.am              |  4 +-
 9 files changed, 420 insertions(+), 8 deletions(-)
 create mode 100644 CEP/BB/BBS/src/MNS/MeqTabular.cc
 create mode 100644 CEP/BB/BBS/src/MNS/MeqTabular.h
 create mode 100644 CEP/BB/BBSKernel/include/BBSKernel/MNS/MeqTabular.h
 create mode 100644 CEP/BB/BBSKernel/src/MNS/MeqTabular.cc
 create mode 100644 CEP/BB/BBSKernel/src/MNS/MeqTabular.h

diff --git a/CEP/BB/BBS/src/MNS/MeqFunklet.cc b/CEP/BB/BBS/src/MNS/MeqFunklet.cc
index 678a48cca3c..139ed7a3e3c 100644
--- a/CEP/BB/BBS/src/MNS/MeqFunklet.cc
+++ b/CEP/BB/BBS/src/MNS/MeqFunklet.cc
@@ -24,6 +24,7 @@
 
 #include <BBS/MNS/MeqFunklet.h>
 #include <BBS/MNS/MeqPolc.h>
+#include <BBS/MNS/MeqTabular.h>
 #include <Common/LofarLogger.h>
 #include <casa/Arrays/Matrix.h>
 
@@ -80,11 +81,15 @@ MeqFunklet& MeqFunklet::operator= (const MeqFunklet& that)
 MeqFunklet* MeqFunklet::make (const ParmDB::ParmValue& pvalue,
 			      const string& name)
 {
-  ASSERTSTR (pvalue.rep().itsType=="polc",
-	     "No 'polc' funklet found for parameter " << name);
   ASSERTSTR (pvalue.rep().itsShape.size()==2,
 	     "No 2-dim funklet found for parameter " << name);
-  return new MeqPolc(pvalue);
+  if (pvalue.rep().itsType=="polc") {
+    return new MeqPolc(pvalue);
+  } else if (pvalue.rep().itsType=="polc") {
+    return new MeqTabular(pvalue);
+  }
+  ASSERTSTR (false,
+	     "Unknown funklet found for parameter " << name);
 }
 
 int MeqFunklet::makeSolvable (int scidIndex)
diff --git a/CEP/BB/BBS/src/MNS/MeqTabular.cc b/CEP/BB/BBS/src/MNS/MeqTabular.cc
new file mode 100644
index 00000000000..a693a165da1
--- /dev/null
+++ b/CEP/BB/BBS/src/MNS/MeqTabular.cc
@@ -0,0 +1,97 @@
+//# MeqTabular.cc:  A tabular parameter value
+//#
+//# Copyright (C) 2006
+//# ASTRON (Netherlands Foundation for Research in Astronomy)
+//# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//#
+//# This program is free software; you can redistribute it and/or modify
+//# it under the terms of the GNU General Public License as published by
+//# the Free Software Foundation; either version 2 of the License, or
+//# (at your option) any later version.
+//#
+//# This program is distributed in the hope that it will be useful,
+//# but WITHOUT ANY WARRANTY; without even the implied warranty of
+//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//# GNU General Public License for more details.
+//#
+//# You should have received a copy of the GNU General Public License
+//# along with this program; if not, write to the Free Software
+//# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//#
+//# $Id$
+
+#include <lofar_config.h>
+
+#include <BBS/MNS/MeqTabular.h>
+#include <BBS/MNS/MeqRequest.h>
+#include <BBS/MNS/MeqResult.h>
+#include <BBS/MNS/MeqMatrixTmp.h>
+#include <Common/LofarLogger.h>
+
+using namespace casa;
+
+namespace LOFAR {
+
+
+MeqTabular::MeqTabular (const ParmDB::ParmValue& pvalue)
+: MeqFunklet (pvalue)
+{
+  const ParmDB::ParmValueRep& pval = pvalue.rep();
+  ASSERTSTR (pval.itsType == "tabular",
+	     "Funklet in ParmValue is not of type 'tabular'");
+}
+
+MeqTabular::~MeqTabular()
+{}
+
+MeqTabular* MeqTabular::clone() const
+{
+  return new MeqTabular(*this);
+}
+
+MeqResult MeqTabular::getResult (const MeqRequest& request,
+				 int nrpert, int pertInx)
+{
+  ASSERTSTR (nrpert == 0,
+	     "A tabular parameter value cannot be solvable");
+  // It is not checked if the domain is valid.
+  // In that way any value can be used for the default domain [-1,1].
+  // Because the values are calculated for the center of each cell,
+  // it is only checked if the centers are in the tabular domain.
+  const MeqDomain& reqDomain = request.domain();
+  MeqResult result(request.nspid());
+  // If there is only one value, the value is independent of x and y.
+  // Make sure it is turned into a scalar value.
+  if (itsCoeff.nelements() == 1) {
+    result.setValue (MeqMatrix(itsCoeff.getDouble()));
+  } else if (itsCoeff.ny() == 1) {
+    // The tabular has multiple values in frequency only.
+    // Get number of steps and values in x and y.
+    int ndx = request.nx();
+    int ndy = request.ny();
+    int ncx = itsCoeff.nx();
+    int ncy = itsCoeff.ny();
+    // Get the step and start values in the domain.
+    double stepdx = (reqDomain.endX() - reqDomain.startX()) / ndx;
+    double stepcx = (domain().endX() - domain().startX()) / ncx;
+    // Evaluate the expression (as double).
+    const double* coeffData = itsCoeff.doubleStorage();
+    // Create matrix for the value itself and keep a pointer to its data.
+    result.setValue (MeqMatrix(double(0), ndx, ndy));
+    double* value = result.getValueRW().doubleStorage();
+    // Iterate over all cells in the frequency domain.
+    double valx = reqDomain.startX();
+    for (int i=0; i<ndx; i++) {
+      valx += stepdx;
+    }
+  }
+  return result;
+}
+
+MeqResult MeqTabular::getAnResult (const MeqRequest& request,
+				   int nrpert, int pertInx)
+{
+  return getResult (request, nrpert, pertInx);
+}
+
+}
diff --git a/CEP/BB/BBS/src/MNS/MeqTabular.h b/CEP/BB/BBS/src/MNS/MeqTabular.h
new file mode 100644
index 00000000000..33b691451f4
--- /dev/null
+++ b/CEP/BB/BBS/src/MNS/MeqTabular.h
@@ -0,0 +1,68 @@
+//# MeqTabular.h: A tabular parameter value
+//#
+//# Copyright (C) 2006
+//# ASTRON (Netherlands Foundation for Research in Astronomy)
+//# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//#
+//# This program is free software; you can redistribute it and/or modify
+//# it under the terms of the GNU General Public License as published by
+//# the Free Software Foundation; either version 2 of the License, or
+//# (at your option) any later version.
+//#
+//# This program is distributed in the hope that it will be useful,
+//# but WITHOUT ANY WARRANTY; without even the implied warranty of
+//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//# GNU General Public License for more details.
+//#
+//# You should have received a copy of the GNU General Public License
+//# along with this program; if not, write to the Free Software
+//# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//#
+//# $Id$
+
+#ifndef MNS_MEQTABULAR_H
+#define MNS_MEQTABULAR_H
+
+// \file
+// A tabular (non-solvable) parameter value.
+
+//# Includes
+#include <BBS/MNS/MeqFunklet.h>
+
+namespace LOFAR {
+
+// \ingroup BBS
+// \addtogroup MNS
+// @{
+
+class MeqTabular: public MeqFunklet
+{
+public:
+  // Create an empty object.
+  MeqTabular()
+    {}
+
+  // Create a tabular from a ParmValue object.
+  MeqTabular (const ParmDB::ParmValue&);
+
+  // Convert a tabular to a ParmValue object.
+  ParmDB::ParmValue toParmValue() const;
+
+  virtual ~MeqTabular();
+
+  // Clone the polc.
+  virtual MeqTabular* clone() const;
+
+  // Calculate the value.
+  // Perturbations are not allowed.
+  virtual MeqResult getResult (const MeqRequest&,
+			       int nrpert, int pertInx);
+  virtual MeqResult getAnResult (const MeqRequest&,
+				 int nrpert, int pertInx);
+};
+
+// @}
+
+}
+
+#endif
diff --git a/CEP/BB/BBS/src/Makefile.am b/CEP/BB/BBS/src/Makefile.am
index 898d34076c9..f800eb5379c 100644
--- a/CEP/BB/BBS/src/Makefile.am
+++ b/CEP/BB/BBS/src/Makefile.am
@@ -50,6 +50,7 @@ MNS/MeqSourceList.h \
 MNS/MeqStatExpr.h \
 MNS/MeqStation.h \
 MNS/MeqStatUVW.h \
+MNS/MeqTabular.h \
 MNS/Pool.h
 
 noinst_HEADERS =
@@ -102,7 +103,8 @@ MNS/MeqResultVec.cc \
 MNS/MeqSourceList.cc \
 MNS/MeqStatExpr.cc \
 MNS/MeqStation.cc \
-MNS/MeqStatUVW.cc 
+MNS/MeqStatUVW.cc \
+MNS/MeqTabular.cc 
 
 
 include $(top_srcdir)/Makefile.common
diff --git a/CEP/BB/BBSKernel/include/BBSKernel/MNS/MeqTabular.h b/CEP/BB/BBSKernel/include/BBSKernel/MNS/MeqTabular.h
new file mode 100644
index 00000000000..33b691451f4
--- /dev/null
+++ b/CEP/BB/BBSKernel/include/BBSKernel/MNS/MeqTabular.h
@@ -0,0 +1,68 @@
+//# MeqTabular.h: A tabular parameter value
+//#
+//# Copyright (C) 2006
+//# ASTRON (Netherlands Foundation for Research in Astronomy)
+//# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//#
+//# This program is free software; you can redistribute it and/or modify
+//# it under the terms of the GNU General Public License as published by
+//# the Free Software Foundation; either version 2 of the License, or
+//# (at your option) any later version.
+//#
+//# This program is distributed in the hope that it will be useful,
+//# but WITHOUT ANY WARRANTY; without even the implied warranty of
+//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//# GNU General Public License for more details.
+//#
+//# You should have received a copy of the GNU General Public License
+//# along with this program; if not, write to the Free Software
+//# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//#
+//# $Id$
+
+#ifndef MNS_MEQTABULAR_H
+#define MNS_MEQTABULAR_H
+
+// \file
+// A tabular (non-solvable) parameter value.
+
+//# Includes
+#include <BBS/MNS/MeqFunklet.h>
+
+namespace LOFAR {
+
+// \ingroup BBS
+// \addtogroup MNS
+// @{
+
+class MeqTabular: public MeqFunklet
+{
+public:
+  // Create an empty object.
+  MeqTabular()
+    {}
+
+  // Create a tabular from a ParmValue object.
+  MeqTabular (const ParmDB::ParmValue&);
+
+  // Convert a tabular to a ParmValue object.
+  ParmDB::ParmValue toParmValue() const;
+
+  virtual ~MeqTabular();
+
+  // Clone the polc.
+  virtual MeqTabular* clone() const;
+
+  // Calculate the value.
+  // Perturbations are not allowed.
+  virtual MeqResult getResult (const MeqRequest&,
+			       int nrpert, int pertInx);
+  virtual MeqResult getAnResult (const MeqRequest&,
+				 int nrpert, int pertInx);
+};
+
+// @}
+
+}
+
+#endif
diff --git a/CEP/BB/BBSKernel/src/MNS/MeqFunklet.cc b/CEP/BB/BBSKernel/src/MNS/MeqFunklet.cc
index 678a48cca3c..139ed7a3e3c 100644
--- a/CEP/BB/BBSKernel/src/MNS/MeqFunklet.cc
+++ b/CEP/BB/BBSKernel/src/MNS/MeqFunklet.cc
@@ -24,6 +24,7 @@
 
 #include <BBS/MNS/MeqFunklet.h>
 #include <BBS/MNS/MeqPolc.h>
+#include <BBS/MNS/MeqTabular.h>
 #include <Common/LofarLogger.h>
 #include <casa/Arrays/Matrix.h>
 
@@ -80,11 +81,15 @@ MeqFunklet& MeqFunklet::operator= (const MeqFunklet& that)
 MeqFunklet* MeqFunklet::make (const ParmDB::ParmValue& pvalue,
 			      const string& name)
 {
-  ASSERTSTR (pvalue.rep().itsType=="polc",
-	     "No 'polc' funklet found for parameter " << name);
   ASSERTSTR (pvalue.rep().itsShape.size()==2,
 	     "No 2-dim funklet found for parameter " << name);
-  return new MeqPolc(pvalue);
+  if (pvalue.rep().itsType=="polc") {
+    return new MeqPolc(pvalue);
+  } else if (pvalue.rep().itsType=="polc") {
+    return new MeqTabular(pvalue);
+  }
+  ASSERTSTR (false,
+	     "Unknown funklet found for parameter " << name);
 }
 
 int MeqFunklet::makeSolvable (int scidIndex)
diff --git a/CEP/BB/BBSKernel/src/MNS/MeqTabular.cc b/CEP/BB/BBSKernel/src/MNS/MeqTabular.cc
new file mode 100644
index 00000000000..a693a165da1
--- /dev/null
+++ b/CEP/BB/BBSKernel/src/MNS/MeqTabular.cc
@@ -0,0 +1,97 @@
+//# MeqTabular.cc:  A tabular parameter value
+//#
+//# Copyright (C) 2006
+//# ASTRON (Netherlands Foundation for Research in Astronomy)
+//# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//#
+//# This program is free software; you can redistribute it and/or modify
+//# it under the terms of the GNU General Public License as published by
+//# the Free Software Foundation; either version 2 of the License, or
+//# (at your option) any later version.
+//#
+//# This program is distributed in the hope that it will be useful,
+//# but WITHOUT ANY WARRANTY; without even the implied warranty of
+//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//# GNU General Public License for more details.
+//#
+//# You should have received a copy of the GNU General Public License
+//# along with this program; if not, write to the Free Software
+//# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//#
+//# $Id$
+
+#include <lofar_config.h>
+
+#include <BBS/MNS/MeqTabular.h>
+#include <BBS/MNS/MeqRequest.h>
+#include <BBS/MNS/MeqResult.h>
+#include <BBS/MNS/MeqMatrixTmp.h>
+#include <Common/LofarLogger.h>
+
+using namespace casa;
+
+namespace LOFAR {
+
+
+MeqTabular::MeqTabular (const ParmDB::ParmValue& pvalue)
+: MeqFunklet (pvalue)
+{
+  const ParmDB::ParmValueRep& pval = pvalue.rep();
+  ASSERTSTR (pval.itsType == "tabular",
+	     "Funklet in ParmValue is not of type 'tabular'");
+}
+
+MeqTabular::~MeqTabular()
+{}
+
+MeqTabular* MeqTabular::clone() const
+{
+  return new MeqTabular(*this);
+}
+
+MeqResult MeqTabular::getResult (const MeqRequest& request,
+				 int nrpert, int pertInx)
+{
+  ASSERTSTR (nrpert == 0,
+	     "A tabular parameter value cannot be solvable");
+  // It is not checked if the domain is valid.
+  // In that way any value can be used for the default domain [-1,1].
+  // Because the values are calculated for the center of each cell,
+  // it is only checked if the centers are in the tabular domain.
+  const MeqDomain& reqDomain = request.domain();
+  MeqResult result(request.nspid());
+  // If there is only one value, the value is independent of x and y.
+  // Make sure it is turned into a scalar value.
+  if (itsCoeff.nelements() == 1) {
+    result.setValue (MeqMatrix(itsCoeff.getDouble()));
+  } else if (itsCoeff.ny() == 1) {
+    // The tabular has multiple values in frequency only.
+    // Get number of steps and values in x and y.
+    int ndx = request.nx();
+    int ndy = request.ny();
+    int ncx = itsCoeff.nx();
+    int ncy = itsCoeff.ny();
+    // Get the step and start values in the domain.
+    double stepdx = (reqDomain.endX() - reqDomain.startX()) / ndx;
+    double stepcx = (domain().endX() - domain().startX()) / ncx;
+    // Evaluate the expression (as double).
+    const double* coeffData = itsCoeff.doubleStorage();
+    // Create matrix for the value itself and keep a pointer to its data.
+    result.setValue (MeqMatrix(double(0), ndx, ndy));
+    double* value = result.getValueRW().doubleStorage();
+    // Iterate over all cells in the frequency domain.
+    double valx = reqDomain.startX();
+    for (int i=0; i<ndx; i++) {
+      valx += stepdx;
+    }
+  }
+  return result;
+}
+
+MeqResult MeqTabular::getAnResult (const MeqRequest& request,
+				   int nrpert, int pertInx)
+{
+  return getResult (request, nrpert, pertInx);
+}
+
+}
diff --git a/CEP/BB/BBSKernel/src/MNS/MeqTabular.h b/CEP/BB/BBSKernel/src/MNS/MeqTabular.h
new file mode 100644
index 00000000000..33b691451f4
--- /dev/null
+++ b/CEP/BB/BBSKernel/src/MNS/MeqTabular.h
@@ -0,0 +1,68 @@
+//# MeqTabular.h: A tabular parameter value
+//#
+//# Copyright (C) 2006
+//# ASTRON (Netherlands Foundation for Research in Astronomy)
+//# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
+//#
+//# This program is free software; you can redistribute it and/or modify
+//# it under the terms of the GNU General Public License as published by
+//# the Free Software Foundation; either version 2 of the License, or
+//# (at your option) any later version.
+//#
+//# This program is distributed in the hope that it will be useful,
+//# but WITHOUT ANY WARRANTY; without even the implied warranty of
+//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//# GNU General Public License for more details.
+//#
+//# You should have received a copy of the GNU General Public License
+//# along with this program; if not, write to the Free Software
+//# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+//#
+//# $Id$
+
+#ifndef MNS_MEQTABULAR_H
+#define MNS_MEQTABULAR_H
+
+// \file
+// A tabular (non-solvable) parameter value.
+
+//# Includes
+#include <BBS/MNS/MeqFunklet.h>
+
+namespace LOFAR {
+
+// \ingroup BBS
+// \addtogroup MNS
+// @{
+
+class MeqTabular: public MeqFunklet
+{
+public:
+  // Create an empty object.
+  MeqTabular()
+    {}
+
+  // Create a tabular from a ParmValue object.
+  MeqTabular (const ParmDB::ParmValue&);
+
+  // Convert a tabular to a ParmValue object.
+  ParmDB::ParmValue toParmValue() const;
+
+  virtual ~MeqTabular();
+
+  // Clone the polc.
+  virtual MeqTabular* clone() const;
+
+  // Calculate the value.
+  // Perturbations are not allowed.
+  virtual MeqResult getResult (const MeqRequest&,
+			       int nrpert, int pertInx);
+  virtual MeqResult getAnResult (const MeqRequest&,
+				 int nrpert, int pertInx);
+};
+
+// @}
+
+}
+
+#endif
diff --git a/CEP/BB/BBSKernel/src/Makefile.am b/CEP/BB/BBSKernel/src/Makefile.am
index 898d34076c9..f800eb5379c 100644
--- a/CEP/BB/BBSKernel/src/Makefile.am
+++ b/CEP/BB/BBSKernel/src/Makefile.am
@@ -50,6 +50,7 @@ MNS/MeqSourceList.h \
 MNS/MeqStatExpr.h \
 MNS/MeqStation.h \
 MNS/MeqStatUVW.h \
+MNS/MeqTabular.h \
 MNS/Pool.h
 
 noinst_HEADERS =
@@ -102,7 +103,8 @@ MNS/MeqResultVec.cc \
 MNS/MeqSourceList.cc \
 MNS/MeqStatExpr.cc \
 MNS/MeqStation.cc \
-MNS/MeqStatUVW.cc 
+MNS/MeqStatUVW.cc \
+MNS/MeqTabular.cc 
 
 
 include $(top_srcdir)/Makefile.common
-- 
GitLab