diff --git a/.gitattributes b/.gitattributes index 8a8400c3b6ae018d88eea24f4fd35dbca7df1703..de64c6841c537dfe79d8265b9933c370e7a87f0d 100644 --- a/.gitattributes +++ b/.gitattributes @@ -210,6 +210,7 @@ CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/combineflagresults.h -text CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/cutareaaction.h -text CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/fitsimageset.h -text CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/foreachbaselineaction.h -text +CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/foreachcomplexcomponentaction.h -text 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/frequencyselectionaction.h -text diff --git a/CEP/DP3/AOFlagger/include/AOFlagger/CMakeLists.txt b/CEP/DP3/AOFlagger/include/AOFlagger/CMakeLists.txt index 689ea31709b9451753b34219cfbe1cf039edeb37..f816222fa715da6b3992b3484cc64b0d56f90686 100644 --- a/CEP/DP3/AOFlagger/include/AOFlagger/CMakeLists.txt +++ b/CEP/DP3/AOFlagger/include/AOFlagger/CMakeLists.txt @@ -131,6 +131,7 @@ install(FILES rfi/strategy/combineflagresults.h rfi/strategy/fitsimageset.h rfi/strategy/foreachbaselineaction.h + rfi/strategy/foreachcomplexcomponentaction.h rfi/strategy/foreachmsaction.h rfi/strategy/foreachpolarisationblock.h rfi/strategy/frequencyselectionaction.h diff --git a/CEP/DP3/AOFlagger/include/AOFlagger/imaging/model.h b/CEP/DP3/AOFlagger/include/AOFlagger/imaging/model.h index b1d4535f1e5c65ca2b5718358555e71a0abea3d4..5260ec3caa4bb54043e801a4e152b88dd641772b 100644 --- a/CEP/DP3/AOFlagger/include/AOFlagger/imaging/model.h +++ b/CEP/DP3/AOFlagger/include/AOFlagger/imaging/model.h @@ -31,6 +31,7 @@ template<typename T> struct OutputReceiver { + void SetY(size_t) { } }; template<> struct OutputReceiver<class UVImager> @@ -98,6 +99,7 @@ class Model { static num_t GetWPosition(num_t delayDirectionDec, num_t delayDirectionRA, num_t frequency, num_t earthLattitudeAngle, num_t dx, num_t dy); void loadUrsaMajor(); + void loadUrsaMajorDistortingSource(); private: std::vector<PointSource *> _sources; double _noiseSigma, _sourceSigma; diff --git a/CEP/DP3/AOFlagger/include/AOFlagger/imaging/observatorium.h b/CEP/DP3/AOFlagger/include/AOFlagger/imaging/observatorium.h index 6e019a21233277c981ea5b7559a726e1d02251eb..576236a4077aaed36d1a51580b646a577c999f24 100644 --- a/CEP/DP3/AOFlagger/include/AOFlagger/imaging/observatorium.h +++ b/CEP/DP3/AOFlagger/include/AOFlagger/imaging/observatorium.h @@ -14,11 +14,13 @@ class Observatorium } size_t AntennaCount() const { return _antennae.size(); } const AntennaInfo &GetAntenna(size_t index) const { return _antennae[index]; } + void SetChannelWidthHz(double channelWidthHz) { _channelWidthHz = channelWidthHz; } double ChannelWidthHz() const { return _channelWidthHz; } + const struct BandInfo &BandInfo() const { return _bandInfo; @@ -42,6 +44,7 @@ struct WSRTObservatorium : public Observatorium WSRTn(i, antennas[i]); AddAntenna(antennas[i]); } + initBand(); } WSRTObservatorium(size_t antenna1, size_t antenna2) { @@ -52,6 +55,7 @@ struct WSRTObservatorium : public Observatorium WSRTn(antenna2, antennas[1]); AddAntenna(antennas[0]); AddAntenna(antennas[1]); + initBand(); } private: @@ -167,16 +171,16 @@ struct WSRTObservatorium : public Observatorium } void initBand() { - SetChannelWidthHz(10000.0); GetBandInfo().windowIndex = 0; - GetBandInfo().channelCount = 256; - for(size_t i=0;i<256;++i) + GetBandInfo().channelCount = 16; + SetChannelWidthHz(10000.0 * 256.0 / GetBandInfo().channelCount); + for(size_t i=0;i<GetBandInfo().channelCount;++i) { ChannelInfo channel; channel.frequencyIndex = i; channel.channelWidthHz = ChannelWidthHz(); channel.frequencyHz = 147000000.0 + ChannelWidthHz() * i; - GetBandInfo().channels[i] = channel; + GetBandInfo().channels.push_back(channel); } } }; diff --git a/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/foreachcomplexcomponentaction.h b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/foreachcomplexcomponentaction.h new file mode 100644 index 0000000000000000000000000000000000000000..7b98905c25a8d09ef62171aae2568ac975c8c2f9 --- /dev/null +++ b/CEP/DP3/AOFlagger/include/AOFlagger/rfi/strategy/foreachcomplexcomponentaction.h @@ -0,0 +1,252 @@ +/*************************************************************************** + * 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 FOR_EACH_COMPLEX_COMPONENT_ACTION_H +#define FOR_EACH_COMPLEX_COMPONENT_ACTION_H + +#include "artifactset.h" +#include "actionblock.h" + +namespace rfiStrategy { + + class ForEachComplexComponentAction : public ActionBlock + { + public: + ForEachComplexComponentAction() : ActionBlock(), _onAmplitude(false), _onPhase(false), _onReal(true), _onImaginary(true) + { + } + virtual std::string Description() + { + return "For each complex component"; + } + virtual ActionType Type() const { return AdapterType; } + virtual void Perform(ArtifactSet &artifacts, class ProgressListener &listener) + { + size_t taskCount = 0; + if(_onAmplitude) ++taskCount; + if(_onPhase) ++taskCount; + if(_onReal) ++taskCount; + if(_onImaginary) ++taskCount; + + size_t taskIndex = 0; + + if(_onAmplitude) { + listener.OnStartTask(taskIndex, taskCount, "On amplitude"); + performOnAmplitude(artifacts, listener); + listener.OnEndTask(); + ++taskIndex; + } + if(_onPhase) { + listener.OnStartTask(taskIndex, taskCount, "On phase"); + performOnPhaseRepresentation(artifacts, listener, TimeFrequencyData::PhasePart); + listener.OnEndTask(); + ++taskIndex; + } + if(_onReal) { + listener.OnStartTask(taskIndex, taskCount, "On real"); + performOnPhaseRepresentation(artifacts, listener, TimeFrequencyData::RealPart); + listener.OnEndTask(); + ++taskIndex; + } + if(_onImaginary) { + listener.OnStartTask(taskIndex, taskCount, "On imaginary"); + performOnPhaseRepresentation(artifacts, listener, TimeFrequencyData::ImaginaryPart); + listener.OnEndTask(); + ++taskIndex; + } + } + void SetRestoreFromAmplitude(bool restoreFromAmplitude) + { + _restoreFromAmplitude = restoreFromAmplitude; + } + bool RestoreFromAmplitude() const + { + return _restoreFromAmplitude; + } + void SetOnAmplitude(bool onAmplitude) + { + _onAmplitude = onAmplitude; + } + bool OnAmplitude() const + { + return _onAmplitude; + } + void SetOnPhase(bool onPhase) + { + _onPhase = onPhase; + } + bool OnPhase() const + { + return _onPhase; + } + void SetOnReal(bool onReal) + { + _onReal = onReal; + } + bool OnReal() const + { + return _onReal; + } + void SetOnImaginary(bool onImaginary) + { + _onImaginary = onImaginary; + } + bool OnImaginary() const + { + return _onImaginary; + } + private: + void performOnAmplitude(ArtifactSet &artifacts, class ProgressListener &listener) + { + enum TimeFrequencyData::PhaseRepresentation contaminatedPhase = + artifacts.ContaminatedData().PhaseRepresentation(); + enum TimeFrequencyData::PhaseRepresentation revisedPhase = + artifacts.RevisedData().PhaseRepresentation(); + enum TimeFrequencyData::PhaseRepresentation originalPhase = + artifacts.OriginalData().PhaseRepresentation(); + + if(contaminatedPhase == TimeFrequencyData::ComplexRepresentation) + { + TimeFrequencyData *newContaminatedData = + artifacts.ContaminatedData().CreateTFData(TimeFrequencyData::AmplitudePart); + artifacts.SetContaminatedData(*newContaminatedData); + delete newContaminatedData; + } + if(revisedPhase == TimeFrequencyData::ComplexRepresentation) + { + TimeFrequencyData *newRevisedData = + artifacts.RevisedData().CreateTFData(TimeFrequencyData::AmplitudePart); + artifacts.SetRevisedData(*newRevisedData); + delete newRevisedData; + } + if(originalPhase == TimeFrequencyData::ComplexRepresentation) + { + TimeFrequencyData *newOriginalData = + artifacts.OriginalData().CreateTFData(TimeFrequencyData::AmplitudePart); + artifacts.SetOriginalData(*newOriginalData); + delete newOriginalData; + } + + ActionBlock::Perform(artifacts, listener); + + if(_restoreFromAmplitude) + { + if(contaminatedPhase == TimeFrequencyData::ComplexRepresentation) + { + TimeFrequencyData *newContaminatedData = + TimeFrequencyData::CreateTFDataFromComplexCombination(artifacts.ContaminatedData(), artifacts.ContaminatedData()); + newContaminatedData->MultiplyImages(1.0L/M_SQRT2); + newContaminatedData->SetMask(artifacts.ContaminatedData()); + artifacts.SetContaminatedData(*newContaminatedData); + delete newContaminatedData; + } + if(revisedPhase == TimeFrequencyData::ComplexRepresentation) + { + TimeFrequencyData *newRevisedData = + TimeFrequencyData::CreateTFDataFromComplexCombination(artifacts.RevisedData(), artifacts.RevisedData()); + newRevisedData->MultiplyImages(1.0L/M_SQRT2); + newRevisedData->SetMask(artifacts.RevisedData()); + artifacts.SetRevisedData(*newRevisedData); + delete newRevisedData; + } + if(originalPhase == TimeFrequencyData::ComplexRepresentation) + { + TimeFrequencyData *newOriginalData = + TimeFrequencyData::CreateTFDataFromComplexCombination(artifacts.OriginalData(), artifacts.OriginalData()); + newOriginalData->MultiplyImages(1.0L/M_SQRT2); + newOriginalData->SetMask(artifacts.OriginalData()); + artifacts.SetOriginalData(*newOriginalData); + delete newOriginalData; + } + } + } + + void performOnPhaseRepresentation(ArtifactSet &artifacts, class ProgressListener &listener, enum TimeFrequencyData::PhaseRepresentation phaseRepresentation) + { + enum TimeFrequencyData::PhaseRepresentation + contaminatedPhase = artifacts.ContaminatedData().PhaseRepresentation(), + revisedPhase = artifacts.RevisedData().PhaseRepresentation(), + originalPhase = artifacts.OriginalData().PhaseRepresentation(); + + TimeFrequencyData + prevContaminated = artifacts.ContaminatedData(), + prevRevised = artifacts.RevisedData(), + prevOriginal = artifacts.OriginalData(); + + if(contaminatedPhase == TimeFrequencyData::ComplexRepresentation) + { + TimeFrequencyData *newContaminatedData = + artifacts.ContaminatedData().CreateTFData(phaseRepresentation); + artifacts.SetContaminatedData(*newContaminatedData); + delete newContaminatedData; + } + if(revisedPhase == TimeFrequencyData::ComplexRepresentation) + { + TimeFrequencyData *newRevisedData = + artifacts.RevisedData().CreateTFData(phaseRepresentation); + artifacts.SetRevisedData(*newRevisedData); + delete newRevisedData; + } + if(originalPhase == TimeFrequencyData::ComplexRepresentation) + { + TimeFrequencyData *newOriginalData = + artifacts.OriginalData().CreateTFData(phaseRepresentation); + artifacts.SetOriginalData(*newOriginalData); + delete newOriginalData; + } + + ActionBlock::Perform(artifacts, listener); + + if(phaseRepresentation != TimeFrequencyData::PhasePart) + { + if(contaminatedPhase == TimeFrequencyData::ComplexRepresentation) + setPart(artifacts.ContaminatedData(), prevContaminated); + if(revisedPhase == TimeFrequencyData::ComplexRepresentation) + setPart(artifacts.RevisedData(), prevRevised); + if(originalPhase == TimeFrequencyData::ComplexRepresentation) + setPart(artifacts.OriginalData(), prevOriginal); + } + } + void setPart(TimeFrequencyData &changedData, TimeFrequencyData &prevData) + { + TimeFrequencyData *newData, *otherPart; + switch(changedData.PhaseRepresentation()) + { + default: + case TimeFrequencyData::RealPart: + otherPart = prevData.CreateTFData(TimeFrequencyData::ImaginaryPart); + newData = TimeFrequencyData::CreateTFDataFromComplexCombination(changedData, *otherPart); + break; + case TimeFrequencyData::ImaginaryPart: + otherPart = prevData.CreateTFData(TimeFrequencyData::RealPart); + newData = TimeFrequencyData::CreateTFDataFromComplexCombination(*otherPart, changedData); + break; + } + changedData = *newData; + delete newData; + delete otherPart; + } + + bool _restoreFromAmplitude; + bool _onAmplitude, _onPhase, _onReal, _onImaginary; + }; + +} // namespace + +#endif // FOR_EACH_COMPLEX_COMPONENT_ACTION_H diff --git a/CEP/DP3/AOFlagger/src/gui/mswindow.cpp b/CEP/DP3/AOFlagger/src/gui/mswindow.cpp index 1fe8f1377a2f7aea4887797327dffc740f3d8305..9a32ffd69e0d41e8adf42c0a42240fa1b5d599c2 100644 --- a/CEP/DP3/AOFlagger/src/gui/mswindow.cpp +++ b/CEP/DP3/AOFlagger/src/gui/mswindow.cpp @@ -1246,7 +1246,7 @@ void MSWindow::onShowImagePlane() void MSWindow::onAddToImagePlane() { try { - if(_timeFrequencyWidget.GetMetaData() != 0) + if(_timeFrequencyWidget.GetMetaData() != 0 && _timeFrequencyWidget.GetMetaData()->HasUVW()) _imagePlaneWindow->AddData(GetActiveData(), _timeFrequencyWidget.GetMetaData()); else if(_spatialMetaData != 0) _imagePlaneWindow->AddData(GetActiveData(), _spatialMetaData); @@ -1372,6 +1372,7 @@ void MSWindow::onSimulateCorrelation() { Model model; model.loadUrsaMajor(); + model.loadUrsaMajorDistortingSource(); WSRTObservatorium wsrtObservatorium; model.SimulateObservation(*_imagePlaneWindow->GetImager(), wsrtObservatorium, -M_PIn-0.05, 0.05, 147000000.0); @@ -1382,6 +1383,7 @@ void MSWindow::onSimulateDoubledBaselineCorrelation() { Model model; model.loadUrsaMajor(); + model.loadUrsaMajorDistortingSource(); WSRTObservatorium wsrtObservatorium(0,5); std::pair<TimeFrequencyData, TimeFrequencyMetaDataPtr> pair = model.SimulateObservation(wsrtObservatorium, -M_PIn-0.05, 0.05, 147000000.0); diff --git a/CEP/DP3/AOFlagger/src/imaging/model.cpp b/CEP/DP3/AOFlagger/src/imaging/model.cpp index 743c98c753f9eab8a5e725a5331188c35fa041a6..a3549ef6df7a4ff73e55073bf1c62eaee7224afb 100644 --- a/CEP/DP3/AOFlagger/src/imaging/model.cpp +++ b/CEP/DP3/AOFlagger/src/imaging/model.cpp @@ -38,11 +38,11 @@ Model::~Model() template<typename T> void Model::SimulateObservation(struct OutputReceiver<T> &receiver, Observatorium &observatorium, num_t delayDirectionDEC, num_t delayDirectionRA, num_t frequency) { - size_t frequencySteps = 1; + size_t channelCount = observatorium.BandInfo().channelCount; - for(size_t f=0;f<frequencySteps;++f) + for(size_t f=0;f<channelCount;++f) { - double channelFrequency = frequency + observatorium.ChannelWidthHz() * f * 256/frequencySteps; + double channelFrequency = frequency + observatorium.ChannelWidthHz() * f; receiver.SetY(f); for(size_t i=0;i<observatorium.AntennaCount();++i) { @@ -67,9 +67,10 @@ template void Model::SimulateObservation(struct OutputReceiver<TimeFrequencyData std::pair<TimeFrequencyData, TimeFrequencyMetaDataPtr> Model::SimulateObservation(class Observatorium &observatorium, num_t delayDirectionDEC, num_t delayDirectionRA, num_t frequency) { + size_t channelCount = observatorium.BandInfo().channelCount; OutputReceiver<TimeFrequencyData> tfOutputter; - tfOutputter._real = Image2D::CreateZeroImagePtr(12*60*60/10, 1); - tfOutputter._imaginary = Image2D::CreateZeroImagePtr(12*60*60/10, 1); + tfOutputter._real = Image2D::CreateZeroImagePtr(12*60*60/10, channelCount); + tfOutputter._imaginary = Image2D::CreateZeroImagePtr(12*60*60/10, channelCount); SimulateObservation(tfOutputter, observatorium, delayDirectionDEC, delayDirectionRA, frequency); TimeFrequencyMetaData *metaData = new TimeFrequencyMetaData(); @@ -77,7 +78,22 @@ std::pair<TimeFrequencyData, TimeFrequencyMetaDataPtr> Model::SimulateObservatio metaData->SetAntenna2(observatorium.GetAntenna(1)); metaData->SetBand(observatorium.BandInfo()); std::vector<double> times; - for(num_t t=0.0;t<12*60*60;t+=10) times.push_back(t); + std::vector<UVW> uvws; + num_t wavelength = 1.0L / frequency; + double + dx = metaData->Antenna1().position.x - metaData->Antenna2().position.x, + dy = metaData->Antenna1().position.y - metaData->Antenna2().position.y, + dz = metaData->Antenna1().position.z - metaData->Antenna2().position.z; + for(num_t t=0.0;t<12*60*60;t+=10) + { + times.push_back(t); + num_t earthLattitudeApprox = t*(M_PIn/12.0/60.0/60.0); + UVW uvw; + GetUVPosition(uvw.u, uvw.v, earthLattitudeApprox, delayDirectionDEC, delayDirectionRA, dx, dy, dz, wavelength); + uvw.w = 0.0; + uvws.push_back(uvw); + } + metaData->SetUVW(uvws); metaData->SetObservationTimes(times); return std::pair<TimeFrequencyData, TimeFrequencyMetaDataPtr>(TimeFrequencyData(StokesIPolarisation, tfOutputter._real, tfOutputter._imaginary), TimeFrequencyMetaDataPtr(metaData)); @@ -247,3 +263,15 @@ void Model::loadUrsaMajor() AddSource(cd + s*rs*2, cr + s*-131, 5.0/8.0 + fluxoffset); // Zeta AddSource(cd + s*rs*-36, cr + s*-192, 7.0/8.0 + fluxoffset); // Alkaid } + +void Model::loadUrsaMajorDistortingSource() +{ + double + s = 0.00005, //scale + rs = 8.0; // stretch in dec + double cd = -M_PIn - 0.05; + double cr = 0.05; + double fluxoffset = 0.0; + + AddSource(cd + s*rs*160, cr + s*300, 4.0 + fluxoffset); // Dubhe +} diff --git a/CEP/DP3/AOFlagger/src/rfi/strategy/actionfactory.cpp b/CEP/DP3/AOFlagger/src/rfi/strategy/actionfactory.cpp index c60585c5c53d0cb8dfcc126f754ee56dbb0ac7e8..b21c6216d47369e00297df62ea76a4077898fea0 100644 --- a/CEP/DP3/AOFlagger/src/rfi/strategy/actionfactory.cpp +++ b/CEP/DP3/AOFlagger/src/rfi/strategy/actionfactory.cpp @@ -28,6 +28,7 @@ #include <AOFlagger/rfi/strategy/cutareaaction.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/foreachmsaction.h> #include <AOFlagger/rfi/strategy/fringestopaction.h> @@ -56,6 +57,7 @@ const std::vector<std::string> ActionFactory::GetActionList() list.push_back("Combine flag results"); list.push_back("Cut area"); list.push_back("For each baseline"); + list.push_back("For each complex component"); list.push_back("For each polarisation"); list.push_back("For each measurement set"); list.push_back("Frequency selection"); @@ -91,6 +93,8 @@ Action *ActionFactory::CreateAction(const std::string &action) return new CutAreaAction(); else if(action == "For each baseline") return new ForEachBaselineAction(); + else if(action == "For each complex component") + return new ForEachComplexComponentAction(); else if(action == "For each measurement set") return new ForEachMSAction(); else if(action == "For each polarisation")