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.Assert;
22  import org.junit.Before;
23  import org.junit.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      @Before
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          Assert.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         Assert.assertEquals( 3, loader.getReceiversAntennas().size());
171         Assert.assertEquals("3S-02-TSADM     NONE",  loader.getReceiversAntennas().get(0).getType());
172         Assert.assertEquals("",                      loader.getReceiversAntennas().get(0).getSerialNumber());
173         Assert.assertEquals("3S-02-TSATE     NONE",  loader.getReceiversAntennas().get(1).getType());
174         Assert.assertEquals("",                      loader.getReceiversAntennas().get(1).getSerialNumber());
175         Assert.assertEquals("AERAT1675_120   SPKE",  loader.getReceiversAntennas().get(2).getType());
176         Assert.assertEquals("",                      loader.getReceiversAntennas().get(2).getSerialNumber());
177         Assert.assertEquals(1, loader.getReceiversAntennas().get(2).getFrequencies().size());
178         Assert.assertEquals(Frequency.G01, loader.getReceiversAntennas().get(2).getFrequencies().get(0));
179         try {
180             loader.getReceiversAntennas().get(2).getEccentricities(Frequency.E06);
181             Assert.fail("an exception should have been thrown");
182         } catch (OrekitException oe) {
183             Assert.assertEquals(OrekitMessages.UNSUPPORTED_FREQUENCY_FOR_ANTENNA, oe.getSpecifier());
184             Assert.assertSame(Frequency.E06, oe.getParts()[0]);
185             Assert.assertEquals("AERAT1675_120   SPKE", oe.getParts()[1]);
186         }
187         Assert.assertEquals(-0.00001, loader.getReceiversAntennas().get(2).getEccentricities(Frequency.G01).getX(), 1.0e-15);
188         Assert.assertEquals(+0.00057, loader.getReceiversAntennas().get(2).getEccentricities(Frequency.G01).getY(), 1.0e-15);
189         Assert.assertEquals(+0.08051, loader.getReceiversAntennas().get(2).getEccentricities(Frequency.G01).getZ(), 1.0e-15);
190         Assert.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             Assert.fail("an exception should have been thrown");
203         } catch (OrekitException oe) {
204             Assert.assertEquals(OrekitMessages.WRONG_COLUMNS_NUMBER, oe.getSpecifier());
205             Assert.assertEquals(25, ((Integer) oe.getParts()[1]).intValue());
206             Assert.assertEquals(17, ((Integer) oe.getParts()[2]).intValue());
207             Assert.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             Assert.fail("an exception should have been thrown");
216         } catch (OrekitException oe) {
217             Assert.assertEquals(OrekitMessages.UNKNOWN_RINEX_FREQUENCY, oe.getSpecifier());
218             Assert.assertEquals("U99", (String) oe.getParts()[0]);
219             Assert.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             Assert.fail("an exception should have been thrown");
228         } catch (OrekitException oe) {
229             Assert.assertEquals(OrekitMessages.MISMATCHED_FREQUENCIES, oe.getSpecifier());
230             Assert.assertEquals(88, ((Integer) oe.getParts()[1]).intValue());
231             Assert.assertEquals("E01", "" + oe.getParts()[2]);
232             Assert.assertEquals("E06", "" + oe.getParts()[3]);
233         }
234     }
235 
236     @Test
237     public void testWrongLabel() {
238         try {
239             new AntexLoader("^igs14-unknown-label\\.atx$");
240             Assert.fail("an exception should have been thrown");
241         } catch (OrekitException oe) {
242             Assert.assertEquals(OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE, oe.getSpecifier());
243             Assert.assertEquals(17, ((Integer) oe.getParts()[0]).intValue());
244             Assert.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             Assert.fail("an exception should have been thrown");
256         } catch (OrekitException oe) {
257             Assert.assertEquals(OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE, oe.getSpecifier());
258             Assert.assertEquals(21, ((Integer) oe.getParts()[0]).intValue());
259             Assert.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             Assert.fail("an exception should have been thrown");
268         } catch (OrekitException oe) {
269             Assert.assertEquals(OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE, oe.getSpecifier());
270             Assert.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         Assert.assertEquals(system,         antenna.getSatelliteSystem());
291         Assert.assertEquals(type,           antenna.getType());
292         Assert.assertEquals(satType,        antenna.getSatelliteType());
293         Assert.assertEquals(satCode,        antenna.getSatelliteCode());
294         Assert.assertEquals(prnNumber,      antenna.getPrnNumber());
295         Assert.assertEquals(cosparId,       antenna.getCosparID());
296         Assert.assertEquals(0.0,            startDate.durationFrom(antenna.getValidFrom()), 1.0e-10);
297         if (endDate == AbsoluteDate.FUTURE_INFINITY) {
298             Assert.assertSame(endDate, antenna.getValidUntil());
299         } else {
300             Assert.assertEquals(0.0,            endDate.durationFrom(antenna.getValidUntil()), 1.0e-10);
301         }
302         Assert.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 }