1   /* Copyright 2002-2012 Space Applications Services
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.ilrs;
18  
19  import java.io.IOException;
20  import java.net.URISyntaxException;
21  import java.nio.file.Paths;
22  import java.util.List;
23  
24  import org.hipparchus.util.FastMath;
25  import org.junit.Assert;
26  import org.junit.Before;
27  import org.junit.Test;
28  import org.orekit.Utils;
29  import org.orekit.data.DataContext;
30  import org.orekit.data.DataSource;
31  import org.orekit.errors.OrekitException;
32  import org.orekit.errors.OrekitMessages;
33  import org.orekit.files.ilrs.CRD.AnglesMeasurement;
34  import org.orekit.files.ilrs.CRD.CRDDataBlock;
35  import org.orekit.files.ilrs.CRD.Meteo;
36  import org.orekit.files.ilrs.CRD.MeteorologicalMeasurement;
37  import org.orekit.files.ilrs.CRD.RangeMeasurement;
38  import org.orekit.files.ilrs.CRDConfiguration.TransponderConfiguration;
39  import org.orekit.time.AbsoluteDate;
40  import org.orekit.time.DateComponents;
41  import org.orekit.time.TimeComponents;
42  import org.orekit.time.TimeScalesFactory;
43  
44  public class CRDParserTest {
45  
46      @Test
47      public void testInvalidFormat() throws URISyntaxException, IOException {
48          try {
49              final String ex = "/ilrs/crd_invalid_format.v2C";
50              final CRDParser parser = new CRDParser();
51              parser.parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
52              Assert.fail("an exception should have been thrown");
53          } catch (OrekitException oe) {
54              Assert.assertEquals(OrekitMessages.UNEXPECTED_FORMAT_FOR_ILRS_FILE,
55                                  oe.getSpecifier());
56              Assert.assertEquals("CRD", oe.getParts()[0]);
57              Assert.assertEquals("CPF", oe.getParts()[1]);
58          }
59      }
60  
61      @Test
62      public void testMissingEOF() throws IOException, URISyntaxException {
63          try {
64              final String ex = "/ilrs/crd_unexpected_end_of_file.v2C";
65              final CRDParser parser = new CRDParser();
66              final String fileName = Paths.get(getClass().getResource(ex).toURI()).toString();
67              parser.parse(new DataSource(fileName));
68              Assert.fail("an exception should have been thrown");
69          } catch (OrekitException oe) {
70              Assert.assertEquals(OrekitMessages.CRD_UNEXPECTED_END_OF_FILE,
71                                  oe.getSpecifier());
72              Assert.assertEquals(23, ((Integer) oe.getParts()[0]).intValue());
73          }
74  
75      }
76  
77      @Test
78      public void testCorruptedData() throws IOException, URISyntaxException {
79          try {
80              final String ex = "/ilrs/crd_corrupted_data.v2C";
81              final CRDParser parser = new CRDParser();
82              parser.parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
83              Assert.fail("an exception should have been thrown");
84          } catch (OrekitException oe) {
85              Assert.assertEquals(OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE,
86                                  oe.getSpecifier());
87              Assert.assertEquals(19, ((Integer) oe.getParts()[0]).intValue());
88          }
89  
90      }
91  
92      @Test
93      public void testInvalidRangeType() throws IOException, URISyntaxException {
94          try {
95              final String ex = "/ilrs/crd_invalid_range_type.v2C";
96              final CRDParser parser = new CRDParser();
97              parser.parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
98              Assert.fail("an exception should have been thrown");
99          } catch (OrekitException oe) {
100             Assert.assertEquals(OrekitMessages.INVALID_RANGE_INDICATOR_IN_CRD_FILE,
101                                 oe.getSpecifier());
102             Assert.assertEquals(9, ((Integer) oe.getParts()[0]).intValue());
103         }
104 
105     }
106 
107     @Test
108     public void testLageos2Version2() throws URISyntaxException, IOException {
109 
110         // Simple test for version 2.0
111         final String ex = "/ilrs/lageos2_201802.npt.v2C";
112 
113         final CRDParser parser = new CRDParser();
114         final CRD file = parser.parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
115 
116         // Verify first data block
117         final CRDDataBlock first = file.getDataBlocks().get(0);
118         final CRDHeader firstHeader = first.getHeader();
119         final CRDConfiguration firstConf = first.getConfigurationRecords();
120         final AbsoluteDate firstStartDate = new AbsoluteDate("2018-02-01T15:14:58.000", TimeScalesFactory.getUTC());
121         final AbsoluteDate firstEndDate   = new AbsoluteDate("2018-02-01T15:48:57.000", TimeScalesFactory.getUTC());
122 
123         // Header
124         Assert.assertEquals(2, firstHeader.getVersion());
125         Assert.assertEquals(2018, firstHeader.getProductionEpoch().getYear());
126         Assert.assertEquals(2, firstHeader.getProductionEpoch().getMonth());
127         Assert.assertEquals(1, firstHeader.getProductionEpoch().getDay());
128         Assert.assertEquals(17, firstHeader.getProductionHour());
129         Assert.assertEquals("CHAL", firstHeader.getStationName());
130         Assert.assertEquals(9998, firstHeader.getSystemIdentifier());
131         Assert.assertEquals(19, firstHeader.getSystemNumber());
132         Assert.assertEquals(1, firstHeader.getSystemOccupancy());
133         Assert.assertEquals(4, firstHeader.getEpochIdentifier());
134         Assert.assertEquals("WPLTN", firstHeader.getStationNetword());
135         Assert.assertEquals("lageos2", firstHeader.getName());
136         Assert.assertEquals("9207002", firstHeader.getIlrsSatelliteId());
137         Assert.assertEquals("5986", firstHeader.getSic());
138         Assert.assertEquals("22195", firstHeader.getNoradId());
139         Assert.assertEquals(0, firstHeader.getSpacecraftEpochTimeScale());
140         Assert.assertEquals(1, firstHeader.getTargetClass());
141         Assert.assertEquals(1, firstHeader.getTargetLocation());
142         Assert.assertEquals(1, firstHeader.getDataType());
143         Assert.assertEquals(0.0, firstHeader.getStartEpoch().durationFrom(firstStartDate), 1.0e-5);
144         Assert.assertEquals(0.0, firstHeader.getEndEpoch().durationFrom(firstEndDate), 1.0e-5);
145         Assert.assertEquals(0, firstHeader.getDataReleaseFlag());
146         Assert.assertFalse(firstHeader.isTroposphericRefractionApplied());
147         Assert.assertFalse(firstHeader.isCenterOfMassCorrectionApplied());
148         Assert.assertFalse(firstHeader.isReceiveAmplitudeCorrectionApplied());
149         Assert.assertTrue(firstHeader.isStationSystemDelayApplied());
150         Assert.assertFalse(firstHeader.isTransponderDelayApplied());
151         Assert.assertEquals(2, firstHeader.getRangeType().getIndicator());
152         Assert.assertEquals(0, firstHeader.getQualityIndicator());
153         Assert.assertEquals(1, firstHeader.getPredictionType());
154         Assert.assertEquals(18, firstHeader.getYearOfCentury());
155         Assert.assertEquals("020115", firstHeader.getDateAndTime());
156         Assert.assertEquals("hts", firstHeader.getPredictionProvider());
157         Assert.assertEquals(3202, firstHeader.getSequenceNumber());
158 
159         // Configuration records
160         Assert.assertEquals(532.000 * 1.0e-9, firstConf.getSystemRecord().getWavelength(), 1.0e-15);
161         Assert.assertEquals("std", firstConf.getSystemRecord().getSystemId());
162         Assert.assertEquals("CL1", firstConf.getLaserRecord().getLaserId());
163         Assert.assertEquals("RG30-L", firstConf.getLaserRecord().getLaserType());
164         Assert.assertEquals(1064.00 * 1.0e-9, firstConf.getLaserRecord().getPrimaryWavelength(), 1.0e-15);
165         Assert.assertEquals(1000.00, firstConf.getLaserRecord().getNominalFireRate(), 1.0e-15);
166         Assert.assertEquals(1.50, firstConf.getLaserRecord().getPulseEnergy(), 1.0e-15);
167         Assert.assertEquals(10.0, firstConf.getLaserRecord().getPulseWidth(), 1.0e-15);
168         Assert.assertEquals(92.82, firstConf.getLaserRecord().getBeamDivergence(), 1.0e-15);
169         Assert.assertEquals(0, firstConf.getLaserRecord().getPulseInOutgoingSemiTrain());
170         Assert.assertEquals("CD1", firstConf.getDetectorRecord().getDetectorId());
171         Assert.assertEquals("CSPAD", firstConf.getDetectorRecord().getDetectorType());
172         Assert.assertEquals(532.000 * 1.0e-9, firstConf.getDetectorRecord().getApplicableWavelength(), 1.0e-15);
173         Assert.assertEquals(20.0, firstConf.getDetectorRecord().getQuantumEfficiency(), 1.0e-15);
174         Assert.assertEquals(5.0, firstConf.getDetectorRecord().getAppliedVoltage(), 1.0e-15);
175         Assert.assertEquals(60000.0, firstConf.getDetectorRecord().getDarkCount(), 1.0e-15);
176         Assert.assertEquals("TTL", firstConf.getDetectorRecord().getOutputPulseType());
177         Assert.assertEquals(0.0, firstConf.getDetectorRecord().getOutputPulseWidth(), 1.0e-15);
178         Assert.assertEquals(1.70 * 1.0e-9, firstConf.getDetectorRecord().getSpectralFilter(), 1.0e-15);
179         Assert.assertEquals(0.0, firstConf.getDetectorRecord().getTransmissionOfSpectralFilter(), 1.0e-15);
180         Assert.assertEquals(0.0, firstConf.getDetectorRecord().getSpatialFilter(), 1.0e-15);
181         Assert.assertEquals("none", firstConf.getDetectorRecord().getExternalSignalProcessing());
182         Assert.assertEquals(0.0, firstConf.getDetectorRecord().getAmplifierGain(), 1.0e-15);
183         Assert.assertEquals(0.0, firstConf.getDetectorRecord().getAmplifierBandwidth(), 1.0e-15);
184         Assert.assertEquals("0", firstConf.getDetectorRecord().getAmplifierInUse());
185         Assert.assertEquals("CT1", firstConf.getTimingRecord().getLocalTimingId());
186         Assert.assertEquals("Meridian", firstConf.getTimingRecord().getTimeSource());
187         Assert.assertEquals("Meridian", firstConf.getTimingRecord().getFrequencySource());
188         Assert.assertEquals("ET-A032", firstConf.getTimingRecord().getTimer());
189         Assert.assertEquals("003309", firstConf.getTimingRecord().getTimerSerialNumber());
190         Assert.assertEquals(0.0, firstConf.getTimingRecord().getEpochDelayCorrection(), 1.0e-15);
191         Assert.assertEquals("pgms", firstConf.getSoftwareRecord().getSoftwareId());
192         Assert.assertEquals("Sattrk", firstConf.getSoftwareRecord().getTrackingSoftwares()[1]);
193         Assert.assertEquals("2.00Cm", firstConf.getSoftwareRecord().getTrackingSoftwareVersions()[1]);
194         Assert.assertEquals("crd_cal", firstConf.getSoftwareRecord().getProcessingSoftwares()[1]);
195         Assert.assertEquals("1.7", firstConf.getSoftwareRecord().getProcessingSoftwareVersions()[1]);
196         Assert.assertEquals("mets", firstConf.getMeteorologicalRecord().getMeteorologicalId());
197         Assert.assertEquals("Paroscientific", firstConf.getMeteorologicalRecord().getPressSensorManufacturer());
198         Assert.assertEquals("Met4a", firstConf.getMeteorologicalRecord().getPressSensorModel());
199         Assert.assertEquals("123456", firstConf.getMeteorologicalRecord().getPressSensorSerialNumber());
200         Assert.assertEquals("Paroscientific", firstConf.getMeteorologicalRecord().getTempSensorManufacturer());
201         Assert.assertEquals("Met4a", firstConf.getMeteorologicalRecord().getTempSensorModel());
202         Assert.assertEquals("123456", firstConf.getMeteorologicalRecord().getTempSensorSerialNumber());
203         Assert.assertEquals("Paroscientific", firstConf.getMeteorologicalRecord().getHumiSensorManufacturer());
204         Assert.assertEquals("Met4a", firstConf.getMeteorologicalRecord().getHumiSensorModel());
205         Assert.assertEquals("123456", firstConf.getMeteorologicalRecord().getHumiSensorSerialNumber());
206         Assert.assertNull(firstConf.getTransponderRecord());
207 
208         // Meteorological data (only one data)
209         final MeteorologicalMeasurement meteoFirst = first.getMeteoData().getMeteo(AbsoluteDate.J2000_EPOCH);
210         Assert.assertEquals(56940.0, meteoFirst.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
211         Assert.assertEquals(0.9989, meteoFirst.getPressure(), 1.0e-15);
212         Assert.assertEquals(259.10, meteoFirst.getTemperature(), 1.0e-15);
213         Assert.assertEquals(80.0, meteoFirst.getHumidity(), 1.0e-15);
214 
215         // Range data
216         final RangeMeasurement rangeFirst1 = first.getRangeData().get(0);
217         Assert.assertEquals(54927.620161400002, rangeFirst1.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
218         Assert.assertEquals(0.044106029140, rangeFirst1.getTimeOfFlight(), 1.0e-15);
219         Assert.assertEquals(2, rangeFirst1.getEpochEvent());
220         Assert.assertEquals(5.7, rangeFirst1.getSnr(), 1.0e-15);
221         final RangeMeasurement rangeFirst2 = first.getRangeData().get(5);
222         Assert.assertEquals(56899.718161400000, rangeFirst2.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
223         Assert.assertEquals(0.050148193335, rangeFirst2.getTimeOfFlight(), 1.0e-15);
224         Assert.assertEquals(2, rangeFirst2.getEpochEvent());
225         Assert.assertEquals(5.7, rangeFirst2.getSnr(), 1.0e-15);
226 
227         // Angles data
228         Assert.assertEquals(0, first.getAnglesData().size());
229 
230         // Verify last data block
231         final CRDDataBlock last = file.getDataBlocks().get(file.getDataBlocks().size() - 1);
232         final CRDHeader lastHeader = last.getHeader();
233         final CRDConfiguration lastConf = last.getConfigurationRecords();
234         final AbsoluteDate lastStartDate = new AbsoluteDate("2018-02-27T14:10:10.000", TimeScalesFactory.getUTC());
235         final AbsoluteDate lastEndDate   = new AbsoluteDate("2018-02-27T14:39:06.000", TimeScalesFactory.getUTC());
236 
237         // Header
238         Assert.assertEquals(2, lastHeader.getVersion());
239         Assert.assertEquals(2018, lastHeader.getProductionEpoch().getYear());
240         Assert.assertEquals(2, lastHeader.getProductionEpoch().getMonth());
241         Assert.assertEquals(27, lastHeader.getProductionEpoch().getDay());
242         Assert.assertEquals(14, lastHeader.getProductionHour());
243         Assert.assertEquals("CHAL", lastHeader.getStationName());
244         Assert.assertEquals(9998, lastHeader.getSystemIdentifier());
245         Assert.assertEquals(19, lastHeader.getSystemNumber());
246         Assert.assertEquals(1, lastHeader.getSystemOccupancy());
247         Assert.assertEquals(4, lastHeader.getEpochIdentifier());
248         Assert.assertEquals("WPLTN", lastHeader.getStationNetword());
249         Assert.assertEquals("lageos2", lastHeader.getName());
250         Assert.assertEquals("9207002", lastHeader.getIlrsSatelliteId());
251         Assert.assertEquals("5986", lastHeader.getSic());
252         Assert.assertEquals("22195", lastHeader.getNoradId());
253         Assert.assertEquals(0, lastHeader.getSpacecraftEpochTimeScale());
254         Assert.assertEquals(1, lastHeader.getTargetClass());
255         Assert.assertEquals(1, lastHeader.getTargetLocation());
256         Assert.assertEquals(1, lastHeader.getDataType());
257         Assert.assertEquals(0.0, lastHeader.getStartEpoch().durationFrom(lastStartDate), 1.0e-5);
258         Assert.assertEquals(0.0, lastHeader.getEndEpoch().durationFrom(lastEndDate), 1.0e-5);
259         Assert.assertEquals(0, lastHeader.getDataReleaseFlag());
260         Assert.assertFalse(lastHeader.isTroposphericRefractionApplied());
261         Assert.assertFalse(lastHeader.isCenterOfMassCorrectionApplied());
262         Assert.assertFalse(lastHeader.isReceiveAmplitudeCorrectionApplied());
263         Assert.assertTrue(lastHeader.isStationSystemDelayApplied());
264         Assert.assertFalse(lastHeader.isTransponderDelayApplied());
265         Assert.assertEquals(2, lastHeader.getRangeType().getIndicator());
266         Assert.assertEquals(0, lastHeader.getQualityIndicator());
267         Assert.assertEquals(1, lastHeader.getPredictionType());
268         Assert.assertEquals(18, lastHeader.getYearOfCentury());
269         Assert.assertEquals("022714", lastHeader.getDateAndTime());
270         Assert.assertEquals("hts", lastHeader.getPredictionProvider());
271         Assert.assertEquals(5802, lastHeader.getSequenceNumber());
272 
273         // Configuration records
274         Assert.assertEquals(532.000 * 1.0e-9, lastConf.getSystemRecord().getWavelength(), 1.0e-15);
275         Assert.assertEquals("std", lastConf.getSystemRecord().getSystemId());
276         Assert.assertEquals("CL1", lastConf.getLaserRecord().getLaserId());
277         Assert.assertEquals("RG30-L", lastConf.getLaserRecord().getLaserType());
278         Assert.assertEquals(1064.00 * 1.0e-9, lastConf.getLaserRecord().getPrimaryWavelength(), 1.0e-15);
279         Assert.assertEquals(1000.00, lastConf.getLaserRecord().getNominalFireRate(), 1.0e-15);
280         Assert.assertEquals(1.50, lastConf.getLaserRecord().getPulseEnergy(), 1.0e-15);
281         Assert.assertEquals(10.0, lastConf.getLaserRecord().getPulseWidth(), 1.0e-15);
282         Assert.assertEquals(92.82, lastConf.getLaserRecord().getBeamDivergence(), 1.0e-15);
283         Assert.assertEquals(0, lastConf.getLaserRecord().getPulseInOutgoingSemiTrain());
284         Assert.assertEquals("CD1", lastConf.getDetectorRecord().getDetectorId());
285         Assert.assertEquals("CSPAD", lastConf.getDetectorRecord().getDetectorType());
286         Assert.assertEquals(532.000 * 1.0e-9, lastConf.getDetectorRecord().getApplicableWavelength(), 1.0e-15);
287         Assert.assertEquals(20.0, lastConf.getDetectorRecord().getQuantumEfficiency(), 1.0e-15);
288         Assert.assertEquals(5.0, lastConf.getDetectorRecord().getAppliedVoltage(), 1.0e-15);
289         Assert.assertEquals(60000.0, lastConf.getDetectorRecord().getDarkCount(), 1.0e-15);
290         Assert.assertEquals("TTL", lastConf.getDetectorRecord().getOutputPulseType());
291         Assert.assertEquals(0.0, lastConf.getDetectorRecord().getOutputPulseWidth(), 1.0e-15);
292         Assert.assertEquals(1.70 * 1.0e-9, lastConf.getDetectorRecord().getSpectralFilter(), 1.0e-15);
293         Assert.assertEquals(0.0, lastConf.getDetectorRecord().getTransmissionOfSpectralFilter(), 1.0e-15);
294         Assert.assertEquals(0.0, lastConf.getDetectorRecord().getSpatialFilter(), 1.0e-15);
295         Assert.assertEquals("none", lastConf.getDetectorRecord().getExternalSignalProcessing());
296         Assert.assertEquals(0.0, lastConf.getDetectorRecord().getAmplifierGain(), 1.0e-15);
297         Assert.assertEquals(0.0, lastConf.getDetectorRecord().getAmplifierBandwidth(), 1.0e-15);
298         Assert.assertEquals("0", lastConf.getDetectorRecord().getAmplifierInUse());
299         Assert.assertEquals("CT1", lastConf.getTimingRecord().getLocalTimingId());
300         Assert.assertEquals("Meridian", lastConf.getTimingRecord().getTimeSource());
301         Assert.assertEquals("Meridian", lastConf.getTimingRecord().getFrequencySource());
302         Assert.assertEquals("ET-A032", lastConf.getTimingRecord().getTimer());
303         Assert.assertEquals("003309", lastConf.getTimingRecord().getTimerSerialNumber());
304         Assert.assertEquals(0.0, lastConf.getTimingRecord().getEpochDelayCorrection(), 1.0e-15);
305         Assert.assertEquals("pgms", lastConf.getSoftwareRecord().getSoftwareId());
306         Assert.assertEquals("Sattrk", lastConf.getSoftwareRecord().getTrackingSoftwares()[1]);
307         Assert.assertEquals("2.00Cm", lastConf.getSoftwareRecord().getTrackingSoftwareVersions()[1]);
308         Assert.assertEquals("crd_cal", lastConf.getSoftwareRecord().getProcessingSoftwares()[1]);
309         Assert.assertEquals("1.7", lastConf.getSoftwareRecord().getProcessingSoftwareVersions()[1]);
310         Assert.assertEquals("mets", lastConf.getMeteorologicalRecord().getMeteorologicalId());
311         Assert.assertEquals("Paroscientific", lastConf.getMeteorologicalRecord().getPressSensorManufacturer());
312         Assert.assertEquals("Met4a", lastConf.getMeteorologicalRecord().getPressSensorModel());
313         Assert.assertEquals("123456", lastConf.getMeteorologicalRecord().getPressSensorSerialNumber());
314         Assert.assertEquals("Paroscientific", lastConf.getMeteorologicalRecord().getTempSensorManufacturer());
315         Assert.assertEquals("Met4a", lastConf.getMeteorologicalRecord().getTempSensorModel());
316         Assert.assertEquals("123456", lastConf.getMeteorologicalRecord().getTempSensorSerialNumber());
317         Assert.assertEquals("Paroscientific", lastConf.getMeteorologicalRecord().getHumiSensorManufacturer());
318         Assert.assertEquals("Met4a", lastConf.getMeteorologicalRecord().getHumiSensorModel());
319         Assert.assertEquals("123456", lastConf.getMeteorologicalRecord().getHumiSensorSerialNumber());
320         Assert.assertNull(lastConf.getTransponderRecord());
321 
322         // Meteorological data (only one data)
323         final MeteorologicalMeasurement meteoLast = last.getMeteoData().getMeteo(AbsoluteDate.J2000_EPOCH);
324         Assert.assertEquals(52749.0, meteoLast.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
325         Assert.assertEquals(0.9921, meteoLast.getPressure(), 1.0e-15);
326         Assert.assertEquals(260.80, meteoLast.getTemperature(), 1.0e-15);
327         Assert.assertEquals(67.0, meteoLast.getHumidity(), 1.0e-15);
328 
329         // Range data
330         final RangeMeasurement rangeLast1 = last.getRangeData().get(0);
331         Assert.assertEquals(51080.935001603524, rangeLast1.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
332         Assert.assertEquals(0.045673108965, rangeLast1.getTimeOfFlight(), 1.0e-15);
333         Assert.assertEquals(2, rangeLast1.getEpochEvent());
334         Assert.assertEquals(5.7, rangeLast1.getSnr(), 1.0e-15);
335         final RangeMeasurement rangeLast2 = last.getRangeData().get(13);
336         Assert.assertEquals(52618.095001597932, rangeLast2.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
337         Assert.assertEquals(0.042733272755, rangeLast2.getTimeOfFlight(), 1.0e-15);
338         Assert.assertEquals(2, rangeLast2.getEpochEvent());
339         Assert.assertEquals(5.7, rangeLast2.getSnr(), 1.0e-15);
340 
341         // Angles data
342         Assert.assertEquals(0, first.getAnglesData().size());
343 
344     }
345 
346     @Test
347     public void testChampVersion1() throws URISyntaxException, IOException {
348 
349         // Simple test for version 1.0
350         final String ex = "/ilrs/champ_201709-small.frd";
351 
352         final CRDParser parser = new CRDParser();
353         final CRD file = parser.parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
354 
355         // Data block
356         final CRDDataBlock block = file.getDataBlocks().get(0);
357         final CRDHeader header = block.getHeader();
358         final CRDConfiguration conf = block.getConfigurationRecords();
359         final AbsoluteDate startDate = new AbsoluteDate("2017-09-26T03:55:41.000", TimeScalesFactory.getUTC());
360         final AbsoluteDate endDate   = new AbsoluteDate("2017-09-26T04:04:48.000", TimeScalesFactory.getUTC());
361 
362         // Header
363         Assert.assertEquals(1, header.getVersion());
364         Assert.assertEquals(2017, header.getProductionEpoch().getYear());
365         Assert.assertEquals(9, header.getProductionEpoch().getMonth());
366         Assert.assertEquals(26, header.getProductionEpoch().getDay());
367         Assert.assertEquals(4, header.getProductionHour());
368         Assert.assertEquals("STL3", header.getStationName());
369         Assert.assertEquals(7825, header.getSystemIdentifier());
370         Assert.assertEquals(90, header.getSystemNumber());
371         Assert.assertEquals(1, header.getSystemOccupancy());
372         Assert.assertEquals(4, header.getEpochIdentifier());
373         Assert.assertEquals("champ", header.getName());
374         Assert.assertEquals("0003902", header.getIlrsSatelliteId());
375         Assert.assertEquals("8002", header.getSic());
376         Assert.assertEquals("026405", header.getNoradId());
377         Assert.assertEquals(0, header.getSpacecraftEpochTimeScale());
378         Assert.assertEquals(1, header.getTargetClass());
379         Assert.assertEquals(0, header.getDataType());
380         Assert.assertEquals(0.0, header.getStartEpoch().durationFrom(startDate), 1.0e-5);
381         Assert.assertEquals(0.0, header.getEndEpoch().durationFrom(endDate), 1.0e-5);
382         Assert.assertEquals(0, header.getDataReleaseFlag());
383         Assert.assertFalse(header.isTroposphericRefractionApplied());
384         Assert.assertFalse(header.isCenterOfMassCorrectionApplied());
385         Assert.assertFalse(header.isReceiveAmplitudeCorrectionApplied());
386         Assert.assertTrue(header.isStationSystemDelayApplied());
387         Assert.assertFalse(header.isTransponderDelayApplied());
388         Assert.assertEquals(2, header.getRangeType().getIndicator());
389         Assert.assertEquals(0, header.getQualityIndicator());
390 
391         // Configuration records
392         Assert.assertEquals(532.100 * 1.0e-9, conf.getSystemRecord().getWavelength(), 1.0e-15);
393         Assert.assertEquals("IDAA", conf.getSystemRecord().getSystemId());
394         Assert.assertEquals("IDAB", conf.getLaserRecord().getLaserId());
395         Assert.assertEquals("Nd-YAG", conf.getLaserRecord().getLaserType());
396         Assert.assertEquals(532.10 * 1.0e-9, conf.getLaserRecord().getPrimaryWavelength(), 1.0e-15);
397         Assert.assertEquals(0.0, conf.getLaserRecord().getNominalFireRate(), 1.0e-15);
398         Assert.assertEquals(21.0, conf.getLaserRecord().getPulseEnergy(), 1.0e-15);
399         Assert.assertEquals(12.0, conf.getLaserRecord().getPulseWidth(), 1.0e-15);
400         Assert.assertEquals(0.0, conf.getLaserRecord().getBeamDivergence(), 1.0e-15);
401         Assert.assertEquals(1, conf.getLaserRecord().getPulseInOutgoingSemiTrain());
402         Assert.assertEquals("IDAJ", conf.getDetectorRecord().getDetectorId());
403         Assert.assertEquals("CSPAD", conf.getDetectorRecord().getDetectorType());
404         Assert.assertEquals(532.000 * 1.0e-9, conf.getDetectorRecord().getApplicableWavelength(), 1.0e-15);
405         Assert.assertEquals(20.0, conf.getDetectorRecord().getQuantumEfficiency(), 1.0e-15);
406         Assert.assertEquals(11.0, conf.getDetectorRecord().getAppliedVoltage(), 1.0e-15);
407         Assert.assertEquals(100000.0, conf.getDetectorRecord().getDarkCount(), 1.0e-15);
408         Assert.assertEquals("ECL", conf.getDetectorRecord().getOutputPulseType());
409         Assert.assertEquals(12.0, conf.getDetectorRecord().getOutputPulseWidth(), 1.0e-15);
410         Assert.assertEquals(2.00 * 1.0e-9, conf.getDetectorRecord().getSpectralFilter(), 1.0e-15);
411         Assert.assertEquals(90.0, conf.getDetectorRecord().getTransmissionOfSpectralFilter(), 1.0e-15);
412         Assert.assertEquals(12.0, conf.getDetectorRecord().getSpatialFilter(), 1.0e-15);
413         Assert.assertEquals("Manual", conf.getDetectorRecord().getExternalSignalProcessing());
414         Assert.assertEquals("IDAV", conf.getTimingRecord().getLocalTimingId());
415         Assert.assertEquals("TrueTime_XLi", conf.getTimingRecord().getTimeSource());
416         Assert.assertEquals("TrueTime_OCXO", conf.getTimingRecord().getFrequencySource());
417         Assert.assertEquals("MRCS", conf.getTimingRecord().getTimer());
418         Assert.assertEquals("NA", conf.getTimingRecord().getTimerSerialNumber());
419         Assert.assertEquals(0.2322 * 1.0e-6, conf.getTimingRecord().getEpochDelayCorrection(), 1.0e-15);
420 
421         // Meteorological data
422         final MeteorologicalMeasurement meteoFirst = block.getMeteoData().getMeteo(AbsoluteDate.J2000_EPOCH);
423         Assert.assertEquals(14353.388283000000, meteoFirst.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
424         Assert.assertEquals(0.92374, meteoFirst.getPressure(), 1.0e-15);
425         Assert.assertEquals(289.42, meteoFirst.getTemperature(), 1.0e-15);
426         Assert.assertEquals(28.1, meteoFirst.getHumidity(), 1.0e-15);
427 
428         // Range data
429         Assert.assertEquals(4, block.getRangeData().size());
430         final RangeMeasurement range = block.getRangeData().get(0);
431         Assert.assertEquals(14487.343206247217, range.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
432         Assert.assertEquals(0.003603959600, range.getTimeOfFlight(), 1.0e-15);
433         Assert.assertEquals(2, range.getEpochEvent());
434 
435         // Angles data
436         Assert.assertEquals(4, block.getAnglesData().size());
437         final AnglesMeasurement angles = block.getAnglesData().get(0);
438         Assert.assertEquals(14343.574333000000, angles.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
439         Assert.assertEquals(FastMath.toRadians(215.000000), angles.getAzimuth(), 1.0e-15);
440         Assert.assertEquals(FastMath.toRadians(15.000010), angles.getElevation(), 1.0e-15);
441         Assert.assertEquals(0, angles.getDirectionFlag());
442         Assert.assertEquals(2, angles.getOriginIndicator());
443         Assert.assertFalse(angles.isRefractionCorrected());
444         Assert.assertEquals(Double.NaN, angles.getAzimuthRate(), 1.0e-15);
445         Assert.assertEquals(Double.NaN, angles.getElevationRate(), 1.0e-15);
446 
447     }
448 
449     @Test
450     public void testAllFields() throws URISyntaxException, IOException {
451 
452         final String ex = "/ilrs/crd_all_fields.frd";
453 
454         final CRD file = new CRDParser().parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
455 
456         final CRDDataBlock block = file.getDataBlocks().get(0);
457         Assert.assertEquals(0, file.getComments().size());
458         Assert.assertEquals(4, block.getRangeData().size());
459         Assert.assertEquals(4, block.getAnglesData().size());
460 
461         // Transponder
462         final TransponderConfiguration transponder = block.getConfigurationRecords().getTransponderRecord();
463         Assert.assertEquals("id", transponder.getTransponderId());
464         Assert.assertEquals(0.0, transponder.getStationUTCOffset(), 1.0e-15);
465         Assert.assertEquals(0.0, transponder.getStationOscDrift(), 1.0e-15);
466         Assert.assertEquals(0.0, transponder.getTranspUTCOffset(), 1.0e-15);
467         Assert.assertEquals(0.0, transponder.getTranspOscDrift(), 1.0e-15);
468         Assert.assertEquals(0.0, transponder.getTranspClkRefTime(), 1.0e-15);
469         Assert.assertEquals(0, transponder.getSpacecraftClockAndDriftApplied());
470         Assert.assertEquals(0, transponder.getStationClockAndDriftApplied());
471         Assert.assertFalse(transponder.isSpacecraftTimeSimplified());
472     }
473 
474     @Test
475     public void testMeteorologicalData() {
476 
477         // Initialise an empty data block
478         final CRDDataBlock block = new CRDDataBlock();
479 
480         // Verify null object
481         Assert.assertNull(block.getMeteoData().getMeteo(AbsoluteDate.J2000_EPOCH));
482 
483         // Add a meteorological data entry
484         final AbsoluteDate date = new AbsoluteDate("2020-10-29T11:40:00.000", TimeScalesFactory.getUTC());
485         final MeteorologicalMeasurement meteoData1 = new MeteorologicalMeasurement(date, 1013.0, 273.0, 50.0);
486         block.addMeteoData(meteoData1);
487 
488         // Verify values
489         MeteorologicalMeasurement data1 = block.getMeteoData().getMeteo(AbsoluteDate.J2000_EPOCH);
490         Assert.assertEquals(meteoData1.getPressure(),    data1.getPressure(),    1.0e-15);
491         Assert.assertEquals(meteoData1.getTemperature(), data1.getTemperature(), 1.0e-15);
492         Assert.assertEquals(meteoData1.getHumidity(),    data1.getHumidity(),    1.0e-15);
493         data1 = block.getMeteoData().getMeteo(date);
494         Assert.assertEquals(meteoData1.getPressure(),    data1.getPressure(),    1.0e-15);
495         Assert.assertEquals(meteoData1.getTemperature(), data1.getTemperature(), 1.0e-15);
496         Assert.assertEquals(meteoData1.getHumidity(),    data1.getHumidity(),    1.0e-15);
497         data1 = block.getMeteoData().getMeteo(date.shiftedBy(60.0));
498         Assert.assertEquals(meteoData1.getPressure(),    data1.getPressure(),    1.0e-15);
499         Assert.assertEquals(meteoData1.getTemperature(), data1.getTemperature(), 1.0e-15);
500         Assert.assertEquals(meteoData1.getHumidity(),    data1.getHumidity(),    1.0e-15);
501 
502         // Add another meteorological data entry
503         final MeteorologicalMeasurement meteoData2 = new MeteorologicalMeasurement(date.shiftedBy(60.0), 1015.0, 275.0, 70.0);
504         block.addMeteoData(meteoData2);
505 
506         // Verify values
507         MeteorologicalMeasurement data2 = block.getMeteoData().getMeteo(AbsoluteDate.J2000_EPOCH); // before first data
508         Assert.assertEquals(meteoData1.getPressure(),    data2.getPressure(),    1.0e-15);
509         Assert.assertEquals(meteoData1.getTemperature(), data2.getTemperature(), 1.0e-15);
510         Assert.assertEquals(meteoData1.getHumidity(),    data2.getHumidity(),    1.0e-15);
511         data2 = block.getMeteoData().getMeteo(date.shiftedBy(180.0)); // After second data
512         Assert.assertEquals(meteoData2.getPressure(),    data2.getPressure(),    1.0e-15);
513         Assert.assertEquals(meteoData2.getTemperature(), data2.getTemperature(), 1.0e-15);
514         Assert.assertEquals(meteoData2.getHumidity(),    data2.getHumidity(),    1.0e-15);
515         data2 = block.getMeteoData().getMeteo(date.shiftedBy(30.0)); // between first and second datta
516         Assert.assertEquals(1014.0,                      data2.getPressure(),    1.0e-15);
517         Assert.assertEquals(274.0,                       data2.getTemperature(), 1.0e-15);
518         Assert.assertEquals(60.0,                        data2.getHumidity(),    1.0e-15);
519 
520     }
521 
522     @Test
523     public void testIssue801() throws URISyntaxException, IOException {
524 
525         final String ex = "/ilrs/crd_all_fields.frd";
526 
527         final CRD file = new CRDParser().parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
528 
529         final CRDDataBlock block = file.getDataBlocks().get(0);
530         Assert.assertEquals(0, file.getComments().size());
531         Assert.assertEquals(4, block.getRangeData().size());
532         Assert.assertEquals(4, block.getAnglesData().size());
533 
534         final Meteo meteo = block.getMeteoData();
535         final List<MeteorologicalMeasurement> data = meteo.getData();
536         Assert.assertEquals(1, data.size());
537 
538         final MeteorologicalMeasurement measurement = data.get(0);
539         Assert.assertEquals(0.92374, measurement.getPressure(),    0.00001);
540         Assert.assertEquals(289.42,  measurement.getTemperature(), 0.01);
541         Assert.assertEquals(28.1,    measurement.getHumidity(),    0.01);
542         
543     }
544 
545     @Test
546     public void testIssue847() throws IOException {
547 
548         // Read the file
549         final String ex = "/ilrs/lageos1-test.npt";
550         final CRD file = new CRDParser().parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
551 
552         // Verify
553         Assert.assertEquals(6, file.getComments().size());
554         Assert.assertEquals("New CFD in the STOP channel", file.getComments().get(0));
555         Assert.assertEquals("No CFD in the START channel", file.getComments().get(1));
556         Assert.assertEquals("New experimental detector (transistor) in the START channel**", file.getComments().get(2));
557         Assert.assertEquals("New CFD in the STOP channel", file.getComments().get(3));
558         Assert.assertEquals("No CFD in the START channel", file.getComments().get(4));
559         Assert.assertEquals("New experimental detector (transistor) in the START channel", file.getComments().get(5));
560     }
561 
562     @Test
563     public void testIssue886() throws IOException {
564         final String ex = "/ilrs/glonass125_trunc.frd";
565         final CRD file = new CRDParser().parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
566         
567         final CRDDataBlock block = file.getDataBlocks().get(0);
568         final List<RangeMeasurement> rangeBlock = block.getRangeData();
569         final RangeMeasurement rangeFirst = rangeBlock.get(0);
570         final RangeMeasurement rangeLast = rangeBlock.get(rangeBlock.size() - 1);
571         
572         DateComponents startEpoch = new DateComponents(2019, 04, 21);
573         DateComponents lastEpoch = new DateComponents(2019, 04, 22);
574         double firstSecOfDay = 77387.019063653420;
575         double lastSecOfDay = 694.119563650340;
576         final AbsoluteDate firstDate = new AbsoluteDate(startEpoch, new TimeComponents(firstSecOfDay), DataContext.getDefault().getTimeScales().getUTC());
577         final AbsoluteDate lastDate = new AbsoluteDate(lastEpoch, new TimeComponents(lastSecOfDay), DataContext.getDefault().getTimeScales().getUTC());
578 
579 
580         Assert.assertEquals(firstDate, rangeFirst.getDate());
581         Assert.assertEquals(lastDate, rangeLast.getDate());
582     }
583     
584     
585     @Before
586     public void setUp() {
587         Utils.setDataRoot("regular-data");
588     }
589 
590 }