source: trunk/src/PlotHelper.cpp @ 2689

Last change on this file since 2689 was 2689, checked in by Kana Sugimoto, 11 years ago

New Development: Yes

JIRA Issue: No

Ready for Test: Yes

Interface Changes: No

What Interface Changed: a new cpp helper class to support asapplotter.plotgrid

Test Programs:

Put in Release Notes: No

Module(s):

Description:

Added a new cpp helper class to make asapplotter.plotgrid work with new STGrid
with more accurate wcs projection.


File size: 6.4 KB
Line 
1//
2// C++ Interface: PlotHelper
3//
4// Description:
5//    A small helper class to handle direction coordinate in asapplotter
6//
7// Author: Kana Sugimoto <kana.sugi@nao.ac.jp>, (C) 2012
8//
9// Copyright: See COPYING file that comes with this distribution
10//
11//
12
13// casacore
14#include <casa/Arrays/Vector.h>
15#include <casa/Quanta/Quantum.h>
16#include <casa/Quanta/QuantumHolder.h>
17#include <measures/Measures/MDirection.h>
18#include <casa/Logging/LogIO.h>
19
20#include "PlotHelper.h"
21
22#define KS_DEBUG
23
24using namespace std ;
25using namespace casa ;
26using namespace asap ;
27
28namespace asap {
29
30PlotHelper::PlotHelper() : dircoord_(0)
31{
32#ifdef KS_DEBUG
33  cout << "Default constructor nrow = " << data_.nrow() << endl;
34#endif
35};
36
37PlotHelper::PlotHelper( const ScantableWrapper &s) : dircoord_(0)
38{
39#ifdef KS_DEBUG
40  cout << "Constructing PlotHelper with scantable wrapper" << endl;
41#endif
42  setScantable(s);
43};
44
45PlotHelper::~PlotHelper(){
46#ifdef KS_DEBUG
47  cout << "Called PlotHelper destructor" << endl;
48#endif
49  if (dircoord_){
50#ifdef KS_DEBUG
51    cout << "Destructing dircoord_" << endl;
52#endif
53    delete dircoord_;
54    dircoord_ = 0;
55  }
56};
57
58void PlotHelper::setScantable( const ScantableWrapper &s )
59{
60#ifdef KS_DEBUG
61  cout << "Setting scantable" << endl;
62#endif
63  data_ = s ;
64};
65
66//   void PlotHelper::setGridParam(const int nx, const int ny, const string cellx, const string celly, string center, const string projection){
67//   // Value check of nx and ny
68//   if (nx < 1)
69//     throw(AipsError("nx should be > 0"));
70//   if (ny < 1)
71//     throw(AipsError("ny should be > 0"));
72//   // Destroy old coord
73//   if (dircoord_){
74//     cout << "Destructing dircoord_" << endl;
75//     delete dircoord_;
76//     dircoord_ = 0;
77//   }
78
79//   //
80//   Double incX, incY;
81//   Double centX, centY;
82//   MDirection::Types mdt;
83//   // projection
84//   Projection::Type projType(Projection::type(String(projname)));
85//   ///
86//   incX = cellx;
87//   incY = celly;
88//   centX = centx;
89//   centY = centy;
90//   MDirection::getType(mdt, String(epoch));
91//   ///
92//   // Get map extent
93//   Double xmax, xmin, ymax, ymin;
94//   ROArrayColumn<Double> dirCol;
95//   MDirection::Types stdt;
96//   const bool stset = (data_ ? true : false);
97
98//   if (stset) {
99//     dirCol_.attach( data_, "DIRECTION" );
100//     Matrix<Double> direction = dirCol.getColumn();
101//     minMax(xmin, xmax, direction.row( 0 ));
102//     minMax(ymin, ymax, direction.row( 1 ));
103//     if (!MDirection::getType(stdt, data_.getDirectionRefString()))
104//       throw AipsError("Failed to get direction reference from scantable.");
105//   }
106//   // center
107//   if (center.size() == 0){
108//     if (!stset)
109//       throw AipsError("Scantable is not set. Could not resolve map center.");
110//     cenX = 0.5 * (xmin + xmax);
111//     cenY = 0.5 * (ymin + ymax);
112//     mdt = stdt;
113//   } else {
114//     if (!MDirection::getType(mdt,center))
115//       throw AipsError("Invalid direction reference in center");
116//     if (stset && mdt != stdt)
117//       throw AipsError("Direction reference of center should be the same as input scantable");
118//     MDirection centdir;
119//     centdir.setRefString(String(center));
120//     ///
121//     Vector<Double> centrad;
122//     centrad = centdir.getAngle("rad").getValue();
123//     cenX = centrad[0];
124//     cenY = centrad[1];
125//     // rotaion
126//     if (stset) {
127//       Double rotnum = round(abs(cenX - )/(C::))
128//     }
129//   }
130//   // cell
131//   Quantum<Double> qcellx, qcelly;
132//   if (cellx.size() == 0 && celly.size() == 0){
133//       // Need resolution
134//     if (!stset)
135//       throw AipsError("Scantable is not set. Could not resolve cell size.");
136//   } else {
137//     if (cellx.size() != 0){
138//       readQuantity(qcellx, String(cellx));
139//       qcellx.convert("rad");
140//     } else if (celly.size() == 0) {
141//       celly = cellx;
142//   
143//   }
144
145void PlotHelper::setGridParamVal(const int nx, const int ny, const double cellx, const double celly, const double centx, const double centy, const string epoch, const string projname){
146  // Value check of nx and ny
147  if (nx < 1)
148    throw(AipsError("nx should be > 0"));
149  if (ny < 1)
150    throw(AipsError("ny should be > 0"));
151  // Destroy old coord
152  if (dircoord_){
153#ifdef KS_DEBUG
154    cout << "Destructing dircoord_" << endl;
155#endif
156    delete dircoord_;
157    dircoord_ = 0;
158  }
159
160  // center (in rad)
161  Double centX(centx), centY(centy);
162  // cell size (in rad)
163  Double incX(cellx), incY(celly);
164  // epoch
165  MDirection::Types mdt;
166  MDirection::getType(mdt, String(epoch));
167  // projection
168  Projection::Type projType(Projection::type(String(projname)));
169
170  Matrix<Double> xform(2,2) ;
171  xform = 0.0 ;
172  xform.diagonal() = 1.0 ;
173  dircoord_ = new DirectionCoordinate(mdt, projType,
174                                      centX, centY, incX, incY,
175                                      xform,
176                                      0.5*Double(nx-1),
177                                      0.5*Double(ny-1)) ; // pixel at grid
178//                                    0.5*Double(nx),
179//                                    0.5*Double(ny)) ; // pixel at center
180#ifdef KS_DEBUG
181  {//Debug outputs
182  cout << "Direction coordinate is set: " << endl;
183  Vector<String> units = dircoord_->worldAxisUnits();
184  Vector<Double> refv = dircoord_->referenceValue();
185  cout <<"Reference: " << MDirection::showType(dircoord_->directionType()) << " " << refv[0] << units[0] << " " << refv[1] << units[1]  << endl;
186  Vector<Double> refpix = dircoord_->referencePixel();
187  cout <<"Reference Pixel: [" << refpix[0] << ", " << refpix[1] << "]" << endl;
188  Vector<Double> inc = dircoord_->increment();
189  cout <<"Increments: [" << inc[0] << ", " << inc[1] << "]" << endl;
190  cout <<"Projection: " << dircoord_->projection().name() << endl;
191  }
192#endif
193};
194
195vector<double>  PlotHelper::getGridPixel(const int whichrow){
196  if (data_.nrow() < 1)
197    throw AipsError("Scantable is not set. Could not get direction.");
198  else if (whichrow > int(data_.nrow()) - 1)
199    throw AipsError("Row index out of range.");
200  if (!dircoord_)
201    throw AipsError("Direction coordinate is not defined.");
202
203  Vector<Double> pixel;
204  MDirection world;
205  vector<double> outvec;
206  world = data_.getCP()->getDirection(whichrow);
207#ifdef KS_DEBUG
208  cout << "searching pixel position (world = " << data_.getCP()->getDirectionString(whichrow) << " = [" << world.getAngle("rad").getValue()[0] << ", " << world.getAngle("rad").getValue()[1] << "])" << endl;
209#endif
210  dircoord_->toPixel(pixel, world);
211#ifdef KS_DEBUG
212  cout << "got pixel = [" << pixel[0] << ", " << pixel[1] << "]" << endl;
213#endif
214  // convert pixel to std vector
215  pixel.tovector(outvec);
216#ifdef KS_DEBUG
217  cout << "returning vector = [" << outvec[0] << ", " << outvec[1] << "]" << endl;
218#endif
219  return outvec;
220};
221
222} //namespace asap
Note: See TracBrowser for help on using the repository browser.