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"; }
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; }
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); }
void SinusFitter::FindPhaseAndAmplitudeComplex(num_t &phase, num_t &litude, 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); }
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); } } }
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"; } }