00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef ArrayTime_CLASS
00028 #define ArrayTime_CLASS
00029
00030 #include <string>
00031 using std::string;
00032
00033 #include <vector>
00034 using std::vector;
00035
00036 #include <Interval.h>
00037 #include <UTCCorrection.h>
00038
00039 #ifndef WITHOUT_ACS
00040 #include <asdmIDLTypesC.h>
00041 using asdmIDLTypes::IDLArrayTime;
00042 #endif
00043
00044 #include "EndianStream.h"
00045 using asdm::EndianOSStream;
00046 using asdm::EndianISStream;
00047
00048 namespace asdm {
00049
00093 class ArrayTime : public Interval {
00094
00095 public:
00096
00097
00098 const static int numberSigDigitsInASecond = 9;
00099 const static long long unitsInASecond = 1000000000LL;
00100 const static long long unitsInADayL = 86400000000000LL;
00101 const static double unitsInADay ;
00102 const static double unitsInADayDiv100 ;
00103 const static double julianDayOfBase ;
00104 const static long long julianDayOfBaseInUnitsInADayDiv100 = 2073600432000000000LL;
00105
00106 static bool isLeapYear(int year);
00107 static double getMJD(double jd);
00108 static double getJD(double mjd);
00109 static ArrayTime add(const ArrayTime &time, const Interval &interval);
00110 static ArrayTime sub(const ArrayTime &time, const Interval &interval) ;
00111 static ArrayTime getArrayTime(StringTokenizer &t) ;
00112
00113 ArrayTime();
00114 ArrayTime (const string &s);
00115 ArrayTime(const ArrayTime &t);
00116 #ifndef WITHOUT_ACS
00117 ArrayTime (const IDLArrayTime &t);
00118 #endif
00119 ArrayTime(int year, int month, double day);
00120 ArrayTime(int year, int month, int day, int hour, int minute, double second);
00121 ArrayTime(double modifiedJulianDay);
00122 ArrayTime(int modifiedJulianDay, double secondsInADay);
00123 ArrayTime(long long nanoseconds);
00124
00125 double getJD() const;
00126 double getMJD() const;
00127 double getJDI() const;
00128 double getMJDI() const;
00129
00130 #ifndef WITHOUT_ACS
00131 IDLArrayTime toIDLArrayTime() const;
00132 #endif
00133 string toFITS() const;
00134
00135
00139 void toBin(EndianOSStream& eoss);
00140
00146 static void toBin(const vector<ArrayTime>& arrayTime, EndianOSStream& eoss);
00147
00153 static void toBin(const vector<vector<ArrayTime> >& arrayTime, EndianOSStream& eoss);
00154
00160 static void toBin(const vector<vector<vector<ArrayTime> > >& arrayTime, EndianOSStream& eoss);
00161
00168 static ArrayTime fromBin(EndianISStream& eiss);
00169
00176 static vector<ArrayTime> from1DBin(EndianISStream & eiss);
00177
00184 static vector<vector<ArrayTime> > from2DBin(EndianISStream & eiss);
00185
00192 static vector<vector<vector<ArrayTime> > > from3DBin(EndianISStream & eiss);
00193
00194 int *getDateTime() const;
00195 double getTimeOfDay() const;
00196 int getDayOfWeek() const;
00197 int getDayOfYear() const;
00198 string timeOfDayToString() const;
00199 double getLocalSiderealTime(double longitudeInHours) const;
00200 double getGreenwichMeanSiderealTime() const;
00201
00202 static double unitToJD(long long unit);
00203 static double unitToMJD(long long unit);
00204 static long long jdToUnit(double jd);
00205 static long long mjdToUnit(double mjd);
00206
00207 static double utcCorrection(double jd);
00208
00209 private:
00210
00211 static long long init(int year, int month, double day);
00212 static long long init(int year, int month, int day, int hour, int minute, double second);
00213 long long FITSString(string t) const;
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224 static const UTCCorrection *UTCCorrectionTable;
00225 static const UTCCorrection UTCLast;
00226
00227 };
00228
00229 inline double ArrayTime::getJDI() const {return getJD();}
00230 inline double ArrayTime::getMJDI()const {return getMJD();}
00231 }
00232
00233 #endif