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