CppEphem
CEObserver.h
Go to the documentation of this file.
1 /***************************************************************************
2  * CEObserver.h: CppEphem *
3  * ----------------------------------------------------------------------- *
4  * Copyright © 2016-2019 JCardenzana *
5  * ----------------------------------------------------------------------- *
6  * *
7  * This program is free software: you can redistribute it and/or modify *
8  * it under the terms of the GNU General Public License as published by *
9  * the Free Software Foundation, either version 3 of the License, or *
10  * (at your option) any later version. *
11  * *
12  * This program is distributed in the hope that it will be useful, *
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15  * GNU General Public License for more details. *
16  * *
17  * You should have received a copy of the GNU General Public License *
18  * along with this program. If not, see <http://www.gnu.org/licenses/>. *
19  * *
20  ***************************************************************************/
21 
22 #ifndef CEObserver_h
23 #define CEObserver_h
24 
25 #include "CEAngle.h"
26 #include "CEDate.h"
27 #include "CENamespace.h"
28 
29 class CEObserver {
30 public:
31  CEObserver(void) ;
32  CEObserver(const double& longitude,
33  const double& latitude,
34  const double& elevation,
35  const CEAngleType& angle_type = CEAngleType::DEGREES) ;
36  CEObserver(const CEObserver& other) ;
37  virtual ~CEObserver(void) ;
38 
39  CEObserver& operator=(const CEObserver& other);
40 
41  /****************************************************
42  * Methods for accessing the underlying observer info
43  ****************************************************/
44  double Longitude_Rad() const;
45  double Longitude_Deg() const;
46  double Latitude_Rad() const;
47  double Latitude_Deg() const;
48  double Elevation_m() const;
49  double Pressure_hPa() const;
50  double Temperature_C() const;
51  double Temperature_K() const;
52  double Temperature_F() const;
53  double RelativeHumidity() const;
54  double Wavelength_um() const;
55  void SetUTCOffset(const double& utc_offset);
56  double UTCOffset() const;
57  std::vector<double> Time(const CEDate& date);
58  std::vector<double> Time_UTC(const CEDate& date);
59 
60  /****************************************************
61  * Methods for setting the underlying observer info
62  ****************************************************/
63  void SetElevation(const double& elevation=0.0);
64  void SetLongitude(const double& longitude,
65  const CEAngleType& angle_type=CEAngleType::RADIANS);
66  void SetLatitude(const double& latitude,
67  const CEAngleType& angle_type=CEAngleType::RADIANS);
68  void SetGeoCoordinates(const double& longitude,
69  const double& latitude,
70  const CEAngleType& angle_type=CEAngleType::RADIANS);
72  void SetRelativeHumidity(const double& humidity=0.0);
73  void SetTemperature_C(const double& temp_C=CppEphem::SeaLevelTemp_C());
74  void SetTemperature_K(const double& temp_K=CppEphem::SeaLevelTemp_K());
75  void SetTemperature_F(const double& temp_F=CppEphem::SeaLevelTemp_F());
76  void SetWavelength_um(const double& new_wavelength_um);
77 
78  /****************************************************
79  * Methods for getting observer position and velocity
80  * vectors relative to CIRS and ICRS coordinates
81  ****************************************************/
82  std::vector<double> PositionGeo(void) const;
83  std::vector<double> PositionCIRS(const CEDate& date) const;
84  std::vector<double> PositionICRS(const CEDate& date) const;
85  std::vector<double> VelocityCIRS(const CEDate& date) const;
86  std::vector<double> VelocityICRS(const CEDate& date) const;
87 
88  // Print information about the observer
89  std::string print(void) const;
90 
91 private:
92 
93  void copy_members(const CEObserver& other);
94  void init_members(void);
95  void free_members(void);
96 
97  // Update teh Position and velocity vectors
98  void UpdatePosVel(const CEDate& date) const;
99 
100  // Variables which define the observers location on Earth
101  double longitude_;
102  double latitude_;
103  double elevation_m_;
104 
105  // Variables defining the observers atmospheric conditions
106  double pressure_hPa_;
107  double temperature_celsius_;
108  double relative_humidity_;
109  double wavelength_um_;
110 
111  // Cached position/velocity vectors
112  mutable double cache_date_;
113  mutable std::vector<double> pos_cirs_;
114  mutable std::vector<double> pos_icrs_;
115  mutable std::vector<double> vel_cirs_;
116  mutable std::vector<double> vel_icrs_;
117 
118  // Variables defining the time of the observer
119  double utc_offset_;
120 };
121 
122 
123 /**********************************************************************/
126 inline
128 {
129  return longitude_ ;
130 }
131 
132 
133 /**********************************************************************/
136 inline
137 double CEObserver::Longitude_Deg() const
138 {
139  return longitude_ * DR2D ;
140 }
141 
142 
143 /**********************************************************************/
146 inline
147 double CEObserver::Latitude_Rad() const
148 {
149  return latitude_ ;
150 }
151 
152 
153 /**********************************************************************/
156 inline
157 double CEObserver::Latitude_Deg() const
158 {
159  return latitude_ * DR2D ;
160 }
161 
162 
163 /**********************************************************************/
166 inline
167 double CEObserver::Elevation_m() const
168 {
169  return elevation_m_ ;
170 }
171 
172 
173 /**********************************************************************/
176 inline
177 double CEObserver::Pressure_hPa() const
178 {
179  return pressure_hPa_ ;
180 }
181 
182 
183 /**********************************************************************/
186 inline
187 double CEObserver::Temperature_C() const
188 {
189  return temperature_celsius_ ;
190 }
191 
192 
193 /**********************************************************************/
196 inline
197 double CEObserver::Temperature_K() const
198 {
200 }
201 
202 
203 /**********************************************************************/
206 inline
207 double CEObserver::Temperature_F() const
208 {
210 }
211 
212 
213 /**********************************************************************/
216 inline
217 double CEObserver::RelativeHumidity() const
218 {
219  return relative_humidity_ ;
220 }
221 
222 
223 /**********************************************************************/
226 inline
227 double CEObserver::Wavelength_um() const
228 {
229  return wavelength_um_ ;
230 }
231 
232 
233 /**********************************************************************/
236 inline
237 void CEObserver::SetUTCOffset(const double& utc_offset)
238 {
239  utc_offset_ = utc_offset ;
240 }
241 
242 
243 /**********************************************************************/
246 inline
247 double CEObserver::UTCOffset() const
248 {
249  return utc_offset_ ;
250 }
251 
252 
253 /**********************************************************************/
258 inline
259 std::vector<double> CEObserver::Time(const CEDate& date)
260 {
261  double utc = date.MJD();
262  utc -= std::floor(utc);
263  utc += utc_offset_/24.0; // Do this here for precision reasons
264  utc *= CppEphem::sec_per_day();
266 }
267 
268 
269 /**********************************************************************/
274 inline
275 std::vector<double> CEObserver::Time_UTC(const CEDate& date)
276 {
277  return CETime::TimeDbl2Vect(date.GetTime_UTC()) ;
278 }
279 
280 
281 /**********************************************************************/
285 inline
286 void CEObserver::SetElevation(const double& elevation)
287 {
288  elevation_m_ = elevation ;
289 }
290 
291 
292 /**********************************************************************/
297 inline
298 void CEObserver::SetLongitude(const double& longitude,
299  const CEAngleType& angle_type)
300 {
301  longitude_ = longitude * ((angle_type==CEAngleType::RADIANS) ? 1 : DD2R) ;
302 }
303 
304 
305 /**********************************************************************/
310 inline
311 void CEObserver::SetLatitude(const double& latitude,
312  const CEAngleType& angle_type)
313 {
314  latitude_ = latitude * ((angle_type==CEAngleType::RADIANS) ? 1 : DD2R) ;
315 }
316 
317 
318 /**********************************************************************/
324 inline
325 void CEObserver::SetGeoCoordinates(const double& longitude,
326  const double& latitude,
327  const CEAngleType& angle_type)
328 {
329  SetLongitude(longitude, angle_type);
330  SetLatitude(latitude, angle_type);
331 }
332 
333 
334 /**********************************************************************/
338 inline
339 void CEObserver::SetPressure_hPa(const double& pressure)
340 {
341  pressure_hPa_ = pressure ;
342 }
343 
344 
345 /**********************************************************************/
349 inline
350 void CEObserver::SetRelativeHumidity(const double& humidity)
351 {
352  relative_humidity_ = humidity ;
353 }
354 
355 
356 /**********************************************************************/
360 inline
361 void CEObserver::SetTemperature_C(const double& temp_C)
362 {
363  temperature_celsius_ = temp_C ;
364 }
365 
366 
367 /**********************************************************************/
371 inline
372 void CEObserver::SetTemperature_K(const double& temp_K)
373 {
375 }
376 
377 
378 /**********************************************************************/
382 inline
383 void CEObserver::SetTemperature_F(const double& temp_F)
384 {
386 }
387 
388 
389 /**********************************************************************/
393 inline
394 void CEObserver::SetWavelength_um(const double& new_wavelength_um)
395 {
396  wavelength_um_ = new_wavelength_um ;
397 }
398 
399 #endif /* CEObserver_h */
CEObserver::Elevation_m
double Elevation_m() const
Return altitude in meters above sea level.
Definition: CEObserver.h:166
CEObserver::SetTemperature_K
void SetTemperature_K(const double &temp_K=CppEphem::SeaLevelTemp_K())
Set the observer's temperature (Kelvin)
Definition: CEObserver.h:371
CEObserver::cache_date_
double cache_date_
Date used to copute pos/vel vectors.
Definition: CEObserver.h:126
CEObserver::SetUTCOffset
void SetUTCOffset(const double &utc_offset)
Set the UTC offset for the observers time.
Definition: CEObserver.h:236
CEObserver::SetLatitude
void SetLatitude(const double &latitude, const CEAngleType &angle_type=CEAngleType::RADIANS)
Set the observer's latitude.
Definition: CEObserver.h:310
CEObserver::Time
std::vector< double > Time(const CEDate &date)
Get the current local time information (see CETime)
Definition: CEObserver.h:258
CEObserver::free_members
void free_members(void)
Initialize the data members.
Definition: CEObserver.cpp:198
CEDate::GetTime_UTC
virtual double GetTime_UTC() const
Method for getting the current UTC time.
Definition: CEDate.cpp:621
CENamespace.h
CEDate
Definition: CEDate.h:43
CEObserver::Temperature_C
double Temperature_C() const
Return temperature in degrees Celsius.
Definition: CEObserver.h:186
CppEphem::Temp_C2F
double Temp_C2F(const double &temp_C)
Definition: CENamespace.h:59
CEObserver::pos_cirs_
std::vector< double > pos_cirs_
XYZ position (AU) relative to Earth center.
Definition: CEObserver.h:127
CEObserver::copy_members
void copy_members(const CEObserver &other)
Copy data members from another CEObserver object.
Definition: CEObserver.cpp:209
CETime::TimeDbl2Vect
static std::vector< double > TimeDbl2Vect(const double &time)
Convert a time formatted as HHMMSS.SS into a vector.
Definition: CETime.cpp:277
CEAngleType
CEAngleType
Definition: CEAngle.h:30
CEObserver::relative_humidity_
double relative_humidity_
Relative humidity (in range 0-1)
Definition: CEObserver.h:122
CEObserver::RelativeHumidity
double RelativeHumidity() const
Return relative humidity.
Definition: CEObserver.h:216
CEObserver::PositionGeo
std::vector< double > PositionGeo(void) const
Returns the observers geocentric position in meters.
Definition: CEObserver.cpp:119
CEObserver::Temperature_F
double Temperature_F() const
Return temperature in degrees Fahrenheit.
Definition: CEObserver.h:206
CppEphem::sec_per_day
double sec_per_day()
Seconds per day.
Definition: CENamespace.h:71
CEObserver::Time_UTC
std::vector< double > Time_UTC(const CEDate &date)
Get the current local time information (see CETime)
Definition: CEObserver.h:274
CEObserver::Longitude_Rad
double Longitude_Rad() const
Return observer geographic longitude in radians.
Definition: CEObserver.h:126
CEObserver::Temperature_K
double Temperature_K() const
Return temperature in Kelvin.
Definition: CEObserver.h:196
CEObserver::SetRelativeHumidity
void SetRelativeHumidity(const double &humidity=0.0)
Set the observer's relative humidity.
Definition: CEObserver.h:349
CEObserver::SetElevation
void SetElevation(const double &elevation=0.0)
Set elevation in meters above sea level.
Definition: CEObserver.h:285
CEObserver::UpdatePosVel
void UpdatePosVel(const CEDate &date) const
Update cached position/velocity vectors.
Definition: CEObserver.cpp:257
CEDate.h
CEObserver::SetWavelength_um
void SetWavelength_um(const double &new_wavelength_um)
Set the observer's observing wavelength (micrometers)
Definition: CEObserver.h:393
CEObserver::SetPressure_hPa
void SetPressure_hPa(const double &pressure=CppEphem::EstimatePressure_hPa(CppEphem::SeaLevelTemp_C()))
Set the observer's pressure.
Definition: CEObserver.h:338
CEObserver::VelocityICRS
std::vector< double > VelocityICRS(const CEDate &date) const
Get the velocity vector for this observer relative to ICRS (solar system barycenter)
Definition: CEObserver.cpp:169
CppEphem::SeaLevelTemp_C
double SeaLevelTemp_C()
Definition: CENamespace.h:55
CEObserver::latitude_
double latitude_
Geographic latitude (radians)
Definition: CEObserver.h:116
CEObserver::VelocityCIRS
std::vector< double > VelocityCIRS(const CEDate &date) const
Get the velocity vector for this observer relative to CIRS (solar system barycenter)
Definition: CEObserver.cpp:157
CEObserver::operator=
CEObserver & operator=(const CEObserver &other)
Copy assignment operator.
Definition: CEObserver.cpp:101
CEObserver::PositionICRS
std::vector< double > PositionICRS(const CEDate &date) const
Get the position vector for this observer relative to ICRS (solar system barycenter)
Definition: CEObserver.cpp:145
CEObserver::Pressure_hPa
double Pressure_hPa() const
Return atmospheric pressure in units of hPa.
Definition: CEObserver.h:176
CEObserver::SetGeoCoordinates
void SetGeoCoordinates(const double &longitude, const double &latitude, const CEAngleType &angle_type=CEAngleType::RADIANS)
Set the observer's longitude and latitude.
Definition: CEObserver.h:324
CEObserver::longitude_
double longitude_
Geographic longitude (radians)
Definition: CEObserver.h:115
CEObserver::Wavelength_um
double Wavelength_um() const
Return the wavelength in units of micrometers.
Definition: CEObserver.h:226
CEObserver::SetTemperature_C
void SetTemperature_C(const double &temp_C=CppEphem::SeaLevelTemp_C())
Set the observer's temperature (Celsius)
Definition: CEObserver.h:360
CEAngle.h
CEObserver::print
std::string print(void) const
Returns a string containing information about this object.
Definition: CEObserver.cpp:180
CEObserver::PositionCIRS
std::vector< double > PositionCIRS(const CEDate &date) const
Get the position vector for this observer relative to CIRS (Earth center)
Definition: CEObserver.cpp:133
CEAngleType::DEGREES
CppEphem::SeaLevelTemp_K
double SeaLevelTemp_K()
Definition: CENamespace.h:54
CppEphem::Temp_F2C
double Temp_F2C(const double &temp_F)
Definition: CENamespace.h:61
CEObserver::elevation_m_
double elevation_m_
Elevation (in meters) above sea-level.
Definition: CEObserver.h:117
CEObserver::SetLongitude
void SetLongitude(const double &longitude, const CEAngleType &angle_type=CEAngleType::RADIANS)
Set the observer's longitude.
Definition: CEObserver.h:297
CEObserver::UTCOffset
double UTCOffset() const
Definition: CEObserver.h:246
CETime::TimeSec2Time
static double TimeSec2Time(const double &seconds)
Convert number of seconds since midnight to HHMMSS.S formatted double.
Definition: CETime.cpp:300
CEObserver::wavelength_um_
double wavelength_um_
Observing wavelength (micrometers)
Definition: CEObserver.h:123
CppEphem::Temp_K2C
double Temp_K2C(const double &temp_K)
Definition: CENamespace.h:63
CEObserver::vel_cirs_
std::vector< double > vel_cirs_
XYZ velocity (AU) relative to Earth center.
Definition: CEObserver.h:129
CEObserver::SetTemperature_F
void SetTemperature_F(const double &temp_F=CppEphem::SeaLevelTemp_F())
Set the observer's temperature (Fahrenheit)
Definition: CEObserver.h:382
CEObserver::Latitude_Deg
double Latitude_Deg() const
Return geographic latitude in degrees.
Definition: CEObserver.h:156
CppEphem::EstimatePressure_hPa
double EstimatePressure_hPa(double elevation_m)
Method for estimating atmospheric pressure (in hPa) from altitude (in meters)
Definition: CENamespace.h:100
CEObserver::temperature_celsius_
double temperature_celsius_
Temperature in degrees celsius.
Definition: CEObserver.h:121
CEObserver::CEObserver
CEObserver(void)
Default constructor.
Definition: CEObserver.cpp:45
CEAngleType::RADIANS
CEObserver::pressure_hPa_
double pressure_hPa_
Atmospheric pressure (in units of hPa)
Definition: CEObserver.h:120
CEObserver::vel_icrs_
std::vector< double > vel_icrs_
XYZ veloicty (AU) relative to solar system barycenter.
Definition: CEObserver.h:130
CEObserver
Definition: CEObserver.h:28
CEObserver::pos_icrs_
std::vector< double > pos_icrs_
XYZ position (AU) relative to solar system barycenter.
Definition: CEObserver.h:128
CEObserver::utc_offset_
double utc_offset_
UTC offset in hours (set by default to system offset)
Definition: CEObserver.h:133
CppEphem::SeaLevelTemp_F
double SeaLevelTemp_F()
Definition: CENamespace.h:56
CEDate::MJD
virtual double MJD() const
Get the Modified Julian date represented by this object.
Definition: CEDate.h:160
CEObserver::Longitude_Deg
double Longitude_Deg() const
Return observer geographic longitude in degrees.
Definition: CEObserver.h:136
CppEphem::Temp_C2K
double Temp_C2K(const double &temp_C)
Definition: CENamespace.h:60
CEObserver::Latitude_Rad
double Latitude_Rad() const
Return geographic latitude in radians.
Definition: CEObserver.h:146
CEObserver::init_members
void init_members(void)
Initialize the data members.
Definition: CEObserver.cpp:232
CEObserver::~CEObserver
virtual ~CEObserver(void)
Destructor.
Definition: CEObserver.cpp:89