diff --git a/Appl/CEP/CS1/CS1_Storage/include/CS1_Storage/MSWriter.h b/Appl/CEP/CS1/CS1_Storage/include/CS1_Storage/MSWriter.h index 20bd28ca77827d987e008a6b8e04f540b3f34722..672c583a69393170df291ceff831f473588edda5 100644 --- a/Appl/CEP/CS1/CS1_Storage/include/CS1_Storage/MSWriter.h +++ b/Appl/CEP/CS1/CS1_Storage/include/CS1_Storage/MSWriter.h @@ -47,7 +47,7 @@ namespace LOFAR // The WSRT is taken as the center of the array. // Thus antPos must have shape [2,nantennas]. MSWriter (const char* msName, double startTime, double timeStep, - int nChan, int nPol, uint nantennas, + int nChan, int nPol, uint nBeams, uint nAntennas, const vector<double>& antPos, const vector<std::string>& storageStationNames, uint timesToIntegrate, uint subbandsPerPset); diff --git a/Appl/CEP/CS1/CS1_Storage/include/CS1_Storage/MSWriterImpl.h b/Appl/CEP/CS1/CS1_Storage/include/CS1_Storage/MSWriterImpl.h index 7a2e2718baa2c6c6153612d22f5b37e1777fe797..3e2bb9e0a7dc7d52fc2270a39a803c7404832a88 100644 --- a/Appl/CEP/CS1/CS1_Storage/include/CS1_Storage/MSWriterImpl.h +++ b/Appl/CEP/CS1/CS1_Storage/include/CS1_Storage/MSWriterImpl.h @@ -28,6 +28,7 @@ //# Includes #include <Common/LofarTypes.h> #include <casa/aips.h> +#include <measures/Measures/MDirection.h> #include <Common/lofar_vector.h> //# Forward Declarations @@ -61,7 +62,7 @@ namespace LOFAR // relative to the center (which is set to Westerbork). So antPos // must have shape [3,nantennas]. MSWriterImpl (const char* msName, double startTime, double timeStep, - int nfreq, int ncorr, + int nfreq, int ncorr, int nbeams, int nantennas, const vector<double>& antPos, const vector<std::string>& storageStationNames, int timesToIntegrate, int subbandsPerPset); @@ -159,6 +160,7 @@ namespace LOFAR double itsTimeStep; ///< duration of each exposure (sec) uint itsTimesToIntegrate; ///< Number of timeSteps to integrate (sec) double itsStartTime; ///< start time of observation (sec) + casa::Block<casa::MDirection> itsField; ///< field (beam) directions casa::Block<casa::Int>* itsNrPol; ///< nr of polarizations for each band casa::Block<casa::Int>* itsNrChan; ///< nr of channels for each band casa::Block<casa::Int>* itsPolnr; ///< rownr in POL subtable for each band diff --git a/Appl/CEP/CS1/CS1_Storage/include/CS1_Storage/WH_SubbandWriter.h b/Appl/CEP/CS1/CS1_Storage/include/CS1_Storage/WH_SubbandWriter.h index 3ae1449d609875ef190fa733f0513b43c4b2e36a..2a3dede9181aeb4faecc7d6fd95a700d20867648 100644 --- a/Appl/CEP/CS1/CS1_Storage/include/CS1_Storage/WH_SubbandWriter.h +++ b/Appl/CEP/CS1/CS1_Storage/include/CS1_Storage/WH_SubbandWriter.h @@ -79,6 +79,7 @@ namespace LOFAR uint itsNBaselines; uint itsNInputsPerSubband; uint itsNChannels; + uint itsNBeams; uint itsNPolSquared; uint itsNVisibilities; diff --git a/Appl/CEP/CS1/CS1_Storage/src/MSWriter.cc b/Appl/CEP/CS1/CS1_Storage/src/MSWriter.cc index fc80befcac87caf5a25bd62699dfa1d73daf3948..8cb5c30c1ee35fdde0a7afe8b1c9902293900d46 100644 --- a/Appl/CEP/CS1/CS1_Storage/src/MSWriter.cc +++ b/Appl/CEP/CS1/CS1_Storage/src/MSWriter.cc @@ -37,17 +37,17 @@ namespace LOFAR using namespace casa; MSWriter::MSWriter (const char* msName, double startTime, double timeStep, - int nChan, int nPol, - uint nantennas, const vector<double>& antPos, + int nChan, int nPol, uint nBeams, + uint nAntennas, const vector<double>& antPos, const vector<string>& storageStationNames, uint timesToIntegrate, uint subbandsPerPset) : itsWriter (0) { - ASSERTSTR(antPos.size() == 3*nantennas, antPos.size() << " == " << 3*nantennas << + ASSERTSTR(antPos.size() == 3*nAntennas, antPos.size() << " == " << 3*nAntennas << "Antenna position vector does not have the right size!"); try { itsWriter = new MSWriterImpl (msName, startTime, timeStep, nChan, nPol, - nantennas, + nBeams, nAntennas, antPos, storageStationNames, timesToIntegrate, subbandsPerPset); } catch (AipsError x) { diff --git a/Appl/CEP/CS1/CS1_Storage/src/MSWriterImpl.cc b/Appl/CEP/CS1/CS1_Storage/src/MSWriterImpl.cc index bebd70ee1787cd400cab3133142133cc80860064..62e688049ea22bbbe8ba2d0fedf1ac4ae57e09ff 100644 --- a/Appl/CEP/CS1/CS1_Storage/src/MSWriterImpl.cc +++ b/Appl/CEP/CS1/CS1_Storage/src/MSWriterImpl.cc @@ -68,7 +68,7 @@ namespace LOFAR using namespace casa; MSWriterImpl::MSWriterImpl (const char* msName, double startTime, double timeStep, - int nfreq, int ncorr, + int nfreq, int ncorr, int nbeams, int nantennas, const vector<double>& antPos, const vector<string>& storageStationNames, int timesToIntegrate, int subbandsPerPset) @@ -82,6 +82,7 @@ namespace LOFAR itsTimeStep (timeStep), itsTimesToIntegrate(timesToIntegrate), itsStartTime(0), + itsField(nbeams), itsNrPol (0), itsNrChan (0), itsPolnr (0), @@ -366,6 +367,7 @@ namespace LOFAR MDirection indir(radec, MDirection::J2000); Vector<MDirection> outdir(1); outdir(0) = indir; + itsField[itsNrField] = indir; // Put the direction into the FIELD subtable. { MSField msfield = itsMS->field(); @@ -620,7 +622,7 @@ namespace LOFAR Quantity qtime(time, "s"); itsFrame->set (MEpoch(qtime, MEpoch::UTC)); MDirection::Ref outref(MDirection::HADEC, *itsFrame); - MDirection outdir = MDirection::Convert (*itsArrayPos, outref) (); + MDirection outdir = MDirection::Convert (itsField[fieldId], outref) (); Double ha = outdir.getAngle().getValue()(0); Double dec = outdir.getAngle().getValue()(1); Double sinha = std::sin(ha); diff --git a/Appl/CEP/CS1/CS1_Storage/src/WH_SubbandWriter.cc b/Appl/CEP/CS1/CS1_Storage/src/WH_SubbandWriter.cc index 04f8932686f68a8d8f80e95702ec4e2a466a23bb..227e20a1a61845417bd55131575442f90a7a71ef 100644 --- a/Appl/CEP/CS1/CS1_Storage/src/WH_SubbandWriter.cc +++ b/Appl/CEP/CS1/CS1_Storage/src/WH_SubbandWriter.cc @@ -72,13 +72,14 @@ namespace LOFAR itsNStations = itsPS.getUint32("Observation.NStations"); itsNBaselines = itsNStations * (itsNStations +1)/2; itsNChannels = itsPS.getUint32("Observation.NChannels"); + itsNBeams = itsPS.getUint32("Observation.NBeams"); itsNInputsPerSubband = itsNinputs; uint pols = itsPS.getUint32("Observation.NPolarisations"); itsNPolSquared = pols*pols; uint nrSamples = itsPS.getUint32("Observation.NSubbandSamples"); itsWeightFactor = (float)itsNChannels/(float)nrSamples; // The inverse of maximum number of valid samples - + vector<double> refFreqs= itsPS.getDoubleVector("Observation.RefFreqs"); unsigned nrSubbands = itsPS.getUint32("Observation.NSubbands"); ASSERTSTR(refFreqs.size() >= nrSubbands, "Wrong number of refFreqs specified!"); @@ -176,9 +177,10 @@ namespace LOFAR #endif startTime, timeStep * itsTimesToIntegrate, itsNChannels, itsNPolSquared, itsNStations, + itsNBeams, antPos, storageStationNames, itsTimesToIntegrate, itsPS.getUint32("General.SubbandsPerPset")); - + double chanWidth = itsPS.getDouble("Observation.SampleRate") / itsPS.getDouble("Observation.NChannels"); LOG_TRACE_VAR_STR("chanWidth = " << chanWidth); @@ -204,7 +206,7 @@ namespace LOFAR //## TODO: add support for more than 1 beam ##// vector<double> beamDirs = itsPS.getDoubleVector("Observation.BeamDirections"); - ASSERT(beamDirs.size() == 2 * itsPS.getUint32("Observation.NBeams")); + ASSERT(beamDirs.size() == 2 * itsNBeams); double RA = beamDirs[0]; double DEC = beamDirs[1]; // For nr of beams