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.io.InputStream;
21  import java.net.URISyntaxException;
22  import java.nio.file.Paths;
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.errors.OrekitException;
30  import org.orekit.errors.OrekitMessages;
31  import org.orekit.files.ilrs.CRDConfiguration.TransponderConfiguration;
32  import org.orekit.files.ilrs.CRDFile.AnglesMeasurement;
33  import org.orekit.files.ilrs.CRDFile.CRDDataBlock;
34  import org.orekit.files.ilrs.CRDFile.MeteorologicalMeasurement;
35  import org.orekit.files.ilrs.CRDFile.RangeMeasurement;
36  import org.orekit.time.AbsoluteDate;
37  import org.orekit.time.TimeScalesFactory;
38  
39  public class CRDParserTest {
40  
41      @Test
42      public void testInvalidFormat() throws URISyntaxException, IOException {
43          try {
44              final String ex = "/ilrs/crd_invalid_format.v2C";
45              final CRDParser parser = new CRDParser();
46              final String fileName = Paths.get(getClass().getResource(ex).toURI()).toString();
47              parser.parse(fileName);
48              Assert.fail("an exception should have been thrown");
49          } catch (OrekitException oe) {
50              Assert.assertEquals(OrekitMessages.UNEXPECTED_FORMAT_FOR_ILRS_FILE,
51                                  oe.getSpecifier());
52              Assert.assertEquals("CRD", oe.getParts()[0]);
53              Assert.assertEquals("CPF", oe.getParts()[1]);
54          }
55      }
56  
57      @Test
58      public void testMissingEOF() throws IOException, URISyntaxException {
59          try {
60              final String ex = "/ilrs/crd_unexpected_end_of_file.v2C";
61              final CRDParser parser = new CRDParser();
62              final String fileName = Paths.get(getClass().getResource(ex).toURI()).toString();
63              parser.parse(fileName);
64              Assert.fail("an exception should have been thrown");
65          } catch (OrekitException oe) {
66              Assert.assertEquals(OrekitMessages.CRD_UNEXPECTED_END_OF_FILE,
67                                  oe.getSpecifier());
68              Assert.assertEquals(23, ((Integer) oe.getParts()[0]).intValue());
69          }
70  
71      }
72  
73      @Test
74      public void testCorruptedData() throws IOException, URISyntaxException {
75          try {
76              final String ex = "/ilrs/crd_corrupted_data.v2C";
77              final CRDParser parser = new CRDParser();
78              final String fileName = Paths.get(getClass().getResource(ex).toURI()).toString();
79              parser.parse(fileName);
80              Assert.fail("an exception should have been thrown");
81          } catch (OrekitException oe) {
82              Assert.assertEquals(OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE,
83                                  oe.getSpecifier());
84              Assert.assertEquals(19, ((Integer) oe.getParts()[0]).intValue());
85          }
86  
87      }
88  
89      @Test
90      public void testInvalidRangeType() throws IOException, URISyntaxException {
91          try {
92              final String ex = "/ilrs/crd_invalid_range_type.v2C";
93              final CRDParser parser = new CRDParser();
94              final String fileName = Paths.get(getClass().getResource(ex).toURI()).toString();
95              parser.parse(fileName);
96              Assert.fail("an exception should have been thrown");
97          } catch (OrekitException oe) {
98              Assert.assertEquals(OrekitMessages.INVALID_RANGE_INDICATOR_IN_CRD_FILE,
99                                  oe.getSpecifier());
100             Assert.assertEquals(9, ((Integer) oe.getParts()[0]).intValue());
101         }
102 
103     }
104 
105     @Test
106     public void testLageos2Version2() throws URISyntaxException, IOException {
107 
108         // Simple test for version 2.0
109         final String ex = "/ilrs/lageos2_201802.npt.v2C";
110 
111         final CRDParser parser = new CRDParser();
112         final String fileName = Paths.get(getClass().getResource(ex).toURI()).toString();
113         final CRDFile file = (CRDFile) parser.parse(fileName);
114 
115         // Verify first data block
116         final CRDDataBlock first = file.getDataBlocks().get(0);
117         final CRDHeader firstHeader = first.getHeader();
118         final CRDConfiguration firstConf = first.getConfigurationRecords();
119         final AbsoluteDate firstStartDate = new AbsoluteDate("2018-02-01T15:14:58.000", TimeScalesFactory.getUTC());
120         final AbsoluteDate firstEndDate   = new AbsoluteDate("2018-02-01T15:48:57.000", TimeScalesFactory.getUTC());
121 
122         // Header
123         Assert.assertEquals(2, firstHeader.getVersion());
124         Assert.assertEquals(2018, firstHeader.getProductionEpoch().getYear());
125         Assert.assertEquals(2, firstHeader.getProductionEpoch().getMonth());
126         Assert.assertEquals(1, firstHeader.getProductionEpoch().getDay());
127         Assert.assertEquals(17, firstHeader.getProductionHour());
128         Assert.assertEquals("CHAL", firstHeader.getStationName());
129         Assert.assertEquals(9998, firstHeader.getSystemIdentifier());
130         Assert.assertEquals(19, firstHeader.getSystemNumber());
131         Assert.assertEquals(1, firstHeader.getSystemOccupancy());
132         Assert.assertEquals(4, firstHeader.getEpochIdentifier());
133         Assert.assertEquals("WPLTN", firstHeader.getStationNetword());
134         Assert.assertEquals("lageos2", firstHeader.getName());
135         Assert.assertEquals("9207002", firstHeader.getIlrsSatelliteId());
136         Assert.assertEquals("5986", firstHeader.getSic());
137         Assert.assertEquals("22195", firstHeader.getNoradId());
138         Assert.assertEquals(0, firstHeader.getSpacecraftEpochTimeScale());
139         Assert.assertEquals(1, firstHeader.getTargetClass());
140         Assert.assertEquals(1, firstHeader.getTargetLocation());
141         Assert.assertEquals(1, firstHeader.getDataType());
142         Assert.assertEquals(0.0, firstHeader.getStartEpoch().durationFrom(firstStartDate), 1.0e-5);
143         Assert.assertEquals(0.0, firstHeader.getEndEpoch().durationFrom(firstEndDate), 1.0e-5);
144         Assert.assertEquals(0, firstHeader.getDataReleaseFlag());
145         Assert.assertFalse(firstHeader.isTroposphericRefractionApplied());
146         Assert.assertFalse(firstHeader.isCenterOfMassCorrectionApplied());
147         Assert.assertFalse(firstHeader.isReceiveAmplitudeCorrectionApplied());
148         Assert.assertTrue(firstHeader.isStationSystemDelayApplied());
149         Assert.assertFalse(firstHeader.isTransponderDelayApplied());
150         Assert.assertEquals(2, firstHeader.getRangeType().getIndicator());
151         Assert.assertEquals(0, firstHeader.getQualityIndicator());
152         Assert.assertEquals(1, firstHeader.getPredictionType());
153         Assert.assertEquals(18, firstHeader.getYearOfCentury());
154         Assert.assertEquals("020115", firstHeader.getDateAndTime());
155         Assert.assertEquals("hts", firstHeader.getPredictionProvider());
156         Assert.assertEquals(3202, firstHeader.getSequenceNumber());
157 
158         // Configuration records
159         Assert.assertEquals(532.000 * 1.0e-9, firstConf.getSystemRecord().getWavelength(), 1.0e-15);
160         Assert.assertEquals("std", firstConf.getSystemRecord().getSystemId());
161         Assert.assertEquals("CL1", firstConf.getLaserRecord().getLaserId());
162         Assert.assertEquals("RG30-L", firstConf.getLaserRecord().getLaserType());
163         Assert.assertEquals(1064.00 * 1.0e-9, firstConf.getLaserRecord().getPrimaryWavelength(), 1.0e-15);
164         Assert.assertEquals(1000.00, firstConf.getLaserRecord().getNominalFireRate(), 1.0e-15);
165         Assert.assertEquals(1.50, firstConf.getLaserRecord().getPulseEnergy(), 1.0e-15);
166         Assert.assertEquals(10.0, firstConf.getLaserRecord().getPulseWidth(), 1.0e-15);
167         Assert.assertEquals(92.82, firstConf.getLaserRecord().getBeamDivergence(), 1.0e-15);
168         Assert.assertEquals(0, firstConf.getLaserRecord().getPulseInOutgoingSemiTrain());
169         Assert.assertEquals("CD1", firstConf.getDetectorRecord().getDetectorId());
170         Assert.assertEquals("CSPAD", firstConf.getDetectorRecord().getDetectorType());
171         Assert.assertEquals(532.000 * 1.0e-9, firstConf.getDetectorRecord().getApplicableWavelength(), 1.0e-15);
172         Assert.assertEquals(20.0, firstConf.getDetectorRecord().getQuantumEfficiency(), 1.0e-15);
173         Assert.assertEquals(5.0, firstConf.getDetectorRecord().getAppliedVoltage(), 1.0e-15);
174         Assert.assertEquals(60000.0, firstConf.getDetectorRecord().getDarkCount(), 1.0e-15);
175         Assert.assertEquals("TTL", firstConf.getDetectorRecord().getOutputPulseType());
176         Assert.assertEquals(0.0, firstConf.getDetectorRecord().getOutputPulseWidth(), 1.0e-15);
177         Assert.assertEquals(1.70 * 1.0e-9, firstConf.getDetectorRecord().getSpectralFilter(), 1.0e-15);
178         Assert.assertEquals(0.0, firstConf.getDetectorRecord().getTransmissionOfSpectralFilter(), 1.0e-15);
179         Assert.assertEquals(0.0, firstConf.getDetectorRecord().getSpatialFilter(), 1.0e-15);
180         Assert.assertEquals("none", firstConf.getDetectorRecord().getExternalSignalProcessing());
181         Assert.assertEquals(0.0, firstConf.getDetectorRecord().getAmplifierGain(), 1.0e-15);
182         Assert.assertEquals(0.0, firstConf.getDetectorRecord().getAmplifierBandwidth(), 1.0e-15);
183         Assert.assertEquals("0", firstConf.getDetectorRecord().getAmplifierInUse());
184         Assert.assertEquals("CT1", firstConf.getTimingRecord().getLocalTimingId());
185         Assert.assertEquals("Meridian", firstConf.getTimingRecord().getTimeSource());
186         Assert.assertEquals("Meridian", firstConf.getTimingRecord().getFrequencySource());
187         Assert.assertEquals("ET-A032", firstConf.getTimingRecord().getTimer());
188         Assert.assertEquals("003309", firstConf.getTimingRecord().getTimerSerialNumber());
189         Assert.assertEquals(0.0, firstConf.getTimingRecord().getEpochDelayCorrection(), 1.0e-15);
190         Assert.assertEquals("pgms", firstConf.getSoftwareRecord().getSoftwareId());
191         Assert.assertEquals("Sattrk", firstConf.getSoftwareRecord().getTrackingSoftwares()[1]);
192         Assert.assertEquals("2.00Cm", firstConf.getSoftwareRecord().getTrackingSoftwareVersions()[1]);
193         Assert.assertEquals("crd_cal", firstConf.getSoftwareRecord().getProcessingSoftwares()[1]);
194         Assert.assertEquals("1.7", firstConf.getSoftwareRecord().getProcessingSoftwareVersions()[1]);
195         Assert.assertEquals("mets", firstConf.getMeteorologicalRecord().getMeteorologicalId());
196         Assert.assertEquals("Paroscientific", firstConf.getMeteorologicalRecord().getPressSensorManufacturer());
197         Assert.assertEquals("Met4a", firstConf.getMeteorologicalRecord().getPressSensorModel());
198         Assert.assertEquals("123456", firstConf.getMeteorologicalRecord().getPressSensorSerialNumber());
199         Assert.assertEquals("Paroscientific", firstConf.getMeteorologicalRecord().getTempSensorManufacturer());
200         Assert.assertEquals("Met4a", firstConf.getMeteorologicalRecord().getTempSensorModel());
201         Assert.assertEquals("123456", firstConf.getMeteorologicalRecord().getTempSensorSerialNumber());
202         Assert.assertEquals("Paroscientific", firstConf.getMeteorologicalRecord().getHumiSensorManufacturer());
203         Assert.assertEquals("Met4a", firstConf.getMeteorologicalRecord().getHumiSensorModel());
204         Assert.assertEquals("123456", firstConf.getMeteorologicalRecord().getHumiSensorSerialNumber());
205         Assert.assertNull(firstConf.getTransponderRecord());
206 
207         // Meteorological data (only one data)
208         final MeteorologicalMeasurement meteoFirst = first.getMeteoData().getMeteo(AbsoluteDate.J2000_EPOCH);
209         Assert.assertEquals(56940.0, meteoFirst.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
210         Assert.assertEquals(0.9989, meteoFirst.getPressure(), 1.0e-15);
211         Assert.assertEquals(259.10, meteoFirst.getTemperature(), 1.0e-15);
212         Assert.assertEquals(80.0, meteoFirst.getHumidity(), 1.0e-15);
213 
214         // Range data
215         final RangeMeasurement rangeFirst1 = first.getRangeData().get(0);
216         Assert.assertEquals(54927.620161400002, rangeFirst1.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
217         Assert.assertEquals(0.044106029140, rangeFirst1.getTimeOfFlight(), 1.0e-15);
218         Assert.assertEquals(2, rangeFirst1.getEpochEvent());
219         Assert.assertEquals(5.7, rangeFirst1.getSnr(), 1.0e-15);
220         final RangeMeasurement rangeFirst2 = first.getRangeData().get(5);
221         Assert.assertEquals(56899.718161400000, rangeFirst2.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
222         Assert.assertEquals(0.050148193335, rangeFirst2.getTimeOfFlight(), 1.0e-15);
223         Assert.assertEquals(2, rangeFirst2.getEpochEvent());
224         Assert.assertEquals(5.7, rangeFirst2.getSnr(), 1.0e-15);
225 
226         // Angles data
227         Assert.assertEquals(0, first.getAnglesData().size());
228 
229         // Verify last data block
230         final CRDDataBlock last = file.getDataBlocks().get(file.getDataBlocks().size() - 1);
231         final CRDHeader lastHeader = last.getHeader();
232         final CRDConfiguration lastConf = last.getConfigurationRecords();
233         final AbsoluteDate lastStartDate = new AbsoluteDate("2018-02-27T14:10:10.000", TimeScalesFactory.getUTC());
234         final AbsoluteDate lastEndDate   = new AbsoluteDate("2018-02-27T14:39:06.000", TimeScalesFactory.getUTC());
235 
236         // Header
237         Assert.assertEquals(2, lastHeader.getVersion());
238         Assert.assertEquals(2018, lastHeader.getProductionEpoch().getYear());
239         Assert.assertEquals(2, lastHeader.getProductionEpoch().getMonth());
240         Assert.assertEquals(27, lastHeader.getProductionEpoch().getDay());
241         Assert.assertEquals(14, lastHeader.getProductionHour());
242         Assert.assertEquals("CHAL", lastHeader.getStationName());
243         Assert.assertEquals(9998, lastHeader.getSystemIdentifier());
244         Assert.assertEquals(19, lastHeader.getSystemNumber());
245         Assert.assertEquals(1, lastHeader.getSystemOccupancy());
246         Assert.assertEquals(4, lastHeader.getEpochIdentifier());
247         Assert.assertEquals("WPLTN", lastHeader.getStationNetword());
248         Assert.assertEquals("lageos2", lastHeader.getName());
249         Assert.assertEquals("9207002", lastHeader.getIlrsSatelliteId());
250         Assert.assertEquals("5986", lastHeader.getSic());
251         Assert.assertEquals("22195", lastHeader.getNoradId());
252         Assert.assertEquals(0, lastHeader.getSpacecraftEpochTimeScale());
253         Assert.assertEquals(1, lastHeader.getTargetClass());
254         Assert.assertEquals(1, lastHeader.getTargetLocation());
255         Assert.assertEquals(1, lastHeader.getDataType());
256         Assert.assertEquals(0.0, lastHeader.getStartEpoch().durationFrom(lastStartDate), 1.0e-5);
257         Assert.assertEquals(0.0, lastHeader.getEndEpoch().durationFrom(lastEndDate), 1.0e-5);
258         Assert.assertEquals(0, lastHeader.getDataReleaseFlag());
259         Assert.assertFalse(lastHeader.isTroposphericRefractionApplied());
260         Assert.assertFalse(lastHeader.isCenterOfMassCorrectionApplied());
261         Assert.assertFalse(lastHeader.isReceiveAmplitudeCorrectionApplied());
262         Assert.assertTrue(lastHeader.isStationSystemDelayApplied());
263         Assert.assertFalse(lastHeader.isTransponderDelayApplied());
264         Assert.assertEquals(2, lastHeader.getRangeType().getIndicator());
265         Assert.assertEquals(0, lastHeader.getQualityIndicator());
266         Assert.assertEquals(1, lastHeader.getPredictionType());
267         Assert.assertEquals(18, lastHeader.getYearOfCentury());
268         Assert.assertEquals("022714", lastHeader.getDateAndTime());
269         Assert.assertEquals("hts", lastHeader.getPredictionProvider());
270         Assert.assertEquals(5802, lastHeader.getSequenceNumber());
271 
272         // Configuration records
273         Assert.assertEquals(532.000 * 1.0e-9, lastConf.getSystemRecord().getWavelength(), 1.0e-15);
274         Assert.assertEquals("std", lastConf.getSystemRecord().getSystemId());
275         Assert.assertEquals("CL1", lastConf.getLaserRecord().getLaserId());
276         Assert.assertEquals("RG30-L", lastConf.getLaserRecord().getLaserType());
277         Assert.assertEquals(1064.00 * 1.0e-9, lastConf.getLaserRecord().getPrimaryWavelength(), 1.0e-15);
278         Assert.assertEquals(1000.00, lastConf.getLaserRecord().getNominalFireRate(), 1.0e-15);
279         Assert.assertEquals(1.50, lastConf.getLaserRecord().getPulseEnergy(), 1.0e-15);
280         Assert.assertEquals(10.0, lastConf.getLaserRecord().getPulseWidth(), 1.0e-15);
281         Assert.assertEquals(92.82, lastConf.getLaserRecord().getBeamDivergence(), 1.0e-15);
282         Assert.assertEquals(0, lastConf.getLaserRecord().getPulseInOutgoingSemiTrain());
283         Assert.assertEquals("CD1", lastConf.getDetectorRecord().getDetectorId());
284         Assert.assertEquals("CSPAD", lastConf.getDetectorRecord().getDetectorType());
285         Assert.assertEquals(532.000 * 1.0e-9, lastConf.getDetectorRecord().getApplicableWavelength(), 1.0e-15);
286         Assert.assertEquals(20.0, lastConf.getDetectorRecord().getQuantumEfficiency(), 1.0e-15);
287         Assert.assertEquals(5.0, lastConf.getDetectorRecord().getAppliedVoltage(), 1.0e-15);
288         Assert.assertEquals(60000.0, lastConf.getDetectorRecord().getDarkCount(), 1.0e-15);
289         Assert.assertEquals("TTL", lastConf.getDetectorRecord().getOutputPulseType());
290         Assert.assertEquals(0.0, lastConf.getDetectorRecord().getOutputPulseWidth(), 1.0e-15);
291         Assert.assertEquals(1.70 * 1.0e-9, lastConf.getDetectorRecord().getSpectralFilter(), 1.0e-15);
292         Assert.assertEquals(0.0, lastConf.getDetectorRecord().getTransmissionOfSpectralFilter(), 1.0e-15);
293         Assert.assertEquals(0.0, lastConf.getDetectorRecord().getSpatialFilter(), 1.0e-15);
294         Assert.assertEquals("none", lastConf.getDetectorRecord().getExternalSignalProcessing());
295         Assert.assertEquals(0.0, lastConf.getDetectorRecord().getAmplifierGain(), 1.0e-15);
296         Assert.assertEquals(0.0, lastConf.getDetectorRecord().getAmplifierBandwidth(), 1.0e-15);
297         Assert.assertEquals("0", lastConf.getDetectorRecord().getAmplifierInUse());
298         Assert.assertEquals("CT1", lastConf.getTimingRecord().getLocalTimingId());
299         Assert.assertEquals("Meridian", lastConf.getTimingRecord().getTimeSource());
300         Assert.assertEquals("Meridian", lastConf.getTimingRecord().getFrequencySource());
301         Assert.assertEquals("ET-A032", lastConf.getTimingRecord().getTimer());
302         Assert.assertEquals("003309", lastConf.getTimingRecord().getTimerSerialNumber());
303         Assert.assertEquals(0.0, lastConf.getTimingRecord().getEpochDelayCorrection(), 1.0e-15);
304         Assert.assertEquals("pgms", lastConf.getSoftwareRecord().getSoftwareId());
305         Assert.assertEquals("Sattrk", lastConf.getSoftwareRecord().getTrackingSoftwares()[1]);
306         Assert.assertEquals("2.00Cm", lastConf.getSoftwareRecord().getTrackingSoftwareVersions()[1]);
307         Assert.assertEquals("crd_cal", lastConf.getSoftwareRecord().getProcessingSoftwares()[1]);
308         Assert.assertEquals("1.7", lastConf.getSoftwareRecord().getProcessingSoftwareVersions()[1]);
309         Assert.assertEquals("mets", lastConf.getMeteorologicalRecord().getMeteorologicalId());
310         Assert.assertEquals("Paroscientific", lastConf.getMeteorologicalRecord().getPressSensorManufacturer());
311         Assert.assertEquals("Met4a", lastConf.getMeteorologicalRecord().getPressSensorModel());
312         Assert.assertEquals("123456", lastConf.getMeteorologicalRecord().getPressSensorSerialNumber());
313         Assert.assertEquals("Paroscientific", lastConf.getMeteorologicalRecord().getTempSensorManufacturer());
314         Assert.assertEquals("Met4a", lastConf.getMeteorologicalRecord().getTempSensorModel());
315         Assert.assertEquals("123456", lastConf.getMeteorologicalRecord().getTempSensorSerialNumber());
316         Assert.assertEquals("Paroscientific", lastConf.getMeteorologicalRecord().getHumiSensorManufacturer());
317         Assert.assertEquals("Met4a", lastConf.getMeteorologicalRecord().getHumiSensorModel());
318         Assert.assertEquals("123456", lastConf.getMeteorologicalRecord().getHumiSensorSerialNumber());
319         Assert.assertNull(lastConf.getTransponderRecord());
320 
321         // Meteorological data (only one data)
322         final MeteorologicalMeasurement meteoLast = last.getMeteoData().getMeteo(AbsoluteDate.J2000_EPOCH);
323         Assert.assertEquals(52749.0, meteoLast.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
324         Assert.assertEquals(0.9921, meteoLast.getPressure(), 1.0e-15);
325         Assert.assertEquals(260.80, meteoLast.getTemperature(), 1.0e-15);
326         Assert.assertEquals(67.0, meteoLast.getHumidity(), 1.0e-15);
327 
328         // Range data
329         final RangeMeasurement rangeLast1 = last.getRangeData().get(0);
330         Assert.assertEquals(51080.935001603524, rangeLast1.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
331         Assert.assertEquals(0.045673108965, rangeLast1.getTimeOfFlight(), 1.0e-15);
332         Assert.assertEquals(2, rangeLast1.getEpochEvent());
333         Assert.assertEquals(5.7, rangeLast1.getSnr(), 1.0e-15);
334         final RangeMeasurement rangeLast2 = last.getRangeData().get(13);
335         Assert.assertEquals(52618.095001597932, rangeLast2.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
336         Assert.assertEquals(0.042733272755, rangeLast2.getTimeOfFlight(), 1.0e-15);
337         Assert.assertEquals(2, rangeLast2.getEpochEvent());
338         Assert.assertEquals(5.7, rangeLast2.getSnr(), 1.0e-15);
339 
340         // Angles data
341         Assert.assertEquals(0, first.getAnglesData().size());
342 
343     }
344 
345     @Test
346     public void testChampVersion1() throws URISyntaxException, IOException {
347 
348         // Simple test for version 1.0
349         final String ex = "/ilrs/champ_201709-small.frd";
350 
351         final CRDParser parser = new CRDParser();
352         final InputStream inEntry = getClass().getResourceAsStream(ex);
353         final CRDFile file = (CRDFile) parser.parse(inEntry);
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 CRDParser parser = new CRDParser();
455         final String fileName = Paths.get(getClass().getResource(ex).toURI()).toString();
456         final CRDFile file = (CRDFile) parser.parse(fileName);
457 
458         final CRDDataBlock block = file.getDataBlocks().get(0);
459         Assert.assertEquals(0, file.getComments().size());
460         Assert.assertEquals(4, block.getRangeData().size());
461         Assert.assertEquals(4, block.getAnglesData().size());
462 
463         // Transponder
464         final TransponderConfiguration transponder = block.getConfigurationRecords().getTransponderRecord();
465         Assert.assertEquals("id", transponder.getTransponderId());
466         Assert.assertEquals(0.0, transponder.getStationUTCOffset(), 1.0e-15);
467         Assert.assertEquals(0.0, transponder.getStationOscDrift(), 1.0e-15);
468         Assert.assertEquals(0.0, transponder.getTranspUTCOffset(), 1.0e-15);
469         Assert.assertEquals(0.0, transponder.getTranspOscDrift(), 1.0e-15);
470         Assert.assertEquals(0.0, transponder.getTranspClkRefTime(), 1.0e-15);
471         Assert.assertEquals(0, transponder.getSpacecraftClockAndDriftApplied());
472         Assert.assertEquals(0, transponder.getStationClockAndDriftApplied());
473         Assert.assertFalse(transponder.isSpacecraftTimeSimplified());
474     }
475 
476     @Test
477     public void testMeteorologicalData() {
478 
479         // Initialise an empty data block
480         final CRDDataBlock block = new CRDDataBlock();
481 
482         // Verify null object
483         Assert.assertNull(block.getMeteoData().getMeteo(AbsoluteDate.J2000_EPOCH));
484 
485         // Add a meteorological data entry
486         final AbsoluteDate date = new AbsoluteDate("2020-10-29T11:40:00.000", TimeScalesFactory.getUTC());
487         final MeteorologicalMeasurement meteoData1 = new MeteorologicalMeasurement(date, 1013.0, 273.0, 50.0);
488         block.addMeteoData(meteoData1);
489 
490         // Verify values
491         MeteorologicalMeasurement data1 = block.getMeteoData().getMeteo(AbsoluteDate.J2000_EPOCH);
492         Assert.assertEquals(meteoData1.getPressure(),    data1.getPressure(),    1.0e-15);
493         Assert.assertEquals(meteoData1.getTemperature(), data1.getTemperature(), 1.0e-15);
494         Assert.assertEquals(meteoData1.getHumidity(),    data1.getHumidity(),    1.0e-15);
495         data1 = block.getMeteoData().getMeteo(date);
496         Assert.assertEquals(meteoData1.getPressure(),    data1.getPressure(),    1.0e-15);
497         Assert.assertEquals(meteoData1.getTemperature(), data1.getTemperature(), 1.0e-15);
498         Assert.assertEquals(meteoData1.getHumidity(),    data1.getHumidity(),    1.0e-15);
499         data1 = block.getMeteoData().getMeteo(date.shiftedBy(60.0));
500         Assert.assertEquals(meteoData1.getPressure(),    data1.getPressure(),    1.0e-15);
501         Assert.assertEquals(meteoData1.getTemperature(), data1.getTemperature(), 1.0e-15);
502         Assert.assertEquals(meteoData1.getHumidity(),    data1.getHumidity(),    1.0e-15);
503 
504         // Add another meteorological data entry
505         final MeteorologicalMeasurement meteoData2 = new MeteorologicalMeasurement(date.shiftedBy(60.0), 1015.0, 275.0, 70.0);
506         block.addMeteoData(meteoData2);
507 
508         // Verify values
509         MeteorologicalMeasurement data2 = block.getMeteoData().getMeteo(AbsoluteDate.J2000_EPOCH); // before first data
510         Assert.assertEquals(meteoData1.getPressure(),    data2.getPressure(),    1.0e-15);
511         Assert.assertEquals(meteoData1.getTemperature(), data2.getTemperature(), 1.0e-15);
512         Assert.assertEquals(meteoData1.getHumidity(),    data2.getHumidity(),    1.0e-15);
513         data2 = block.getMeteoData().getMeteo(date.shiftedBy(180.0)); // After second data
514         Assert.assertEquals(meteoData2.getPressure(),    data2.getPressure(),    1.0e-15);
515         Assert.assertEquals(meteoData2.getTemperature(), data2.getTemperature(), 1.0e-15);
516         Assert.assertEquals(meteoData2.getHumidity(),    data2.getHumidity(),    1.0e-15);
517         data2 = block.getMeteoData().getMeteo(date.shiftedBy(30.0)); // between first and second datta
518         Assert.assertEquals(1014.0,                      data2.getPressure(),    1.0e-15);
519         Assert.assertEquals(274.0,                       data2.getTemperature(), 1.0e-15);
520         Assert.assertEquals(60.0,                        data2.getHumidity(),    1.0e-15);
521 
522     }
523 
524     @Before
525     public void setUp() {
526         Utils.setDataRoot("regular-data");
527     }
528 
529 }