diff --git a/.gitattributes b/.gitattributes index 939c2d43dc426761fa5c29de73637656979f9f92..1e65316cf1d8f7d134243c3fda31af278d92f089 100644 --- a/.gitattributes +++ b/.gitattributes @@ -235,6 +235,7 @@ CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/foreachmsaction.h -text CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/foreachpolarisationblock.h -text CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/foreachsimulatedbaselineaction.h -text CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/fouriertransformaction.h -text +CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/frequencyconvolutionaction.h -text CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/frequencyselectionaction.h -text CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/fringestopaction.h -text CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/imageraction.h -text diff --git a/CEP/DP3/AOFlagger/include/AOFlagger/CMakeLists.txt b/CEP/DP3/AOFlagger/include/AOFlagger/CMakeLists.txt index f91c7b76997325412e842590b5c454dea567961c..d458637c0c981f1765f717592fca98ad5df77193 100644 --- a/CEP/DP3/AOFlagger/include/AOFlagger/CMakeLists.txt +++ b/CEP/DP3/AOFlagger/include/AOFlagger/CMakeLists.txt @@ -147,6 +147,7 @@ install(FILES rfi/strategy/foreachmsaction.h rfi/strategy/foreachpolarisationblock.h rfi/strategy/fouriertransformaction.h + rfi/strategy/frequencyconvolutionaction.h rfi/strategy/frequencyselectionaction.h rfi/strategy/fringestopaction.h rfi/strategy/imageraction.h diff --git a/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/action.h b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/action.h index b57284c93d17625991769f28e9381094917c4090..0127f70870f969930663bf089054429f47efd2fb 100644 --- a/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/action.h +++ b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/action.h @@ -43,6 +43,7 @@ namespace rfiStrategy { ForEachPolarisationBlockType, ForEachSimulatedBaselineActionType, FourierTransformActionType, + FrequencyConvolutionActionType, FrequencySelectionActionType, FringeStopActionType, ImagerActionType, diff --git a/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/directionalcleanaction.h b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/directionalcleanaction.h index 474e7eda56306a542afee929363c63bce2d44719..9f549e80f1bbfef9db5caa2bdb860fe55f59f74f 100644 --- a/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/directionalcleanaction.h +++ b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/directionalcleanaction.h @@ -23,6 +23,7 @@ #include <iostream> #include <AOFlagger/util/ffttools.h> +#include <AOFlagger/util/plot.h> #include <AOFlagger/msio/samplerow.h> #include <AOFlagger/msio/timefrequencydata.h> @@ -31,6 +32,7 @@ #include <AOFlagger/rfi/strategy/action.h> #include <AOFlagger/rfi/strategy/actionblock.h> +#include <AOFlagger/rfi/thresholdtools.h> #include <AOFlagger/rfi/uvprojection.h> namespace rfiStrategy { @@ -38,9 +40,39 @@ namespace rfiStrategy { class DirectionalCleanAction : public Action { public: - DirectionalCleanAction() : Action(), _limitingDistance(1.0) + DirectionalCleanAction() : Action(), _limitingDistance(1.0), _attenuationOfCenter(0.01), _channelConvolutionSize(1), _makePlot(true), _values(0) { } + virtual ~DirectionalCleanAction() + { + Finish(); + } + virtual void Finish() + { + if(_values != 0) + { + if(_makePlot) + { + Plot plot("clean.pdf"); + unsigned left = 0, right = 0; + for(unsigned i=0;i!=_valueWidth/2;++i) + { + if(_values[i] != 0) left = i; + if(_values[_valueWidth-i-1] != 0) right = i; + } + plot.StartScatter("Positive"); + for(unsigned i=0;i<=left;++i) + plot.PushDataPoint(i, _values[i]); + plot.StartScatter("Negative"); + for(unsigned i=0;i<=right;++i) + plot.PushDataPoint(i, _values[_valueWidth-i-1]); + plot.Close(); + plot.Show(); + } + delete[] _values; + _values = 0; + } + } virtual std::string Description() { return "Directional cleaning"; @@ -65,9 +97,22 @@ namespace rfiStrategy { imagDest = Image2D::CreateCopy(revised.GetImaginaryPart()), realOriginal = Image2D::CreateCopy(original.GetRealPart()), imagOriginal = Image2D::CreateCopy(original.GetImaginaryPart()); - for(unsigned y=0;y<artifacts.ContaminatedData().ImageHeight();++y) + + Image2DPtr amplitudes = FFTTools::CreateAbsoluteImage(contaminated.GetImage(0), contaminated.GetImage(1)); + + if(_channelConvolutionSize != 1) + amplitudes = ThresholdTools::FrequencyRectangularConvolution(amplitudes, _channelConvolutionSize); + + if(_values == 0) + { + _valueWidth = amplitudes->Width(); + _values = new num_t[amplitudes->Width()]; + for(unsigned i=0;i<amplitudes->Width();++i) _values[i] = 0.0; + } + + for(unsigned y=0;y<contaminated.ImageHeight();++y) { - performFrequency(artifacts, realDest, imagDest, realOriginal, imagOriginal, y); + performFrequency(artifacts, amplitudes, realDest, imagDest, realOriginal, imagOriginal, y); } revised.SetImage(0, realDest); revised.SetImage(1, imagDest); @@ -77,10 +122,24 @@ namespace rfiStrategy { } double LimitingDistance() const { return _limitingDistance; } void SetLimitingDistance(double limitingDistance) { _limitingDistance = limitingDistance; } + + unsigned ChannelConvolutionSize() const { return _channelConvolutionSize; } + void SetChannelConvolutionSize(unsigned channelConvolutionSize) { _channelConvolutionSize = channelConvolutionSize; } + + numl_t AttenuationOfCenter() const { return _attenuationOfCenter; } + void SetAttenuationOfCenter(numl_t attenuationOfCenter) { _attenuationOfCenter = attenuationOfCenter; } + + bool MakePlot() const { return _makePlot; } + void SetMakePlot(bool makePlot) { _makePlot = makePlot; } private: double _limitingDistance; + numl_t _attenuationOfCenter; + unsigned _channelConvolutionSize; + unsigned _valueWidth; + bool _makePlot; + num_t *_values; - void performFrequency(ArtifactSet &artifacts, Image2DPtr realDest, Image2DPtr imagDest, Image2DPtr realOriginal, Image2DPtr imagOriginal, unsigned y) + void performFrequency(ArtifactSet &artifacts, Image2DCPtr amplitudeValues, Image2DPtr realDest, Image2DPtr imagDest, Image2DPtr realOriginal, Image2DPtr imagOriginal, unsigned y) { Image2DCPtr realInput = artifacts.ContaminatedData().GetRealPart(), @@ -96,7 +155,7 @@ namespace rfiStrategy { bool *isConjugated = new bool[inputWidth]; - SampleRowPtr row = SampleRow::CreateAmplitudeFromRow(realInput, imagInput, y); + SampleRowPtr row = SampleRow::CreateFromRow(amplitudeValues, y); UVProjection::ProjectPositions(artifacts.MetaData(), inputWidth, y, uPositions, vPositions, isConjugated, artifacts.ProjectedDirectionRad()); @@ -107,12 +166,12 @@ namespace rfiStrategy { UVProjection::GetIndicesInProjectedImage(_limitingDistance, minU, maxU, inputWidth, destWidth, lowestIndex, highestIndex); for(unsigned i=0;i!=lowestIndex;++i) { - const numl_t weight = (numl_t) i / lowestIndex; + const numl_t weight = (1.0-_attenuationOfCenter)*((numl_t) i / lowestIndex) + _attenuationOfCenter; row->SetValue(i, weight * row->Value(i)); } for(unsigned i=highestIndex;i!=destWidth;++i) { - const numl_t weight = (numl_t) (destWidth - i) / (destWidth - highestIndex); + const numl_t weight = _attenuationOfCenter; row->SetValue(i, weight * row->Value(i)); } @@ -132,17 +191,20 @@ namespace rfiStrategy { numl_t amplitudeRemoved = amplitude * 0.75; - if(amplitude < mean + 2.5*sigma || amplitude < 0.0) + numl_t limit = mean; + + if(amplitude < limit || amplitude < 0.0) { - AOLogger::Debug << "Strongest component is < mean + 2.5 x sigma, not continuing with clean\n"; + AOLogger::Debug << "Strongest component is < limit not continuing with clean\n"; } else { - subtractComponent(artifacts, realDest, imagDest, inputWidth, uPositions, isConjugated, fIndex, amplitudeRemoved, phase, y); + subtractComponent(realDest, imagDest, inputWidth, uPositions, isConjugated, fIndex, amplitudeRemoved, phase, y); if(fIndex >= lowestIndex && fIndex < highestIndex) { AOLogger::Debug << "Within limits " << lowestIndex << "-" << highestIndex << '\n'; - subtractComponent(artifacts, realOriginal, imagOriginal, inputWidth, uPositions, isConjugated, fIndex, amplitudeRemoved, phase, y); + _values[fIndex] += amplitudeRemoved; + subtractComponent(realOriginal, imagOriginal, inputWidth, uPositions, isConjugated, fIndex, amplitudeRemoved, phase, y); } } @@ -151,7 +213,7 @@ namespace rfiStrategy { delete[] isConjugated; } - void subtractComponent(ArtifactSet &artifacts, Image2DPtr real, Image2DPtr imaginary, const size_t inputWidth, const numl_t *uPositions, const bool *isConjugated, unsigned fIndex, numl_t amplitude, numl_t phase, unsigned y) + void subtractComponent(Image2DPtr real, Image2DPtr imaginary, const size_t inputWidth, const numl_t *uPositions, const bool *isConjugated, unsigned fIndex, numl_t amplitude, numl_t phase, unsigned y) { numl_t minU, maxU; UVProjection::MaximalUPositions(inputWidth, uPositions, minU, maxU); diff --git a/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/frequencyconvolutionaction.h b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/frequencyconvolutionaction.h new file mode 100644 index 0000000000000000000000000000000000000000..b93c1e5c26f626aedc3fd26dcdc7aaae6509d3d9 --- /dev/null +++ b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/frequencyconvolutionaction.h @@ -0,0 +1,62 @@ +/*************************************************************************** + * Copyright (C) 2008 by A.R. Offringa * + * offringa@astro.rug.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. * + ***************************************************************************/ +#ifndef RFI_FREQUENCY_CONVOLUTION_ACTION +#define RFI_FREQUENCY_CONVOLUTION_ACTION + +#include <stdexcept> + +#include <AOFlagger/rfi/strategy/action.h> +#include <AOFlagger/rfi/strategy/actionblock.h> +#include <AOFlagger/rfi/strategy/artifactset.h> + +#include <AOFlagger/rfi/thresholdtools.h> + +namespace rfiStrategy { + + class FrequencyConvolutionAction : public Action + { + public: + FrequencyConvolutionAction() : Action(), _convolutionSize(16) + { + } + virtual std::string Description() + { + return "Frequency convolution"; + } + virtual ActionType Type() const { return FrequencyConvolutionActionType; } + virtual void Perform(ArtifactSet &artifacts, class ProgressListener &) + { + TimeFrequencyData &data = artifacts.ContaminatedData(); + if(data.ImageCount() != 1) + throw std::runtime_error("A frequency convolution can only be applied on single component data"); + + Image2DPtr image = ThresholdTools::FrequencyRectangularConvolution(data.GetImage(0), _convolutionSize); + data.SetImage(0, image); + } + + unsigned ConvolutionSize() const { return _convolutionSize; } + void SetConvolutionSize(unsigned size) { _convolutionSize = size; } + private: + unsigned _convolutionSize; + }; + +} // namespace + +#endif // RFI_FREQUENCY_CONVOLUTION_ACTION diff --git a/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/strategyreader.h b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/strategyreader.h index 44a476b3b10a86b6e9684179a40a6deabc407718..103906f1e4970bd1ec87f003f0035f6ee47ab29e 100644 --- a/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/strategyreader.h +++ b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/strategyreader.h @@ -68,6 +68,7 @@ class StrategyReader { class Action *parseForEachMSAction(xmlNode *node); class Action *parseForEachPolarisationBlock(xmlNode *node); class Action *parseFourierTransformAction(xmlNode *node); + class Action *parseFrequencyConvolutionAction(xmlNode *node); class Action *parseFrequencySelectionAction(xmlNode *node); class Action *parseFringeStopAction(xmlNode *node); class Action *parseImagerAction(xmlNode *node); diff --git a/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/strategywriter.h b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/strategywriter.h index 23d99cfbd8e9199fadb630c2218e1fe5d14f4cb9..8ecd588d2d39656a77c38f718fd81a4c6b99cd41 100644 --- a/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/strategywriter.h +++ b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/strategywriter.h @@ -83,6 +83,7 @@ namespace rfiStrategy { void writeForEachMSAction(const class ForEachMSAction &action); void writeForEachPolarisationBlock(const class ForEachPolarisationBlock &action); void writeFourierTransformAction(const class FourierTransformAction &action); + void writeFrequencyConvolutionAction(const class FrequencyConvolutionAction &action); void writeFrequencySelectionAction(const class FrequencySelectionAction &action); void writeFringeStopAction(const class FringeStopAction &action); void writeImagerAction(const class ImagerAction &action); diff --git a/CEP/DP3/AOFlagger/include/AOFlagger/rfi/thresholdtools.h b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/thresholdtools.h index 0eca7b22068cca1858af6d2972e1c4279f51eec1..0c828454dde1af62fa5ad2207e4e13d035f9b092 100644 --- a/CEP/DP3/AOFlagger/include/AOFlagger/rfi/thresholdtools.h +++ b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/thresholdtools.h @@ -51,8 +51,42 @@ class ThresholdTools { static void FilterConnectedSamples(Mask2DPtr mask, size_t minConnectedSampleArea, bool eightConnected=true); static void FilterConnectedSample(Mask2DPtr mask, unsigned x, unsigned y, size_t minConnectedSampleArea, bool eightConnected=true); static void UnrollPhase(Image2DPtr image); + + static Image2DPtr FrequencyRectangularConvolution(Image2DCPtr source, unsigned convolutionSize) + { + Image2DPtr image = Image2D::CreateCopy(source); + const unsigned upperWindowHalf = (convolutionSize+1) / 2; + for(size_t x=0;x<image->Width();++x) + { + num_t sum = 0.0; + for(unsigned y=0;y<upperWindowHalf;++y) + sum += image->Value(x, y); + for(unsigned y=upperWindowHalf;y<convolutionSize;++y) + { + image->SetValue(x, y-upperWindowHalf, sum/(num_t) y); + sum += image->Value(x, y); + } + unsigned count = convolutionSize; + for(unsigned y=convolutionSize;y!=image->Height();++y) + { + image->SetValue(x, y-upperWindowHalf, sum/(num_t) count); + sum += image->Value(x, y) - image->Value(x, y - convolutionSize); + } + for(unsigned y=image->Height();y!=image->Height() + upperWindowHalf;++y) + { + image->SetValue(x, y-upperWindowHalf, sum/(num_t) count); + sum -= image->Value(x, y - convolutionSize); + --count; + } + } + return image; + } private: ThresholdTools() { } + + // We need this less than operator, because the normal operator + // does not enforce a strictly ordered set, because a<b != !(b<a) in the case + // of nans/infs. static bool numLessThanOperator(const num_t &a, const num_t &b) { if(std::isfinite(a)) { if(std::isfinite(b)) diff --git a/CEP/DP3/AOFlagger/include/AOFlagger/util/ffttools.h b/CEP/DP3/AOFlagger/include/AOFlagger/util/ffttools.h index 3a3e8f76bb90ffa461769accc60dc77a8c1cf6d5..740125ef62652a04dcf24724a71b206adef87756 100644 --- a/CEP/DP3/AOFlagger/include/AOFlagger/util/ffttools.h +++ b/CEP/DP3/AOFlagger/include/AOFlagger/util/ffttools.h @@ -69,6 +69,10 @@ class FFTTools{ static Image2D *CreateFullImageFromFFT(const Image2D &fft); static Image2D *CreateShiftedImageFromFFT(const Image2D &fft); static Image2D *CreateAbsoluteImage(const Image2D &real, const Image2D &imaginary); + static Image2DPtr CreateAbsoluteImage(Image2DCPtr real, Image2DCPtr imaginary) + { + return Image2DPtr(CreateAbsoluteImage(*real, *imaginary)); + } static Image2DPtr CreatePhaseImage(Image2DCPtr real, Image2DCPtr imaginary); static void FFTConvolve(const Image2D &realIn, const Image2D &imaginaryIn, const Image2D &realKernel, const Image2D &imaginaryKernel, Image2D &outReal, Image2D &outImaginary); static void FFTConvolveFFTKernel(const Image2D &realIn, const Image2D &imaginaryIn, const Image2D &realFFTKernel, const Image2D &imaginaryFFTKernel, Image2D &outReal, Image2D &outImaginary); diff --git a/CEP/DP3/AOFlagger/src/rfi/strategy/actionfactory.cpp b/CEP/DP3/AOFlagger/src/rfi/strategy/actionfactory.cpp index 405e48db2cd93b87b1bb38a5c6ee799d20a2f2e7..f506d42cd6b9d55efc391c2520e63bf1b715958f 100644 --- a/CEP/DP3/AOFlagger/src/rfi/strategy/actionfactory.cpp +++ b/CEP/DP3/AOFlagger/src/rfi/strategy/actionfactory.cpp @@ -27,13 +27,14 @@ #include <AOFlagger/rfi/strategy/combineflagresults.h> #include <AOFlagger/rfi/strategy/cutareaaction.h> #include <AOFlagger/rfi/strategy/directionalcleanaction.h> -#include <AOFlagger/rfi/strategy/frequencyselectionaction.h> #include <AOFlagger/rfi/strategy/foreachbaselineaction.h> #include <AOFlagger/rfi/strategy/foreachcomplexcomponentaction.h> #include <AOFlagger/rfi/strategy/foreachpolarisationblock.h> #include <AOFlagger/rfi/strategy/foreachsimulatedbaselineaction.h> #include <AOFlagger/rfi/strategy/foreachmsaction.h> #include <AOFlagger/rfi/strategy/fouriertransformaction.h> +#include <AOFlagger/rfi/strategy/frequencyconvolutionaction.h> +#include <AOFlagger/rfi/strategy/frequencyselectionaction.h> #include <AOFlagger/rfi/strategy/fringestopaction.h> #include <AOFlagger/rfi/strategy/imageraction.h> #include <AOFlagger/rfi/strategy/iterationblock.h> @@ -69,6 +70,7 @@ const std::vector<std::string> ActionFactory::GetActionList() list.push_back("For each simulated baseline"); list.push_back("For each measurement set"); list.push_back("Fourier transformation"); + list.push_back("Frequency convolution"); list.push_back("Frequency selection"); list.push_back("Fringe stopping recovery"); list.push_back("Image"); @@ -115,6 +117,8 @@ Action *ActionFactory::CreateAction(const std::string &action) return new ForEachPolarisationBlock(); else if(action == "For each simulated baseline") return new ForEachSimulatedBaselineAction(); + else if(action == "Frequency convolution") + return new FrequencyConvolutionAction(); else if(action == "Frequency selection") return new FrequencySelectionAction(); else if(action == "Fringe stopping recovery") diff --git a/CEP/DP3/AOFlagger/src/rfi/strategy/strategyreader.cpp b/CEP/DP3/AOFlagger/src/rfi/strategy/strategyreader.cpp index 1c5a705920f639efc3b8f9a58319a371d102d0d2..089ed924d15d6f1950fb5b0b6905cb66374fc4d0 100644 --- a/CEP/DP3/AOFlagger/src/rfi/strategy/strategyreader.cpp +++ b/CEP/DP3/AOFlagger/src/rfi/strategy/strategyreader.cpp @@ -32,6 +32,7 @@ #include <AOFlagger/rfi/strategy/foreachmsaction.h> #include <AOFlagger/rfi/strategy/foreachpolarisationblock.h> #include <AOFlagger/rfi/strategy/fouriertransformaction.h> +#include <AOFlagger/rfi/strategy/frequencyconvolutionaction.h> #include <AOFlagger/rfi/strategy/frequencyselectionaction.h> #include <AOFlagger/rfi/strategy/fringestopaction.h> #include <AOFlagger/rfi/strategy/imageraction.h> @@ -247,6 +248,8 @@ Action *StrategyReader::parseAction(xmlNode *node) newAction = parseForEachPolarisationBlock(node); else if(typeStr == "FourierTransformAction") newAction = parseFourierTransformAction(node); + else if(typeStr == "FrequencyConvolutionAction") + newAction = parseFrequencyConvolutionAction(node); else if(typeStr == "FrequencySelectionAction") newAction = parseFrequencySelectionAction(node); else if(typeStr == "FringeStopAction") @@ -353,6 +356,9 @@ Action *StrategyReader::parseDirectionalCleanAction(xmlNode *node) { DirectionalCleanAction *newAction = new DirectionalCleanAction(); newAction->SetLimitingDistance(getDouble(node, "limiting-distance")); + newAction->SetChannelConvolutionSize(getInt(node, "channel-convolution-size")); + newAction->SetAttenuationOfCenter(getDouble(node, "attenuation-of-center")); + newAction->SetMakePlot(getBool(node, "make-plot")); return newAction; } @@ -450,6 +456,13 @@ Action *StrategyReader::parseFourierTransformAction(xmlNode *) return newAction; } +class Action *StrategyReader::parseFrequencyConvolutionAction(xmlNode *node) +{ + FrequencyConvolutionAction *newAction = new FrequencyConvolutionAction(); + newAction->SetConvolutionSize(getInt(node, "convolution-size")); + return newAction; +} + class Action *StrategyReader::parseFrequencySelectionAction(xmlNode *node) { FrequencySelectionAction *newAction = new FrequencySelectionAction(); diff --git a/CEP/DP3/AOFlagger/src/rfi/strategy/strategywriter.cpp b/CEP/DP3/AOFlagger/src/rfi/strategy/strategywriter.cpp index d9593f7b1503620fe8aeae2e13388e04eb01c700..300f219c06b872c73cd371b320b2d17581c80222 100644 --- a/CEP/DP3/AOFlagger/src/rfi/strategy/strategywriter.cpp +++ b/CEP/DP3/AOFlagger/src/rfi/strategy/strategywriter.cpp @@ -31,6 +31,7 @@ #include <AOFlagger/rfi/strategy/foreachmsaction.h> #include <AOFlagger/rfi/strategy/foreachpolarisationblock.h> #include <AOFlagger/rfi/strategy/fouriertransformaction.h> +#include <AOFlagger/rfi/strategy/frequencyconvolutionaction.h> #include <AOFlagger/rfi/strategy/frequencyselectionaction.h> #include <AOFlagger/rfi/strategy/fringestopaction.h> #include <AOFlagger/rfi/strategy/imageraction.h> @@ -127,6 +128,9 @@ namespace rfiStrategy { case FourierTransformActionType: writeFourierTransformAction(static_cast<const FourierTransformAction&>(action)); break; + case FrequencyConvolutionActionType: + writeFrequencyConvolutionAction(static_cast<const FrequencyConvolutionAction&>(action)); + break; case FrequencySelectionActionType: writeFrequencySelectionAction(static_cast<const FrequencySelectionAction&>(action)); break; @@ -248,6 +252,9 @@ namespace rfiStrategy { { Attribute("type", "DirectionalCleanAction"); Write<double>("limiting-distance", action.LimitingDistance()); + Write<int>("channel-convolution-size", action.ChannelConvolutionSize()); + Write<double>("attenuation-of-center", action.AttenuationOfCenter()); + Write<bool>("make-plot", action.MakePlot()); } void StrategyWriter::writeForEachBaselineAction(const ForEachBaselineAction &action) @@ -302,6 +309,12 @@ namespace rfiStrategy { Attribute("type", "FourierTransformAction"); } + void StrategyWriter::writeFrequencyConvolutionAction(const FrequencyConvolutionAction &action) + { + Attribute("type", "FrequencyConvolutionAction"); + Write<double>("convolution-size", action.ConvolutionSize()); + } + void StrategyWriter::writeFrequencySelectionAction(const FrequencySelectionAction &action) { Attribute("type", "FrequencySelectionAction");