; docformat = 'rst' ; ; NAME: ; genoidReadObs ; PURPOSE: ; Read a Genoid Parameter VOTable and store its content in a structure ; ;+ ; :Description: ; Read a Genoid Parameter VOTable and store its content in a structure ; ; :Categories: ; Disk I/O, Genoid ; ; :Params: ; file: in, required, type=string ; The path to the VOTable to be read ; ; :Keywords: ; empty: in, optional, type=integer, default=0 ; If non-zero, skip reading and return an array of "empty" elements. ; ; :Returns: A structure containing the VOTable. Fields are:: ; ; ; :Author: ; B.Carry (OCA) ; ; :History: ; Change History:: ; Written in June 2017, B. Carry (OCA) ;- function genoidReadParam, file, empty=empty, primary=primary, satellite=satellite, tab=tab COMPILE_OPT hidden, idl2 ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; ;--- TAG --- I -- Initialization And Input Verification -----------------------; ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; ;--I.1-- Define Default Reading --------------------------------------------------------------; if not keyword_set(primary) and not keyword_set(satellite) then satellite=1 ;--I.2-- Define Empty Elements ---------------------------------------------------------------; eF={val:0.d,unit:'',sigma1:0.,sigma2:0.,sigma3:0.,min:0.,max:0.,pm:0.,comment:'',adjust:0 } outPrim = { id: '', name:'', self: {mass:eF, radius:eF, density:eF, J2:eF, J4:eF } } outSat = { id: '', name:'', $ self: {mass:eF, radius:eF, density:eF, J2:eF, J4:eF }, $ orbit: {a:eF, e:eF, i:eF, period:eF,longNode:eF,argPeri:eF, TPP:eF,$ meanMotion:eF, meanAnomaly:eF, t0: eF } } ;--I.3-- Simple Return If Requested ----------------------------------------------------------; if keyword_set(empty) then begin if keyword_set(primary) then return, outPrim if keyword_set(satellite) then return, outSat endif ;--I.4-- Syntax Validation -------------------------------------------------------------------; if not keyword_set(file) then begin message, /ioError, 'Syntax: obs = genoidReadObs( file )' return, -1 endif ;--I.5-- File Accessibility ------------------------------------------------------------------; if not file_test(file,/read) then begin message, /Info, 'File cannot be read: '+strTrim(file,2) return, -2 endif ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; ;--- TAG --- II -- Read the XML Structure -----------------------; ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; ;--II.1-- Read XML Structure -----------------------------------------------------------------; xml = read_xml( file ) ;--II.2-- Primary Body -----------------------------------------------------------------------; ;--II.2.1-- Define Shortcut Name short = xml.genoide.targets.target__1 ;--II.2.2-- Identifier outPrim.id = strTrim(short.name.id, 2) outPrim.name = strTrim(short.name._text,2) ;--II.2.3-- Physical Parameters ;--II.2.3/A-- Mass outPrim.self.mass.val = float(short.PHYSICAL_PARAMETER.mass._TEXT) outPrim.self.mass.sigma1 = float(short.PHYSICAL_PARAMETER.mass.SIGMA1) outPrim.self.mass.sigma2 = float(short.PHYSICAL_PARAMETER.mass.SIGMA2) outPrim.self.mass.sigma3 = float(short.PHYSICAL_PARAMETER.mass.SIGMA3) outPrim.self.mass.min = float(short.PHYSICAL_PARAMETER.mass.MIN) outPrim.self.mass.max = float(short.PHYSICAL_PARAMETER.mass.MAX) outPrim.self.mass.adjust = float(short.PHYSICAL_PARAMETER.mass.AJUST) outPrim.self.mass.unit = strTrim(short.PHYSICAL_PARAMETER.mass.UNIT,2) outPrim.self.mass.comment= strTrim(short.PHYSICAL_PARAMETER.mass.COMMENT,2) ;--II.2.3/B-- Radius outPrim.self.radius.val = float(short.PHYSICAL_PARAMETER.MEAN_RADIUS._TEXT) outPrim.self.radius.sigma2 = float(short.PHYSICAL_PARAMETER.MEAN_RADIUS.SIGMA1) outPrim.self.radius.sigma2 = float(short.PHYSICAL_PARAMETER.MEAN_RADIUS.SIGMA2) outPrim.self.radius.sigma3 = float(short.PHYSICAL_PARAMETER.MEAN_RADIUS.SIGMA3) outPrim.self.radius.min = float(short.PHYSICAL_PARAMETER.MEAN_RADIUS.MIN) outPrim.self.radius.max = float(short.PHYSICAL_PARAMETER.MEAN_RADIUS.MAX) outPrim.self.radius.adjust = float(short.PHYSICAL_PARAMETER.MEAN_RADIUS.AJUST) outPrim.self.radius.unit = strTrim(short.PHYSICAL_PARAMETER.MEAN_RADIUS.UNIT,2) outPrim.self.radius.comment = strTrim(short.PHYSICAL_PARAMETER.MEAN_RADIUS.COMMENT,2) ;--II.2.3/C-- Density outPrim.self.density.val = float(short.PHYSICAL_PARAMETER.density._TEXT) outPrim.self.density.sigma2 = float(short.PHYSICAL_PARAMETER.density.SIGMA1) outPrim.self.density.sigma2 = float(short.PHYSICAL_PARAMETER.density.SIGMA2) outPrim.self.density.sigma3 = float(short.PHYSICAL_PARAMETER.density.SIGMA3) outPrim.self.density.min = float(short.PHYSICAL_PARAMETER.density.MIN) outPrim.self.density.max = float(short.PHYSICAL_PARAMETER.density.MAX) outPrim.self.density.adjust = float(short.PHYSICAL_PARAMETER.density.AJUST) outPrim.self.density.unit = strTrim(short.PHYSICAL_PARAMETER.density.UNIT,2) outPrim.self.density.comment= strTrim(short.PHYSICAL_PARAMETER.density.COMMENT,2) ;--II.2.3/D-- J2 outPrim.self.J2.val = float(short.PHYSICAL_PARAMETER.J2._TEXT) outPrim.self.J2.sigma2 = float(short.PHYSICAL_PARAMETER.J2.SIGMA1) outPrim.self.J2.sigma2 = float(short.PHYSICAL_PARAMETER.J2.SIGMA2) outPrim.self.J2.sigma3 = float(short.PHYSICAL_PARAMETER.J2.SIGMA3) outPrim.self.J2.min = float(short.PHYSICAL_PARAMETER.J2.MIN) outPrim.self.J2.max = float(short.PHYSICAL_PARAMETER.J2.MAX) outPrim.self.J2.adjust = float(short.PHYSICAL_PARAMETER.J2.AJUST) outPrim.self.J2.unit = strTrim(short.PHYSICAL_PARAMETER.J2.UNIT,2) outPrim.self.J2.comment= strTrim(short.PHYSICAL_PARAMETER.J2.COMMENT,2) ;--II.2.3/E-- J4 outPrim.self.J4.val = float(short.PHYSICAL_PARAMETER.J4._TEXT) outPrim.self.J4.sigma2 = float(short.PHYSICAL_PARAMETER.J4.SIGMA1) outPrim.self.J4.sigma2 = float(short.PHYSICAL_PARAMETER.J4.SIGMA2) outPrim.self.J4.sigma3 = float(short.PHYSICAL_PARAMETER.J4.SIGMA3) outPrim.self.J4.min = float(short.PHYSICAL_PARAMETER.J4.MIN) outPrim.self.J4.max = float(short.PHYSICAL_PARAMETER.J4.MAX) outPrim.self.J4.adjust = float(short.PHYSICAL_PARAMETER.J4.AJUST) outPrim.self.J4.unit = strTrim(short.PHYSICAL_PARAMETER.J4.UNIT,2) outPrim.self.J4.comment= strTrim(short.PHYSICAL_PARAMETER.J4.COMMENT,2) ;--II.3-- Decode XML for Satellite -----------------------------------------------------------; ;--II.3.1-- Define Shortcut Name short = xml.genoide.targets.target__2 ;--II.3.2-- Identifier outSat.id = strTrim(short.name.id,2) outSat.name = strTrim(short.name._text,2) ;--II.3.3-- Physical Parameters ;--II.3.3/A-- Mass outSat.self.mass.val = float(short.PHYSICAL_PARAMETER.mass._TEXT) outSat.self.mass.min = float(short.PHYSICAL_PARAMETER.mass.MIN) outSat.self.mass.max = float(short.PHYSICAL_PARAMETER.mass.MAX) outSat.self.mass.adjust = float(short.PHYSICAL_PARAMETER.mass.AJUST) outSat.self.mass.unit = strTrim(short.PHYSICAL_PARAMETER.mass.UNIT,2) ;--II.3.3/B-- Radius outSat.self.radius.val = float(short.PHYSICAL_PARAMETER.MEAN_RADIUS._TEXT) outSat.self.radius.pm = float(short.PHYSICAL_PARAMETER.MEAN_RADIUS.PM) outSat.self.radius.adjust = float(short.PHYSICAL_PARAMETER.MEAN_RADIUS.AJUST) outSat.self.radius.unit = strTrim(short.PHYSICAL_PARAMETER.MEAN_RADIUS.UNIT,2) ;--II.3.4-- Dynamical Parameters ;--II.3.4/A-- Semi-major Axis outSat.orbit.a.val = float(short.DYNAMICAL_PARAMETER.a._TEXT) outSat.orbit.a.sigma2 = float(short.DYNAMICAL_PARAMETER.a.SIGMA1) outSat.orbit.a.sigma2 = float(short.DYNAMICAL_PARAMETER.a.SIGMA2) outSat.orbit.a.sigma3 = float(short.DYNAMICAL_PARAMETER.a.SIGMA3) outSat.orbit.a.min = float(short.DYNAMICAL_PARAMETER.a.MIN) outSat.orbit.a.max = float(short.DYNAMICAL_PARAMETER.a.MAX) outSat.orbit.a.adjust = float(short.DYNAMICAL_PARAMETER.a.AJUST) outSat.orbit.a.unit = strTrim(short.DYNAMICAL_PARAMETER.a.UNIT,2) outSat.orbit.a.comment= strTrim(short.DYNAMICAL_PARAMETER.a.COMMENT,2) ;--II.3.4/B-- Eccentricity outSat.orbit.e.val = float(short.DYNAMICAL_PARAMETER.e._TEXT) outSat.orbit.e.sigma2 = float(short.DYNAMICAL_PARAMETER.e.SIGMA1) outSat.orbit.e.sigma2 = float(short.DYNAMICAL_PARAMETER.e.SIGMA2) outSat.orbit.e.sigma3 = float(short.DYNAMICAL_PARAMETER.e.SIGMA3) outSat.orbit.e.min = float(short.DYNAMICAL_PARAMETER.e.MIN) outSat.orbit.e.max = float(short.DYNAMICAL_PARAMETER.e.MAX) outSat.orbit.e.adjust = float(short.DYNAMICAL_PARAMETER.e.AJUST) outSat.orbit.e.unit = strTrim(short.DYNAMICAL_PARAMETER.e.UNIT,2) outSat.orbit.e.comment= strTrim(short.DYNAMICAL_PARAMETER.e.COMMENT,2) ;--II.3.4/C-- Inclination outSat.orbit.i.val = float(short.DYNAMICAL_PARAMETER.i._TEXT) outSat.orbit.i.sigma2 = float(short.DYNAMICAL_PARAMETER.i.SIGMA1) outSat.orbit.i.sigma2 = float(short.DYNAMICAL_PARAMETER.i.SIGMA2) outSat.orbit.i.sigma3 = float(short.DYNAMICAL_PARAMETER.i.SIGMA3) outSat.orbit.i.min = float(short.DYNAMICAL_PARAMETER.i.MIN) outSat.orbit.i.max = float(short.DYNAMICAL_PARAMETER.i.MAX) outSat.orbit.i.adjust = float(short.DYNAMICAL_PARAMETER.i.AJUST) outSat.orbit.i.unit = strTrim(short.DYNAMICAL_PARAMETER.i.UNIT,2) outSat.orbit.i.comment= strTrim(short.DYNAMICAL_PARAMETER.i.COMMENT,2) ;--II.3.4/D-- Period outSat.orbit.period.val = float(short.DYNAMICAL_PARAMETER.period._TEXT) outSat.orbit.period.sigma2 = float(short.DYNAMICAL_PARAMETER.period.SIGMA1) outSat.orbit.period.sigma2 = float(short.DYNAMICAL_PARAMETER.period.SIGMA2) outSat.orbit.period.sigma3 = float(short.DYNAMICAL_PARAMETER.period.SIGMA3) outSat.orbit.period.min = float(short.DYNAMICAL_PARAMETER.period.MIN) outSat.orbit.period.max = float(short.DYNAMICAL_PARAMETER.period.MAX) outSat.orbit.period.adjust = float(short.DYNAMICAL_PARAMETER.period.AJUST) outSat.orbit.period.unit = strTrim(short.DYNAMICAL_PARAMETER.period.UNIT,2) outSat.orbit.period.comment= strTrim(short.DYNAMICAL_PARAMETER.period.COMMENT,2) ;--II.3.4/E-- Longitude of Ascending Node outSat.orbit.longNode.val = float(short.DYNAMICAL_PARAMETER.omega._TEXT) outSat.orbit.longNode.sigma2 = float(short.DYNAMICAL_PARAMETER.omega.SIGMA1) outSat.orbit.longNode.sigma2 = float(short.DYNAMICAL_PARAMETER.omega.SIGMA2) outSat.orbit.longNode.sigma3 = float(short.DYNAMICAL_PARAMETER.omega.SIGMA3) outSat.orbit.longNode.min = float(short.DYNAMICAL_PARAMETER.omega.MIN) outSat.orbit.longNode.max = float(short.DYNAMICAL_PARAMETER.omega.MAX) outSat.orbit.longNode.adjust = float(short.DYNAMICAL_PARAMETER.omega.AJUST) outSat.orbit.longNode.unit = strTrim(short.DYNAMICAL_PARAMETER.omega.UNIT,2) outSat.orbit.longNode.comment= strTrim(short.DYNAMICAL_PARAMETER.omega.COMMENT,2) ;--II.3.4/F-- Argument of Periaster outSat.orbit.argPeri.val = float(short.DYNAMICAL_PARAMETER.omegap._TEXT) outSat.orbit.argPeri.sigma2 = float(short.DYNAMICAL_PARAMETER.omegap.SIGMA1) outSat.orbit.argPeri.sigma2 = float(short.DYNAMICAL_PARAMETER.omegap.SIGMA2) outSat.orbit.argPeri.sigma3 = float(short.DYNAMICAL_PARAMETER.omegap.SIGMA3) outSat.orbit.argPeri.min = float(short.DYNAMICAL_PARAMETER.omegap.MIN) outSat.orbit.argPeri.max = float(short.DYNAMICAL_PARAMETER.omegap.MAX) outSat.orbit.argPeri.adjust = float(short.DYNAMICAL_PARAMETER.omegap.AJUST) outSat.orbit.argPeri.unit = strTrim(short.DYNAMICAL_PARAMETER.omegap.UNIT,2) outSat.orbit.argPeri.comment= strTrim(short.DYNAMICAL_PARAMETER.omegap.COMMENT,2) ;--II.3.4/G-- Time of Passage to Periaster outSat.orbit.TPP.val = float(short.DYNAMICAL_PARAMETER.TPP._TEXT) outSat.orbit.TPP.sigma2 = float(short.DYNAMICAL_PARAMETER.TPP.SIGMA1) outSat.orbit.TPP.sigma2 = float(short.DYNAMICAL_PARAMETER.TPP.SIGMA2) outSat.orbit.TPP.sigma3 = float(short.DYNAMICAL_PARAMETER.TPP.SIGMA3) outSat.orbit.TPP.min = float(short.DYNAMICAL_PARAMETER.TPP.MIN) outSat.orbit.TPP.max = float(short.DYNAMICAL_PARAMETER.TPP.MAX) outSat.orbit.TPP.adjust = float(short.DYNAMICAL_PARAMETER.TPP.AJUST) outSat.orbit.TPP.unit = strTrim(short.DYNAMICAL_PARAMETER.TPP.UNIT,2) outSat.orbit.TPP.comment= strTrim(short.DYNAMICAL_PARAMETER.TPP.COMMENT,2) ;--II.3.4/H-- Mean Motion outSat.orbit.meanMotion.val = float(short.DYNAMICAL_PARAMETER.n._TEXT) outSat.orbit.meanMotion.sigma2 = float(short.DYNAMICAL_PARAMETER.n.SIGMA1) outSat.orbit.meanMotion.sigma2 = float(short.DYNAMICAL_PARAMETER.n.SIGMA2) outSat.orbit.meanMotion.sigma3 = float(short.DYNAMICAL_PARAMETER.n.SIGMA3) outSat.orbit.meanMotion.min = float(short.DYNAMICAL_PARAMETER.n.MIN) outSat.orbit.meanMotion.max = float(short.DYNAMICAL_PARAMETER.n.MAX) outSat.orbit.meanMotion.adjust = float(short.DYNAMICAL_PARAMETER.n.AJUST) outSat.orbit.meanMotion.unit = strTrim(short.DYNAMICAL_PARAMETER.n.UNIT,2) outSat.orbit.meanMotion.comment= strTrim(short.DYNAMICAL_PARAMETER.n.COMMENT,2) ;--II.3.4/I-- Mean Anomaly outSat.orbit.meanAnomaly.val = float(short.DYNAMICAL_PARAMETER.AM._TEXT) outSat.orbit.meanAnomaly.sigma2 = float(short.DYNAMICAL_PARAMETER.AM.SIGMA1) outSat.orbit.meanAnomaly.sigma2 = float(short.DYNAMICAL_PARAMETER.AM.SIGMA2) outSat.orbit.meanAnomaly.sigma3 = float(short.DYNAMICAL_PARAMETER.AM.SIGMA3) outSat.orbit.meanAnomaly.min = float(short.DYNAMICAL_PARAMETER.AM.MIN) outSat.orbit.meanAnomaly.max = float(short.DYNAMICAL_PARAMETER.AM.MAX) outSat.orbit.meanAnomaly.adjust = float(short.DYNAMICAL_PARAMETER.AM.AJUST) outSat.orbit.meanAnomaly.unit = strTrim(short.DYNAMICAL_PARAMETER.AM.UNIT,2) outSat.orbit.meanAnomaly.comment= strTrim(short.DYNAMICAL_PARAMETER.AM.COMMENT,2) ;--II.3.4/J-- Reference Epoch outSat.orbit.T0.val = float(short.DYNAMICAL_PARAMETER.T0._TEXT) outSat.orbit.T0.unit = strTrim(short.DYNAMICAL_PARAMETER.T0.UNIT,2) outSat.orbit.T0.comment= strTrim(short.DYNAMICAL_PARAMETER.T0.COMMENT,2) ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; ;--- TAG --- III -- Export a Table of Results -----------------------; ;-----------------------------------------------------------------------------------------------; ;-----------------------------------------------------------------------------------------------; if keyword_set(tab) then begin openW, idEx, tab, /Get_Lun printf,idEx,'\begin{table}' printf,idEx,'\begin{center}' printf,idEx,' \caption{Orbital elements of the satellite of '+outPrim.name+', ' printf,idEx,' '+outSat.name+', expressed in EQJ2000,' printf,idEx,' obtained with \genoid:' printf,idEx,' orbital period $P$, semi-major axis $a$,' printf,idEx,' eccentricity $e$, inclination $i$,' printf,idEx,' longitude of the ascending node $\Omega$,' printf,idEx,' argument of the pericenter $\varpi$, time of pericenter $t_p$.' printf,idEx,' We also report the derived primary mass $M$,' printf,idEx,' the ecliptic J2000 coordinates of the orbital pole' printf,idEx,' ($\lambda_p,\,\beta_p$), ' printf,idEx,' the equatorial J2000 coordinates of the orbital pole' printf,idEx,' ($\alpha_p,\,\delta_p$), and the' printf,idEx,' angular tilt ($\Lambda$) with respect to the equator of' printf,idEx,' '+outPrim.name+'. Uncertainties are given at 3-$\sigma$.}' printf,idEx,' \label{tab:dyn} ' printf,idEx,' \begin{tabular}{lllll}' printf,idEx,' \hline\hline' printf,idEx,' & \multicolumn{2}{c}{'+outSat.name+'} \\' printf,idEx,' \hline' printf,idEx,' \noalign{\smallskip}' printf,idEx,' \multicolumn{2}{c}{Observing data set} \\' printf,idEx,' \noalign{\smallskip}' printf,idEx,' Number of observations & XXXX & \\' printf,idEx,' Time span (days) & XXXX & \\' printf,idEx,' RMS & XXXX & \\' printf,idEx,' \hline' printf,idEx,' \noalign{\smallskip}' printf,idEx,' \multicolumn{2}{c}{Orbital elements EQJ2000} \\' printf,idEx,' \noalign{\smallskip}' printf,idEx,' $P$ (day) & '+string(outSat.orbit.period.val,format='(F10.6)')+ ' & $\pm$ '+string(outSat.orbit.period.sigma3,format='(F10.6)')+'\\' printf,idEx,' $a$ (km) & '+string(outSat.orbit.a.val,format='(F6.1)')+ ' & $\pm$ '+string(outSat.orbit.a.sigma3,format='(F6.1)')+'\\' printf,idEx,' $e$ & '+string(outSat.orbit.e.val,format='(F6.4)')+ ' & $\pm$ '+string(outSat.orbit.e.sigma3,format='(F6.4)')+'\\' printf,idEx,' $i$ (\degr) & '+string(outSat.orbit.i.val,format='(F5.1)')+ ' & $\pm$ '+string(outSat.orbit.i.sigma3,format='(F5.1)')+'\\' printf,idEx,' $\Omega$ (\degr) & '+string(outSat.orbit.longNode.val,format='(F5.1)')+' & $\pm$ '+string(outSat.orbit.longNode.sigma3,format='(F5.1)')+'\\' printf,idEx,' $\varpi$ (\degr) & '+string(outSat.orbit.argPeri.val,format='(F5.1)') +' & $\pm$ '+string(outSat.orbit.argPeri.sigma3,format='(F5.1)')+'\\' printf,idEx,' $t_{p}$ (JD) & '+string(outSat.orbit.Tpp.val,format='(D13.5)')+ ' & $\pm$ '+string(outSat.orbit.Tpp.sigma3,format='(F13.3)')+'\\' printf,idEx,' \hline' printf,idEx,' \noalign{\smallskip}' printf,idEx,' \multicolumn{2}{c}{Derived parameters} \\' printf,idEx,' \noalign{\smallskip}' printf,idEx,' $M$ ($\times 10^{19}$ kg) & 1.201 & $\pm$ 0.120 \\' printf,idEx,' $\lambda_p,\,\beta_p$ (\degr) & 73, 53 & $\pm$ 4, 2 \\' printf,idEx,' $\alpha_p,\,\delta_p$ (\degr) & 50, 74 & $\pm$ 4, 2 \\' printf,idEx,' $\Lambda$ (\degr) & 0.6 & $\pm$ 1.6 \\' printf,idEx,' \hline' printf,idEx,' \end{tabular}' printf,idEx,'\end{center}' printf,idEx,'\end{table}' free_lun, idEx endif if keyword_set(primary) then return, outPrim if keyword_set(satellite) then return, outSat end