bool ForEachBaselineAction::IsBaselineSelected(ImageSetIndex &index)
	{
		ImageSet& imageSet = _artifacts->ImageSet();
		IndexableSet* msImageSet = dynamic_cast<IndexableSet*>(&imageSet);
		size_t a1id, a2id;
		if(msImageSet != nullptr)
		{
			a1id = msImageSet->GetAntenna1(index);
			a2id = msImageSet->GetAntenna2(index);
			if(!_bands.empty() && _bands.count(msImageSet->GetBand(index))==0)
				return false;
			if(!_fields.empty() && _fields.count(msImageSet->GetField(index))==0)
				return false;
		} else {
			a1id = 0;
			a2id = 0;
		}
		if(_antennaeToSkip.count(a1id) != 0 || _antennaeToSkip.count(a2id) != 0)
			return false;
		if(!_antennaeToInclude.empty() && (_antennaeToInclude.count(a1id) == 0 && _antennaeToInclude.count(a2id) == 0))
			return false;
		
		// For SD/BHFits/QS files, we want to select everything -- it's confusing
		// if the default option "only flag cross correlations" would also
		// hold for sdfits files.
		if(dynamic_cast<FitsImageSet*>(&imageSet)!=0
			|| dynamic_cast<BHFitsImageSet*>(&imageSet)!=0
			|| dynamic_cast<FilterBankSet*>(&imageSet)!=0
			|| dynamic_cast<QualityStatImageSet*>(&imageSet)!=0)
			return true;

		switch(_selection)
		{
			case All:
				return true;
			case CrossCorrelations:
			{
				return a1id != a2id;
			}
			case AutoCorrelations:
				return a1id == a2id;
			case EqualToCurrent: {
				if(!_hasInitAntennae)
					throw BadUsageException("For each baseline over 'EqualToCurrent' with no current baseline");
				throw BadUsageException("Not implemented");
			}
			case AutoCorrelationsOfCurrentAntennae:
				if(!_hasInitAntennae)
					throw BadUsageException("For each baseline over 'AutoCorrelationsOfCurrentAntennae' with no current baseline");
				return a1id == a2id && (_initAntenna1.id == a1id || _initAntenna2.id == a1id);
			default:
				return false;
		}
	}
Esempio n. 2
0
	void PlotAction::plotPolarizationFlagCounts(ArtifactSet &artifacts)
	{
		if(artifacts.PolarizationStatistics() == 0)
			throw BadUsageException("No polarization statistics in the artifact set");

		TimeFrequencyData &data = artifacts.ContaminatedData();
		artifacts.PolarizationStatistics()->Add(data);
	}
Esempio n. 3
0
	void PlotAction::plotFrequencyPower(ArtifactSet &artifacts)
	{
		if(artifacts.FrequencyPowerPlot() == 0)
			throw BadUsageException("No frequency power plot in the artifact set");

		TimeFrequencyData &data = artifacts.ContaminatedData();
		TimeFrequencyMetaDataCPtr meta = artifacts.MetaData();
		artifacts.FrequencyPowerPlot()->Add(data, meta);
	}
Esempio n. 4
0
	void PlotAction::plotAntennaFlagCounts(ArtifactSet &artifacts)
	{
		if(artifacts.AntennaFlagCountPlot() == 0)
			throw BadUsageException("No antenna flag count plot in the artifact set");

		TimeFrequencyData &data = artifacts.ContaminatedData();
		TimeFrequencyMetaDataCPtr meta = artifacts.MetaData();
		artifacts.AntennaFlagCountPlot()->Add(data, meta);
	}
Esempio n. 5
0
	void PlotAction::plotSpectrumPerBaseline(ArtifactSet &artifacts)
	{
		if(artifacts.FrequencyPowerPlot() == 0)
			throw BadUsageException("No frequency power plot in the artifact set");

		TimeFrequencyData &data = artifacts.ContaminatedData();
		TimeFrequencyMetaDataCPtr meta = artifacts.MetaData();
		artifacts.FrequencyPowerPlot()->SetLogYAxis(_logYAxis);
		artifacts.FrequencyPowerPlot()->StartNewLine(meta->Antenna1().name + " x " + meta->Antenna2().name);
		artifacts.FrequencyPowerPlot()->Add(data, meta);
	}
Esempio n. 6
0
	void ImagerAction::Perform(ArtifactSet &artifacts, ProgressListener &progress)
	{
		boost::mutex::scoped_lock lock(_imagerMutex);
		UVImager *imager = artifacts.Imager();
		if(imager == 0)
			throw BadUsageException("No imager available to create image.");
		TimeFrequencyData &data = artifacts.ContaminatedData();
		TimeFrequencyMetaDataCPtr metaData = artifacts.MetaData();
		if(data.PolarisationCount() > 1)
		{
			TimeFrequencyData *tmp = data.CreateTFData(StokesIPolarisation);
			data = *tmp;
			delete tmp;
		}
		
		bool btPlaneImager = true;
		if(btPlaneImager)
		{
			typedef double ImagerNumeric;
			BaselineTimePlaneImager<ImagerNumeric> btImager;
			BandInfo band = metaData->Band();
			Image2DCPtr
				inputReal = data.GetRealPart(),
				inputImag = data.GetImaginaryPart();
			Mask2DCPtr mask = data.GetSingleMask();
			size_t width = inputReal->Width();
			
			for(size_t t=0;t!=width;++t)
			{
				UVW uvw = metaData->UVW()[t];
				size_t channelCount = inputReal->Height();
				std::vector<std::complex<ImagerNumeric> > data(channelCount);
				for(size_t ch=0;ch!=channelCount;++ch) {
					if(mask->Value(t, ch))
						data[ch] = std::complex<ImagerNumeric>(0.0, 0.0);
					else
						data[ch] = std::complex<ImagerNumeric>(inputReal->Value(t, ch), inputImag->Value(t, ch));
				}
				
				btImager.Image(uvw.u, uvw.v, uvw.w, band.channels[0].frequencyHz, band.channels[1].frequencyHz-band.channels[0].frequencyHz, channelCount, &(data[0]), imager->FTReal());
			}
		} else {
			progress.OnStartTask(*this, 0, 1, "Imaging baseline");
			for(size_t y=0;y<data.ImageHeight();++y)
			{
				imager->Image(data, metaData, y);
				progress.OnProgress(*this, y, data.ImageHeight());
			}
			progress.OnEndTask(*this);
		}
	}
TimeFrequencyData TimeFrequencyImager::GetData() const
{
	TimeFrequencyData data;
	if(
		_realXX != 0 && _imaginaryXX != 0 &&
		_realXY != 0 && _imaginaryXY != 0 &&
		_realYX != 0 && _imaginaryYX != 0 &&
		_realYY != 0 && _imaginaryYY != 0)
	{
		data = TimeFrequencyData(_realXX, _imaginaryXX, _realXY, _imaginaryXY, _realYX, _imaginaryYX, _realYY, _imaginaryYY);
	} else if(
		_realXX != 0 && _imaginaryXX != 0 &&
		_realYY != 0 && _imaginaryYY != 0)
	{
		data = TimeFrequencyData(AutoDipolePolarisation, _realXX, _imaginaryXX, _realYY, _imaginaryYY);
	} else if(_realStokesI != 0 && _imaginaryStokesI != 0)
	{
		data = TimeFrequencyData(StokesIPolarisation, _realStokesI, _imaginaryStokesI);
	}

	if(_flagXX != 0 && _flagXY != 0 && _flagYX != 0 && _flagYY != 0)
	{
		if(data.Polarisation() != DipolePolarisation)
			throw BadUsageException("Trying to read dipole polarisation masks, but TF data does not have the dipole polarisations"); 
		data.SetIndividualPolarisationMasks(_flagXX, _flagXY, _flagYX, _flagYY);
	} else if(_flagXX != 0 && _flagYY != 0)
	{
		if(data.Polarisation() != AutoDipolePolarisation)
			throw BadUsageException("Trying to read auto dipole polarisation masks, but TF data does not have the auto dipole polarisations"); 
		data.SetIndividualPolarisationMasks(_flagXX, _flagYY);
	} else if(_flagCombined != 0)
	{
		data.SetGlobalMask(_flagCombined);
	}

	return data;
}
Esempio n. 8
0
	void PlotAction::plotAntennaFlagCounts(ArtifactSet &artifacts)
	{
		if(artifacts.AntennaFlagCountPlot() == 0)
			throw BadUsageException("No antenna flag count plot in the artifact set");
		
		if(artifacts.HasMetaData() && artifacts.MetaData()->HasAntenna1() && artifacts.MetaData()->HasAntenna2())
		{
			TimeFrequencyData &data = artifacts.ContaminatedData();
			TimeFrequencyMetaDataCPtr meta = artifacts.MetaData();
			artifacts.AntennaFlagCountPlot()->Add(data, meta);
		} else {
			AOLogger::Warn << "The strategy contains an action that makes an antenna plot, but the image set did not provide meta data.\n"
				"Plot will not be made.\n";
		}
	}
Esempio n. 9
0
void ThresholdMitigater::HorizontalSumThresholdLargeSSE(Image2DCPtr input, Mask2DPtr mask, size_t length, num_t threshold)
{
	switch(length)
	{
		case 1: HorizontalSumThreshold<1>(input, mask, threshold); break;
		case 2: HorizontalSumThresholdLargeSSE<2>(input, mask, threshold); break;
		case 4: HorizontalSumThresholdLargeSSE<4>(input, mask, threshold); break;
		case 8: HorizontalSumThresholdLargeSSE<8>(input, mask, threshold); break;
		case 16: HorizontalSumThresholdLargeSSE<16>(input, mask, threshold); break;
		case 32: HorizontalSumThresholdLargeSSE<32>(input, mask, threshold); break;
		case 64: HorizontalSumThresholdLargeSSE<64>(input, mask, threshold); break;
		case 128: HorizontalSumThresholdLargeSSE<128>(input, mask, threshold); break;
		case 256: HorizontalSumThresholdLargeSSE<256>(input, mask, threshold); break;
		default: throw BadUsageException("Invalid value for length");
	}	
}
Esempio n. 10
0
void ThresholdMitigater::VerticalSumThresholdLargeReference(Image2DCPtr input, Mask2DPtr mask, size_t length, num_t threshold)
{
	switch(length)
	{
		case 1: VerticalSumThreshold<1>(input, mask, threshold); break;
		case 2: VerticalSumThresholdLarge<2>(input, mask, threshold); break;
		case 4: VerticalSumThresholdLarge<4>(input, mask, threshold); break;
		case 8: VerticalSumThresholdLarge<8>(input, mask, threshold); break;
		case 16: VerticalSumThresholdLarge<16>(input, mask, threshold); break;
		case 32: VerticalSumThresholdLarge<32>(input, mask, threshold); break;
		case 64: VerticalSumThresholdLarge<64>(input, mask, threshold); break;
		case 128: VerticalSumThresholdLarge<128>(input, mask, threshold); break;
		case 256: VerticalSumThresholdLarge<256>(input, mask, threshold); break;
		default: throw BadUsageException("Invalid value for length");
	}
}
Esempio n. 11
0
	void PlotAction::plotBaselineRMS(ArtifactSet &artifacts)
	{
		if(artifacts.PolarizationStatistics() == 0)
			throw BadUsageException("No polarization statistics in the artifact set");

		TimeFrequencyData &data = artifacts.ContaminatedData();
		TimeFrequencyMetaDataCPtr metaData = artifacts.MetaData();
		double rms = 0.0;
		for(unsigned i=0;i<data.PolarisationCount();++i)
		{
			TimeFrequencyData *polarisation = data.CreateTFDataFromPolarisationIndex(i);
			Mask2DCPtr mask = polarisation->GetSingleMask();
			for(unsigned j=0;j<polarisation->ImageCount();++j)
			{
				Image2DCPtr image = polarisation->GetImage(j);
				rms += ThresholdTools::RMS(image, mask);
			}
			delete polarisation;
		}
		rms /= data.PolarisationCount();
		;
		AOLogger::Info << "RMS of " << metaData->Antenna1().name << " x " << metaData->Antenna2().name << ": "
			<< rms << '\n';
	}