From f6e6621605e23c0985d56eb58e2cad1fd950000c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Offringa?= <offringa@astron.nl>
Date: Sun, 28 Nov 2010 23:14:57 +0000
Subject: [PATCH] Bug 1491: small changes related to filtering

---
 .../strategyframes/foreachpolarisationframe.h |  61 +++++-
 .../gui/strategyframes/setimageframe.h        |  14 +-
 .../rfi/strategy/foreachpolarisationblock.h   | 174 +++++++++++++-----
 .../AOFlagger/rfi/strategy/setimageaction.h   |  25 ++-
 .../include/AOFlagger/rfi/strategy/types.h    |   9 +-
 .../AOFlagger/src/gui/imageplanewindow.cpp    |   3 +-
 .../src/rfi/strategy/strategyreader.cpp       |   9 +-
 .../src/rfi/strategy/strategywriter.cpp       |   9 +-
 8 files changed, 247 insertions(+), 57 deletions(-)

diff --git a/CEP/DP3/AOFlagger/include/AOFlagger/gui/strategyframes/foreachpolarisationframe.h b/CEP/DP3/AOFlagger/include/AOFlagger/gui/strategyframes/foreachpolarisationframe.h
index f3b116d556b..6a0cdc5bfe0 100644
--- a/CEP/DP3/AOFlagger/include/AOFlagger/gui/strategyframes/foreachpolarisationframe.h
+++ b/CEP/DP3/AOFlagger/include/AOFlagger/gui/strategyframes/foreachpolarisationframe.h
@@ -36,12 +36,47 @@ class ForEachPolarisationFrame : public Gtk::Frame {
 		ForEachPolarisationFrame(rfiStrategy::ForEachPolarisationBlock &action, EditStrategyWindow &editStrategyWindow)
 		: Gtk::Frame("For each baseline"),
 		_editStrategyWindow(editStrategyWindow), _action(action),
-		_iterateStokesComponentsButton("Iterate stokes components"),
+		_onXXButton("XX"),
+		_onXYButton("XY"),
+		_onYXButton("YX"),
+		_onYYButton("YY"),
+		_onStokesIButton("Stokes I"),
+		_onStokesQButton("Stokes Q"),
+		_onStokesUButton("Stokes U"),
+		_onStokesVButton("Stokes V"),
 		_applyButton(Gtk::Stock::APPLY)
 		{
-			_box.pack_start(_iterateStokesComponentsButton);
-			_iterateStokesComponentsButton.set_active(_action.IterateStokesValues());
-			_iterateStokesComponentsButton.show();
+			_box.pack_start(_onXXButton);
+			_onXXButton.set_active(_action.OnXX());
+			_onXXButton.show();
+
+			_box.pack_start(_onXYButton);
+			_onXYButton.set_active(_action.OnXY());
+			_onXYButton.show();
+
+			_box.pack_start(_onYXButton);
+			_onYXButton.set_active(_action.OnYX());
+			_onYXButton.show();
+
+			_box.pack_start(_onYYButton);
+			_onYYButton.set_active(_action.OnYY());
+			_onYYButton.show();
+
+			_box.pack_start(_onStokesIButton);
+			_onStokesIButton.set_active(_action.OnStokesI());
+			_onStokesIButton.show();
+
+			_box.pack_start(_onStokesQButton);
+			_onStokesQButton.set_active(_action.OnStokesQ());
+			_onStokesQButton.show();
+
+			_box.pack_start(_onStokesUButton);
+			_onStokesUButton.set_active(_action.OnStokesU());
+			_onStokesUButton.show();
+
+			_box.pack_start(_onStokesVButton);
+			_onStokesVButton.set_active(_action.OnStokesV());
+			_onStokesVButton.show();
 
 			_buttonBox.pack_start(_applyButton);
 			_applyButton.signal_clicked().connect(sigc::mem_fun(*this, &ForEachPolarisationFrame::onApplyClicked));
@@ -59,12 +94,26 @@ class ForEachPolarisationFrame : public Gtk::Frame {
 
 		Gtk::VBox _box;
 		Gtk::HButtonBox _buttonBox;
-		Gtk::CheckButton _iterateStokesComponentsButton;
+		Gtk::CheckButton _onXXButton;
+		Gtk::CheckButton _onXYButton;
+		Gtk::CheckButton _onYXButton;
+		Gtk::CheckButton _onYYButton;
+		Gtk::CheckButton _onStokesIButton;
+		Gtk::CheckButton _onStokesQButton;
+		Gtk::CheckButton _onStokesUButton;
+		Gtk::CheckButton _onStokesVButton;
 		Gtk::Button _applyButton;
 
 		void onApplyClicked()
 		{
-			_action.SetIterateStokesValues(_iterateStokesComponentsButton.get_active());
+			_action.SetOnXX(_onXXButton.get_active());
+			_action.SetOnXY(_onXYButton.get_active());
+			_action.SetOnYX(_onYXButton.get_active());
+			_action.SetOnYY(_onYYButton.get_active());
+			_action.SetOnStokesI(_onStokesIButton.get_active());
+			_action.SetOnStokesQ(_onStokesQButton.get_active());
+			_action.SetOnStokesU(_onStokesUButton.get_active());
+			_action.SetOnStokesV(_onStokesVButton.get_active());
 			_editStrategyWindow.UpdateAction(&_action);
 		}
 };
diff --git a/CEP/DP3/AOFlagger/include/AOFlagger/gui/strategyframes/setimageframe.h b/CEP/DP3/AOFlagger/include/AOFlagger/gui/strategyframes/setimageframe.h
index 8328ddcdeed..432971e6a79 100644
--- a/CEP/DP3/AOFlagger/include/AOFlagger/gui/strategyframes/setimageframe.h
+++ b/CEP/DP3/AOFlagger/include/AOFlagger/gui/strategyframes/setimageframe.h
@@ -40,6 +40,7 @@ class SetImageFrame : public Gtk::Frame {
 		_originalButton("Original"),
 		_swapButton("Swap revised and contaminated"),
 		_replaceFlaggedValuesButton("Replace flagged values"),
+		_setFlaggedValuesToZeroButton("Set flagged values to zero"),
 		_addButton("Add instead of set"),
 		_applyButton(Gtk::Stock::APPLY)
 		{
@@ -56,6 +57,9 @@ class SetImageFrame : public Gtk::Frame {
 
 			_box.pack_start(_replaceFlaggedValuesButton);
 			_replaceFlaggedValuesButton.set_group(group);
+			
+			_box.pack_start(_setFlaggedValuesToZeroButton);
+			_setFlaggedValuesToZeroButton.set_group(group);
 
 			switch(_action.NewImage())
 			{
@@ -71,12 +75,16 @@ class SetImageFrame : public Gtk::Frame {
 				case rfiStrategy::SetImageAction::ReplaceFlaggedValues:
 				_replaceFlaggedValuesButton.set_active(true);
 					break;
+				case rfiStrategy::SetImageAction::SetFlaggedValuesToZero:
+				_setFlaggedValuesToZeroButton.set_active(true);
+					break;
 			}
 
 			_zeroButton.show();
 			_originalButton.show();
 			_swapButton.show();
 			_replaceFlaggedValuesButton.show();
+			_setFlaggedValuesToZeroButton.show();
 
 			_box.pack_start(_addButton);
 			_addButton.set_active(_action.Add());
@@ -100,7 +108,7 @@ class SetImageFrame : public Gtk::Frame {
 		Gtk::HButtonBox _buttonBox;
 		Gtk::Label _baselinesLabel;
 		Gtk::RadioButton
-			_zeroButton, _originalButton, _swapButton, _replaceFlaggedValuesButton;
+			_zeroButton, _originalButton, _swapButton, _replaceFlaggedValuesButton, _setFlaggedValuesToZeroButton;
 		Gtk::CheckButton
 			_addButton;
 		Gtk::Button _applyButton;
@@ -113,8 +121,10 @@ class SetImageFrame : public Gtk::Frame {
 				_action.SetNewImage(rfiStrategy::SetImageAction::FromOriginal);
 			else if(_swapButton.get_active())
 				_action.SetNewImage(rfiStrategy::SetImageAction::SwapRevisedAndContaminated);
-			else
+			else if(_replaceFlaggedValuesButton.get_active())
 				_action.SetNewImage(rfiStrategy::SetImageAction::ReplaceFlaggedValues);
+			else
+				_action.SetNewImage(rfiStrategy::SetImageAction::SetFlaggedValuesToZero);
 			_action.SetAdd(_addButton.get_active());
 			_editStrategyWindow.UpdateAction(&_action);
 		}
diff --git a/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/foreachpolarisationblock.h b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/foreachpolarisationblock.h
index 19a78a75b42..bc1a739a8e8 100644
--- a/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/foreachpolarisationblock.h
+++ b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/foreachpolarisationblock.h
@@ -21,17 +21,20 @@
 #ifndef RFI_FOREACHPOLARISATION_H
 #define RFI_FOREACHPOLARISATION_H 
 
-#include "actionblock.h"
-#include "artifactset.h"
+#include <AOFlagger/rfi/strategy/action.h>
+#include <AOFlagger/rfi/strategy/actionblock.h>
+#include <AOFlagger/rfi/strategy/artifactset.h>
 
-#include "../../msio/timefrequencydata.h"
+#include <AOFlagger/msio/timefrequencydata.h>
 
 namespace rfiStrategy {
 
 	class ForEachPolarisationBlock : public ActionBlock
 	{
 		public:
-			ForEachPolarisationBlock() : _iterateStokesValues(false)
+			ForEachPolarisationBlock() :
+				_onXX(true), _onXY(true), _onYX(true), _onYY(true),
+				_onStokesI(false), _onStokesQ(false), _onStokesU(false), _onStokesV(false)
 			{
 			}
 			virtual ~ForEachPolarisationBlock()
@@ -39,6 +42,17 @@ namespace rfiStrategy {
 			}
 			virtual std::string Description()
 			{
+				if(selectedPolarizationCount() == 1)
+				{
+					if(_onXX) return "On XX";
+					if(_onXY) return "On XY";
+					if(_onYX) return "On YX";
+					if(_onYY) return "On YY";
+					if(_onStokesI) return "On Stokes I";
+					if(_onStokesQ) return "On Stokes Q";
+					if(_onStokesU) return "On Stokes U";
+					if(_onStokesV) return "On Stokes V";
+				}
 				return "For each polarisation";
 			}
 			virtual void Initialize()
@@ -55,12 +69,16 @@ namespace rfiStrategy {
 				if(oldContaminatedData.Polarisation() != oldOriginalData.Polarisation())
 					throw BadUsageException("Contaminated and original do not have equal polarisation, in for each polarisation block");
 
-				if(oldContaminatedData.Polarisation() == DipolePolarisation && _iterateStokesValues)
-					performStokesIteration(artifacts, progress);
-				else if(oldContaminatedData.PolarisationCount() == 1) {
+				if(oldContaminatedData.PolarisationCount() == 1)
+				{
 					// There is only one polarisation in the contaminated data; just run all childs
 					ActionBlock::Perform(artifacts, progress);
-				} else {
+				}
+				else if(oldContaminatedData.Polarisation() == DipolePolarisation && isDecompositionSelected())
+				{
+					performStokesIteration(artifacts, progress);
+				}
+				else {
 					bool changeRevised = (oldRevisedData.Polarisation() == oldContaminatedData.Polarisation());
 					unsigned count = oldContaminatedData.PolarisationCount();
 
@@ -68,32 +86,35 @@ namespace rfiStrategy {
 					{
 						TimeFrequencyData *newContaminatedData =
 							oldContaminatedData.CreateTFDataFromPolarisationIndex(polarizationIndex);
-						TimeFrequencyData *newOriginalData =
-							oldOriginalData.CreateTFDataFromPolarisationIndex(polarizationIndex);
-
-						artifacts.SetContaminatedData(*newContaminatedData);
-						artifacts.SetOriginalData(*newOriginalData);
-		
-						progress.OnStartTask(*this, polarizationIndex, count, newContaminatedData->Description());
-		
-						delete newContaminatedData;
-						delete newOriginalData;
-						
-						if(changeRevised)
+						if(isPolarizationSelected(newContaminatedData->Polarisation()))
 						{
-							TimeFrequencyData *newRevised = oldRevisedData.CreateTFDataFromPolarisationIndex(polarizationIndex);
-							artifacts.SetRevisedData(*newRevised);
-							delete newRevised;
-						}
-		
-						ActionBlock::Perform(artifacts, progress);
+							TimeFrequencyData *newOriginalData =
+								oldOriginalData.CreateTFDataFromPolarisationIndex(polarizationIndex);
 
-						setPolarizationData(polarizationIndex, oldContaminatedData, artifacts.ContaminatedData());
-						setPolarizationData(polarizationIndex, oldOriginalData, artifacts.OriginalData());
-						if(changeRevised)
-							setPolarizationData(polarizationIndex, oldRevisedData, artifacts.RevisedData());
+							artifacts.SetContaminatedData(*newContaminatedData);
+							artifacts.SetOriginalData(*newOriginalData);
+			
+							progress.OnStartTask(*this, polarizationIndex, count, newContaminatedData->Description());
+			
+							delete newOriginalData;
+							
+							if(changeRevised)
+							{
+								TimeFrequencyData *newRevised = oldRevisedData.CreateTFDataFromPolarisationIndex(polarizationIndex);
+								artifacts.SetRevisedData(*newRevised);
+								delete newRevised;
+							}
+			
+							ActionBlock::Perform(artifacts, progress);
 
-						progress.OnEndTask(*this);
+							setPolarizationData(polarizationIndex, oldContaminatedData, artifacts.ContaminatedData());
+							setPolarizationData(polarizationIndex, oldOriginalData, artifacts.OriginalData());
+							if(changeRevised)
+								setPolarizationData(polarizationIndex, oldRevisedData, artifacts.RevisedData());
+
+							progress.OnEndTask(*this);
+						}
+						delete newContaminatedData;
 					}
 
 					artifacts.SetContaminatedData(oldContaminatedData);
@@ -104,14 +125,71 @@ namespace rfiStrategy {
 
 			void SetIterateStokesValues(bool iterateStokesValues)
 			{
-				_iterateStokesValues = iterateStokesValues;
+				_onStokesI = iterateStokesValues;
+				_onStokesQ = iterateStokesValues;
+				_onStokesU = iterateStokesValues;
+				_onStokesV = iterateStokesValues;
 			}
+			
 			bool IterateStokesValues() const
 			{
-				return _iterateStokesValues;
+				return _onStokesI && _onStokesQ && _onStokesU && _onStokesV;
 			}
+			
+			void SetOnXX(bool onXX) { _onXX = onXX; }
+			void SetOnXY(bool onXY) { _onXY = onXY; }
+			void SetOnYX(bool onYX) { _onYX = onYX; }
+			void SetOnYY(bool onYY) { _onYY = onYY; }
+			void SetOnStokesI(bool onStokesI) { _onStokesI = onStokesI; }
+			void SetOnStokesQ(bool onStokesQ) { _onStokesQ = onStokesQ; }
+			void SetOnStokesU(bool onStokesU) { _onStokesU = onStokesU; }
+			void SetOnStokesV(bool onStokesV) { _onStokesV = onStokesV; }
+			
+			bool OnXX() const { return _onXX; }
+			bool OnXY() const { return _onXY; }
+			bool OnYX() const { return _onYX; }
+			bool OnYY() const { return _onYY; }
+			bool OnStokesI() const { return _onStokesI; }
+			bool OnStokesQ() const { return _onStokesQ; }
+			bool OnStokesU() const { return _onStokesU; }
+			bool OnStokesV() const { return _onStokesV; }
 		private:
-			bool _iterateStokesValues;
+			bool _onXX, _onXY, _onYX, _onYY, _onStokesI, _onStokesQ, _onStokesU, _onStokesV;
+			
+			bool isPolarizationSelected(PolarisationType polarization)
+			{
+				switch(polarization)
+				{
+					case XXPolarisation: return _onXX;
+					case XYPolarisation: return _onXY;
+					case YXPolarisation: return _onYX;
+					case YYPolarisation: return _onYY;
+					case StokesIPolarisation: return _onStokesI;
+					case StokesQPolarisation: return _onStokesQ;
+					case StokesUPolarisation: return _onStokesU;
+					case StokesVPolarisation: return _onStokesV;
+					default: return false;
+				}
+			}
+			
+			bool isDecompositionSelected() const
+			{
+				return _onStokesI || _onStokesQ || _onStokesU || _onStokesV;
+			}
+			
+			int selectedPolarizationCount() const
+			{
+				int count = 0;
+				if(_onXX) ++count;
+				if(_onXY) ++count;
+				if(_onYX) ++count;
+				if(_onYY) ++count;
+				if(_onStokesI) ++count;
+				if(_onStokesQ) ++count;
+				if(_onStokesU) ++count;
+				if(_onStokesV) ++count;
+				return count;
+			}
 
 			void setPolarizationData(size_t polarizationIndex, TimeFrequencyData &oldData, TimeFrequencyData &newData)
 			{
@@ -137,17 +215,29 @@ namespace rfiStrategy {
 
 				Mask2DPtr mask = Mask2D::CreateSetMaskPtr<false>(oldContaminatedData.ImageWidth(), oldContaminatedData.ImageHeight());
 
-				performPolarisation(artifacts, progress, StokesIPolarisation, oldContaminatedData, oldOriginalData, oldRevisedData, changeRevised, 0, 4);
-				mask->Join(artifacts.ContaminatedData().GetSingleMask());
+				if(_onStokesI)
+				{
+					performPolarisation(artifacts, progress, StokesIPolarisation, oldContaminatedData, oldOriginalData, oldRevisedData, changeRevised, 0, 4);
+					mask->Join(artifacts.ContaminatedData().GetSingleMask());
+				}
 
-				performPolarisation(artifacts, progress, StokesQPolarisation, oldContaminatedData, oldOriginalData, oldRevisedData, changeRevised, 1, 4);
-				mask->Join(artifacts.ContaminatedData().GetSingleMask());
+				if(_onStokesQ)
+				{
+					performPolarisation(artifacts, progress, StokesQPolarisation, oldContaminatedData, oldOriginalData, oldRevisedData, changeRevised, 1, 4);
+					mask->Join(artifacts.ContaminatedData().GetSingleMask());
+				}
 
-				performPolarisation(artifacts, progress, StokesUPolarisation, oldContaminatedData, oldOriginalData, oldRevisedData, changeRevised, 2, 4);
-				mask->Join(artifacts.ContaminatedData().GetSingleMask());
+				if(_onStokesU)
+				{
+					performPolarisation(artifacts, progress, StokesUPolarisation, oldContaminatedData, oldOriginalData, oldRevisedData, changeRevised, 2, 4);
+					mask->Join(artifacts.ContaminatedData().GetSingleMask());
+				}
 
-				performPolarisation(artifacts, progress, StokesVPolarisation, oldContaminatedData, oldOriginalData, oldRevisedData, changeRevised, 3, 4);
-				mask->Join(artifacts.ContaminatedData().GetSingleMask());
+				if(_onStokesV)
+				{
+					performPolarisation(artifacts, progress, StokesVPolarisation, oldContaminatedData, oldOriginalData, oldRevisedData, changeRevised, 3, 4);
+					mask->Join(artifacts.ContaminatedData().GetSingleMask());
+				}
 				
 				oldContaminatedData.SetGlobalMask(mask);
 				artifacts.SetContaminatedData(oldContaminatedData);
diff --git a/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/setimageaction.h b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/setimageaction.h
index 7a42cb5e398..2c7c6f1e397 100644
--- a/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/setimageaction.h
+++ b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/setimageaction.h
@@ -31,7 +31,7 @@ namespace rfiStrategy {
 	class SetImageAction : public Action
 	{
 		public:
-			enum NewImage { Zero, FromOriginal, SwapRevisedAndContaminated, ReplaceFlaggedValues };
+			enum NewImage { Zero, FromOriginal, SwapRevisedAndContaminated, ReplaceFlaggedValues, SetFlaggedValuesToZero };
 
 			SetImageAction() : _newImage(FromOriginal), _add(false) { }
 
@@ -60,6 +60,8 @@ namespace rfiStrategy {
 							return "Swap revised and contaminated";
 						case ReplaceFlaggedValues:
 							return "Revise flagged values";
+						case SetFlaggedValuesToZero:
+							return "Set flagged values to zero";
 					}
 				}
 			}
@@ -149,6 +151,26 @@ namespace rfiStrategy {
 						}
 						break;
 					}
+					case SetFlaggedValuesToZero:
+					{
+						TimeFrequencyData contaminatedData = artifacts.ContaminatedData();
+						Mask2DCPtr mask = contaminatedData.GetSingleMask();
+						unsigned imageCount = contaminatedData.ImageCount();
+						for(unsigned i=0;i<imageCount;++i)
+						{
+							Image2DPtr image = Image2D::CreateCopy(contaminatedData.GetImage(i));
+							for(size_t y=0;y<image->Height();++y)
+							{
+								for(size_t x=0;x<image->Width();++x)
+								{
+									if(mask->Value(x, y))
+										image->SetValue(x, y, 0.0);
+								}
+							}
+							artifacts.ContaminatedData().SetImage(i, image);
+						}
+						break;
+					}
 				}
 			}
 			void PerformAdd(class ArtifactSet &artifacts, class ProgressListener &)
@@ -174,6 +196,7 @@ namespace rfiStrategy {
 					case Zero:
 					case SwapRevisedAndContaminated:
 					case ReplaceFlaggedValues:
+					case SetFlaggedValuesToZero:
 					break;
 				}
 			}
diff --git a/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/types.h b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/types.h
index 77e59078af5..6429f2170b5 100644
--- a/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/types.h
+++ b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/types.h
@@ -60,12 +60,15 @@ class Observatorium;
 // 1.9 : allow formatting of the xml file by white space
 // 2.0 : added the TimeconvolutionAction and the ForEachComplexComponentAction (to replace the Adapter)
 // 2.1 : added min-window-size to FringeStopAction
-#define STRATEGY_FILE_FORMAT_VERSION 2.1
+// 2.2 : removed iterate-stokes-values parameter of ForEachBaselineAction, replaced width individual
+//       on-xx, on-xy, ..., on-stokes-v & added enumeration value "SetFlaggedValuesToZero"
+//       in SetImageAction.
+#define STRATEGY_FILE_FORMAT_VERSION 2.2
 
 // The earliest format version which can be read by this version of the software
-#define STRATEGY_FILE_FORMAT_VERSION_REQUIRED 1.4
+#define STRATEGY_FILE_FORMAT_VERSION_REQUIRED 2.2
 
 // The earliest software version which is required to read the written files
-#define STRATEGY_FILE_READER_VERSION_REQUIRED 2.0
+#define STRATEGY_FILE_READER_VERSION_REQUIRED 2.2
 
 #endif // RFI_STRATEGY_TYPES
diff --git a/CEP/DP3/AOFlagger/src/gui/imageplanewindow.cpp b/CEP/DP3/AOFlagger/src/gui/imageplanewindow.cpp
index a0389fb6687..689af2d700d 100644
--- a/CEP/DP3/AOFlagger/src/gui/imageplanewindow.cpp
+++ b/CEP/DP3/AOFlagger/src/gui/imageplanewindow.cpp
@@ -21,6 +21,7 @@
 
 #include <AOFlagger/util/ffttools.h>
 #include <AOFlagger/util/plot.h>
+#include <AOFlagger/rfi/sinusfitter.h>
 
 ImagePlaneWindow::ImagePlaneWindow()
  : _imager(1536*2, 1536*2), _clearButton("Clear"),
@@ -419,7 +420,7 @@ bool ImagePlaneWindow::onButtonReleased(GdkEventButton *event)
 		num_t max = _imageWidget.Image()->GetMaximum(left, top, right-left, bottom-top);
 		num_t xRel = posX-width/2.0, yRel = posY-height/2.0;
 		std::cout << "RMS=" << rms << ", max=" << max
-			<< ", angle=" << (acosn(xRel/yRel)*180.0/M_PIn) << ", dist=" << sqrt(xRel*xRel + yRel*yRel) << std::endl;
+			<< ", angle=" << (SinusFitter::Phase(xRel, -yRel)*180.0/M_PI) << ", dist=" << sqrt(xRel*xRel + yRel*yRel) << std::endl;
 	}
 	return true;
 }
diff --git a/CEP/DP3/AOFlagger/src/rfi/strategy/strategyreader.cpp b/CEP/DP3/AOFlagger/src/rfi/strategy/strategyreader.cpp
index 832957785dd..ff86f17f9b5 100644
--- a/CEP/DP3/AOFlagger/src/rfi/strategy/strategyreader.cpp
+++ b/CEP/DP3/AOFlagger/src/rfi/strategy/strategyreader.cpp
@@ -415,7 +415,14 @@ Action *StrategyReader::parseForEachMSAction(xmlNode *node)
 Action *StrategyReader::parseForEachPolarisationBlock(xmlNode *node)
 {
 	ForEachPolarisationBlock *newAction = new ForEachPolarisationBlock();
-	newAction->SetIterateStokesValues(getBool(node, "iterate-stokes-values"));
+	newAction->SetOnXX(getBool(node, "on-xx"));
+	newAction->SetOnXY(getBool(node, "on-xy"));
+	newAction->SetOnYX(getBool(node, "on-yx"));
+	newAction->SetOnYY(getBool(node, "on-yy"));
+	newAction->SetOnStokesI(getBool(node, "on-stokes-i"));
+	newAction->SetOnStokesQ(getBool(node, "on-stokes-q"));
+	newAction->SetOnStokesU(getBool(node, "on-stokes-u"));
+	newAction->SetOnStokesV(getBool(node, "on-stokes-v"));
 	parseChildren(node, newAction);
 	return newAction;
 }
diff --git a/CEP/DP3/AOFlagger/src/rfi/strategy/strategywriter.cpp b/CEP/DP3/AOFlagger/src/rfi/strategy/strategywriter.cpp
index 5c23e2ef5ba..aeab55e73e5 100644
--- a/CEP/DP3/AOFlagger/src/rfi/strategy/strategywriter.cpp
+++ b/CEP/DP3/AOFlagger/src/rfi/strategy/strategywriter.cpp
@@ -267,7 +267,14 @@ namespace rfiStrategy {
 	void StrategyWriter::writeForEachPolarisationBlock(const ForEachPolarisationBlock &action)
 	{
 		Attribute("type", "ForEachPolarisationBlock");
-		Write<bool>("iterate-stokes-values", action.IterateStokesValues());
+		Write<bool>("on-xx", action.OnXX());
+		Write<bool>("on-xy", action.OnXY());
+		Write<bool>("on-yx", action.OnYX());
+		Write<bool>("on-yy", action.OnYY());
+		Write<bool>("on-stokes-i", action.OnStokesI());
+		Write<bool>("on-stokes-q", action.OnStokesQ());
+		Write<bool>("on-stokes-u", action.OnStokesU());
+		Write<bool>("on-stokes-v", action.OnStokesV());
 		writeContainerItems(action);
 	}
 
-- 
GitLab