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 ComplexPlanePlotWindow::setDetailsLabel() { size_t x = (size_t) _xPositionScale.get_value(); size_t y = (size_t) _yPositionScale.get_value(); size_t length = (size_t) _lengthScale.get_value(); size_t avgSize = (size_t) _ySumLengthScale.get_value(); size_t middleY = (2*y + avgSize) / 2; TimeFrequencyMetaDataCPtr metaData = _msWindow.TimeFrequencyMetaData(); double timeStart = _observationTimes[x]; double deltaTime; if(_observationTimes.size()>1) deltaTime = _observationTimes[1] - _observationTimes[0]; else deltaTime = 1.0; long double frequency = metaData->Band().channels[middleY].frequencyHz; Baseline baseline(metaData->Antenna1(), metaData->Antenna2()); long double delayRA = metaData->Field().delayDirectionRA; long double delayDec = metaData->Field().delayDirectionDec; long double intFringeFreq = UVImager::GetFringeCount(x, x+length, y, metaData); long double midFringeFreq = UVImager::GetFringeStopFrequency((x*2 + length)/2, baseline, delayRA, delayDec, frequency, metaData); std::stringstream s; s << "Start time: " << Date::AipsMJDToString(timeStart) << std::endl << "Frequency: " << frequency/1000000.0L << "Mhz" << std::endl << "Baseline: " << baseline.Distance() << "m" << std::endl << "Delay direction: " << delayRA << "RA, " << delayDec << "dec." << std::endl << "(=" << RightAscension::ToString(delayRA) << " RA, " << Declination::ToString(delayDec) << " dec.)" << std::endl << "Mid fringe stopping freq: " << midFringeFreq << "(Hz)" << std::endl << "Fringe count: " << intFringeFreq << std::endl << "Fringe length: " << 1.0L/intFringeFreq << "(s)" << std::endl << "Time step: " << deltaTime << "(s)" << std::endl << "Samples/fringe: " << (1.0L / (deltaTime * intFringeFreq)) << std::endl << "Fringes in domain: " << intFringeFreq << std::endl; _detailsLabel.set_text(s.str()); }