SloanCoords.hxx
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007 #ifndef SLOANCOORDS_H
00008 #define SLOANCOORDS_H
00009
00010 #include <cmath>
00011 #include <limits>
00012
00013 #include "Constants.h"
00014 #include "Converter.h"
00015 #include "DataMethod.hxx"
00016 #include "Logger.h"
00017 #include "StringOps.h"
00018
00021 template<typename DataType>
00022 class SloanCoords : public DataMethod<DataType>
00023 {
00024 public:
00026 SloanCoords() { DataMethod<DataType>::methodName = "SloanCoords"; }
00027
00029 virtual ~SloanCoords() { }
00030
00031
00033 void setSource(IntMap& tbls, IntMap& cols, StringMap units)
00034 {
00035 raColno = cols[0];
00036 decColno = cols[1];
00037
00038
00039 decFact = converter.getFactor(units[0], "RADIANS");
00040 raFact = converter.getFactor(units[1], "RADIANS");
00041
00042
00043 degToRad = converter.getFactor("degrees", "radians");
00044 raOffset = -95.0*degToRad;
00045 etaOffset = +32.5*degToRad;
00046 }
00047
00050 void setTarget(IntMap& cols, StringMap units)
00051 {
00052 lambdaColno = cols[0];
00053 etaColno = cols[1];
00054
00055
00056 lFact = converter.getFactor("RADIANS", units[0]);
00057 eFact = converter.getFactor("RADIANS", units[1]);
00058 }
00059
00061 void doit(TableData<DataType>& data, int row1, int row2)
00062 {
00063 Logger log;
00064 for (int rowNo = row1; rowNo < row2; ++rowNo)
00065 {
00066
00067 double ra, dec;
00068 data.value(raColno, rowNo, ra);
00069 data.value(decColno, rowNo, dec);
00070
00071
00072 ra *= raFact;
00073 dec *= decFact;
00074
00075 double x = cos(ra + raOffset)*cos(dec);
00076 double y = sin(ra + raOffset)*cos(dec);
00077 double z = sin(dec);
00078
00079 Numeric lambda = -1.0 * asin(x) * lFact;
00080 Numeric eta = (atan2(z,y) - etaOffset) * eFact;
00081
00082 if (eta < -180.0) eta += 360.0;
00083 if (eta > 180.0) eta -= 360.0;
00084
00085
00086 if (eta != eta or std::isinf(eta) or
00087 lambda != lambda or std::isinf(lambda))
00088 {
00089 string mess = "WCS error in lambda, eta ";
00090 mess += StringOps::NumToString(lambdaColno) + ",";
00091 mess += StringOps::NumToString(etaColno) + " ";
00092 mess += StringOps::NumToString(rowNo) + " : ";
00093 mess += "value replaced with dbl_max";
00094 log.addError(mess);
00095 data.assign(lambdaColno, rowNo, std::numeric_limits<double>::max( )-1);
00096 data.assign(etaColno, rowNo, std::numeric_limits<double>::max( )-1);
00097 } else {
00098 data.assign(lambdaColno, rowNo, lambda);
00099 data.assign(etaColno, rowNo, eta);
00100 }
00101 }
00102 }
00103
00104
00105 void doit2(TableData<DataType>& rawData, TableData<DataType>& data, int row1, int row2) { }
00106
00107 private:
00108 int lambdaColno, etaColno, raColno, decColno;
00109 double decFact, raFact, lFact, eFact;
00110 double degToRad, raOffset, etaOffset;
00111 Converter converter;
00112 };
00113
00114 #endif
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126