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; } }
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); }
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); }
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); }
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); }
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; }
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"; } }
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"); } }
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"); } }
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'; }