;+ ; ;Procedure: add_tt2000_offset ; ;Purpose: ; Takes TDAS double timestamp and offsets date(s) using the data in the CDF 3.4(or later) leap second config file. ; Like time_string and time_double, it is vectorized and accepts array inputs of arbitrary dimensions ; ;Inputs: ; Dates: If /subtract is not set: double precision seconds since 1970 TAI (Unix timestamp) Can be scalar or array values with any dimensions or ordering. ; If /subtract is set: double precision seconds since 1970 TT(timestamp TT 1970 epoch) can be scalar or array values with any dimensions or ordering ; ;Keywords: ; subtract: If this keyword is set, this function will subtract leap seconds from a TT date that already includes them. ; ; Offsets: Set this to a named variable in which to return the offsets used for the calculation. Note that these can differ in both sign and magnitude for ; a particular date, depending on whether you are adding or subtracting. ; ;Return Value: ; The data with leap seconds added(or removed). ; ;Notes: ; #1 This routine requires the CDF 3.4 leap second file. One will be provided with the TDAS install, but it will be updated ; automatically when a new leap second occurs. ; ; #2 The IDL system variable "!CDF_LEAP_SECONDS" must be defined for this routine to work. This variable is defined by ; calling cdf_leap_second_init. Normally, the initialization routine for missions that use tt2000 should use this. ; ; #3 The calculation adds both leap seconds and the 32.184 second historical offset between TAI and TT ; ; ;Examples: ;THEMIS> print,time_double('2007-03-23')-add_tt2000_offset(time_double('2007-03-23')) ; -65.183998 ;THEMIS> print,time_double('2007-03-23')-add_tt2000_offset(time_double('2007-03-23'),offsets=off_p) ; -65.183998 ;THEMIS> print,off_p ; 65.1840 ;THEMIS> print,time_double('2007-03-23')-add_tt2000_offset(time_double('2007-03-23'),offsets=off_s,/subtract) ; 65.183998 ;THEMIS> print,off_s ; -65.1840 ; ; ; $LastChangedBy: kersten $ ; $LastChangedDate: 2013-01-30 10:33:53 -0800 (Wed, 30 Jan 2013) $ ; $LastChangedRevision: 11501 $ ; $URL: svn+ssh://thmsvn@ambrosia.ssl.berkeley.edu/repos/spdsoft/tags/spedas_1_00/general/misc/time/TT2000/add_tt2000_offset.pro $ ;- function add_tt2000_offset,dates,subtract=subtract,offsets=offsets defsysv,'!CDF_LEAP_SECONDS',exists=exists if ~keyword_set(exists) then begin ;fatal error message,'Error. !CDF_LEAP_SECONDS, must be defined. Try calling cdf_leap_second_init' endif ; stop leap_data = read_asc(!cdf_leap_seconds.local_data_dir+'/CDFLeapSeconds.txt') leap_dates= time_double(strtrim(leap_data.(0),2)+'-'+strtrim(leap_data.(1),2)+'-'+strtrim(leap_data.(2),2)+'/00:00:00') leap_offsets=leap_data.(3) ;leap seconds occur at the TT calendar date in the file. This date will already include leap seconds. if keyword_set(subtract) then begin leap_dates+=32.184 ;offset between unix epoch(TAI) & J2000.0 epoch(TT) leap_dates+=[0,leap_offsets[1:n_elements(leap_offsets)-1]] ;leap_dates-=leap_offsets endif ;finds which offset parameters apply to which input dates offset_indexes=value_locate(leap_dates,dates,/l64) ;this assumes that leap_dates is monotone offsets=([0,leap_offsets])[offset_indexes+1]+32.184 ;offset_indexes has range [-1,n-1], so prepending the zero offset element allows indexing without error if keyword_set(subtract) then begin offsets*=-1 endif return,dates+offsets end