diff --git a/RTCP/LofarStMan/configure.in b/RTCP/LofarStMan/configure.in index 3800e030ff46207b9bf7340e347e05c13633cc41..ad03e1957f7103c2507df5b218daf04211bd96f2 100644 --- a/RTCP/LofarStMan/configure.in +++ b/RTCP/LofarStMan/configure.in @@ -18,8 +18,7 @@ AC_PROG_CXX AM_PROG_LEX AC_PROG_INSTALL AC_PROG_LN_S -#AC_ENABLE_SHARED -AC_DISABLE_SHARED +AC_ENABLE_SHARED AC_PROG_LIBTOOL dnl Checks for libraries. diff --git a/RTCP/LofarStMan/src/LofarColumn.cc b/RTCP/LofarStMan/src/LofarColumn.cc index 57415b6a34932db31da61b41b87562a4e783a43e..c7f17e98a6a8d237deaf3ec91276e8cda8a8962a 100644 --- a/RTCP/LofarStMan/src/LofarColumn.cc +++ b/RTCP/LofarStMan/src/LofarColumn.cc @@ -34,11 +34,13 @@ #include <measures/TableMeasures/ArrayMeasColumn.h> #include <measures/Measures/MEpoch.h> #include <measures/Measures/MDirection.h> +#include <measures/Measures/MCDirection.h> #include <measures/Measures/MPosition.h> #include <measures/Measures/MCPosition.h> -#include <measures/Measures/MeasConvert.h> #include <measures/Measures/MBaseline.h> #include <measures/Measures/MCBaseline.h> +#include <measures/Measures/MeasConvert.h> +#include <measures/Measures/MeasTable.h> #include <measures/Measures/MUvw.h> #include <casa/Arrays/Array.h> #include <casa/Utilities/Assert.h> @@ -137,29 +139,39 @@ namespace LOFAR { // Read the station positions from the ANTENNA subtable // and convert them to a baseline in ITRF. const TableRecord& keyset = itsParent->table().keywordSet(); - cout<<"nkeys="<<keyset.size()<<endl; itsCanCalc = keyset.isDefined ("ANTENNA"); if (itsCanCalc) { - cout << "cancalc" << endl; Table anttab (keyset.asTable ("ANTENNA")); AlwaysAssert (anttab.nrow() > 0, AipsError); int nrant = anttab.nrow(); - cout << "nrant="<<nrant<<endl; ROScalarMeasColumn<MPosition> antcol (anttab, "POSITION"); + MPosition arrayPos; + Vector<Double> pos0; for (int i=0; i<nrant; ++i) { // Read antenna position and convert to ITRF. MPosition mpos = MPosition::Convert (antcol(i), MPosition::ITRF)(); - const MVPosition& mvpos = mpos.getValue(); + if (i == 0) { + pos0 = mpos.getValue().getVector(); + } + // Use position of middle station as array position. + if (i == nrant/2) { + arrayPos = mpos; + } + Vector<Double> pos = mpos.getValue().getVector(); + MVPosition mvpos((pos[0] - pos0[0]), + (pos[1] - pos0[1]), + (pos[2] - pos0[2])); itsAntMB.push_back (MBaseline (MVBaseline(mvpos), MBaseline::ITRF)); } // Read the phase reference position from the FIELD subtable. - // Only use the first value from the PHASEDIR array. + // Only use the first value from the PHASE_DIR array in J2000. Table fldtab (itsParent->table().keywordSet().asTable ("FIELD")); AlwaysAssert (fldtab.nrow() == 1, AipsError); - ROArrayMeasColumn<MDirection> fldcol (fldtab, "PHASEDIR"); - itsPhaseDir = *(fldcol(0).data()); + ROArrayMeasColumn<MDirection> fldcol (fldtab, "PHASE_DIR"); + itsPhaseDir = MDirection::Convert (*(fldcol(0).data()), + MDirection::J2000)(); // Create a reference frame. Use the middle antenna as array position. - itsFrame.set (antcol(nrant/2)); + itsFrame.set (arrayPos); itsFrame.set (itsPhaseDir); // Initialize the rest which is used to cache the UVW per antenna. // The cache is only useful if the MS is accessed in time order, but that @@ -184,18 +196,18 @@ namespace LOFAR { int blnr = rownr / nrbasel; int antinx = rownr - blnr * nrbasel; int ant1 = itsParent->ant1()[antinx]; - int ant2 = itsParent->ant1()[antinx]; + int ant2 = itsParent->ant2()[antinx]; // If a different block (i.e. time), we have to calculate the UVWs. if (blnr != itsLastBlNr) { itsLastBlNr = blnr; - itsFrame.set (MEpoch(MVEpoch(itsParent->time(blnr)), MEpoch::UTC)); + Quantum<Double> tm(itsParent->time(blnr), "s"); + itsFrame.set (MEpoch(MVEpoch(tm.get("d").getValue()), MEpoch::UTC)); itsUvwFilled = false; } // Calculate the UVWs for this timestamp if not done yet. int ant = ant1; for (int i=0; i<2; ++i) { if (!itsUvwFilled[ant]) { - cout<<"calc for ant="<<ant<<", blnr="<<blnr<<endl; MBaseline& mbl = itsAntMB[ant]; mbl.getRefPtr()->set(itsFrame); // attach frame MBaseline::Convert mcvt(mbl, MBaseline::J2000); diff --git a/RTCP/LofarStMan/test/tLofarStMan.cc b/RTCP/LofarStMan/test/tLofarStMan.cc index 64232014185bccfd25920267b991ec940e76a61c..cd3e808f509a22f1895b4d0f4cf83a619f1a560e 100644 --- a/RTCP/LofarStMan/test/tLofarStMan.cc +++ b/RTCP/LofarStMan/test/tLofarStMan.cc @@ -285,6 +285,13 @@ void updateTable (uInt nchan, uInt npol, const Complex& startValue) } } +void copyTable() +{ + Table tab("tLofarStMan_tmp.data"); + // Deep copy the table. + tab.deepCopy ("tLofarStMan_tmp.datcp", Table::New, true); +} + int main (int argc, char* argv[]) { @@ -305,6 +312,7 @@ int main (int argc, char* argv[]) cout << "nrow=" << tab.nrow() << endl; ROArrayColumn<double> uvwcol(tab, "UVW"); cout << "uvws="<< uvwcol(0) << endl; + cout << "uvws="<< uvwcol(1) << endl; cout << "uvwe="<< uvwcol(tab.nrow()-1) << endl; } else { if (argc > 2) { @@ -335,6 +343,7 @@ int main (int argc, char* argv[]) // Update the table and check again. updateTable (nchan, npol, Complex(3.52, 20.3)); readTable (nseq, nant, nchan, npol, 1e9, 10., Complex(3.52, 20.3)); + copyTable(); } } catch (AipsError x) { cout << "Caught an exception: " << x.getMesg() << endl;