USGS

Isis 3.0 Object Programmers' Reference

Home

SpicePosition.h
Go to the documentation of this file.
1 #ifndef SpicePosition_h
2 #define SpicePosition_h
3 
25 #include <string>
26 #include <vector>
27 
28 #include <SpiceUsr.h>
29 #include <SpiceZfc.h>
30 #include <SpiceZmc.h>
31 
32 #include "Table.h"
33 #include "PolynomialUnivariate.h"
34 
35 namespace Isis {
36  class NumericalApproximation;
37 
181  public:
182  //??? jw
187  enum Source { Spice,
192  // table and adding nth degree polynomial
193  };
194 
195  SpicePosition(int targetCode, int observerCode);
196 
198  virtual ~SpicePosition();
199 
200  void SetTimeBias(double timeBias);
201  double GetTimeBias() const;
202 
203  virtual void SetAberrationCorrection(const QString &correction);
204  virtual QString GetAberrationCorrection() const;
205  double GetLightTime() const;
206 
207  const std::vector<double> &SetEphemerisTime(double et);
208  enum PartialType {WRT_X, WRT_Y, WRT_Z};
209 
211  double EphemerisTime() const {
212  return p_et;
213  };
214 
215  const std::vector<double> &GetCenterCoordinate();
216 
218  const std::vector<double> &Coordinate() {
219  return p_coordinate;
220  };
221 
223  const std::vector<double> &Velocity();
224 
226  bool HasVelocity() {
227  return p_hasVelocity;
228  };
229 
230  void LoadCache(double startTime, double endTime, int size);
231  void LoadCache(double time);
232  void LoadCache(Table &table);
233 
234  Table LineCache(const QString &tableName);
235  Table LoadHermiteCache(const QString &tableName);
236 
237  void ReloadCache();
238  void ReloadCache(Table &table);
239 
240  Table Cache(const QString &tableName);
241 
243  bool IsCached() const {
244  return (p_cache.size() > 0);
245  };
246 
247  void SetPolynomial(const Source type = PolyFunction);
248 
249  void SetPolynomial(const std::vector<double>& XC,
250  const std::vector<double>& YC,
251  const std::vector<double>& ZC,
252  const Source type = PolyFunction);
253 
254  void GetPolynomial(std::vector<double>& XC,
255  std::vector<double>& YC,
256  std::vector<double>& ZC);
257 
259  void SetPolynomialDegree(int degree);
260 
263  return p_source;
264  };
265 
266  void ComputeBaseTime();
267 
269  double GetBaseTime() {
270  return p_baseTime;
271  };
272 
273  void SetOverrideBaseTime(double baseTime, double timeScale);
274 
276  double GetTimeScale() {
277  return p_timeScale;
278  };
279 
280  double DPolynomial(const int coeffIndex);
281 
282  std::vector<double> CoordinatePartial(SpicePosition::PartialType partialVar, int coeffIndex);
283 
284  std::vector<double> VelocityPartial(SpicePosition::PartialType partialVar, int coeffIndex);
285  enum OverrideType {NoOverrides, ScaleOnly, BaseAndScale};
286  void Memcache2HermiteCache(double tolerance);
287  std::vector<double> Extrapolate(double timeEt);
288  std::vector<double> HermiteCoordinate();
289  protected:
292  virtual void SetEphemerisTimeSpice();
295 
296  std::vector<int> HermiteIndices(double tol, std::vector <int> indexList);
297 
298  //======================================================================
299  // New methods support for light time correction and swap of observer/target
300  SpicePosition(int targetCode, int observerCode, bool swapObserverTarget);
301  int getObserverCode() const;
302  int getTargetCode() const;
303  double getAdjustedEphemerisTime() const;
304  void computeStateVector(double et, int target, int observer,
305  const QString &refFrame,
306  const QString &abcorr,
307  double state[6], bool &hasVelocity,
308  double &lightTime) const;
309  void setStateVector(const double state[6], const bool &hasVelocity);
310  void setLightTime(const double &lightTime);
311  //======================================================================
312 
313  private:
314  void init(int targetCode, int observerCode,
315  const bool &swapObserverTarget = false);
316  void ClearCache();
317  void LoadTimeCache();
318  void CacheLabel(Table &table);
319  double ComputeVelocityInTime(PartialType var);
320 
323 
324  double p_timeBias;
326 
327  double p_et;
328  std::vector<double> p_coordinate;
329  std::vector<double> p_velocity;
330 
337 
339  std::vector<double> p_cacheTime;
340  std::vector<std::vector<double> > p_cache;
341  std::vector<std::vector<double> > p_cacheVelocity;
342  std::vector<double> p_coefficients[3];
343 
344  double p_baseTime;
345  double p_timeScale;
347  // of degree p_degree has been created and
348  // used to fill the cache
349  int p_degree;
354  OverrideType p_override;
357 
358  // Variables support observer/target swap and light time correction
359  bool m_swapObserverTarget;
360  double m_lt;
361  };
362 };
363 
364 #endif