Isis Developer Reference
SpicePosition.h
Go to the documentation of this file.
1 #ifndef SpicePosition_h
2 #define SpicePosition_h
3 
8 /* SPDX-License-Identifier: CC0-1.0 */
9 #include <string>
10 #include <vector>
11 
12 #include <SpiceUsr.h>
13 #include <SpiceZfc.h>
14 #include <SpiceZmc.h>
15 
16 #include "Table.h"
17 #include "PolynomialUnivariate.h"
18 
19 // ale includes
20 #include "ale/States.h"
21 
22 #include <nlohmann/json.hpp>
23 
24 namespace Isis {
25  class NumericalApproximation;
26 
174  public:
175  //??? jw
180  enum Source { Spice,
185  // table and adding nth degree polynomial
186  };
187 
188  SpicePosition(int targetCode, int observerCode);
189 
191  virtual ~SpicePosition();
192 
193  void SetTimeBias(double timeBias);
194  double GetTimeBias() const;
195 
196  virtual void SetAberrationCorrection(const QString &correction);
197  virtual QString GetAberrationCorrection() const;
198  double GetLightTime() const;
199 
200  const std::vector<double> &SetEphemerisTime(double et);
202 
204  double EphemerisTime() const {
205  return p_et;
206  };
207 
208  const std::vector<double> &GetCenterCoordinate();
209 
211  const std::vector<double> &Coordinate() {
212  return p_coordinate;
213  };
214 
216  const std::vector<double> &Velocity();
217 
219  bool HasVelocity() {
220  return p_hasVelocity;
221  };
222 
223  void LoadCache(double startTime, double endTime, int size);
224  void LoadCache(double time);
225  void LoadCache(Table &table);
226  void LoadCache(nlohmann::json &isd);
227 
228  Table LineCache(const QString &tableName);
229  Table LoadHermiteCache(const QString &tableName);
230 
231  void ReloadCache();
232  void ReloadCache(Table &table);
233 
234  Table Cache(const QString &tableName);
235 
237  bool IsCached() const {
238  return (m_state != NULL);
239  };
240 
242  int cacheSize() const {
243  if (m_state) {
244  return m_state->getStates().size();
245  }
246  return 0;
247  };
248 
249  void SetPolynomial(const Source type = PolyFunction);
250 
251  void SetPolynomial(const std::vector<double>& XC,
252  const std::vector<double>& YC,
253  const std::vector<double>& ZC,
254  const Source type = PolyFunction);
255 
256  void GetPolynomial(std::vector<double>& XC,
257  std::vector<double>& YC,
258  std::vector<double>& ZC);
259 
261  void SetPolynomialDegree(int degree);
262 
265  return p_source;
266  };
267 
268  void ComputeBaseTime();
269 
271  double GetBaseTime() {
272  return p_baseTime;
273  };
274 
275  void SetOverrideBaseTime(double baseTime, double timeScale);
276 
278  double GetTimeScale() {
279  return p_timeScale;
280  };
281 
282  double DPolynomial(const int coeffIndex);
283 
284  std::vector<double> CoordinatePartial(SpicePosition::PartialType partialVar, int coeffIndex);
285 
286  std::vector<double> VelocityPartial(SpicePosition::PartialType partialVar, int coeffIndex);
288  void Memcache2HermiteCache(double tolerance);
289  std::vector<double> Extrapolate(double timeEt);
290  std::vector<double> HermiteCoordinate();
291  protected:
294  virtual void SetEphemerisTimeSpice();
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 
321  int p_targetCode;
322  int p_observerCode;
323 
324  double p_timeBias;
325  QString p_aberrationCorrection;
326 
327  double p_et;
328  std::vector<double> p_coordinate;
329  std::vector<double> p_velocity;
330 
331  Source p_source;
332  std::vector<double> p_cacheTime;
333  std::vector<double> p_coefficients[3];
334 
335  double p_baseTime;
336  double p_timeScale;
337  bool p_degreeApplied;
338  // of degree p_degree has been created and
339  // used to fill the cache
340  int p_degree;
341  double p_fullCacheStartTime;
342  double p_fullCacheEndTime;
343  double p_fullCacheSize;
344  bool p_hasVelocity;
345  OverrideType p_override;
346  double p_overrideBaseTime;
347  double p_overrideTimeScale;
348 
349  // Variables support observer/target swap and light time correction
350  bool m_swapObserverTarget;
351  double m_lt;
352 
353  ale::States *m_state;
354  };
355 };
356 
357 #endif
Isis::SpicePosition::PartialType
PartialType
Definition: SpicePosition.h:201
Isis::SpicePosition::HermiteCache
@ HermiteCache
Object is reading from splined table.
Definition: SpicePosition.h:182
Isis::SpicePosition::GetPolynomial
void GetPolynomial(std::vector< double > &XC, std::vector< double > &YC, std::vector< double > &ZC)
Return the coefficients of a polynomial fit to each of the three coordinates of the position for the ...
Definition: SpicePosition.cpp:1103
Table.h
Isis::SpicePosition
Obtain SPICE position information for a body.
Definition: SpicePosition.h:173
Isis::IException::Io
@ Io
A type of error that occurred when performing an actual I/O operation.
Definition: IException.h:155
Isis::SpicePosition::SetEphemerisTimePolyFunction
void SetEphemerisTimePolyFunction()
This is a protected method that is called by SetEphemerisTime() when Source type is PolyFunction.
Definition: SpicePosition.cpp:1355
Isis::SpicePosition::BaseAndScale
@ BaseAndScale
Definition: SpicePosition.h:287
Isis::LeastSquares::Solve
int Solve(Isis::LeastSquares::SolveMethod method=SVD)
After all the data has been registered through AddKnown, invoke this method to solve the system of eq...
Definition: LeastSquares.cpp:205
Isis::SpicePosition::SetEphemerisTimeSpice
virtual void SetEphemerisTimeSpice()
This is a protected method that is called by SetEphemerisTime() when Source type is Spice.
Definition: SpicePosition.cpp:1432
Isis::SpicePosition::computeStateVector
void computeStateVector(double et, int target, int observer, const QString &refFrame, const QString &abcorr, double state[6], bool &hasVelocity, double &lightTime) const
Computes the state vector of the target w.r.t observer.
Definition: SpicePosition.cpp:1742
Isis::SpicePosition::GetAberrationCorrection
virtual QString GetAberrationCorrection() const
Returns current state of stellar aberration correction.
Definition: SpicePosition.cpp:213
Isis::LineEquation::Intercept
double Intercept()
Compute the intercept of the line.
Definition: LineEquation.cpp:87
Isis::SpicePosition::SetAberrationCorrection
virtual void SetAberrationCorrection(const QString &correction)
Set the aberration correction (light time)
Definition: SpicePosition.cpp:186
TableField.h
Isis::SpicePosition::SetPolynomial
void SetPolynomial(const Source type=PolyFunction)
Set the coefficients of a polynomial fit to each of the components (X, Y, Z) of the position vector f...
Definition: SpicePosition.cpp:930
Isis::SpicePosition::~SpicePosition
virtual ~SpicePosition()
Destructor.
Definition: SpicePosition.cpp:133
Isis::BasisFunction::SetCoefficients
void SetCoefficients(const std::vector< double > &coefs)
Set the coefficients for the equation.
Definition: BasisFunction.cpp:42
Isis::Table::Label
PvlObject & Label()
The Table's label.
Definition: Table.cpp:260
Isis::SpicePosition::GetSource
Source GetSource()
Return the source of the position.
Definition: SpicePosition.h:264
Isis::SpicePosition::HermiteCoordinate
std::vector< double > HermiteCoordinate()
This method returns the Hermite coordinate for the current time for PolyFunctionOverHermiteConstant f...
Definition: SpicePosition.cpp:1646
Isis::SpicePosition::CoordinatePartial
std::vector< double > CoordinatePartial(SpicePosition::PartialType partialVar, int coeffIndex)
Set the coefficients of a polynomial fit to each of the three coordinates of the position vector for ...
Definition: SpicePosition.cpp:1167
Isis::SpicePosition::GetBaseTime
double GetBaseTime()
Return the base time for the position.
Definition: SpicePosition.h:271
SpicePosition.h
Isis::SpicePosition::WRT_X
@ WRT_X
Definition: SpicePosition.h:201
Isis::SpicePosition::getAdjustedEphemerisTime
double getAdjustedEphemerisTime() const
Returns adjusted ephemeris time.
Definition: SpicePosition.cpp:1705
Isis::PolynomialUnivariate
Nth degree Polynomial with one variable.
Definition: PolynomialUnivariate.h:37
Isis::SpicePosition::Coordinate
const std::vector< double > & Coordinate()
Return the current J2000 position.
Definition: SpicePosition.h:211
Isis::TableRecord::Fields
int Fields() const
Returns the number of fields that are currently in the record.
Definition: TableRecord.cpp:78
NaifStatus.h
Isis::SpicePosition::SetTimeBias
void SetTimeBias(double timeBias)
Apply a time bias when invoking SetEphemerisTime method.
Definition: SpicePosition.cpp:150
Isis::SpicePosition::getTargetCode
int getTargetCode() const
Returns target code.
Definition: SpicePosition.cpp:1689
Isis::SpicePosition::ComputeBaseTime
void ComputeBaseTime()
Compute the base time using cached times.
Definition: SpicePosition.cpp:1116
Isis::SpicePosition::GetTimeBias
double GetTimeBias() const
Returns the value of the time bias added to ET.
Definition: SpicePosition.cpp:161
Isis::LineEquation
Utility class for creating and using cartesean line equations.
Definition: LineEquation.h:29
Isis::SpicePosition::setStateVector
void setStateVector(const double state[6], const bool &hasVelocity)
Sets the state of target relative to observer.
Definition: SpicePosition.cpp:1794
Isis::SpicePosition::SetEphemerisTimeMemcache
void SetEphemerisTimeMemcache()
This is a protected method that is called by SetEphemerisTime() when Source type is Memcache.
Definition: SpicePosition.cpp:1294
NumericalApproximation.h
Isis::SpicePosition::SpicePosition
SpicePosition(int targetCode, int observerCode)
Construct an empty SpicePosition class using valid body codes.
Definition: SpicePosition.cpp:37
Isis::NaifStatus::CheckErrors
static void CheckErrors(bool resetNaif=true)
This method looks for any naif errors that might have occurred.
Definition: NaifStatus.cpp:28
Isis::SpicePosition::LineCache
Table LineCache(const QString &tableName)
Return a table with J2000 to reference positions.
Definition: SpicePosition.cpp:704
Isis::SpicePosition::SetEphemerisTime
const std::vector< double > & SetEphemerisTime(double et)
Return J2000 coordinate at given time.
Definition: SpicePosition.cpp:249
Isis::TableRecord
Definition: TableRecord.h:38
QStringList
Isis::SpicePosition::SetEphemerisTimePolyFunctionOverHermiteConstant
void SetEphemerisTimePolyFunctionOverHermiteConstant()
This is a protected method that is called by SetEphemerisTime() when Source type is PolyFunctionOverH...
Definition: SpicePosition.cpp:1403
Isis::toString
QString toString(bool boolToConvert)
Global function to convert a boolean to a string.
Definition: IString.cpp:211
Isis::SpicePosition::SetEphemerisTimeHermiteCache
void SetEphemerisTimeHermiteCache()
This is a protected method that is called by SetEphemerisTime() when Source type is HermiteCache.
Definition: SpicePosition.cpp:1324
Isis::SpicePosition::Spice
@ Spice
Object is reading directly from the kernels.
Definition: SpicePosition.h:180
Isis::SpicePosition::GetCenterCoordinate
const std::vector< double > & GetCenterCoordinate()
Compute and return the coordinate at the center time.
Definition: SpicePosition.cpp:1586
Isis::SpicePosition::HasVelocity
bool HasVelocity()
Return the flag indicating whether the velocity exists.
Definition: SpicePosition.h:219
Isis::SpicePosition::PolyFunctionOverHermiteConstant
@ PolyFunctionOverHermiteConstant
Object is reading from splined.
Definition: SpicePosition.h:184
Isis::SpicePosition::getObserverCode
int getObserverCode() const
Returns observer code.
Definition: SpicePosition.cpp:1675
Isis::SpicePosition::LoadHermiteCache
Table LoadHermiteCache(const QString &tableName)
Cache J2000 position over existing cached time range using polynomials stored as Hermite cubic spline...
Definition: SpicePosition.cpp:793
LineEquation.h
Isis::SpicePosition::PolyFunction
@ PolyFunction
Object is calculated from nth degree polynomial.
Definition: SpicePosition.h:183
Isis::SpicePosition::LoadCache
void LoadCache(double startTime, double endTime, int size)
Cache J2000 position over a time range.
Definition: SpicePosition.cpp:297
Isis::SpicePosition::ScaleOnly
@ ScaleOnly
Definition: SpicePosition.h:287
Isis::LeastSquares
Generic least square fitting class.
Definition: LeastSquares.h:99
Isis::SpicePosition::GetLightTime
double GetLightTime() const
Return the light time coorection value.
Definition: SpicePosition.cpp:230
_FILEINFO_
#define _FILEINFO_
Macro for the filename and line number.
Definition: IException.h:24
Isis::SpicePosition::cacheSize
int cacheSize() const
Get the size of the current cached positions.
Definition: SpicePosition.h:242
Isis::PvlObject::hasKeyword
bool hasKeyword(const QString &kname, FindOptions opts) const
See if a keyword is in the current PvlObject, or deeper inside other PvlObjects and Pvlgroups within ...
Definition: PvlObject.cpp:236
Isis::TableField::Double
@ Double
The values in the field are 8 byte doubles.
Definition: TableField.h:54
json
nlohmann::json json
Definition: PvlObject.cpp:22
Isis::Table
Class for storing Table blobs information.
Definition: Table.h:61
Isis::Table::Name
QString Name() const
The Table's name.
Definition: Table.cpp:247
LeastSquares.h
Isis::SpicePosition::Source
Source
This enum indicates the status of the object.
Definition: SpicePosition.h:180
Isis::IException
Isis exception class.
Definition: IException.h:91
Isis::SpicePosition::setLightTime
void setLightTime(const double &lightTime)
Inheritors can set the light time if indicated.
Definition: SpicePosition.cpp:1824
Isis::SpicePosition::NoOverrides
@ NoOverrides
Definition: SpicePosition.h:287
Isis::Spice
Obtain SPICE information for a spacecraft.
Definition: Spice.h:283
Isis::SpicePosition::Extrapolate
std::vector< double > Extrapolate(double timeEt)
Extrapolate position for a given time assuming a constant velocity.
Definition: SpicePosition.cpp:1626
Isis::SpicePosition::EphemerisTime
double EphemerisTime() const
Return the current ephemeris time.
Definition: SpicePosition.h:204
BasisFunction.h
Isis::SpicePosition::Memcache2HermiteCache
void Memcache2HermiteCache(double tolerance)
This method reduces the cache for position, time and velocity to the minimum number of values needed ...
Definition: SpicePosition.cpp:1463
IException.h
Isis::toDouble
double toDouble(const QString &string)
Global function to convert from a string to a double.
Definition: IString.cpp:149
Isis::IException::Programmer
@ Programmer
This error is for when a programmer made an API call that was illegal.
Definition: IException.h:146
Isis::SpicePosition::SetOverrideBaseTime
void SetOverrideBaseTime(double baseTime, double timeScale)
Set an override base time to be used with observations on scanners to allow all images in an observat...
Definition: SpicePosition.cpp:1147
Isis::SpicePosition::Velocity
const std::vector< double > & Velocity()
Return the current J2000 velocity.
Definition: SpicePosition.cpp:1269
json
nlohmann::json json
This is free and unencumbered software released into the public domain.
Definition: SpicePosition.cpp:26
Isis::SpicePosition::WRT_Z
@ WRT_Z
Definition: SpicePosition.h:201
Isis::SpicePosition::OverrideType
OverrideType
Definition: SpicePosition.h:287
Isis::PvlObject::findKeyword
PvlKeyword & findKeyword(const QString &kname, FindOptions opts)
Finds a keyword in the current PvlObject, or deeper inside other PvlObjects and Pvlgroups within this...
Definition: PvlObject.cpp:177
Isis::SpicePosition::IsCached
bool IsCached() const
Is this position cached.
Definition: SpicePosition.h:237
Isis::LineEquation::Slope
double Slope()
Compute the slope of the line.
Definition: LineEquation.cpp:66
Isis::SpicePosition::WRT_Y
@ WRT_Y
Definition: SpicePosition.h:201
Isis::LeastSquares::AddKnown
void AddKnown(const std::vector< double > &input, double expected, double weight=1.0)
Invoke this method for each set of knowns.
Definition: LeastSquares.cpp:96
Isis::SpicePosition::Cache
Table Cache(const QString &tableName)
Return a table with J2000 positions.
Definition: SpicePosition.cpp:549
Isis::SpicePosition::Memcache
@ Memcache
Object is reading from cached table.
Definition: SpicePosition.h:181
Isis::Table::Records
int Records() const
Returns the number of records.
Definition: Table.cpp:313
Isis::SpicePosition::ReloadCache
void ReloadCache()
Cache J2000 positions over existing cached time range using polynomials.
Definition: SpicePosition.cpp:729
Isis::BasisFunction::Evaluate
double Evaluate(const std::vector< double > &vars)
Compute the equation using the input variables.
Definition: BasisFunction.cpp:64
Isis::SpicePosition::GetTimeScale
double GetTimeScale()
Return the time scale for the position.
Definition: SpicePosition.h:278
Isis::SpicePosition::DPolynomial
double DPolynomial(const int coeffIndex)
Evaluate the derivative of the fit polynomial (parabola) defined by the given coefficients with respe...
Definition: SpicePosition.cpp:1244
Isis
This is free and unencumbered software released into the public domain.
Definition: Apollo.h:16
Isis::BasisFunction::Coefficients
int Coefficients() const
Returns the number of coefficients for the equation.
Definition: BasisFunction.h:64
PolynomialUnivariate.h
Isis::BasisFunction::Coefficient
double Coefficient(int i) const
Returns the ith coefficient.
Definition: BasisFunction.h:107
Isis::SpicePosition::VelocityPartial
std::vector< double > VelocityPartial(SpicePosition::PartialType partialVar, int coeffIndex)
Compute the derivative of the velocity with respect to the specified variable.
Definition: SpicePosition.cpp:1208
Isis::TableField
Class for storing an Isis::Table's field information.
Definition: TableField.h:47
Isis::SpicePosition::SetPolynomialDegree
void SetPolynomialDegree(int degree)
Set the polynomial degree.
Definition: SpicePosition.cpp:1502