コード例 #1
0
ファイル: uvimager.cpp プロジェクト: jjdmol/LOFAR
void UVImager::GetUVPosition(num_t &u, num_t &v, size_t timeIndex, size_t frequencyIndex, TimeFrequencyMetaDataCPtr metaData)
{
	num_t frequency = metaData->Band().channels[frequencyIndex].frequencyHz;
	u = metaData->UVW()[timeIndex].u * frequency / SpeedOfLight();
	v = metaData->UVW()[timeIndex].v * frequency / SpeedOfLight();
	return;
	const Baseline &baseline = metaData->Baseline();
	num_t delayDirectionRA = metaData->Field().delayDirectionRA;
	num_t delayDirectionDec = metaData->Field().delayDirectionDec;
	double time = metaData->ObservationTimes()[timeIndex];

	num_t pointingLattitude = delayDirectionRA;
	num_t earthLattitudeAngle = Date::JDToHourOfDay(Date::AipsMJDToJD(time))*M_PIn/12.0L;

	// Rotate baseline plane towards source, first rotate around x axis, then around z axis
	num_t raRotation = earthLattitudeAngle - pointingLattitude + M_PIn*0.5L;
	num_t raCos = cosn(-raRotation);
	num_t raSin = sinn(-raRotation);

	num_t dx = baseline.antenna1.x - baseline.antenna2.x;
	num_t dy = baseline.antenna1.y - baseline.antenna2.y;
	num_t dz = baseline.antenna1.z - baseline.antenna2.z;

	num_t decCos = cosn(delayDirectionDec);
	num_t decSin = sinn(delayDirectionDec);

	num_t
		du = -dx * raCos * decSin - dy * raSin - dz * raCos * decCos,
		dv = -dx * raSin * decSin + dy * raCos - dz * raSin * decCos;

  /*
	num_t dxProjected = tmpCos*dx - tmpSin*dy;
	num_t tmpdy = tmpSin*dx + tmpCos*dy;

	num_t dyProjected = tmpCos*tmpdy - tmpSin*dz;*/

	// du = dx*cosn(ra) - dy*sinn(ra)
	// dv = ( dx*sinn(ra) + dy*cosn(ra) ) * cosn(-dec) - dz * sinn(-dec)
	// Now, the newly projected positive z axis of the baseline points to the field
	num_t baselineLength = sqrtn(du*du + dv*dv);

	num_t baselineAngle;
	if(baselineLength == 0.0)
		baselineAngle = 0.0;
	else {
		baselineLength *= frequency / SpeedOfLight();
		if(du > 0.0L)
			baselineAngle = atann(du/dv);
		else
			baselineAngle = M_PIn - atann(du/-dv);
	}
	u = cosn(baselineAngle)*baselineLength;
	v = -sinn(baselineAngle)*baselineLength;

	std::cout << "Calced: " << u << "," << v
		<< ", ori: " << metaData->UVW()[timeIndex].u << "," << metaData->UVW()[timeIndex].v << "(," << metaData->UVW()[timeIndex].w << ")\n";
}
コード例 #2
0
ファイル: uvimager.cpp プロジェクト: jjdmol/LOFAR
void UVImager::GetUVPosition(num_t &u, num_t &v, const SingleFrequencySingleBaselineData &data, const AntennaCache &cache)
{
	unsigned field = data.field;
	num_t pointingLattitude = _fields[field].delayDirectionRA;

	//calcTimer.Start();
	num_t earthLattitudeAngle = Date::JDToHourOfDay(Date::AipsMJDToJD(data.time))*M_PIn/12.0L;

	//long double pointingLongitude = _fields[field].delayDirectionDec; //not used

	// Rotate baseline plane towards source, first rotate around z axis, then around x axis
	num_t raRotation = earthLattitudeAngle - pointingLattitude + M_PIn*0.5L;
	num_t tmpCos = cosn(raRotation);
	num_t tmpSin = sinn(raRotation);

	num_t dxProjected = tmpCos*cache.dx - tmpSin*cache.dy;
	num_t tmpdy = tmpSin*cache.dx + tmpCos*cache.dy;

	tmpCos = _fields[field].delayDirectionDecNegCos; // cosn(-pointingLongitude);
	tmpSin = _fields[field].delayDirectionDecNegSin; //sinn(-pointingLongitude);
	num_t dyProjected = tmpCos*tmpdy - tmpSin*cache.dz;
	// long double dzProjected = tmpSin*tmpdy + tmpCos*dzAnt; // we don't need it

	// Now, the newly projected positive z axis of the baseline points to the field

	num_t baselineLength = sqrtn(dxProjected*dxProjected + dyProjected*dyProjected);
	
	num_t baselineAngle;
	if(baselineLength == 0.0L)
		baselineAngle = 0.0L;
	else {
		baselineLength /= cache.wavelength;
		if(dxProjected > 0.0L)
			baselineAngle = atann(dyProjected/dxProjected);
		else
			baselineAngle = M_PIn - atann(dyProjected/-dxProjected);
	}
		

	u = cosn(baselineAngle)*baselineLength;
	v = -sinn(baselineAngle)*baselineLength;
}
コード例 #3
0
ファイル: uvimager.cpp プロジェクト: jjdmol/LOFAR
num_t UVImager::GetFringeStopFrequency(size_t timeIndex, const Baseline &/*baseline*/, num_t /*delayDirectionRA*/, num_t delayDirectionDec, num_t /*frequency*/, TimeFrequencyMetaDataCPtr metaData)
{
	// earthspeed = rad / sec
	const num_t earthSpeed = 2.0L * M_PIn / (24.0L * 60.0L * 60.0L);
	//num_t earthLattitudeAngle =
	//	Date::JDToHourOfDay(Date::AipsMJDToJD(metaData->ObservationTimes()[timeIndex]))*M_PIn/12.0L;
	//num_t raSin = sinn(-delayDirectionRA - earthLattitudeAngle);
	//num_t raCos = cosn(-delayDirectionRA - earthLattitudeAngle);
	//num_t dx = baseline.antenna2.x - baseline.antenna1.x;
	//num_t dy = baseline.antenna2.y - baseline.antenna1.y;
	//num_t wavelength = 299792458.0L / frequency;
	return -earthSpeed * metaData->UVW()[timeIndex].u * cosn(delayDirectionDec);
}
コード例 #4
0
ファイル: sinusfitter.cpp プロジェクト: pkgw/aoflagger
void SinusFitter::FindPhaseAndAmplitudeComplex(num_t &phase, num_t &amplitude, const num_t *dataR, const num_t *dataI, const num_t *dataT, const size_t dataSize, const num_t frequency) const throw()
{
	// calculate 1/N * \sum_t x(t) e^{-i * frequency * t}
	num_t sumR = 0.0L, sumI = 0.0L;
	for(unsigned i=0;i<dataSize;++i)
	{
		const num_t t = dataT[i];
		const num_t xR = dataR[i];
		const num_t xI = dataI[i];
		
		sumR += xR * cosn(-t * frequency);
		sumR += xI * sinn(-t * frequency);

		sumI += xR * sinn(-t * frequency);
		sumI -= xI * cosn(-t * frequency);
	}

	sumR /= (num_t) dataSize;
	sumI /= (num_t) dataSize;

	phase = Phase(sumR, sumI);
	amplitude = sqrtn(sumR*sumR + sumI*sumI);
}
コード例 #5
0
ファイル: uvimager.cpp プロジェクト: jjdmol/LOFAR
void UVImager::SetUVFTValue(num_t u, num_t v, num_t r, num_t i, num_t weight)
{
	for(size_t iy=0;iy<_yResFT;++iy)
	{
		for(size_t ix=0;ix<_xResFT;++ix)
		{
			num_t x = ((num_t) ix - (_xResFT/2)) / _uvScaling * _uvFTReal->Width();
			num_t y = ((num_t) iy - (_yResFT/2)) / _uvScaling * _uvFTReal->Height();
			// Calculate F(x,y) += f(u, v) e ^ {i 2 pi (x u + y v) } 
			num_t fftRotation = (u * x + v * y) * -2.0L * M_PIn;
			num_t fftCos = cosn(fftRotation), fftSin = sinn(fftRotation);
			_uvFTReal->AddValue(ix, iy, (fftCos * r - fftSin * i) * weight);
			_uvFTImaginary->AddValue(ix, iy, (fftSin * r + fftCos * i) * weight);
		}
	}

}
コード例 #6
0
void ImagePlaneWindow::onButtonReleased(size_t x, size_t y)
{
	if(_heatMapPlot.HasImage() && _lastMetaData != 0)
	{
		int 
			width = _heatMapPlot.Image()->Width(),
			height = _heatMapPlot.Image()->Height();
			
		int left = x - 3, right = x + 3, top = y - 3, bottom = y + 3;
		if(left < 0) left = 0;
		if(right >= width) right = width - 1;
		if(top < 0) top = 0;
		if(bottom >= height) bottom = height - 1;
		
		const BandInfo band = _lastMetaData->Band();
		num_t frequencyHz = band.channels[band.channels.size()/2].frequencyHz;
		num_t rms = _heatMapPlot.Image()->GetRMS(left, top, right-left, bottom-top);
		num_t max = _heatMapPlot.Image()->GetMaximum(left, top, right-left, bottom-top);
		num_t xRel = x-width/2.0, yRel = y-height/2.0;
		const numl_t
			dist = sqrtnl(xRel*xRel + yRel*yRel),
			delayRa = _lastMetaData->Field().delayDirectionRA,
			delayDec = _lastMetaData->Field().delayDirectionDec;
		std::cout << "Clicked at: " << xRel << "," << yRel << '\n';
		double
			distanceRad = _imager.ImageDistanceToDecRaDistance(dist);
		std::cout << "RMS=" << rms << ", max=" << max
			<< ", angle=" << (SinusFitter::Phase(xRel, -yRel)*180.0/M_PI) << ", dist=" << dist << "\n"
			<< "Distance ~ "
			<< distanceRad << " rad = "
			<< Angle::ToString(distanceRad) << " = "
			<< (1.0/_imager.ImageDistanceToFringeSpeedInSamples(dist, frequencyHz, _lastMetaData)) << " samples/fringe.\n";
		numl_t
			centerX = cosn(delayRa) * delayDec,
			centerY = -sinn(delayRa) * delayDec,
			dx = _imager.ImageDistanceToDecRaDistance(-xRel) + centerX,
			dy = _imager.ImageDistanceToDecRaDistance(yRel) + centerY,
			ra = 2.0*M_PInl - SinusFitter::Phase(dx, dy),
			dec = sqrtnl(dx*dx + dy*dy);
		std::cout << "Delay = " << RightAscension::ToString(delayRa) << ", " << Declination::ToString(delayDec) << " (@" << dx << "," << dy << ")\n";
		std::cout << "RA = " << RightAscension::ToString(ra) << ", DEC = " << Declination::ToString(dec) << "\n";
	}
}