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.gnss.antenna;
18  
19  import org.hipparchus.geometry.euclidean.threed.Vector3D;
20  import org.hipparchus.util.FastMath;
21  import org.junit.jupiter.api.Assertions;
22  import org.junit.jupiter.api.BeforeEach;
23  import org.junit.jupiter.api.Test;
24  import org.orekit.Utils;
25  import org.orekit.errors.OrekitException;
26  import org.orekit.errors.OrekitMessages;
27  import org.orekit.gnss.Frequency;
28  import org.orekit.gnss.SatelliteSystem;
29  import org.orekit.time.AbsoluteDate;
30  import org.orekit.time.TimeScalesFactory;
31  import org.orekit.utils.TimeSpanMap;
32  
33  
34  public class AntexLoaderTest {
35  
36      @BeforeEach
37      public void setUp() {
38          // Sets the root of data to read
39          Utils.setDataRoot("gnss:antex");
40      }
41  
42      @Test
43      public void testSmallAntexFile() {
44  
45          AntexLoader  loader = new AntexLoader("^igs14-small\\.atx$");
46  
47          Assertions.assertEquals(16, loader.getSatellitesAntennas().size());
48  
49          checkSatellite(loader.getSatellitesAntennas().get( 0), 1992, 11, 22, 2008, 10, 16,
50                         SatelliteSystem.GPS,     "BLOCK IIA",   SatelliteType.BLOCK_IIA, 32, 1,
51                         "1992-079A", Frequency.G01, 45.0, 7.0, 1.30);
52          checkSatellite(loader.getSatellitesAntennas().get( 0), 2008, 10, 23, 2009,  1,  6,
53                         SatelliteSystem.GPS,     "BLOCK IIA",   SatelliteType.BLOCK_IIA, 37, 1,
54                         "1993-032A", Frequency.G02, 120.0, 4.0, -0.4);
55          checkSatellite(loader.getSatellitesAntennas().get( 0), 2009,  3, 24, 2011,  5,  6,
56                         SatelliteSystem.GPS,     "BLOCK IIR-M", SatelliteType.BLOCK_IIR_M, 49, 1,
57                         "2009-014A", Frequency.G01, 57.0, 3.0, 4.60);
58          checkSatellite(loader.getSatellitesAntennas().get( 0), 2011,  6,  2, 2011,  7, 12,
59                         SatelliteSystem.GPS,     "BLOCK IIA",   SatelliteType.BLOCK_IIA, 35, 1,
60                         "1993-054A", Frequency.G02, 25.0, 9.0, 1.20);
61          checkSatellite(loader.getSatellitesAntennas().get( 0), 2011,  7, 16, 9999, 12, 31,
62                         SatelliteSystem.GPS,     "BLOCK IIF",   SatelliteType.BLOCK_IIF, 63, 1,
63                         "2011-036A", Frequency.G01, 17.0, 2.0, 2.80);
64  
65          checkSatellite(loader.getSatellitesAntennas().get( 1), 1989,  6, 10, 2004,  5,  12,
66                         SatelliteSystem.GPS,     "BLOCK II",    SatelliteType.BLOCK_II, 13, 2,
67                         "1989-044A", Frequency.G02, 0.0, 0.0, -0.80);
68          checkSatellite(loader.getSatellitesAntennas().get( 1), 2004, 11,  6, 9999, 12, 31,
69                         SatelliteSystem.GPS,     "BLOCK IIR-B", SatelliteType.BLOCK_IIR_B, 61, 2,
70                         "2004-045A", Frequency.G01, 270.0, 17.0, 40.60);
71  
72          checkSatellite(loader.getSatellitesAntennas().get( 2), 1985, 10,  9, 1994,  4,  17,
73                         SatelliteSystem.GPS,     "BLOCK I",     SatelliteType.BLOCK_I, 11, 3,
74                         "1985-093A", Frequency.G02, 3.0, 3.0, -0.90);
75          checkSatellite(loader.getSatellitesAntennas().get( 2), 1996,  3, 28, 2014,  8,  18,
76                         SatelliteSystem.GPS,     "BLOCK IIA",   SatelliteType.BLOCK_IIA, 33, 3,
77                         "1996-019A", Frequency.G01, 34.0, 6.0, 0.80);
78          checkSatellite(loader.getSatellitesAntennas().get( 2), 2014,  9,  5, 2014,  10, 20,
79                         SatelliteSystem.GPS,     "BLOCK IIA",   SatelliteType.BLOCK_IIA, 35, 3,
80                         "1993-054A", Frequency.G02, 12.0, 10.0, 0.70);
81          checkSatellite(loader.getSatellitesAntennas().get( 2), 2014, 10, 29, 9999, 12, 31,
82                         SatelliteSystem.GPS,     "BLOCK IIF",   SatelliteType.BLOCK_IIF, 69, 3,
83                         "2014-068A", Frequency.G01, 78.0, 0.5, 5.25);
84  
85          checkSatellite(loader.getSatellitesAntennas().get( 3), 1998, 12, 30, 2004, 12, 25,
86                         SatelliteSystem.GLONASS, "GLONASS",     SatelliteType.GLONASS, 779, 1,
87                         "1998-077A", Frequency.R01, 33.0, 9.0, -1.60);
88          checkSatellite(loader.getSatellitesAntennas().get( 3), 2004, 12, 26, 2009, 12, 13,
89                         SatelliteSystem.GLONASS, "GLONASS",     SatelliteType.GLONASS, 796, 1,
90                         "2004-053A", Frequency.R02, 114.0, 5.0, -0.20);
91          checkSatellite(loader.getSatellitesAntennas().get( 3), 2009, 12, 14, 9999, 12, 31,
92                         SatelliteSystem.GLONASS, "GLONASS-M",  SatelliteType.GLONASS_M, 730, 1,
93                         "2009-070A", Frequency.R01, 46.0, 3.0, 0.8);
94  
95          checkSatellite(loader.getSatellitesAntennas().get( 4), 2003, 12, 10, 2008, 12, 24,
96                         SatelliteSystem.GLONASS, "GLONASS",     SatelliteType.GLONASS, 794, 2,
97                         "2003-056B", Frequency.R02, 67.0, 7.0, -1.10);
98          checkSatellite(loader.getSatellitesAntennas().get( 4), 2008, 12, 25, 2013,  6, 30,
99                         SatelliteSystem.GLONASS, "GLONASS-M",   SatelliteType.GLONASS_M, 728, 2,
100                        "2008-067C", Frequency.R01, 23.0, 6.0, -0.6);
101         checkSatellite(loader.getSatellitesAntennas().get( 4), 2013,  7,  1, 9999, 12, 31,
102                        SatelliteSystem.GLONASS, "GLONASS-M",   SatelliteType.GLONASS_M, 747, 2,
103                        "2013-019A", Frequency.R02, 1.0, 14.0, 1.50);
104 
105         checkSatellite(loader.getSatellitesAntennas().get( 5), 1994, 11, 20, 2001, 11, 30,
106                        SatelliteSystem.GLONASS, "GLONASS",     SatelliteType.GLONASS, 763, 3,
107                        "1994-076A", Frequency.R01, 6.0, 1.0, 1.50);
108         checkSatellite(loader.getSatellitesAntennas().get( 5), 2001, 12,  1, 2008, 12, 24,
109                        SatelliteSystem.GLONASS, "GLONASS",     SatelliteType.GLONASS, 789, 3,
110                        "2001-053B", Frequency.R02, 54.0, 13.0, 0.0);
111         checkSatellite(loader.getSatellitesAntennas().get( 5), 2008, 12, 25, 2010,  9, 30,
112                        SatelliteSystem.GLONASS, "GLONASS-M",   SatelliteType.GLONASS_M, 727, 3,
113                        "2008-067A", Frequency.R01, 98.0, 5.0, -0.20);
114         checkSatellite(loader.getSatellitesAntennas().get( 5), 2010, 10,  1, 2010, 12, 15,
115                        SatelliteSystem.GLONASS, "GLONASS-M",   SatelliteType.GLONASS_M, 722, 3,
116                        "2007-065B", Frequency.R02, 112.0, 2.0, 1.10);
117         checkSatellite(loader.getSatellitesAntennas().get( 5), 2010, 12, 16, 2011,  3, 10,
118                        SatelliteSystem.GLONASS, "GLONASS-M",   SatelliteType.GLONASS_M, 727, 3,
119                        "2008-067A", Frequency.R01, 134.0, 3.0, 0.8);
120         checkSatellite(loader.getSatellitesAntennas().get( 5), 2011,  3, 11, 2011, 10, 12,
121                        SatelliteSystem.GLONASS, "GLONASS-M",   SatelliteType.GLONASS_M, 715, 3,
122                        "2006-062C", Frequency.R02, 12.0, 2.5, 0.95);
123         checkSatellite(loader.getSatellitesAntennas().get( 5), 2011, 10, 13, 2011, 11, 30,
124                        SatelliteSystem.GLONASS, "GLONASS-K1",  SatelliteType.GLONASS_K1, 801, 3,
125                        "2011-009A", Frequency.R01, 345.0, 3.456, 0.0);
126         checkSatellite(loader.getSatellitesAntennas().get( 5), 2011, 12,  1, 9999, 12, 31,
127                        SatelliteSystem.GLONASS, "GLONASS-M",   SatelliteType.GLONASS_M, 744, 3,
128                        "2011-064A", Frequency.R02, 360.0, 10.0 / 3.0, 0.60);
129 
130         checkSatellite(loader.getSatellitesAntennas().get( 6), 2016,  5, 24, 9999, 12, 31,
131                        SatelliteSystem.GALILEO, "GALILEO-2",   SatelliteType.GALILEO_2, 210, 1,
132                        "2016-030B", Frequency.E01, 359.0, 4.2, 0.0);
133 
134         checkSatellite(loader.getSatellitesAntennas().get( 7), 2016,  5, 24, 9999, 12, 31,
135                        SatelliteSystem.GALILEO, "GALILEO-2",   SatelliteType.GALILEO_2, 211, 2,
136                        "2016-030A", Frequency.E05, 23.0, 12.0, 0.0);
137 
138         checkSatellite(loader.getSatellitesAntennas().get( 8), 2011, 10, 21, 9999, 12, 31,
139                        SatelliteSystem.GALILEO, "GALILEO-1",   SatelliteType.GALILEO_1, 101, 11,
140                        "2011-060A", Frequency.E06, 110.0, 22.0 / 3.0, 0.64);
141 
142         checkSatellite(loader.getSatellitesAntennas().get( 9), 2010,  1, 16, 9999, 12, 31,
143                        SatelliteSystem.BEIDOU, "BEIDOU-2G",    SatelliteType.BEIDOU_2G, 3, 1,
144                        "2010-001A", Frequency.C01, 14.0, 7.0, 0.0);
145 
146         checkSatellite(loader.getSatellitesAntennas().get(10), 2010,  7, 31, 9999, 12, 31,
147                        SatelliteSystem.BEIDOU, "BEIDOU-2I",    SatelliteType.BEIDOU_2I, 5, 6,
148                        "2010-036A", Frequency.C02, 245.0, 8.0, 0.0);
149 
150         checkSatellite(loader.getSatellitesAntennas().get(11), 2012,  4, 29, 9999, 12, 31,
151                        SatelliteSystem.BEIDOU, "BEIDOU-2M",    SatelliteType.BEIDOU_2M, 12, 11,
152                        "2012-018A", Frequency.C06, 146.0, 3.2, 0.0);
153 
154         checkSatellite(loader.getSatellitesAntennas().get(12), 2010,  9, 11, 9999, 12, 31,
155                        SatelliteSystem.QZSS,    "QZSS",        SatelliteType.QZSS, 1, 193,
156                        "2010-045A", Frequency.J01, 113.0, 6.0, 0.0);
157 
158         checkSatellite(loader.getSatellitesAntennas().get(13), 2013,  7,  1, 9999, 12, 31,
159                        SatelliteSystem.IRNSS,   "IRNSS-1IGSO", SatelliteType.IRNSS_1IGSO, 1, 1,
160                        "2013-034A", Frequency.I05, 34.0, 9.0, 0.0);
161 
162         checkSatellite(loader.getSatellitesAntennas().get(14), 2014, 10, 15, 9999, 12, 31,
163                        SatelliteSystem.IRNSS,   "IRNSS-1GEO",  SatelliteType.IRNSS_1GEO, 3, 3,
164                        "2014-061A", Frequency.I09, 23.0, 10.0, 0.0);
165 
166         checkSatellite(loader.getSatellitesAntennas().get(15), 2015,  3, 28, 9999, 12, 31,
167                        SatelliteSystem.IRNSS,   "IRNSS-1IGSO", SatelliteType.IRNSS_1IGSO, 4, 4,
168                        "2015-018A", Frequency.I05, 321.0, 13.0, 0.0);
169 
170         Assertions.assertEquals( 3, loader.getReceiversAntennas().size());
171         Assertions.assertEquals("3S-02-TSADM     NONE",  loader.getReceiversAntennas().get(0).getType());
172         Assertions.assertEquals("",                      loader.getReceiversAntennas().get(0).getSerialNumber());
173         Assertions.assertEquals("3S-02-TSATE     NONE",  loader.getReceiversAntennas().get(1).getType());
174         Assertions.assertEquals("",                      loader.getReceiversAntennas().get(1).getSerialNumber());
175         Assertions.assertEquals("AERAT1675_120   SPKE",  loader.getReceiversAntennas().get(2).getType());
176         Assertions.assertEquals("",                      loader.getReceiversAntennas().get(2).getSerialNumber());
177         Assertions.assertEquals(1, loader.getReceiversAntennas().get(2).getFrequencies().size());
178         Assertions.assertEquals(Frequency.G01, loader.getReceiversAntennas().get(2).getFrequencies().get(0));
179         try {
180             loader.getReceiversAntennas().get(2).getEccentricities(Frequency.E06);
181             Assertions.fail("an exception should have been thrown");
182         } catch (OrekitException oe) {
183             Assertions.assertEquals(OrekitMessages.UNSUPPORTED_FREQUENCY_FOR_ANTENNA, oe.getSpecifier());
184             Assertions.assertSame(Frequency.E06, oe.getParts()[0]);
185             Assertions.assertEquals("AERAT1675_120   SPKE", oe.getParts()[1]);
186         }
187         Assertions.assertEquals(-0.00001, loader.getReceiversAntennas().get(2).getEccentricities(Frequency.G01).getX(), 1.0e-15);
188         Assertions.assertEquals(+0.00057, loader.getReceiversAntennas().get(2).getEccentricities(Frequency.G01).getY(), 1.0e-15);
189         Assertions.assertEquals(+0.08051, loader.getReceiversAntennas().get(2).getEccentricities(Frequency.G01).getZ(), 1.0e-15);
190         Assertions.assertEquals(-0.00249,
191                             loader.getReceiversAntennas().get(2).getPhaseCenterVariation(Frequency.G01,
192                                                                                          new Vector3D(FastMath.toRadians(60.0),
193                                                                                                       FastMath.toRadians(55.0))),
194                             1.0e-15);
195 
196     }
197 
198     @Test
199     public void testWrongColumns() {
200         try {
201             new AntexLoader("^igs14-wrong-columns\\.atx$");
202             Assertions.fail("an exception should have been thrown");
203         } catch (OrekitException oe) {
204             Assertions.assertEquals(OrekitMessages.WRONG_COLUMNS_NUMBER, oe.getSpecifier());
205             Assertions.assertEquals(25, ((Integer) oe.getParts()[1]).intValue());
206             Assertions.assertEquals(17, ((Integer) oe.getParts()[2]).intValue());
207             Assertions.assertEquals(10, ((Integer) oe.getParts()[3]).intValue());
208         }
209     }
210 
211     @Test
212     public void testUnknownFrequency() {
213         try {
214             new AntexLoader("^igs14-unknown-rinex-frequency\\.atx$");
215             Assertions.fail("an exception should have been thrown");
216         } catch (OrekitException oe) {
217             Assertions.assertEquals(OrekitMessages.UNKNOWN_RINEX_FREQUENCY, oe.getSpecifier());
218             Assertions.assertEquals("U99", (String) oe.getParts()[0]);
219             Assertions.assertEquals(23, ((Integer) oe.getParts()[2]).intValue());
220         }
221     }
222 
223     @Test
224     public void testMismatchedFrequencies() {
225         try {
226             new AntexLoader("^igs14-mismatched-frequencies\\.atx$");
227             Assertions.fail("an exception should have been thrown");
228         } catch (OrekitException oe) {
229             Assertions.assertEquals(OrekitMessages.MISMATCHED_FREQUENCIES, oe.getSpecifier());
230             Assertions.assertEquals(88, ((Integer) oe.getParts()[1]).intValue());
231             Assertions.assertEquals("E01", "" + oe.getParts()[2]);
232             Assertions.assertEquals("E06", "" + oe.getParts()[3]);
233         }
234     }
235 
236     @Test
237     public void testWrongLabel() {
238         try {
239             new AntexLoader("^igs14-unknown-label\\.atx$");
240             Assertions.fail("an exception should have been thrown");
241         } catch (OrekitException oe) {
242             Assertions.assertEquals(OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE, oe.getSpecifier());
243             Assertions.assertEquals(17, ((Integer) oe.getParts()[0]).intValue());
244             Assertions.assertEquals("THIS IS NOT AN ANTEX LABEL", ((String) oe.getParts()[2]).substring(60).trim());
245         }
246     }
247 
248     @Test
249     /**
250      * This test is related to issue-622.
251      */
252     public void testUnknownNumberFrequencies() {
253         try {
254             new AntexLoader("^igs14-unknown-nb-frequencies\\.atx$");
255             Assertions.fail("an exception should have been thrown");
256         } catch (OrekitException oe) {
257             Assertions.assertEquals(OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE, oe.getSpecifier());
258             Assertions.assertEquals(21, ((Integer) oe.getParts()[0]).intValue());
259             Assertions.assertEquals("END OF FREQUENCY", ((String) oe.getParts()[2]).substring(60).trim());
260         }
261     }
262 
263     @Test
264     public void testCorruptedFile() {
265         try {
266             new AntexLoader("^igs14-corrupted\\.atx$");
267             Assertions.fail("an exception should have been thrown");
268         } catch (OrekitException oe) {
269             Assertions.assertEquals(OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE, oe.getSpecifier());
270             Assertions.assertEquals(21, ((Integer) oe.getParts()[0]).intValue());
271         }
272     }
273 
274     private void checkSatellite(final TimeSpanMap<SatelliteAntenna> tsm,
275                                 final int startYear, final int startMonth, final int startDay,
276                                 final int endYear, final int endMonth, final int endDay,
277                                 final SatelliteSystem system, final String type,
278                                 final SatelliteType satType, final int satCode, final int prnNumber,
279                                 final String cosparId, final Frequency freq, final double az, final double pol,
280                                 final double phaseCenterVariation) {
281         final double oneMilliSecond = 0.001;
282         final AbsoluteDate startDate = new AbsoluteDate(startYear, startMonth, startDay,
283                                                         TimeScalesFactory.getGPS());
284         final AbsoluteDate endDate   = endYear > 9000 ?
285                                        AbsoluteDate.FUTURE_INFINITY :
286                                        new AbsoluteDate(endYear, endMonth, endDay,
287                                                         23, 59, 59.9999999,
288                                                         TimeScalesFactory.getGPS());
289         final SatelliteAntenna antenna = tsm.get(startDate.shiftedBy(oneMilliSecond));
290         Assertions.assertEquals(system,         antenna.getSatelliteSystem());
291         Assertions.assertEquals(type,           antenna.getType());
292         Assertions.assertEquals(satType,        antenna.getSatelliteType());
293         Assertions.assertEquals(satCode,        antenna.getSatelliteCode());
294         Assertions.assertEquals(prnNumber,      antenna.getPrnNumber());
295         Assertions.assertEquals(cosparId,       antenna.getCosparID());
296         Assertions.assertEquals(0.0,            startDate.durationFrom(antenna.getValidFrom()), 1.0e-10);
297         if (endDate == AbsoluteDate.FUTURE_INFINITY) {
298             Assertions.assertSame(endDate, antenna.getValidUntil());
299         } else {
300             Assertions.assertEquals(0.0,            endDate.durationFrom(antenna.getValidUntil()), 1.0e-10);
301         }
302         Assertions.assertEquals(phaseCenterVariation * 0.001,
303                             antenna.getPhaseCenterVariation(freq,
304                                                             new Vector3D(FastMath.toRadians(az),
305                                                                          FastMath.toRadians(90 - pol))),
306                             1.0e-10);
307     }
308 
309 }