00001 #include <vector>
00002 #include <map>
00003 using namespace std;
00004
00005 #include "Enum.hpp"
00006 #include "CorrelationMode.h"
00007
00008 #include <measures/Measures.h>
00009 #include <measures/Measures/MEpoch.h>
00010 #include <measures/Measures/MPosition.h>
00011 #include <measures/Measures/MDirection.h>
00012 #include <measures/Measures/MCBaseline.h>
00013 #include <measures/Measures/MBaseline.h>
00014 #include <measures/Measures/MCuvw.h>
00015 #include <measures/Measures/Muvw.h>
00016 #include <casa/Quanta.h>
00017
00018 using namespace casa;
00019
00020 #include "ASDMEntities.h"
00021 using namespace asdm;
00022
00035 class UvwCoords{
00036 public:
00037
00045 UvwCoords(ASDM* const datasetPtr);
00046
00048 ~UvwCoords();
00049
00070 void uvw_bl( Tag configDescriptionId,
00071 const vector<vector<Angle> >& phaseDir,
00072 double timeCentroid,
00073 Enum<CorrelationMode> correlationMode,
00074 bool reverse, bool autoTrailing,
00075 vector<Vector<casa::Double> >& v_uvw );
00076
00094 void uvw_bl( Tag configDescriptionId,
00095 const vector<vector<Angle> >& phaseDir,
00096 const vector<double>& v_timeCentroid,
00097 Enum<CorrelationMode> correlationMode,
00098 bool reverse, bool autoTrailing,
00099 vector<Vector<casa::Double> >& v_uvw);
00100
00101
00121 void uvw_bl( asdm::MainRow* mainRow, vector<double> v_timeCentroid,
00122 Enum<CorrelationMode> correlationMode,
00123 pair<bool,bool> dataOrder,
00124 vector<casa::Vector<casa::Double> >& v_uvw );
00125
00126 private:
00127
00131 struct ArrayParam{
00132 public:
00133 Tag subarrayId;
00134 vector<Tag> v_ant;
00135 unsigned int nrepeat;
00136 Enum<CorrelationMode> e_correlationMode;
00141 bool operator== ( ArrayParam & rhs){
00142 set<Tag> a, b;
00143 for(unsigned int na=0; na<v_ant.size(); na++){
00144 a.insert(v_ant[na]);
00145 b.insert(rhs.v_ant[na]);
00146 }
00147 if( a != b ) return false;
00148 return true;
00149 }
00150 string show(){
00151 ostringstream os;
00152 for(unsigned int n=0; n<v_ant.size(); n++)os << v_ant[n].toString() << " ";
00153 os << " nrepeat " << nrepeat;
00154 return os.str();
00155 }
00156 };
00157
00158 map<Tag,ArrayParam> m_array_;
00159 map<Tag,MPosition> m_antPos_;
00160 map<Tag,Vector<casa::Double> > m_antUVW_;
00161
00162
00163 double timeCentroid_;
00164 vector<vector<Angle> > phaseDir_;
00165 Tag subarrayId_;
00166
00167 Vector<casa::Double> sduvw_;
00168
00173 vector<double> antPos(const vector<double>& stationPos, const vector<double>& antOffset);
00174
00188 void uvw_an(double timeCentroid, const vector<vector<Angle> >& phaseDir, const vector<Tag>& v_antId);
00189
00207 void uvw_bl( const vector<Tag>& v_antennaId, unsigned int nrep, bool reverse, vector<Vector<casa::Double> >& v_uvw);
00208
00209 };