1   /* Copyright 2002-2022 CS GROUP
2    * Licensed to CS GROUP (CS) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * CS licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.orekit.files.sinex;
18  
19  import java.lang.reflect.InvocationTargetException;
20  import java.lang.reflect.Method;
21  
22  import org.hipparchus.geometry.euclidean.threed.Vector3D;
23  import org.junit.Assert;
24  import org.junit.Before;
25  import org.junit.Test;
26  import org.orekit.Utils;
27  import org.orekit.errors.OrekitException;
28  import org.orekit.errors.OrekitMessages;
29  import org.orekit.files.sinex.Station.ReferenceSystem;
30  import org.orekit.time.AbsoluteDate;
31  import org.orekit.time.DateComponents;
32  import org.orekit.time.TimeComponents;
33  import org.orekit.time.TimeScalesFactory;
34  import org.orekit.utils.Constants;
35  
36  public class SinexLoaderTest {
37  
38      @Before
39      public void setUp() {
40          // Sets the root of data to read
41          Utils.setDataRoot("gnss:sinex");
42      }
43  
44      @Test
45      public void testSmallIGSSinexFile() {
46  
47          SinexLoader loader = new SinexLoader("cod20842-small.snx");
48   
49          Assert.assertEquals(2, loader.getStations().size());
50  
51          checkStation(loader.getStation("ABMF"), 2019, 350, 0.0, 2019, 352, 86370, 2019, 351, 43185,
52                       "ABMF", "97103M001", Vector3D.ZERO,
53                       new Vector3D(0.291978579235962e07, -0.538374495897593e07, 0.177460486102077e07),
54                       Vector3D.ZERO);
55  
56          checkStation(loader.getStation("ABPO"), 2019, 350, 0.0, 2019, 352, 86370, 2019, 351, 43185,
57                       "ABPO", "33302M001", new Vector3D(0.0083, 0., 0.),
58                       new Vector3D(0.409721654480569e07, 0.442911920899428e07, -.206577118054971e07),
59                       Vector3D.ZERO);
60  
61      }
62  
63      @Test
64      public void testSLRSinexFile() {
65  
66          SinexLoader loader = new SinexLoader("SLRF2008_150928_2015.09.28.snx");
67  
68          // Test date computation using format description
69          try {
70              Method method = SinexLoader.class.getDeclaredMethod("stringEpochToAbsoluteDate", String.class);
71              method.setAccessible(true);
72              final AbsoluteDate date = (AbsoluteDate) method.invoke(loader, "95:120:86399");
73              final AbsoluteDate refDate = new AbsoluteDate("1995-04-30T23:59:59.000", TimeScalesFactory.getUTC());
74              Assert.assertEquals(0., refDate.durationFrom(date), 0.);
75          } catch (NoSuchMethodException | SecurityException e) {
76              e.printStackTrace();
77          } catch (IllegalAccessException e) {
78              e.printStackTrace();
79          } catch (IllegalArgumentException e) {
80              e.printStackTrace();
81          } catch (InvocationTargetException e) {
82              e.printStackTrace();
83          }
84  
85          // Test some values
86          checkStation(loader.getStation("1885"), 1996, 310, 71317, 1996, 320, 73221, 2005, 1, 0.,
87                       "1885", "12302S006", Vector3D.ZERO,
88                       new Vector3D(0.318389220590831e07, 0.142146588920043e07, 0.532281398355808e07),
89                       new Vector3D(-.239370506815545e-01 / Constants.JULIAN_YEAR,
90                                    0.114173567092327e-01 / Constants.JULIAN_YEAR,
91                                    -.145139658580209e-02 / Constants.JULIAN_YEAR));
92  
93          checkStation(loader.getStation("7082"), 1983, 313, 13398, 1984, 4, 83080, 2005, 1, 0.,
94                       "7082", "40438M001", Vector3D.ZERO,
95                       new Vector3D(-.173599736285899e07, -.442504854754010e07, 0.424143058893134e07),
96                       new Vector3D(-.142509359401051e-01 / Constants.JULIAN_YEAR,
97                                    -.975043019205914e-02 / Constants.JULIAN_YEAR,
98                                    -.506419781207987e-03 / Constants.JULIAN_YEAR));
99      }
100 
101     @Test
102     public void testStationEccentricityXYZFile() {
103 
104         // Load file (it corresponds to a small version of the real entier file)
105         SinexLoader loader = new SinexLoader("ecc_xyz-small.snx");
106         Assert.assertEquals(3, loader.getStations().size());
107 
108         // Reference values
109         final Vector3D ecc1148 = Vector3D.ZERO;
110         final Vector3D ecc7035 = new Vector3D(-0.9670, -1.9490, 1.3990);
111         final Vector3D ecc7120 = new Vector3D(-3.0850, -1.3670, 1.2620);
112 
113         // Verify
114         Assert.assertEquals(ReferenceSystem.XYZ, loader.getStation("1148").getEccRefSystem());
115         Assert.assertEquals(0., ecc1148.distance(loader.getStation("1148").getEccentricities()), 1.0e-15);
116         Assert.assertEquals(ReferenceSystem.XYZ, loader.getStation("7035").getEccRefSystem());
117         Assert.assertEquals(0., ecc7035.distance(loader.getStation("7035").getEccentricities()), 1.0e-15);
118         Assert.assertEquals(ReferenceSystem.XYZ, loader.getStation("7120").getEccRefSystem());
119         Assert.assertEquals(0., ecc7120.distance(loader.getStation("7120").getEccentricities()), 1.0e-15);
120 
121     }
122 
123     @Test
124     public void testStationEccentricityUNEFile() {
125 
126         // Load file (it corresponds to a small version of the real entier file)
127         SinexLoader loader = new SinexLoader("ecc_une-small.snx");
128         Assert.assertEquals(3, loader.getStations().size());
129 
130         // Reference values
131         final Vector3D ecc1148 = Vector3D.ZERO;
132         final Vector3D ecc7035 = new Vector3D(2.5870, 0.0060, 0.0170);
133         final Vector3D ecc7120 = new Vector3D(3.6020, -0.0130, 0.0090);
134 
135         // Verify
136         Assert.assertEquals(ReferenceSystem.UNE, loader.getStation("1148").getEccRefSystem());
137         Assert.assertEquals(0., ecc1148.distance(loader.getStation("1148").getEccentricities()), 1.0e-15);
138         Assert.assertEquals(ReferenceSystem.UNE, loader.getStation("7035").getEccRefSystem());
139         Assert.assertEquals(0., ecc7035.distance(loader.getStation("7035").getEccentricities()), 1.0e-15);
140         Assert.assertEquals(ReferenceSystem.UNE, loader.getStation("7120").getEccRefSystem());
141         Assert.assertEquals(0., ecc7120.distance(loader.getStation("7120").getEccentricities()), 1.0e-15);
142 
143     }
144 
145     @Test
146     public void testIssue867() {
147 
148         // Load file (it corresponds to a small version of the real entier file)
149         SinexLoader loader = new SinexLoader("ecc_xyz-small-multiple-ecc.snx");
150         Assert.assertEquals(4, loader.getStations().size());
151 
152         // Verify station 7236
153         final Station  station7236    = loader.getStation("7236");
154         final Vector3D refStation7236 = Vector3D.ZERO;
155         Assert.assertEquals(0.0, refStation7236.distance(station7236.getEccentricities(new AbsoluteDate("1995-07-05T07:50:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
156         Assert.assertEquals(0.0, station7236.getValidFrom().durationFrom(new AbsoluteDate("1988-01-01T00:00:00.000", TimeScalesFactory.getUTC())), 1.0e-15);
157         Assert.assertEquals(0.0, station7236.getValidUntil().durationFrom(new AbsoluteDate("1999-09-30T23:59:59.000", TimeScalesFactory.getUTC())), 1.0e-15);
158 
159         // Verify station 7237
160         final Station station7237 = loader.getStation("7237");
161         final Vector3D refStation7237 = Vector3D.ZERO;
162         Assert.assertEquals(0.0, refStation7237.distance(station7237.getEccentricities(new AbsoluteDate("1995-07-05T07:50:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
163         Assert.assertEquals(0.0, refStation7237.distance(station7237.getEccentricities(new AbsoluteDate("2021-12-06T17:30:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
164         Assert.assertEquals(0.0, refStation7237.distance(station7237.getEccentricities(new AbsoluteDate("2999-12-06T17:30:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
165         Assert.assertEquals(0.0, station7237.getValidFrom().durationFrom(new AbsoluteDate("1988-01-01T00:00:00.000", TimeScalesFactory.getUTC())), 1.0e-15);
166         Assert.assertTrue(station7237.getValidUntil() == AbsoluteDate.FUTURE_INFINITY);
167 
168         // Verify station 7090
169         final Station station7090 = loader.getStation("7090");
170         Vector3D refStation7090 = new Vector3D(-1.2030, 2.5130, -1.5440);
171         Assert.assertEquals(0.0, refStation7090.distance(station7090.getEccentricities(new AbsoluteDate("1982-07-05T07:50:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
172         Assert.assertEquals(0.0, refStation7090.distance(station7090.getEccentricities(new AbsoluteDate("1984-07-05T07:50:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
173         Assert.assertEquals(0.0, refStation7090.distance(station7090.getEccentricities(new AbsoluteDate("1985-07-05T07:50:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
174         Assert.assertEquals(0.0, refStation7090.distance(station7090.getEccentricities(new AbsoluteDate("1986-07-05T07:50:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
175         Assert.assertEquals(0.0, refStation7090.distance(station7090.getEccentricities(new AbsoluteDate("1987-07-05T07:50:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
176         refStation7090 = new Vector3D(-1.1990, 2.5070, -1.5400);
177         Assert.assertEquals(0.0, refStation7090.distance(station7090.getEccentricities(new AbsoluteDate("1988-07-05T07:50:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
178         Assert.assertEquals(0.0, refStation7090.distance(station7090.getEccentricities(new AbsoluteDate("1990-07-05T07:50:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
179         Assert.assertEquals(0.0, refStation7090.distance(station7090.getEccentricities(new AbsoluteDate("1991-07-05T07:50:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
180         Assert.assertEquals(0.0, refStation7090.distance(station7090.getEccentricities(new AbsoluteDate("1992-01-01T12:00:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
181         refStation7090 = new Vector3D(-1.2060, 2.5010, -1.5530);
182         Assert.assertEquals(0.0, refStation7090.distance(station7090.getEccentricities(new AbsoluteDate("1992-07-05T07:50:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
183         Assert.assertEquals(0.0, refStation7090.distance(station7090.getEccentricities(new AbsoluteDate("1995-07-05T07:50:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
184         Assert.assertEquals(0.0, refStation7090.distance(station7090.getEccentricities(new AbsoluteDate("1998-07-05T07:50:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
185         refStation7090 = new Vector3D(-1.2048, 2.5019, -1.5516);
186         Assert.assertEquals(0.0, refStation7090.distance(station7090.getEccentricities(new AbsoluteDate("2002-07-05T07:50:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
187         refStation7090 = new Vector3D(-1.2058, 2.5026, -1.5522);
188         Assert.assertEquals(0.0, refStation7090.distance(station7090.getEccentricities(new AbsoluteDate("2005-07-05T07:50:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
189         refStation7090 = new Vector3D(-1.2069, 2.5034, -1.5505);
190         Assert.assertEquals(0.0, refStation7090.distance(station7090.getEccentricities(new AbsoluteDate("2008-07-05T07:50:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
191         refStation7090 = new Vector3D(-1.2043, 2.5040, -1.5509);
192         Assert.assertEquals(0.0, refStation7090.distance(station7090.getEccentricities(new AbsoluteDate("2012-07-05T07:50:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
193         refStation7090 = new Vector3D(-1.2073, 2.5034, -1.5509);
194         Assert.assertEquals(0.0, refStation7090.distance(station7090.getEccentricities(new AbsoluteDate("2015-07-05T07:50:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
195         Assert.assertEquals(0.0, refStation7090.distance(station7090.getEccentricities(new AbsoluteDate("2021-07-05T07:50:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
196         Assert.assertEquals(0.0, refStation7090.distance(station7090.getEccentricities(new AbsoluteDate("2999-07-05T07:50:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
197         Assert.assertEquals(0.0, station7090.getValidFrom().durationFrom(new AbsoluteDate("1979-07-01T00:00:00.000", TimeScalesFactory.getUTC())), 1.0e-15);
198         Assert.assertTrue(station7090.getValidUntil() == AbsoluteDate.FUTURE_INFINITY);
199 
200         // Verify station 7092
201         final Station station7092 = loader.getStation("7092");
202         Vector3D refStation7092 = new Vector3D(-3.0380, 0.6290, 0.4980);
203         Assert.assertEquals(0.0, refStation7092.distance(station7092.getEccentricities(new AbsoluteDate("1980-07-05T07:50:00.000", TimeScalesFactory.getUTC()))), 1.0e-15);
204         Assert.assertEquals(0.0, station7092.getValidFrom().durationFrom(new AbsoluteDate("1979-08-15T00:00:00.000", TimeScalesFactory.getUTC())), 1.0e-15);
205         Assert.assertEquals(0.0, station7092.getValidUntil().durationFrom(new AbsoluteDate("1980-10-31T23:59:59.000", TimeScalesFactory.getUTC())), 1.0e-15);
206 
207     }
208 
209     @Test
210     public void testNoEccentricityEntryForEpoch() {
211 
212         // Load file (it corresponds to a small version of the real entier file)
213         SinexLoader loader = new SinexLoader("ecc_xyz-small-multiple-ecc.snx");
214 
215         // Station 7236
216         final Station station7236 = loader.getStation("7236");
217 
218         // Epoch of exception
219         final AbsoluteDate exceptionEpoch = new AbsoluteDate("1987-01-11T00:00:00.000", TimeScalesFactory.getUTC());
220 
221         // Test the exception
222         try {
223             station7236.getEccentricities(exceptionEpoch);
224             Assert.fail("an exception should have been thrown");
225         } catch (OrekitException oe) {
226             Assert.assertEquals(OrekitMessages.NO_STATION_ECCENTRICITY_FOR_EPOCH, oe.getSpecifier());
227         }
228 
229     }
230 
231     @Test
232     public void testCorruptedFile() {
233         try {
234             new SinexLoader("cod20842-corrupted.snx");
235             Assert.fail("an exception should have been thrown");
236         } catch (OrekitException oe) {
237             Assert.assertEquals(OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE, oe.getSpecifier());
238             Assert.assertEquals(52, ((Integer) oe.getParts()[0]).intValue());
239         }
240     }
241 
242     private void checkStation(final Station station, final int startYear, final int startDay, final double secInStartDay,
243                               final int endYear, final int endDay, final double secInEndDay,
244                               final int epochYear, final int epochDay, final double secInEpoch,
245                               final String siteCode, final String refDomes, final Vector3D refEcc,
246                               final Vector3D refPos, final Vector3D refVel) {
247 
248         final AbsoluteDate start = new AbsoluteDate(new DateComponents(startYear, startDay),
249                                                     new TimeComponents(secInStartDay),
250                                                     TimeScalesFactory.getUTC());
251         final AbsoluteDate end = new AbsoluteDate(new DateComponents(endYear, endDay),
252                                                   new TimeComponents(secInEndDay),
253                                                   TimeScalesFactory.getUTC());
254         final AbsoluteDate epoch = new AbsoluteDate(new DateComponents(epochYear, epochDay),
255                                                     new TimeComponents(secInEpoch),
256                                                     TimeScalesFactory.getUTC());
257 
258         Assert.assertEquals(0., start.durationFrom(station.getValidFrom()), 1.0e-10);
259         Assert.assertEquals(0., end.durationFrom(station.getValidUntil()),  1.0e-10);
260         Assert.assertEquals(0., epoch.durationFrom(station.getEpoch()),     1.0e-10);
261         Assert.assertEquals(siteCode, station.getSiteCode());
262         Assert.assertEquals(refDomes, station.getDomes());
263         Assert.assertEquals(0., refEcc.distance(station.getEccentricities()), 1.0e-10);
264         Assert.assertEquals(0., refPos.distance(station.getPosition()), 1.0e-10);
265         Assert.assertEquals(0., refVel.distance(station.getVelocity()), 1.0e-10);
266 
267     }
268     
269 }