lsst.astshim  16.0-2-g0febb12+11
Frame.h
Go to the documentation of this file.
1 /*
2  * LSST Data Management System
3  * Copyright 2017 AURA/LSST.
4  *
5  * This product includes software developed by the
6  * LSST Project (http://www.lsst.org/).
7  *
8  * This program is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the LSST License Statement and
19  * the GNU General Public License along with this program. If not,
20  * see <https://www.lsstcorp.org/LegalNotices/>.
21  */
22 #ifndef ASTSHIM_FRAME_H
23 #define ASTSHIM_FRAME_H
24 
25 #include <memory>
26 #include <sstream>
27 #include <stdexcept>
28 #include <utility>
29 
30 #include "astshim/Mapping.h"
31 #include "astshim/Object.h"
32 #include "astshim/base.h"
33 #include "astshim/detail/utils.h"
34 
35 namespace ast {
36 
37 class CmpFrame;
38 class Frame;
39 
44 public:
51  DirectionPoint(double direction, PointD const &point) : direction(direction), point(point){};
52  double direction;
54 };
55 
59 class NReadValue {
60 public:
67  NReadValue(int nread, double value) : nread(nread), value(value){};
68  int nread;
69  double value;
70 };
71 
76 public:
82  explicit ResolvedPoint(int naxes) : point(naxes), d1(), d2() {}
83  std::vector<double> point;
84  double d1;
85  double d2;
86 };
87 
91 class FrameMapping {
92 public:
99  FrameMapping(std::shared_ptr<Frame> frame, std::shared_ptr<Mapping> mapping)
100  : frame(frame), mapping(mapping) {}
101  std::shared_ptr<Frame> frame;
102  std::shared_ptr<Mapping> mapping;
103 };
104 
105 class FrameSet;
106 
157 class Frame : public Mapping {
158  friend class Object;
159 
160 public:
168  explicit Frame(int naxes, std::string const &options = "")
169  : Mapping(reinterpret_cast<AstMapping *>(astFrame(naxes, "%s", options.c_str()))) {}
170 
171  virtual ~Frame() {}
172 
174  Frame(Frame const &) = default;
175  Frame(Frame &&) = default;
176  Frame &operator=(Frame const &) = delete;
177  Frame &operator=(Frame &&) = default;
178 
180  std::shared_ptr<Frame> copy() const { return std::static_pointer_cast<Frame>(copyPolymorphic()); }
181 
199  double angle(PointD const &a, PointD const &b, PointD const &c) const {
200  assertPointLength(a, "a");
201  assertPointLength(b, "b");
202  assertPointLength(c, "c");
203  return detail::safeDouble(astAngle(getRawPtr(), a.data(), b.data(), c.data()));
204  }
205 
227  double axAngle(PointD const &a, PointD const &b, int axis) const {
228  assertPointLength(a, "a");
229  assertPointLength(b, "b");
230  return detail::safeDouble(astAxAngle(getRawPtr(), a.data(), b.data(), axis));
231  }
232 
245  double axDistance(int axis, double v1, double v2) const {
246  return detail::safeDouble(astAxDistance(getRawPtr(), axis, v1, v2));
247  }
248 
261  double axOffset(int axis, double v1, double dist) const {
262  return detail::safeDouble(astAxOffset(getRawPtr(), axis, v1, dist));
263  }
264 
457  std::shared_ptr<FrameSet> convert(Frame const &to, std::string const &domainlist = "");
458 
472  double distance(PointD const &point1, PointD const &point2) const {
473  assertPointLength(point1, "point1");
474  assertPointLength(point2, "point2");
475  return detail::safeDouble(astDistance(getRawPtr(), point1.data(), point2.data()));
476  }
477 
767  std::shared_ptr<FrameSet> findFrame(Frame const &tmplt, std::string const &domainlist = "");
768 
780  std::string format(int axis, double value) const {
781  char const *rawstr = astFormat(getRawPtr(), axis, value);
782  assertOK();
783  return std::string(rawstr);
784  }
785 
790  bool getActiveUnit() const {
791  bool ret = astGetActiveUnit(getRawPtr());
792  assertOK();
793  return ret;
794  }
795 
800  std::string getAlignSystem() const { return getC("AlignSystem"); }
801 
805  double getBottom(int axis) const { return getD(detail::formatAxisAttr("Bottom", axis)); }
806 
810  int getDigits() const { return getI("Digits"); }
811 
815  int getDigits(int axis) const { return getI(detail::formatAxisAttr("Digits", axis)); }
816 
820  bool getDirection(int axis) const { return getB(detail::formatAxisAttr("Direction", axis)); }
821 
825  std::string getDomain() const { return getC("Domain"); }
826 
830  double getDut1() const { return getD("Dut1"); }
831 
835  double getEpoch() const { return getD("Epoch"); }
836 
840  std::string getFormat(int axis) const { return getC(detail::formatAxisAttr("Format", axis)); }
841 
846  std::string getInternalUnit(int axis) const { return getC(detail::formatAxisAttr("InternalUnit", axis)); }
847 
851  std::string getLabel(int axis) const { return getC(detail::formatAxisAttr("Label", axis)); }
852 
856  bool getMatchEnd() const { return getB("MatchEnd"); }
857 
862  int getMaxAxes() const { return getI("MaxAxes"); }
863 
868  int getMinAxes() const { return getI("MinAxes"); }
869 
874  int getNAxes() const { return getI("NAxes"); }
875 
880  std::string getNormUnit(int axis) const { return getC(detail::formatAxisAttr("NormUnit", axis)); }
881 
885  double getObsAlt() const { return getD("ObsAlt"); }
886 
890  std::string getObsLat() const { return getC("ObsLat"); }
891 
895  std::string getObsLon() const { return getC("ObsLon"); }
896 
900  bool getPermute() const { return getB("Permute"); }
901 
905  bool getPreserveAxes() const { return getB("PreserveAxes"); }
906 
910  std::string getSymbol(int axis) const { return getC(detail::formatAxisAttr("Symbol", axis)); }
911 
916  std::string getSystem() const { return getC("System"); }
917 
921  std::string getTitle() const { return getC("Title"); }
922 
926  double getTop(int axis) const { return getD(detail::formatAxisAttr("Top", axis)); }
927 
931  std::string getUnit(int axis) const { return getC(detail::formatAxisAttr("Unit", axis)); }
932 
964  std::vector<double> intersect(std::vector<double> const &a1, std::vector<double> const &a2,
965  std::vector<double> const &b1, std::vector<double> const &b2) const;
966 
983  std::vector<int> matchAxes(Frame const &other) const {
984  std::vector<int> ret(other.getNIn());
985  astMatchAxes(getRawPtr(), other.getRawPtr(), ret.data());
986  assertOK();
987  return ret;
988  }
989 
1021  CmpFrame under(Frame const &next) const;
1022 
1043  PointD norm(PointD value) const {
1044  astNorm(getRawPtr(), value.data());
1045  assertOK();
1046  detail::astBadToNan(value);
1047  return value;
1048  }
1049 
1073  PointD offset(PointD point1, PointD point2, double offset) const {
1074  assertPointLength(point1, "point1");
1075  assertPointLength(point2, "point2");
1076  PointD ret(getNIn());
1077  astOffset(getRawPtr(), point1.data(), point2.data(), offset, ret.data());
1078  assertOK();
1079  detail::astBadToNan(ret);
1080  return ret;
1081  }
1082 
1115  DirectionPoint offset2(PointD const &point1, double angle, double offset) const {
1116  detail::assertEqual(getNIn(), "naxes", 2, " cannot call offset2");
1117  assertPointLength(point1, "point1");
1118  PointD point2(getNIn());
1119  double offsetAngle = astOffset2(getRawPtr(), point1.data(), angle, offset, point2.data());
1120  assertOK();
1121  detail::astBadToNan(point2);
1122  return DirectionPoint(detail::safeDouble(offsetAngle), point2);
1123  }
1124 
1136  void permAxes(std::vector<int> perm) {
1137  detail::assertEqual(perm.size(), "perm.size()", static_cast<std::size_t>(getNAxes()), "naxes");
1138  astPermAxes(getRawPtr(), perm.data());
1139  assertOK();
1140  }
1141 
1161  FrameMapping pickAxes(std::vector<int> const &axes) const;
1162 
1194  ResolvedPoint resolve(std::vector<double> const &point1, std::vector<double> const &point2,
1195  std::vector<double> const &point3) const;
1196 
1201  void setAlignSystem(std::string const &system) { setC("AlignSystem", system); }
1202 
1206  void setBottom(int axis, double bottom) { setD(detail::formatAxisAttr("Bottom", axis), bottom); }
1207 
1211  void setDigits(int digits) { setI("Digits", digits); }
1212 
1216  void setDigits(int axis, int digits) { setD(detail::formatAxisAttr("Digits", axis), digits); }
1217 
1221  void setDirection(bool direction, int axis) {
1222  setB(detail::formatAxisAttr("Direction", axis), direction);
1223  }
1224 
1228  virtual void setDomain(std::string const &domain) { setC("Domain", domain); }
1229 
1233  void setDut1(double dut1) { setD("Dut1", dut1); }
1234 
1238  void setEpoch(double epoch) { setD("Epoch", epoch); }
1239 
1243  void setEpoch(std::string const &epoch) { setC("Epoch", epoch); }
1244 
1248  void setFormat(int axis, std::string const &format) {
1249  setC(detail::formatAxisAttr("Format", axis), format);
1250  }
1251 
1255  void setLabel(int axis, std::string const &label) { setC(detail::formatAxisAttr("Label", axis), label); }
1256 
1260  void setMatchEnd(bool match) { setB("MatchEnd", match); }
1261 
1266  void setMaxAxes(int maxAxes) { setI("MaxAxes", maxAxes); }
1267 
1272  void setMinAxes(int minAxes) { setI("MinAxes", minAxes); }
1273 
1277  void setObsAlt(double alt) { setD("ObsAlt", alt); }
1278 
1282  void setObsLat(std::string const &lat) { setC("ObsLat", lat); }
1283 
1287  void setObsLon(std::string const &lon) { setC("ObsLon", lon); }
1288 
1293  void setActiveUnit(bool enable) {
1294  astSetActiveUnit(getRawPtr(), enable);
1295  assertOK();
1296  }
1297 
1301  void setPermute(bool permute) { setB("Permute", permute); }
1302 
1306  void setPreserveAxes(bool preserve) { setB("PreserveAxes", preserve); }
1307 
1311  void setSymbol(int axis, std::string const &symbol) {
1312  setC(detail::formatAxisAttr("Symbol", axis), symbol);
1313  }
1314 
1319  void setSystem(std::string const &system) { setC("System", system); }
1320 
1324  void setTitle(std::string const &title) { setC("Title", title); }
1325 
1329  void setTop(int axis, double top) { setD(detail::formatAxisAttr("Top", axis), top); }
1330 
1334  void setUnit(int axis, std::string const &unit) { setC(detail::formatAxisAttr("Unit", axis), unit); }
1335 
1500  NReadValue unformat(int axis, std::string const &str) const {
1501  double value;
1502  int nread = astUnformat(getRawPtr(), axis, str.c_str(), &value);
1503  assertOK();
1504  return NReadValue(nread, detail::safeDouble(value));
1505  }
1506 
1507 protected:
1517  explicit Frame(AstFrame *rawPtr) : Mapping(reinterpret_cast<AstMapping *>(rawPtr)) {
1518  if (!astIsAFrame(getRawPtr())) {
1519  std::ostringstream os;
1520  os << "This is a " << getClassName() << ", which is not a Frame";
1521  throw std::invalid_argument(os.str());
1522  }
1523  }
1524 
1525  virtual std::shared_ptr<Object> copyPolymorphic() const override { return copyImpl<Frame, AstFrame>(); }
1526 
1527 private:
1534  template <typename T>
1535  void assertPointLength(T const &p, char const *name) const {
1536  if (static_cast<int>(p.size()) != getNIn()) {
1537  std::ostringstream os;
1538  os << "point " << name << " has " << p.size() << " axes, but " << getNIn() << " required";
1539  throw std::invalid_argument(os.str());
1540  }
1541  }
1542 };
1543 
1544 } // namespace ast
1545 
1546 #endif
double axOffset(int axis, double v1, double dist) const
Definition: Frame.h:261
Definition: CmpFrame.h:60
Frame(int naxes, std::string const &options="")
Definition: Frame.h:168
std::string getDomain() const
Definition: Frame.h:825
void setDigits(int digits)
Definition: Frame.h:1211
void setObsLat(std::string const &lat)
Definition: Frame.h:1282
double getTop(int axis) const
Definition: Frame.h:926
Definition: Frame.h:75
AstObject const * getRawPtr() const
Definition: Object.h:291
double value
Value that was read.
Definition: Frame.h:69
void setEpoch(std::string const &epoch)
Definition: Frame.h:1243
Definition: Frame.h:91
void setPreserveAxes(bool preserve)
Definition: Frame.h:1306
double distance(PointD const &point1, PointD const &point2) const
Definition: Frame.h:472
AST wrapper classes and functions.
Definition: attributes_channel.dox:1
double axDistance(int axis, double v1, double v2) const
Definition: Frame.h:245
void setMaxAxes(int maxAxes)
Definition: Frame.h:1266
void setDut1(double dut1)
Definition: Frame.h:1233
std::shared_ptr< Frame > copy() const
Return a deep copy of this object.
Definition: Frame.h:180
double d2
Resolved vector component 2.
Definition: Frame.h:85
void assertOK(AstObject *rawPtr1=nullptr, AstObject *rawPtr2=nullptr)
Definition: base.cc:49
void setSymbol(int axis, std::string const &symbol)
Definition: Frame.h:1311
DirectionPoint(double direction, PointD const &point)
Definition: Frame.h:51
double getBottom(int axis) const
Definition: Frame.h:805
std::vector< double > point
Point.
Definition: Frame.h:83
double axAngle(PointD const &a, PointD const &b, int axis) const
Definition: Frame.h:227
void setFormat(int axis, std::string const &format)
Definition: Frame.h:1248
void permAxes(std::vector< int > perm)
Definition: Frame.h:1136
void astBadToNan(std::vector< double > &p)
Definition: utils.h:58
double direction
Direction, an angle in radians.
Definition: Frame.h:51
void setTop(int axis, double top)
Definition: Frame.h:1329
Definition: Mapping.h:59
bool getMatchEnd() const
Definition: Frame.h:856
std::string getFormat(int axis) const
Definition: Frame.h:840
PointD point
Point.
Definition: Frame.h:53
void setEpoch(double epoch)
Definition: Frame.h:1238
std::string getSystem() const
Definition: Frame.h:916
Definition: Frame.h:59
Definition: Frame.h:157
int getNAxes() const
Definition: Frame.h:874
std::shared_ptr< Mapping > mapping
Mapping.
Definition: Frame.h:102
std::string getUnit(int axis) const
Definition: Frame.h:931
void setBottom(int axis, double bottom)
Definition: Frame.h:1206
Frame(AstFrame *rawPtr)
Definition: Frame.h:1517
double d1
Resolved vector component 1.
Definition: Frame.h:84
void setLabel(int axis, std::string const &label)
Definition: Frame.h:1255
std::shared_ptr< Frame > frame
Frame.
Definition: Frame.h:101
void setObsAlt(double alt)
Definition: Frame.h:1277
PointD offset(PointD point1, PointD point2, double offset) const
Definition: Frame.h:1073
int getDigits() const
Definition: Frame.h:810
virtual void setDomain(std::string const &domain)
Definition: Frame.h:1228
bool getDirection(int axis) const
Definition: Frame.h:820
std::string getObsLon() const
Definition: Frame.h:895
int getDigits(int axis) const
Definition: Frame.h:815
double getObsAlt() const
Definition: Frame.h:885
std::vector< double > PointD
Definition: base.h:57
std::string getClassName(AstObject const *rawObj)
Definition: utils.cc:37
double angle(PointD const &a, PointD const &b, PointD const &c) const
Definition: Frame.h:199
int getMaxAxes() const
Definition: Frame.h:862
std::string getInternalUnit(int axis) const
Definition: Frame.h:846
double getEpoch() const
Definition: Frame.h:835
std::string getTitle() const
Definition: Frame.h:921
int getNIn() const
Definition: Mapping.h:77
bool getPreserveAxes() const
Definition: Frame.h:905
std::string getLabel(int axis) const
Definition: Frame.h:851
ResolvedPoint(int naxes)
Definition: Frame.h:82
double getDut1() const
Definition: Frame.h:830
void setObsLon(std::string const &lon)
Definition: Frame.h:1287
std::string formatAxisAttr(std::string const &name, int axis)
Definition: utils.h:78
void setMatchEnd(bool match)
Definition: Frame.h:1260
bool getPermute() const
Definition: Frame.h:900
double safeDouble(double val)
Definition: utils.h:99
std::string getAlignSystem() const
Definition: Frame.h:800
void assertEqual(T1 val1, std::string const &descr1, T2 val2, std::string const &descr2)
Definition: utils.h:47
virtual ~Frame()
Definition: Frame.h:171
void setUnit(int axis, std::string const &unit)
Definition: Frame.h:1334
void setSystem(std::string const &system)
Definition: Frame.h:1319
std::string getObsLat() const
Definition: Frame.h:890
FrameMapping(std::shared_ptr< Frame > frame, std::shared_ptr< Mapping > mapping)
Definition: Frame.h:99
Definition: Frame.h:43
void setDirection(bool direction, int axis)
Definition: Frame.h:1221
DirectionPoint offset2(PointD const &point1, double angle, double offset) const
Definition: Frame.h:1115
NReadValue unformat(int axis, std::string const &str) const
Definition: Frame.h:1500
std::string format(int axis, double value) const
Definition: Frame.h:780
Definition: Object.h:51
std::string getSymbol(int axis) const
Definition: Frame.h:910
void setMinAxes(int minAxes)
Definition: Frame.h:1272
Definition: FrameSet.h:99
void setActiveUnit(bool enable)
Definition: Frame.h:1293
void setAlignSystem(std::string const &system)
Definition: Frame.h:1201
NReadValue(int nread, double value)
Definition: Frame.h:67
bool getActiveUnit() const
Definition: Frame.h:790
virtual std::shared_ptr< Object > copyPolymorphic() const override
Definition: Frame.h:1525
void setPermute(bool permute)
Definition: Frame.h:1301
void setDigits(int axis, int digits)
Definition: Frame.h:1216
void setTitle(std::string const &title)
Definition: Frame.h:1324
std::vector< int > matchAxes(Frame const &other) const
Definition: Frame.h:983
PointD norm(PointD value) const
Definition: Frame.h:1043
std::string getNormUnit(int axis) const
Definition: Frame.h:880
int getMinAxes() const
Definition: Frame.h:868