Skip to content
Snippets Groups Projects
Commit 557aa7be authored by Andre Offringa's avatar Andre Offringa
Browse files

Bug 1491: largely refactoring the timeconvolutionaction

parent be8dff33
No related branches found
No related tags found
No related merge requests found
...@@ -141,6 +141,34 @@ namespace rfiStrategy { ...@@ -141,6 +141,34 @@ namespace rfiStrategy {
bool IsSincScaleInSamples() const { return _isSincScaleInSamples; } bool IsSincScaleInSamples() const { return _isSincScaleInSamples; }
void SetIsSincScaleInSamples(bool inSamples) { _isSincScaleInSamples = inSamples; } void SetIsSincScaleInSamples(bool inSamples) { _isSincScaleInSamples = inSamples; }
private: private:
struct IterationData
{
ArtifactSet
*artifacts;
size_t
width,
fourierWidth,
rangeStart,
rangeEnd,
vZeroPos,
startXf,
endXf;
numl_t
maxDist;
numl_t
*rowRValues,
*rowIValues,
*rowUPositions,
*rowVPositions,
*fourierValuesReal,
*fourierValuesImag;
numl_t
**fSinTable,
**fCosTable;
bool
*rowSignsNegated;
};
Image2DPtr PerformSingleSincOperation(ArtifactSet &artifacts) const Image2DPtr PerformSingleSincOperation(ArtifactSet &artifacts) const
{ {
TimeFrequencyData data = artifacts.ContaminatedData(); TimeFrequencyData data = artifacts.ContaminatedData();
...@@ -265,125 +293,118 @@ private: ...@@ -265,125 +293,118 @@ private:
return newImage; return newImage;
} }
void PerformExtrapolatedSincOperation(ArtifactSet &artifacts, Image2DPtr real, Image2DPtr imaginary, class ProgressListener &listener) const void Project(class IterationData &iterData, Image2DCPtr real, Image2DCPtr imaginary, size_t y) const
{
TimeFrequencyMetaDataCPtr metaData = artifacts.MetaData();
const size_t width = real->Width();
const size_t fourierWidth = width * 2;
const BandInfo band = artifacts.MetaData()->Band();
numl_t
*rowRValues = new numl_t[width],
*rowIValues = new numl_t[width],
*rowUPositions = new numl_t[width],
*rowVPositions = new numl_t[width],
*fourierValuesReal = new numl_t[fourierWidth],
*fourierValuesImag = new numl_t[fourierWidth];
bool
*rowSignsNegated = new bool[width];
for(size_t y=0;y<real->Height();++y)
{ {
listener.OnProgress(*this, y, real->Height()); UVProjection::Project(real, iterData.artifacts->MetaData(), y, iterData.rowRValues, iterData.rowUPositions, iterData.rowVPositions, iterData.rowSignsNegated, _directionRad, false);
UVProjection::Project(imaginary, iterData.artifacts->MetaData(), y, iterData.rowIValues, iterData.rowUPositions, iterData.rowVPositions, iterData.rowSignsNegated, _directionRad, true);
UVProjection::Project(real, metaData, y, rowRValues, rowUPositions, rowVPositions, rowSignsNegated, _directionRad, false);
UVProjection::Project(imaginary, metaData, y, rowIValues, rowUPositions, rowVPositions, rowSignsNegated, _directionRad, true);
// Find the point closest to v=0 // Find the point closest to v=0
numl_t vDist = fabsnl(rowVPositions[0]); const size_t width = real->Width();
numl_t vDist = fabsnl( iterData.rowVPositions[0]);
size_t vZeroPos = 0; size_t vZeroPos = 0;
for(unsigned i=1;i<width;++i) for(unsigned i=1;i<width;++i)
{ {
if(fabsnl(rowVPositions[i]) < vDist) if(fabsnl( iterData.rowVPositions[i]) < vDist)
{ {
vDist = fabsnl(rowVPositions[i]); vDist = fabsnl( iterData.rowVPositions[i]);
vZeroPos = i; vZeroPos = i;
} }
} }
const numl_t maxDist = fabsnl(rowUPositions[vZeroPos]); iterData.vZeroPos = iterData.vZeroPos;
iterData.maxDist = fabsnl( iterData.rowUPositions[vZeroPos]);
AOLogger::Debug << "v is min at t=" << vZeroPos << " (v=+-" << vDist << ", maxDist=" << maxDist << ")\n"; AOLogger::Debug << "v is min at t=" << vZeroPos << " (v=+-" << vDist << ", maxDist=" << iterData.maxDist << ")\n";
}
size_t void PrecalculateFTFactors(class IterationData &iterData) const
rangeStart = (size_t) roundn(_etaParameter * (num_t) width / 2.0), {
rangeEnd = width - rangeStart; const size_t
width = iterData.width,
fourierWidth = iterData.fourierWidth,
rangeStart = iterData.rangeStart,
rangeEnd = iterData.rangeEnd;
// Precalculate sinus values for FT iterData.fSinTable = new numl_t*[fourierWidth],
numl_t iterData.fCosTable = new numl_t*[fourierWidth];
**fSinTable = new numl_t*[fourierWidth],
**fCosTable = new numl_t*[fourierWidth];
for(size_t xF=0;xF<fourierWidth;++xF) for(size_t xF=0;xF<fourierWidth;++xF)
{ {
fSinTable[xF] = new numl_t[rangeEnd - rangeStart]; iterData.fSinTable[xF] = new numl_t[rangeEnd - rangeStart];
fCosTable[xF] = new numl_t[rangeEnd - rangeStart]; iterData.fCosTable[xF] = new numl_t[rangeEnd - rangeStart];
// F(xF) = \int f(u) * e^(-i 2 \pi * u_n * xF_n) // F(xF) = \int f(u) * e^(-i 2 \pi * u_n * xF_n)
// xF \in [0 : fourierWidth] -> xF_n = 2 xF / fourierWidth - 1 \in [-1 : 1]; // xF \in [0 : fourierWidth] -> xF_n = 2 xF / fourierWidth - 1 \in [-1 : 1];
// u \in [-maxDist : maxDist] -> u_n = u * width / maxDist \in [ -width : width ] // u \in [-maxDist : maxDist] -> u_n = u * width / maxDist \in [ -width : width ]
// final frequenty domain covers [-maxDist : maxDist] // final frequenty domain covers [-maxDist : maxDist]
const numl_t const numl_t
fourierPos = (numl_t) xF / fourierWidth - 0.5, fourierPos = (numl_t) xF / fourierWidth - 0.5,
fourierFactor = -fourierPos * 2.0 * M_PInl * width * 0.5 / maxDist; fourierFactor = -fourierPos * 2.0 * M_PInl * width * 0.5 / iterData.maxDist;
for(size_t tIndex=rangeStart;tIndex<rangeEnd;++tIndex) for(size_t tIndex=rangeStart;tIndex<rangeEnd;++tIndex)
{ {
size_t t = (tIndex + width - vZeroPos) % width; size_t t = (tIndex + width - iterData.vZeroPos) % width;
const numl_t posU = rowUPositions[t]; const numl_t posU = iterData.rowUPositions[t];
fCosTable[xF][tIndex-rangeStart] = cosnl(fourierFactor * posU); iterData.fCosTable[xF][tIndex-rangeStart] = cosnl(fourierFactor * posU);
fSinTable[xF][tIndex-rangeStart] = sinnl(fourierFactor * posU); iterData.fSinTable[xF][tIndex-rangeStart] = sinnl(fourierFactor * posU);
}
} }
} }
for(unsigned iteration=0;iteration<_iterations;++iteration) void PerformFourierTransform(class IterationData &iterData, Image2DPtr real, Image2DPtr imaginary, size_t y) const
{ {
const size_t
rangeStart = iterData.rangeStart,
rangeEnd = iterData.rangeEnd,
width = iterData.width,
vZeroPos = iterData.vZeroPos;
// Perform a 1d Fourier transform, ignoring eta part of the data // Perform a 1d Fourier transform, ignoring eta part of the data
for(size_t xF=0;xF<fourierWidth;++xF) for(size_t xF=0;xF<iterData.fourierWidth;++xF)
{ {
numl_t numl_t
realVal = 0.0, realVal = 0.0,
imagVal = 0.0, imagVal = 0.0,
weightSum = 0.0; weightSum = 0.0;
const numl_t
*fCosTable = iterData.fCosTable[xF],
*fSinTable = iterData.fSinTable[xF];
// compute F(xF) = \int f(x) * exp( -2 * \pi * i * x * xF ) // compute F(xF) = \int f(x) * exp( -2 * \pi * i * x * xF )
for(size_t tIndex=rangeStart;tIndex<rangeEnd;++tIndex) for(size_t tIndex=rangeStart;tIndex<rangeEnd;++tIndex)
{ {
size_t t = (tIndex + width - vZeroPos) % width; size_t t = (tIndex + width - vZeroPos) % width;
if(rowUPositions[t] != 0.0) if(iterData.rowUPositions[t] != 0.0)
{ {
const numl_t weight = 1.0;//fabsnl(rowVPositions[t]/posU); const numl_t weight = 1.0;//fabsnl(rowVPositions[t]/posU);
const numl_t weightSqrt = 1.0;//sqrtnl(weight); const numl_t weightSqrt = 1.0;//sqrtnl(weight);
realVal += (rowRValues[t] * fCosTable[xF][tIndex-rangeStart] - realVal += (iterData.rowRValues[t] * fCosTable[tIndex-rangeStart] -
rowIValues[t] * fSinTable[xF][tIndex-rangeStart]) * weightSqrt; iterData.rowIValues[t] * fSinTable[tIndex-rangeStart]) * weightSqrt;
imagVal += (rowIValues[t] * fCosTable[xF][tIndex-rangeStart] + imagVal += (iterData.rowIValues[t] * fCosTable[tIndex-rangeStart] +
rowRValues[t] * fSinTable[xF][tIndex-rangeStart]) * weightSqrt; iterData.rowRValues[t] * fSinTable[tIndex-rangeStart]) * weightSqrt;
weightSum += weight; weightSum += weight;
} }
} }
fourierValuesReal[xF] = realVal / weightSum; iterData.fourierValuesReal[xF] = realVal / weightSum;
fourierValuesImag[xF] = imagVal / weightSum; iterData.fourierValuesImag[xF] = imagVal / weightSum;
if(_operation == ProjectedFTOperation) if(_operation == ProjectedFTOperation)
{ {
real->SetValue(xF/2, y, (num_t) realVal / weightSum); real->SetValue(xF/2, y, (num_t) realVal / weightSum);
imaginary->SetValue(xF/2, y, (num_t) imagVal / weightSum); imaginary->SetValue(xF/2, y, (num_t) imagVal / weightSum);
} }
} }
}
numl_t sincScale = ActualSincScaleInLambda(artifacts, band.channels[y].frequencyHz); void InvFourierTransform(class IterationData &iterData, Image2DPtr real, Image2DPtr imaginary, size_t y) const
numl_t clippingFrequency = 1.0/(sincScale * width / maxDist);
long fourierClippingIndex = (long) ceilnl((numl_t) fourierWidth * 0.5 * clippingFrequency);
if(fourierClippingIndex*2 > (long) fourierWidth) fourierClippingIndex = fourierWidth/2;
if(fourierClippingIndex < 0) fourierClippingIndex = 0;
size_t
startXf = fourierWidth/2 - fourierClippingIndex,
endXf = fourierWidth/2 + fourierClippingIndex;
if(_operation == ExtrapolatedSincOperation)
{ {
const size_t
startXf = iterData.startXf,
endXf = iterData.endXf,
width = iterData.width,
fourierWidth = iterData.fourierWidth;
AOLogger::Debug << "Inv FT, using 0-" << startXf << " and " << endXf << "-" << fourierWidth << '\n'; AOLogger::Debug << "Inv FT, using 0-" << startXf << " and " << endXf << "-" << fourierWidth << '\n';
for(size_t t=0;t<width;++t) for(size_t t=0;t<width;++t)
{ {
const numl_t const numl_t
posU = rowUPositions[t], posU = iterData.rowUPositions[t],
posV = rowVPositions[t], posV = iterData.rowVPositions[t],
posFactor = posU * 2.0 * M_PInl; posFactor = posU * 2.0 * M_PInl;
numl_t numl_t
realVal = 0.0, realVal = 0.0,
...@@ -409,8 +430,8 @@ private: ...@@ -409,8 +430,8 @@ private:
{ {
const numl_t const numl_t
fourierPosL = (numl_t) xF / fourierWidth - 0.5, fourierPosL = (numl_t) xF / fourierWidth - 0.5,
fourierRealL = fourierValuesReal[xF], fourierRealL = iterData.fourierValuesReal[xF],
fourierImagL = fourierValuesImag[xF]; fourierImagL = iterData.fourierValuesImag[xF];
const numl_t const numl_t
cosValL = cosnl(fourierPosL * posFactor), cosValL = cosnl(fourierPosL * posFactor),
...@@ -423,8 +444,8 @@ private: ...@@ -423,8 +444,8 @@ private:
{ {
const numl_t const numl_t
fourierPosR = (numl_t) (endXf + xF) / fourierWidth - 0.5, fourierPosR = (numl_t) (endXf + xF) / fourierWidth - 0.5,
fourierRealR = fourierValuesReal[endXf + xF], fourierRealR = iterData.fourierValuesReal[endXf + xF],
fourierImagR = fourierValuesImag[endXf + xF]; fourierImagR = iterData.fourierValuesImag[endXf + xF];
const numl_t const numl_t
cosValR = cosnl(fourierPosR * posFactor), cosValR = cosnl(fourierPosR * posFactor),
...@@ -436,27 +457,41 @@ private: ...@@ -436,27 +457,41 @@ private:
++xF; ++xF;
} }
real->SetValue(t, y, -realVal/weightSum); real->SetValue(t, y, -realVal/weightSum);
if(rowSignsNegated[t]) if(iterData.rowSignsNegated[t])
imaginary->SetValue(t, y, imagVal/weightSum); imaginary->SetValue(t, y, imagVal/weightSum);
else else
imaginary->SetValue(t, y, -imagVal/weightSum); imaginary->SetValue(t, y, -imagVal/weightSum);
} }
} }
} else if(_operation == IterativeExtrapolatedSincOperation) { }
void SubtractComponent(class IterationData &iterData, Image2DPtr real, Image2DPtr imaginary, size_t y) const
{
const size_t
startXf = iterData.startXf,
endXf = iterData.endXf,
width = iterData.width,
fourierWidth = iterData.fourierWidth;
// Find strongest frequency // Find strongest frequency
AOLogger::Debug << "Limiting search to xF<" << startXf << " and xF>" << endXf << '\n'; AOLogger::Debug << "Limiting search to xF<" << startXf << " and xF>" << endXf << '\n';
size_t xFRemoval = 0; size_t xFRemoval = 0;
double xFValue = fourierValuesReal[0]*fourierValuesReal[0] + fourierValuesImag[0]*fourierValuesImag[0]; double xFValue =
iterData.fourierValuesReal[0]*iterData.fourierValuesReal[0] + iterData.fourierValuesImag[0]*iterData.fourierValuesImag[0];
for(size_t xF=0;xF<startXf;++xF) for(size_t xF=0;xF<startXf;++xF)
{ {
numl_t val = fourierValuesReal[xF]*fourierValuesReal[xF] + fourierValuesImag[xF]*fourierValuesImag[xF]; numl_t
fReal = iterData.fourierValuesReal[xF],
fImag = iterData.fourierValuesImag[xF],
val = fReal*fReal + fImag*fImag;
if(val > xFValue) if(val > xFValue)
{ {
xFRemoval = xF; xFRemoval = xF;
xFValue = val; xFValue = val;
} }
val = fourierValuesReal[xF+endXf]*fourierValuesReal[xF+endXf] + fourierValuesImag[xF+endXf]*fourierValuesImag[xF+endXf]; fReal = iterData.fourierValuesReal[xF+endXf];
fImag = iterData.fourierValuesImag[xF+endXf];
val = fReal*fReal + fImag*fImag;
if(val > xFValue) if(val > xFValue)
{ {
xFRemoval = xF+endXf; xFRemoval = xF+endXf;
...@@ -465,19 +500,19 @@ private: ...@@ -465,19 +500,19 @@ private:
} }
const numl_t const numl_t
fourierPos = (numl_t) xFRemoval / fourierWidth - 0.5, fourierPos = (numl_t) xFRemoval / fourierWidth - 0.5,
fourierFactor = fourierPos * 2.0 * M_PInl * width * 0.5 / maxDist, fourierFactor = fourierPos * 2.0 * M_PInl * width * 0.5 / iterData.maxDist,
fourierReal = fourierValuesReal[xFRemoval], fourierReal = iterData.fourierValuesReal[xFRemoval],
fourierImag = fourierValuesImag[xFRemoval]; fourierImag = iterData.fourierValuesImag[xFRemoval];
AOLogger::Debug << "Strongest frequency at xF=" << xFRemoval << ", amp^2=" << xFValue << '\n'; AOLogger::Debug << "Strongest frequency at xF=" << xFRemoval << ", amp^2=" << xFValue << '\n';
AOLogger::Debug << "Corresponding frequency: " << fourierPos << " x " << maxDist << " / " AOLogger::Debug << "Corresponding frequency: " << fourierPos << " x " << iterData.maxDist << " / "
<< width << " = " << (fourierPos*maxDist/width) << " (pixels/fringe)\n"; << width << " = " << (fourierPos*iterData.maxDist/width) << " (pixels/fringe)\n";
// Remove strongest frequency // Remove strongest frequency
for(size_t t=0;t<width;++t) for(size_t t=0;t<width;++t)
{ {
const numl_t const numl_t
posU = rowUPositions[t], posU = iterData.rowUPositions[t],
weightSum = 1.0; weightSum = 1.0;
const numl_t const numl_t
...@@ -487,37 +522,94 @@ private: ...@@ -487,37 +522,94 @@ private:
numl_t realVal = (fourierReal * cosValL - fourierImag * sinValL) * 0.75 / weightSum; numl_t realVal = (fourierReal * cosValL - fourierImag * sinValL) * 0.75 / weightSum;
numl_t imagVal = (fourierImag * cosValL + fourierReal * sinValL) * 0.75 / weightSum; numl_t imagVal = (fourierImag * cosValL + fourierReal * sinValL) * 0.75 / weightSum;
rowRValues[t] -= realVal; iterData.rowRValues[t] -= realVal;
rowIValues[t] -= imagVal; iterData.rowIValues[t] -= imagVal;
real->SetValue(t, y, rowRValues[t]); real->SetValue(t, y, iterData.rowRValues[t]);
if(rowSignsNegated[t]) if(iterData.rowSignsNegated[t])
imaginary->SetValue(t, y, -rowIValues[t]); imaginary->SetValue(t, y, -iterData.rowIValues[t]);
else else
imaginary->SetValue(t, y, rowIValues[t]); imaginary->SetValue(t, y, iterData.rowIValues[t]);
}
}
void PerformExtrapolatedSincOperation(ArtifactSet &artifacts, Image2DPtr real, Image2DPtr imaginary, class ProgressListener &listener) const
{
TimeFrequencyMetaDataCPtr metaData = artifacts.MetaData();
const size_t width = real->Width();
const BandInfo band = artifacts.MetaData()->Band();
class IterationData iterData;
iterData.artifacts = &artifacts;
iterData.width = width;
iterData.rowRValues = new numl_t[width];
iterData.rowIValues = new numl_t[width];
iterData.rowUPositions = new numl_t[width];
iterData.rowVPositions = new numl_t[width];
iterData.fourierWidth = width * 2;
iterData.fourierValuesReal = new numl_t[iterData.fourierWidth];
iterData.fourierValuesImag = new numl_t[iterData.fourierWidth];
iterData.rowSignsNegated = new bool[width];
iterData.rangeStart = (size_t) roundn(_etaParameter * (num_t) width / 2.0),
iterData.rangeEnd = width - iterData.rangeStart;
for(size_t y=0;y<real->Height();++y)
{
listener.OnProgress(*this, y, real->Height());
Project(iterData, real, imaginary, y);
PrecalculateFTFactors(iterData);
for(unsigned iteration=0;iteration<_iterations;++iteration)
{
PerformFourierTransform(iterData, real, imaginary, y);
numl_t sincScale = ActualSincScaleInLambda(artifacts, band.channels[y].frequencyHz);
numl_t clippingFrequency = 1.0/(sincScale * width / iterData.maxDist);
long fourierClippingIndex =
(long) ceilnl((numl_t) iterData.fourierWidth * 0.5 * clippingFrequency);
if(fourierClippingIndex*2 > (long) iterData.fourierWidth)
fourierClippingIndex = iterData.fourierWidth/2;
if(fourierClippingIndex < 0)
fourierClippingIndex = 0;
iterData.startXf = iterData.fourierWidth/2 - fourierClippingIndex,
iterData.endXf = iterData.fourierWidth/2 + fourierClippingIndex;
if(_operation == ExtrapolatedSincOperation)
{
InvFourierTransform(iterData, real, imaginary, y);
} }
else if(_operation == IterativeExtrapolatedSincOperation)
{
SubtractComponent(iterData, real, imaginary, y);
} }
} }
for(size_t xF=0;xF<fourierWidth;++xF) for(size_t xF=0;xF<iterData.fourierWidth;++xF)
{ {
delete[] fSinTable[xF]; delete[] iterData.fSinTable[xF];
delete[] fCosTable[xF]; delete[] iterData.fCosTable[xF];
} }
delete[] fSinTable; delete[] iterData.fSinTable;
delete[] fCosTable; delete[] iterData.fCosTable;
} }
listener.OnProgress(*this, real->Height(), real->Height()); listener.OnProgress(*this, real->Height(), real->Height());
delete[] rowRValues; delete[] iterData.rowRValues;
delete[] rowIValues; delete[] iterData.rowIValues;
delete[] rowUPositions; delete[] iterData.rowUPositions;
delete[] rowVPositions; delete[] iterData.rowVPositions;
delete[] rowSignsNegated; delete[] iterData.rowSignsNegated;
delete[] fourierValuesReal; delete[] iterData.fourierValuesReal;
delete[] fourierValuesImag; delete[] iterData.fourierValuesImag;
} }
numl_t avgUVDistance(const std::vector<UVW> &uvw, const double frequencyHz) const numl_t avgUVDistance(ArtifactSet &artifacts, const double frequencyHz) const
{ {
const std::vector<UVW> &uvw = artifacts.MetaData()->UVW();
numl_t avgDist = 0.0; numl_t avgDist = 0.0;
for(std::vector<UVW>::const_iterator i=uvw.begin();i!=uvw.end();++i) for(std::vector<UVW>::const_iterator i=uvw.begin();i!=uvw.end();++i)
{ {
...@@ -532,13 +624,13 @@ private: ...@@ -532,13 +624,13 @@ private:
if(_isSincScaleInSamples) if(_isSincScaleInSamples)
return _sincSize; return _sincSize;
else else
return _sincSize / avgUVDistance(artifacts.MetaData()->UVW(), frequencyHz) * (0.5 * (numl_t) artifacts.ContaminatedData().ImageWidth()); return _sincSize / avgUVDistance(artifacts, frequencyHz) * (0.5 * (numl_t) artifacts.ContaminatedData().ImageWidth());
} }
numl_t ActualSincScaleInLambda(ArtifactSet &artifacts, const double frequencyHz) const numl_t ActualSincScaleInLambda(ArtifactSet &artifacts, const double frequencyHz) const
{ {
if(_isSincScaleInSamples) if(_isSincScaleInSamples)
return _sincSize / (0.5 * (numl_t) artifacts.ContaminatedData().ImageWidth()) * avgUVDistance(artifacts.MetaData()->UVW(), frequencyHz); return _sincSize / (0.5 * (numl_t) artifacts.ContaminatedData().ImageWidth()) * avgUVDistance(artifacts, frequencyHz);
else else
return _sincSize; return _sincSize;
} }
...@@ -558,7 +650,7 @@ private: ...@@ -558,7 +650,7 @@ private:
AOLogger::Debug << "Central frequency: " << centralFreq << "\n"; AOLogger::Debug << "Central frequency: " << centralFreq << "\n";
AOLogger::Debug << "Baseline length: " << artifacts.MetaData()->Baseline().Distance() << '\n'; AOLogger::Debug << "Baseline length: " << artifacts.MetaData()->Baseline().Distance() << '\n';
AOLogger::Debug << "Sinc scale in lambda: " << ActualSincScaleInLambda(artifacts, centralFreq) << '\n'; AOLogger::Debug << "Sinc scale in lambda: " << ActualSincScaleInLambda(artifacts, centralFreq) << '\n';
AOLogger::Debug << "Average distance: " << avgUVDistance(artifacts.MetaData()->UVW(), centralFreq) << '\n'; AOLogger::Debug << "Average distance: " << avgUVDistance(artifacts, centralFreq) << '\n';
const numl_t sincDist = ActualSincScaleAsRaDecDist(artifacts, centralFreq); const numl_t sincDist = ActualSincScaleAsRaDecDist(artifacts, centralFreq);
numl_t ignoreRadius = sincDist / imager.UVScaling(); numl_t ignoreRadius = sincDist / imager.UVScaling();
AOLogger::Debug << "Ignoring radius=" << ignoreRadius << "\n"; AOLogger::Debug << "Ignoring radius=" << ignoreRadius << "\n";
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment