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 org.hipparchus.util.FastMath;
20  import org.junit.jupiter.api.Assertions;
21  import org.junit.jupiter.api.BeforeEach;
22  import org.junit.jupiter.api.Test;
23  import org.orekit.Utils;
24  import org.orekit.data.DataContext;
25  import org.orekit.data.DataSource;
26  import org.orekit.errors.OrekitException;
27  import org.orekit.errors.OrekitMessages;
28  import org.orekit.files.ilrs.CRD.AnglesMeasurement;
29  import org.orekit.files.ilrs.CRD.CRDDataBlock;
30  import org.orekit.files.ilrs.CRD.Calibration;
31  import org.orekit.files.ilrs.CRD.CalibrationDetail;
32  import org.orekit.files.ilrs.CRD.FrRangeMeasurement;
33  import org.orekit.files.ilrs.CRD.Meteo;
34  import org.orekit.files.ilrs.CRD.MeteorologicalMeasurement;
35  import org.orekit.files.ilrs.CRD.NptRangeMeasurement;
36  import org.orekit.files.ilrs.CRD.RangeMeasurement;
37  import org.orekit.files.ilrs.CRD.RangeSupplement;
38  import org.orekit.files.ilrs.CRD.SessionStatistics;
39  import org.orekit.files.ilrs.CRDConfiguration.CalibrationTargetConfiguration;
40  import org.orekit.files.ilrs.CRDConfiguration.DetectorConfiguration;
41  import org.orekit.files.ilrs.CRDConfiguration.LaserConfiguration;
42  import org.orekit.files.ilrs.CRDConfiguration.MeteorologicalConfiguration;
43  import org.orekit.files.ilrs.CRDConfiguration.SoftwareConfiguration;
44  import org.orekit.files.ilrs.CRDConfiguration.SystemConfiguration;
45  import org.orekit.files.ilrs.CRDConfiguration.TimingSystemConfiguration;
46  import org.orekit.files.ilrs.CRDConfiguration.TransponderConfiguration;
47  import org.orekit.files.ilrs.CRDHeader.DataType;
48  import org.orekit.time.AbsoluteDate;
49  import org.orekit.time.DateComponents;
50  import org.orekit.time.TimeComponents;
51  import org.orekit.time.TimeScale;
52  import org.orekit.time.TimeScalesFactory;
53  
54  import java.io.IOException;
55  import java.net.URISyntaxException;
56  import java.nio.file.Paths;
57  import java.util.Arrays;
58  import java.util.List;
59  import java.util.Set;
60  
61  public class CRDParserTest {
62  
63      @Test
64      public void testInvalidFormat() throws URISyntaxException, IOException {
65          try {
66              final String ex = "/ilrs/crd_invalid_format.v2C";
67              final CRDParser parser = new CRDParser();
68              parser.parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
69              Assertions.fail("an exception should have been thrown");
70          } catch (OrekitException oe) {
71              Assertions.assertEquals(OrekitMessages.UNEXPECTED_FORMAT_FOR_ILRS_FILE,
72                                  oe.getSpecifier());
73              Assertions.assertEquals("CRD", oe.getParts()[0]);
74              Assertions.assertEquals("CPF", oe.getParts()[1]);
75          }
76      }
77  
78      @Test
79      public void testMissingEOF() throws IOException, URISyntaxException {
80          try {
81              final String ex = "/ilrs/crd_unexpected_end_of_file.v2C";
82              final CRDParser parser = new CRDParser();
83              final String fileName = Paths.get(getClass().getResource(ex).toURI()).toString();
84              parser.parse(new DataSource(fileName));
85              Assertions.fail("an exception should have been thrown");
86          } catch (OrekitException oe) {
87              Assertions.assertEquals(OrekitMessages.CRD_UNEXPECTED_END_OF_FILE,
88                                  oe.getSpecifier());
89              Assertions.assertEquals(23, ((Integer) oe.getParts()[0]).intValue());
90          }
91  
92      }
93  
94      @Test
95      public void testCorruptedData() throws IOException, URISyntaxException {
96          try {
97              final String ex = "/ilrs/crd_corrupted_data.v2C";
98              final CRDParser parser = new CRDParser();
99              parser.parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
100             Assertions.fail("an exception should have been thrown");
101         } catch (OrekitException oe) {
102             Assertions.assertEquals(OrekitMessages.UNABLE_TO_PARSE_LINE_IN_FILE,
103                                 oe.getSpecifier());
104             Assertions.assertEquals(19, ((Integer) oe.getParts()[0]).intValue());
105         }
106 
107     }
108 
109     @Test
110     public void testInvalidRangeType() throws IOException, URISyntaxException {
111         try {
112             final String ex = "/ilrs/crd_invalid_range_type.v2C";
113             final CRDParser parser = new CRDParser();
114             parser.parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
115             Assertions.fail("an exception should have been thrown");
116         } catch (OrekitException oe) {
117             Assertions.assertEquals(OrekitMessages.INVALID_RANGE_INDICATOR_IN_CRD_FILE,
118                                 oe.getSpecifier());
119             Assertions.assertEquals(9, ((Integer) oe.getParts()[0]).intValue());
120         }
121 
122     }
123 
124     @Test
125     public void testLageos2Version2() throws URISyntaxException, IOException {
126 
127         // Simple test for version 2.0
128         final String ex = "/ilrs/lageos2_201802.npt.v2C";
129 
130         final CRDParser parser = new CRDParser();
131         final CRD file = parser.parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
132 
133         // Verify first data block
134         final CRDDataBlock first = file.getDataBlocks().get(0);
135         final CRDHeader firstHeader = first.getHeader();
136         final CRDConfiguration firstConf = first.getConfigurationRecords();
137         final AbsoluteDate firstStartDate = new AbsoluteDate("2018-02-01T15:14:58.000", TimeScalesFactory.getUTC());
138         final AbsoluteDate firstEndDate   = new AbsoluteDate("2018-02-01T15:48:57.000", TimeScalesFactory.getUTC());
139 
140         // Header
141         Assertions.assertEquals(2, firstHeader.getVersion());
142         Assertions.assertEquals(2018, firstHeader.getProductionEpoch().getYear());
143         Assertions.assertEquals(2, firstHeader.getProductionEpoch().getMonth());
144         Assertions.assertEquals(1, firstHeader.getProductionEpoch().getDay());
145         Assertions.assertEquals(17, firstHeader.getProductionHour());
146         Assertions.assertEquals("CHAL", firstHeader.getStationName());
147         Assertions.assertEquals(9998, firstHeader.getSystemIdentifier());
148         Assertions.assertEquals(19, firstHeader.getSystemNumber());
149         Assertions.assertEquals(1, firstHeader.getSystemOccupancy());
150         Assertions.assertEquals(4, firstHeader.getEpochIdentifier());
151         Assertions.assertEquals("WPLTN", firstHeader.getStationNetword());
152         Assertions.assertEquals("lageos2", firstHeader.getName());
153         Assertions.assertEquals("9207002", firstHeader.getIlrsSatelliteId());
154         Assertions.assertEquals("5986", firstHeader.getSic());
155         Assertions.assertEquals("22195", firstHeader.getNoradId());
156         Assertions.assertEquals(0, firstHeader.getSpacecraftEpochTimeScale());
157         Assertions.assertEquals(1, firstHeader.getTargetClass());
158         Assertions.assertEquals(1, firstHeader.getTargetLocation());
159         Assertions.assertEquals(1, firstHeader.getDataType());
160         Assertions.assertEquals(0.0, firstHeader.getStartEpoch().durationFrom(firstStartDate), 1.0e-5);
161         Assertions.assertEquals(0.0, firstHeader.getEndEpoch().durationFrom(firstEndDate), 1.0e-5);
162         Assertions.assertEquals(0, firstHeader.getDataReleaseFlag());
163         Assertions.assertFalse(firstHeader.isTroposphericRefractionApplied());
164         Assertions.assertFalse(firstHeader.isCenterOfMassCorrectionApplied());
165         Assertions.assertFalse(firstHeader.isReceiveAmplitudeCorrectionApplied());
166         Assertions.assertTrue(firstHeader.isStationSystemDelayApplied());
167         Assertions.assertFalse(firstHeader.isTransponderDelayApplied());
168         Assertions.assertEquals(2, firstHeader.getRangeType().getIndicator());
169         Assertions.assertEquals(0, firstHeader.getQualityIndicator());
170         Assertions.assertEquals(1, firstHeader.getPredictionType());
171         Assertions.assertEquals(18, firstHeader.getYearOfCentury());
172         Assertions.assertEquals("020115", firstHeader.getDateAndTime());
173         Assertions.assertEquals("hts", firstHeader.getPredictionProvider());
174         Assertions.assertEquals(3202, firstHeader.getSequenceNumber());
175 
176         // Configuration records
177         Assertions.assertEquals(532.000 * 1.0e-9, firstConf.getSystemRecord().getWavelength(), 1.0e-15);
178         Assertions.assertEquals("std", firstConf.getSystemRecord().getSystemId());
179         Assertions.assertEquals("CL1", firstConf.getLaserRecord().getLaserId());
180         Assertions.assertEquals("RG30-L", firstConf.getLaserRecord().getLaserType());
181         Assertions.assertEquals(1064.00 * 1.0e-9, firstConf.getLaserRecord().getPrimaryWavelength(), 1.0e-15);
182         Assertions.assertEquals(1000.00, firstConf.getLaserRecord().getNominalFireRate(), 1.0e-15);
183         Assertions.assertEquals(1.50, firstConf.getLaserRecord().getPulseEnergy(), 1.0e-15);
184         Assertions.assertEquals(10.0, firstConf.getLaserRecord().getPulseWidth(), 1.0e-15);
185         Assertions.assertEquals(92.82, firstConf.getLaserRecord().getBeamDivergence(), 1.0e-15);
186         Assertions.assertEquals(0, firstConf.getLaserRecord().getPulseInOutgoingSemiTrain());
187         Assertions.assertEquals("CD1", firstConf.getDetectorRecord().getDetectorId());
188         Assertions.assertEquals("CSPAD", firstConf.getDetectorRecord().getDetectorType());
189         Assertions.assertEquals(532.000 * 1.0e-9, firstConf.getDetectorRecord().getApplicableWavelength(), 1.0e-15);
190         Assertions.assertEquals(20.0, firstConf.getDetectorRecord().getQuantumEfficiency(), 1.0e-15);
191         Assertions.assertEquals(5.0, firstConf.getDetectorRecord().getAppliedVoltage(), 1.0e-15);
192         Assertions.assertEquals(60000.0, firstConf.getDetectorRecord().getDarkCount(), 1.0e-15);
193         Assertions.assertEquals("TTL", firstConf.getDetectorRecord().getOutputPulseType());
194         Assertions.assertEquals(0.0, firstConf.getDetectorRecord().getOutputPulseWidth(), 1.0e-15);
195         Assertions.assertEquals(1.70 * 1.0e-9, firstConf.getDetectorRecord().getSpectralFilter(), 1.0e-15);
196         Assertions.assertEquals(0.0, firstConf.getDetectorRecord().getTransmissionOfSpectralFilter(), 1.0e-15);
197         Assertions.assertEquals(0.0, firstConf.getDetectorRecord().getSpatialFilter(), 1.0e-15);
198         Assertions.assertEquals("none", firstConf.getDetectorRecord().getExternalSignalProcessing());
199         Assertions.assertEquals(0.0, firstConf.getDetectorRecord().getAmplifierGain(), 1.0e-15);
200         Assertions.assertEquals(0.0, firstConf.getDetectorRecord().getAmplifierBandwidth(), 1.0e-15);
201         Assertions.assertEquals("0", firstConf.getDetectorRecord().getAmplifierInUse());
202         Assertions.assertEquals("CT1", firstConf.getTimingRecord().getLocalTimingId());
203         Assertions.assertEquals("Meridian", firstConf.getTimingRecord().getTimeSource());
204         Assertions.assertEquals("Meridian", firstConf.getTimingRecord().getFrequencySource());
205         Assertions.assertEquals("ET-A032", firstConf.getTimingRecord().getTimer());
206         Assertions.assertEquals("003309", firstConf.getTimingRecord().getTimerSerialNumber());
207         Assertions.assertEquals(0.0, firstConf.getTimingRecord().getEpochDelayCorrection(), 1.0e-15);
208         Assertions.assertEquals("pgms", firstConf.getSoftwareRecord().getSoftwareId());
209         Assertions.assertEquals("Sattrk", firstConf.getSoftwareRecord().getTrackingSoftwares()[1]);
210         Assertions.assertEquals("2.00Cm", firstConf.getSoftwareRecord().getTrackingSoftwareVersions()[1]);
211         Assertions.assertEquals("crd_cal", firstConf.getSoftwareRecord().getProcessingSoftwares()[1]);
212         Assertions.assertEquals("1.7", firstConf.getSoftwareRecord().getProcessingSoftwareVersions()[1]);
213         Assertions.assertEquals("mets", firstConf.getMeteorologicalRecord().getMeteorologicalId());
214         Assertions.assertEquals("Paroscientific", firstConf.getMeteorologicalRecord().getPressSensorManufacturer());
215         Assertions.assertEquals("Met4a", firstConf.getMeteorologicalRecord().getPressSensorModel());
216         Assertions.assertEquals("123456", firstConf.getMeteorologicalRecord().getPressSensorSerialNumber());
217         Assertions.assertEquals("Paroscientific", firstConf.getMeteorologicalRecord().getTempSensorManufacturer());
218         Assertions.assertEquals("Met4a", firstConf.getMeteorologicalRecord().getTempSensorModel());
219         Assertions.assertEquals("123456", firstConf.getMeteorologicalRecord().getTempSensorSerialNumber());
220         Assertions.assertEquals("Paroscientific", firstConf.getMeteorologicalRecord().getHumiSensorManufacturer());
221         Assertions.assertEquals("Met4a", firstConf.getMeteorologicalRecord().getHumiSensorModel());
222         Assertions.assertEquals("123456", firstConf.getMeteorologicalRecord().getHumiSensorSerialNumber());
223         Assertions.assertNull(firstConf.getTransponderRecord());
224 
225         // Meteorological data (only one data)
226         final MeteorologicalMeasurement meteoFirst = first.getMeteoData().getMeteo(AbsoluteDate.J2000_EPOCH);
227         Assertions.assertEquals(56940.0, meteoFirst.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
228         Assertions.assertEquals(0.9989, meteoFirst.getPressure(), 1.0e-15);
229         Assertions.assertEquals(259.10, meteoFirst.getTemperature(), 1.0e-15);
230         Assertions.assertEquals(80.0, meteoFirst.getHumidity(), 1.0e-15);
231 
232         // Range data
233         final RangeMeasurement rangeFirst1 = first.getRangeData().get(0);
234         Assertions.assertEquals(54927.620161400002, rangeFirst1.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
235         Assertions.assertEquals(0.044106029140, rangeFirst1.getTimeOfFlight(), 1.0e-15);
236         Assertions.assertEquals(2, rangeFirst1.getEpochEvent());
237         Assertions.assertEquals(5.7, rangeFirst1.getSnr(), 1.0e-15);
238         final RangeMeasurement rangeFirst2 = first.getRangeData().get(5);
239         Assertions.assertEquals(56899.718161400000, rangeFirst2.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
240         Assertions.assertEquals(0.050148193335, rangeFirst2.getTimeOfFlight(), 1.0e-15);
241         Assertions.assertEquals(2, rangeFirst2.getEpochEvent());
242         Assertions.assertEquals(5.7, rangeFirst2.getSnr(), 1.0e-15);
243 
244         // Angles data
245         Assertions.assertEquals(0, first.getAnglesData().size());
246 
247         // Verify last data block
248         final CRDDataBlock last = file.getDataBlocks().get(file.getDataBlocks().size() - 1);
249         final CRDHeader lastHeader = last.getHeader();
250         final CRDConfiguration lastConf = last.getConfigurationRecords();
251         final AbsoluteDate lastStartDate = new AbsoluteDate("2018-02-27T14:10:10.000", TimeScalesFactory.getUTC());
252         final AbsoluteDate lastEndDate   = new AbsoluteDate("2018-02-27T14:39:06.000", TimeScalesFactory.getUTC());
253 
254         // Header
255         Assertions.assertEquals(2, lastHeader.getVersion());
256         Assertions.assertEquals(2018, lastHeader.getProductionEpoch().getYear());
257         Assertions.assertEquals(2, lastHeader.getProductionEpoch().getMonth());
258         Assertions.assertEquals(27, lastHeader.getProductionEpoch().getDay());
259         Assertions.assertEquals(14, lastHeader.getProductionHour());
260         Assertions.assertEquals("CHAL", lastHeader.getStationName());
261         Assertions.assertEquals(9998, lastHeader.getSystemIdentifier());
262         Assertions.assertEquals(19, lastHeader.getSystemNumber());
263         Assertions.assertEquals(1, lastHeader.getSystemOccupancy());
264         Assertions.assertEquals(4, lastHeader.getEpochIdentifier());
265         Assertions.assertEquals("WPLTN", lastHeader.getStationNetword());
266         Assertions.assertEquals("lageos2", lastHeader.getName());
267         Assertions.assertEquals("9207002", lastHeader.getIlrsSatelliteId());
268         Assertions.assertEquals("5986", lastHeader.getSic());
269         Assertions.assertEquals("22195", lastHeader.getNoradId());
270         Assertions.assertEquals(0, lastHeader.getSpacecraftEpochTimeScale());
271         Assertions.assertEquals(1, lastHeader.getTargetClass());
272         Assertions.assertEquals(1, lastHeader.getTargetLocation());
273         Assertions.assertEquals(1, lastHeader.getDataType());
274         Assertions.assertEquals(0.0, lastHeader.getStartEpoch().durationFrom(lastStartDate), 1.0e-5);
275         Assertions.assertEquals(0.0, lastHeader.getEndEpoch().durationFrom(lastEndDate), 1.0e-5);
276         Assertions.assertEquals(0, lastHeader.getDataReleaseFlag());
277         Assertions.assertFalse(lastHeader.isTroposphericRefractionApplied());
278         Assertions.assertFalse(lastHeader.isCenterOfMassCorrectionApplied());
279         Assertions.assertFalse(lastHeader.isReceiveAmplitudeCorrectionApplied());
280         Assertions.assertTrue(lastHeader.isStationSystemDelayApplied());
281         Assertions.assertFalse(lastHeader.isTransponderDelayApplied());
282         Assertions.assertEquals(2, lastHeader.getRangeType().getIndicator());
283         Assertions.assertEquals(0, lastHeader.getQualityIndicator());
284         Assertions.assertEquals(1, lastHeader.getPredictionType());
285         Assertions.assertEquals(18, lastHeader.getYearOfCentury());
286         Assertions.assertEquals("022714", lastHeader.getDateAndTime());
287         Assertions.assertEquals("hts", lastHeader.getPredictionProvider());
288         Assertions.assertEquals(5802, lastHeader.getSequenceNumber());
289 
290         // Configuration records
291         Assertions.assertEquals(532.000 * 1.0e-9, lastConf.getSystemRecord().getWavelength(), 1.0e-15);
292         Assertions.assertEquals("std", lastConf.getSystemRecord().getSystemId());
293         Assertions.assertEquals("CL1", lastConf.getLaserRecord().getLaserId());
294         Assertions.assertEquals("RG30-L", lastConf.getLaserRecord().getLaserType());
295         Assertions.assertEquals(1064.00 * 1.0e-9, lastConf.getLaserRecord().getPrimaryWavelength(), 1.0e-15);
296         Assertions.assertEquals(1000.00, lastConf.getLaserRecord().getNominalFireRate(), 1.0e-15);
297         Assertions.assertEquals(1.50, lastConf.getLaserRecord().getPulseEnergy(), 1.0e-15);
298         Assertions.assertEquals(10.0, lastConf.getLaserRecord().getPulseWidth(), 1.0e-15);
299         Assertions.assertEquals(92.82, lastConf.getLaserRecord().getBeamDivergence(), 1.0e-15);
300         Assertions.assertEquals(0, lastConf.getLaserRecord().getPulseInOutgoingSemiTrain());
301         Assertions.assertEquals("CD1", lastConf.getDetectorRecord().getDetectorId());
302         Assertions.assertEquals("CSPAD", lastConf.getDetectorRecord().getDetectorType());
303         Assertions.assertEquals(532.000 * 1.0e-9, lastConf.getDetectorRecord().getApplicableWavelength(), 1.0e-15);
304         Assertions.assertEquals(20.0, lastConf.getDetectorRecord().getQuantumEfficiency(), 1.0e-15);
305         Assertions.assertEquals(5.0, lastConf.getDetectorRecord().getAppliedVoltage(), 1.0e-15);
306         Assertions.assertEquals(60000.0, lastConf.getDetectorRecord().getDarkCount(), 1.0e-15);
307         Assertions.assertEquals("TTL", lastConf.getDetectorRecord().getOutputPulseType());
308         Assertions.assertEquals(0.0, lastConf.getDetectorRecord().getOutputPulseWidth(), 1.0e-15);
309         Assertions.assertEquals(1.70 * 1.0e-9, lastConf.getDetectorRecord().getSpectralFilter(), 1.0e-15);
310         Assertions.assertEquals(0.0, lastConf.getDetectorRecord().getTransmissionOfSpectralFilter(), 1.0e-15);
311         Assertions.assertEquals(0.0, lastConf.getDetectorRecord().getSpatialFilter(), 1.0e-15);
312         Assertions.assertEquals("none", lastConf.getDetectorRecord().getExternalSignalProcessing());
313         Assertions.assertEquals(0.0, lastConf.getDetectorRecord().getAmplifierGain(), 1.0e-15);
314         Assertions.assertEquals(0.0, lastConf.getDetectorRecord().getAmplifierBandwidth(), 1.0e-15);
315         Assertions.assertEquals("0", lastConf.getDetectorRecord().getAmplifierInUse());
316         Assertions.assertEquals("CT1", lastConf.getTimingRecord().getLocalTimingId());
317         Assertions.assertEquals("Meridian", lastConf.getTimingRecord().getTimeSource());
318         Assertions.assertEquals("Meridian", lastConf.getTimingRecord().getFrequencySource());
319         Assertions.assertEquals("ET-A032", lastConf.getTimingRecord().getTimer());
320         Assertions.assertEquals("003309", lastConf.getTimingRecord().getTimerSerialNumber());
321         Assertions.assertEquals(0.0, lastConf.getTimingRecord().getEpochDelayCorrection(), 1.0e-15);
322         Assertions.assertEquals("pgms", lastConf.getSoftwareRecord().getSoftwareId());
323         Assertions.assertEquals("Sattrk", lastConf.getSoftwareRecord().getTrackingSoftwares()[1]);
324         Assertions.assertEquals("2.00Cm", lastConf.getSoftwareRecord().getTrackingSoftwareVersions()[1]);
325         Assertions.assertEquals("crd_cal", lastConf.getSoftwareRecord().getProcessingSoftwares()[1]);
326         Assertions.assertEquals("1.7", lastConf.getSoftwareRecord().getProcessingSoftwareVersions()[1]);
327         Assertions.assertEquals("mets", lastConf.getMeteorologicalRecord().getMeteorologicalId());
328         Assertions.assertEquals("Paroscientific", lastConf.getMeteorologicalRecord().getPressSensorManufacturer());
329         Assertions.assertEquals("Met4a", lastConf.getMeteorologicalRecord().getPressSensorModel());
330         Assertions.assertEquals("123456", lastConf.getMeteorologicalRecord().getPressSensorSerialNumber());
331         Assertions.assertEquals("Paroscientific", lastConf.getMeteorologicalRecord().getTempSensorManufacturer());
332         Assertions.assertEquals("Met4a", lastConf.getMeteorologicalRecord().getTempSensorModel());
333         Assertions.assertEquals("123456", lastConf.getMeteorologicalRecord().getTempSensorSerialNumber());
334         Assertions.assertEquals("Paroscientific", lastConf.getMeteorologicalRecord().getHumiSensorManufacturer());
335         Assertions.assertEquals("Met4a", lastConf.getMeteorologicalRecord().getHumiSensorModel());
336         Assertions.assertEquals("123456", lastConf.getMeteorologicalRecord().getHumiSensorSerialNumber());
337         Assertions.assertNull(lastConf.getTransponderRecord());
338 
339         // Meteorological data (only one data)
340         final MeteorologicalMeasurement meteoLast = last.getMeteoData().getMeteo(AbsoluteDate.J2000_EPOCH);
341         Assertions.assertEquals(52749.0, meteoLast.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
342         Assertions.assertEquals(0.9921, meteoLast.getPressure(), 1.0e-15);
343         Assertions.assertEquals(260.80, meteoLast.getTemperature(), 1.0e-15);
344         Assertions.assertEquals(67.0, meteoLast.getHumidity(), 1.0e-15);
345 
346         // Range data
347         final RangeMeasurement rangeLast1 = last.getRangeData().get(0);
348         Assertions.assertEquals(51080.935001603524, rangeLast1.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
349         Assertions.assertEquals(0.045673108965, rangeLast1.getTimeOfFlight(), 1.0e-15);
350         Assertions.assertEquals(2, rangeLast1.getEpochEvent());
351         Assertions.assertEquals(5.7, rangeLast1.getSnr(), 1.0e-15);
352         final RangeMeasurement rangeLast2 = last.getRangeData().get(13);
353         Assertions.assertEquals(52618.095001597932, rangeLast2.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
354         Assertions.assertEquals(0.042733272755, rangeLast2.getTimeOfFlight(), 1.0e-15);
355         Assertions.assertEquals(2, rangeLast2.getEpochEvent());
356         Assertions.assertEquals(5.7, rangeLast2.getSnr(), 1.0e-15);
357 
358         // Angles data
359         Assertions.assertEquals(0, first.getAnglesData().size());
360 
361     }
362 
363     @Test
364     public void testChampVersion1() throws URISyntaxException, IOException {
365 
366         // Simple test for version 1.0
367         final String ex = "/ilrs/champ_201709-small.frd";
368 
369         final CRDParser parser = new CRDParser();
370         final CRD file = parser.parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
371 
372         // Data block
373         final CRDDataBlock block = file.getDataBlocks().get(0);
374         final CRDHeader header = block.getHeader();
375         final CRDConfiguration conf = block.getConfigurationRecords();
376         final AbsoluteDate startDate = new AbsoluteDate("2017-09-26T03:55:41.000", TimeScalesFactory.getUTC());
377         final AbsoluteDate endDate   = new AbsoluteDate("2017-09-26T04:04:48.000", TimeScalesFactory.getUTC());
378 
379         // Header
380         Assertions.assertEquals(1, header.getVersion());
381         Assertions.assertEquals(2017, header.getProductionEpoch().getYear());
382         Assertions.assertEquals(9, header.getProductionEpoch().getMonth());
383         Assertions.assertEquals(26, header.getProductionEpoch().getDay());
384         Assertions.assertEquals(4, header.getProductionHour());
385         Assertions.assertEquals("STL3", header.getStationName());
386         Assertions.assertEquals(7825, header.getSystemIdentifier());
387         Assertions.assertEquals(90, header.getSystemNumber());
388         Assertions.assertEquals(1, header.getSystemOccupancy());
389         Assertions.assertEquals(4, header.getEpochIdentifier());
390         Assertions.assertEquals("champ", header.getName());
391         Assertions.assertEquals("0003902", header.getIlrsSatelliteId());
392         Assertions.assertEquals("8002", header.getSic());
393         Assertions.assertEquals("026405", header.getNoradId());
394         Assertions.assertEquals(0, header.getSpacecraftEpochTimeScale());
395         Assertions.assertEquals(1, header.getTargetClass());
396         Assertions.assertEquals(0, header.getDataType());
397         Assertions.assertEquals(0.0, header.getStartEpoch().durationFrom(startDate), 1.0e-5);
398         Assertions.assertEquals(0.0, header.getEndEpoch().durationFrom(endDate), 1.0e-5);
399         Assertions.assertEquals(0, header.getDataReleaseFlag());
400         Assertions.assertFalse(header.isTroposphericRefractionApplied());
401         Assertions.assertFalse(header.isCenterOfMassCorrectionApplied());
402         Assertions.assertFalse(header.isReceiveAmplitudeCorrectionApplied());
403         Assertions.assertTrue(header.isStationSystemDelayApplied());
404         Assertions.assertFalse(header.isTransponderDelayApplied());
405         Assertions.assertEquals(2, header.getRangeType().getIndicator());
406         Assertions.assertEquals(0, header.getQualityIndicator());
407 
408         // Configuration records
409         Assertions.assertEquals(532.100 * 1.0e-9, conf.getSystemRecord().getWavelength(), 1.0e-15);
410         Assertions.assertEquals("IDAA", conf.getSystemRecord().getSystemId());
411         Assertions.assertEquals("IDAB", conf.getLaserRecord().getLaserId());
412         Assertions.assertEquals("Nd-YAG", conf.getLaserRecord().getLaserType());
413         Assertions.assertEquals(532.10 * 1.0e-9, conf.getLaserRecord().getPrimaryWavelength(), 1.0e-15);
414         Assertions.assertEquals(0.0, conf.getLaserRecord().getNominalFireRate(), 1.0e-15);
415         Assertions.assertEquals(21.0, conf.getLaserRecord().getPulseEnergy(), 1.0e-15);
416         Assertions.assertEquals(12.0, conf.getLaserRecord().getPulseWidth(), 1.0e-15);
417         Assertions.assertEquals(0.0, conf.getLaserRecord().getBeamDivergence(), 1.0e-15);
418         Assertions.assertEquals(1, conf.getLaserRecord().getPulseInOutgoingSemiTrain());
419         Assertions.assertEquals("IDAJ", conf.getDetectorRecord().getDetectorId());
420         Assertions.assertEquals("CSPAD", conf.getDetectorRecord().getDetectorType());
421         Assertions.assertEquals(532.000 * 1.0e-9, conf.getDetectorRecord().getApplicableWavelength(), 1.0e-15);
422         Assertions.assertEquals(20.0, conf.getDetectorRecord().getQuantumEfficiency(), 1.0e-15);
423         Assertions.assertEquals(11.0, conf.getDetectorRecord().getAppliedVoltage(), 1.0e-15);
424         Assertions.assertEquals(100000.0, conf.getDetectorRecord().getDarkCount(), 1.0e-15);
425         Assertions.assertEquals("ECL", conf.getDetectorRecord().getOutputPulseType());
426         Assertions.assertEquals(12.0, conf.getDetectorRecord().getOutputPulseWidth(), 1.0e-15);
427         Assertions.assertEquals(2.00 * 1.0e-9, conf.getDetectorRecord().getSpectralFilter(), 1.0e-15);
428         Assertions.assertEquals(90.0, conf.getDetectorRecord().getTransmissionOfSpectralFilter(), 1.0e-15);
429         Assertions.assertEquals(12.0, conf.getDetectorRecord().getSpatialFilter(), 1.0e-15);
430         Assertions.assertEquals("Manual", conf.getDetectorRecord().getExternalSignalProcessing());
431         Assertions.assertEquals("IDAV", conf.getTimingRecord().getLocalTimingId());
432         Assertions.assertEquals("TrueTime_XLi", conf.getTimingRecord().getTimeSource());
433         Assertions.assertEquals("TrueTime_OCXO", conf.getTimingRecord().getFrequencySource());
434         Assertions.assertEquals("MRCS", conf.getTimingRecord().getTimer());
435         Assertions.assertEquals("NA", conf.getTimingRecord().getTimerSerialNumber());
436         Assertions.assertEquals(0.2322 * 1.0e-6, conf.getTimingRecord().getEpochDelayCorrection(), 1.0e-15);
437 
438         // Meteorological data
439         final MeteorologicalMeasurement meteoFirst = block.getMeteoData().getMeteo(AbsoluteDate.J2000_EPOCH);
440         Assertions.assertEquals(14353.388283000000, meteoFirst.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
441         Assertions.assertEquals(0.92374, meteoFirst.getPressure(), 1.0e-15);
442         Assertions.assertEquals(289.42, meteoFirst.getTemperature(), 1.0e-15);
443         Assertions.assertEquals(28.1, meteoFirst.getHumidity(), 1.0e-15);
444 
445         // Range data
446         Assertions.assertEquals(4, block.getRangeData().size());
447         final RangeMeasurement range = block.getRangeData().get(0);
448         Assertions.assertEquals(14487.343206247217, range.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
449         Assertions.assertEquals(0.003603959600, range.getTimeOfFlight(), 1.0e-15);
450         Assertions.assertEquals(2, range.getEpochEvent());
451 
452         // Angles data
453         Assertions.assertEquals(4, block.getAnglesData().size());
454         final AnglesMeasurement angles = block.getAnglesData().get(0);
455         Assertions.assertEquals(14343.574333000000, angles.getDate().getComponents(parser.getTimeScale()).getTime().getSecondsInLocalDay(), 1.0e-15);
456         Assertions.assertEquals(FastMath.toRadians(215.000000), angles.getAzimuth(), 1.0e-15);
457         Assertions.assertEquals(FastMath.toRadians(15.000010), angles.getElevation(), 1.0e-15);
458         Assertions.assertEquals(0, angles.getDirectionFlag());
459         Assertions.assertEquals(2, angles.getOriginIndicator());
460         Assertions.assertFalse(angles.isRefractionCorrected());
461         Assertions.assertEquals(Double.NaN, angles.getAzimuthRate(), 1.0e-15);
462         Assertions.assertEquals(Double.NaN, angles.getElevationRate(), 1.0e-15);
463 
464     }
465 
466     @Test
467     public void testAllFields() throws URISyntaxException, IOException {
468 
469         final String ex = "/ilrs/crd_all_fields.frd";
470 
471         final CRD file = new CRDParser().parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
472 
473         final CRDDataBlock block = file.getDataBlocks().get(0);
474         Assertions.assertEquals(0, file.getComments().size());
475         Assertions.assertEquals(4, block.getRangeData().size());
476         Assertions.assertEquals(4, block.getAnglesData().size());
477 
478         // Transponder
479         final TransponderConfiguration transponder = block.getConfigurationRecords().getTransponderRecord();
480         Assertions.assertEquals("id", transponder.getTransponderId());
481         Assertions.assertEquals(0.0, transponder.getStationUTCOffset(), 1.0e-15);
482         Assertions.assertEquals(0.0, transponder.getStationOscDrift(), 1.0e-15);
483         Assertions.assertEquals(0.0, transponder.getTranspUTCOffset(), 1.0e-15);
484         Assertions.assertEquals(0.0, transponder.getTranspOscDrift(), 1.0e-15);
485         Assertions.assertEquals(0.0, transponder.getTranspClkRefTime(), 1.0e-15);
486         Assertions.assertEquals(0, transponder.getSpacecraftClockAndDriftApplied());
487         Assertions.assertEquals(0, transponder.getStationClockAndDriftApplied());
488         Assertions.assertFalse(transponder.isSpacecraftTimeSimplified());
489     }
490 
491     @Test
492     public void testMeteorologicalData() {
493 
494         // Initialise an empty data block
495         final CRDDataBlock block = new CRDDataBlock();
496 
497         // Verify null object
498         Assertions.assertNull(block.getMeteoData().getMeteo(AbsoluteDate.J2000_EPOCH));
499 
500         // Add a meteorological data entry
501         final AbsoluteDate date = new AbsoluteDate("2020-10-29T11:40:00.000", TimeScalesFactory.getUTC());
502         final MeteorologicalMeasurement meteoData1 = new MeteorologicalMeasurement(date, 1013.0, 273.0, 50.0);
503         block.addMeteoData(meteoData1);
504 
505         // Verify values
506         MeteorologicalMeasurement data1 = block.getMeteoData().getMeteo(AbsoluteDate.J2000_EPOCH);
507         Assertions.assertEquals(meteoData1.getPressure(),    data1.getPressure(),    1.0e-15);
508         Assertions.assertEquals(meteoData1.getTemperature(), data1.getTemperature(), 1.0e-15);
509         Assertions.assertEquals(meteoData1.getHumidity(),    data1.getHumidity(),    1.0e-15);
510         data1 = block.getMeteoData().getMeteo(date);
511         Assertions.assertEquals(meteoData1.getPressure(),    data1.getPressure(),    1.0e-15);
512         Assertions.assertEquals(meteoData1.getTemperature(), data1.getTemperature(), 1.0e-15);
513         Assertions.assertEquals(meteoData1.getHumidity(),    data1.getHumidity(),    1.0e-15);
514         data1 = block.getMeteoData().getMeteo(date.shiftedBy(60.0));
515         Assertions.assertEquals(meteoData1.getPressure(),    data1.getPressure(),    1.0e-15);
516         Assertions.assertEquals(meteoData1.getTemperature(), data1.getTemperature(), 1.0e-15);
517         Assertions.assertEquals(meteoData1.getHumidity(),    data1.getHumidity(),    1.0e-15);
518 
519         // Add another meteorological data entry
520         final MeteorologicalMeasurement meteoData2 = new MeteorologicalMeasurement(date.shiftedBy(60.0), 1015.0, 275.0, 70.0);
521         block.addMeteoData(meteoData2);
522 
523         // Verify values
524         MeteorologicalMeasurement data2 = block.getMeteoData().getMeteo(AbsoluteDate.J2000_EPOCH); // before first data
525         Assertions.assertEquals(meteoData1.getPressure(),    data2.getPressure(),    1.0e-15);
526         Assertions.assertEquals(meteoData1.getTemperature(), data2.getTemperature(), 1.0e-15);
527         Assertions.assertEquals(meteoData1.getHumidity(),    data2.getHumidity(),    1.0e-15);
528         data2 = block.getMeteoData().getMeteo(date.shiftedBy(180.0)); // After second data
529         Assertions.assertEquals(meteoData2.getPressure(),    data2.getPressure(),    1.0e-15);
530         Assertions.assertEquals(meteoData2.getTemperature(), data2.getTemperature(), 1.0e-15);
531         Assertions.assertEquals(meteoData2.getHumidity(),    data2.getHumidity(),    1.0e-15);
532         data2 = block.getMeteoData().getMeteo(date.shiftedBy(30.0)); // between first and second datta
533         Assertions.assertEquals(1014.0,                      data2.getPressure(),    1.0e-15);
534         Assertions.assertEquals(274.0,                       data2.getTemperature(), 1.0e-15);
535         Assertions.assertEquals(60.0,                        data2.getHumidity(),    1.0e-15);
536 
537     }
538 
539     @Test
540     public void testIssue801() throws URISyntaxException, IOException {
541 
542         final String ex = "/ilrs/crd_all_fields.frd";
543 
544         final CRD file = new CRDParser().parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
545 
546         final CRDDataBlock block = file.getDataBlocks().get(0);
547         Assertions.assertEquals(0, file.getComments().size());
548         Assertions.assertEquals(4, block.getRangeData().size());
549         Assertions.assertEquals(4, block.getAnglesData().size());
550 
551         final Meteo meteo = block.getMeteoData();
552         final List<MeteorologicalMeasurement> data = meteo.getData();
553         Assertions.assertEquals(1, data.size());
554 
555         final MeteorologicalMeasurement measurement = data.get(0);
556         Assertions.assertEquals(0.92374, measurement.getPressure(),    0.00001);
557         Assertions.assertEquals(289.42,  measurement.getTemperature(), 0.01);
558         Assertions.assertEquals(28.1,    measurement.getHumidity(),    0.01);
559 
560     }
561 
562     @Test
563     public void testIssue847() throws IOException {
564 
565         // Read the file
566         final String ex = "/ilrs/lageos1-test.npt";
567         final CRD file = new CRDParser().parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
568 
569         // Verify
570         Assertions.assertEquals(6, file.getComments().size());
571         Assertions.assertEquals("New CFD in the STOP channel", file.getComments().get(0));
572         Assertions.assertEquals("No CFD in the START channel", file.getComments().get(1));
573         Assertions.assertEquals("New experimental detector (transistor) in the START channel**", file.getComments().get(2));
574         Assertions.assertEquals("New CFD in the STOP channel", file.getComments().get(3));
575         Assertions.assertEquals("No CFD in the START channel", file.getComments().get(4));
576         Assertions.assertEquals("New experimental detector (transistor) in the START channel", file.getComments().get(5));
577     }
578 
579     @Test
580     public void testIssue886() throws IOException {
581         final String ex = "/ilrs/glonass125_trunc.frd";
582         final CRD file = new CRDParser().parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
583 
584         final CRDDataBlock block = file.getDataBlocks().get(0);
585         final List<RangeMeasurement> rangeBlock = block.getRangeData();
586         final RangeMeasurement rangeFirst = rangeBlock.get(0);
587         final RangeMeasurement rangeLast = rangeBlock.get(rangeBlock.size() - 1);
588 
589         DateComponents startEpoch = new DateComponents(2019, 04, 19);
590         DateComponents lastEpoch = new DateComponents(2019, 04, 20);
591         double firstSecOfDay = 77387.019063653420;
592         double lastSecOfDay = 694.119563650340;
593         final AbsoluteDate firstDate = new AbsoluteDate(startEpoch, new TimeComponents(firstSecOfDay), DataContext.getDefault().getTimeScales().getUTC());
594         final AbsoluteDate lastDate = new AbsoluteDate(lastEpoch, new TimeComponents(lastSecOfDay), DataContext.getDefault().getTimeScales().getUTC());
595 
596 
597         Assertions.assertEquals(firstDate, rangeFirst.getDate());
598         Assertions.assertEquals(lastDate, rangeLast.getDate());
599     }
600 
601     @Test
602     public void testIssue886Bis() throws IOException {
603         final String ex = "/ilrs/Rollover.frd";
604         final CRD file = new CRDParser().parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
605 
606         // Verify each block
607 
608         // Block 1
609         CRDDataBlock block = file.getDataBlocks().get(0);
610         List<RangeMeasurement> rangeBlock = block.getRangeData();
611         RangeMeasurement rangeFirst = rangeBlock.get(0);
612         RangeMeasurement rangeLast = rangeBlock.get(rangeBlock.size() - 1);
613 
614         DateComponents startEpoch = new DateComponents(2022, 6, 6);
615         DateComponents lastEpoch = new DateComponents(2022, 6, 6);
616         double firstSecOfDay = 43410.8898329;
617         double lastSecOfDay = 43444.1690476;
618         AbsoluteDate firstDate = new AbsoluteDate(startEpoch, new TimeComponents(firstSecOfDay), DataContext.getDefault().getTimeScales().getUTC());
619         AbsoluteDate lastDate = new AbsoluteDate(lastEpoch, new TimeComponents(lastSecOfDay), DataContext.getDefault().getTimeScales().getUTC());
620 
621         Assertions.assertEquals(firstDate, rangeFirst.getDate());
622         Assertions.assertEquals(lastDate, rangeLast.getDate());
623 
624         // Block 2
625         block = file.getDataBlocks().get(1);
626         rangeBlock = block.getRangeData();
627         rangeFirst = rangeBlock.get(0);
628         rangeLast = rangeBlock.get(rangeBlock.size() - 1);
629 
630         startEpoch = new DateComponents(2022, 6, 6);
631         lastEpoch = new DateComponents(2022, 6, 6);
632         firstSecOfDay = 26579.400543200001;
633         lastSecOfDay = 26618.200540700000;
634         firstDate = new AbsoluteDate(startEpoch, new TimeComponents(firstSecOfDay), DataContext.getDefault().getTimeScales().getUTC());
635         lastDate = new AbsoluteDate(lastEpoch, new TimeComponents(lastSecOfDay), DataContext.getDefault().getTimeScales().getUTC());
636 
637         Assertions.assertEquals(firstDate, rangeFirst.getDate());
638         Assertions.assertEquals(lastDate, rangeLast.getDate());
639 
640         // Block 3
641         block = file.getDataBlocks().get(2);
642         rangeBlock = block.getRangeData();
643         rangeFirst = rangeBlock.get(0);
644         rangeLast = rangeBlock.get(rangeBlock.size() - 1);
645 
646         startEpoch = new DateComponents(2021, 1, 26);
647         lastEpoch = new DateComponents(2021, 1, 27);
648         firstSecOfDay = 86181.271863631440;
649         lastSecOfDay = 1007.946763625370;
650         firstDate = new AbsoluteDate(startEpoch, new TimeComponents(firstSecOfDay), DataContext.getDefault().getTimeScales().getUTC());
651         lastDate = new AbsoluteDate(lastEpoch, new TimeComponents(lastSecOfDay), DataContext.getDefault().getTimeScales().getUTC());
652 
653         Assertions.assertEquals(firstDate, rangeFirst.getDate());
654         Assertions.assertEquals(lastDate, rangeLast.getDate());
655 
656     }
657     
658     @Test
659     public void testIssue938() throws IOException {
660         final String ex = "/ilrs/crd201_all_samples";
661         final CRD file = new CRDParser().parse(new DataSource(ex, () -> getClass().getResourceAsStream(ex)));
662 
663         final TimeScale utc = TimeScalesFactory.getUTC();
664 
665         final double DELTA_PS = 1e-12;  // 1ps, TimeOfFlight
666         final double DELTA_TENTH_PS = 0.1e-12;  // 0.1ps, Rms, PeakMinusMean, SystemDelay, DelayShift, TroposphericRefractionCorrection
667         final double DELTA_TENTH_US = 0.1e-6;  // 0.1us, EpochDelayCorrection
668         final double DELTA_MILLI_NM = 1e-12;  // 0.001nm, Wavelength, ApplicableWavelength, PrimaryWavelength
669         final double DELTA_TENTH_MM = 1e-3;  // 0.1mm, CenterOfMassCorrection, OneWayDistance, SurveyedTargetDistance, SumOfAllConstantDelays, SurveyError
670         final double DELTA_MILLI = 1e-3;  // milli, Skew, Kurtosis
671         final double DELTA_CENTI = 1e-2;  // centi, ReturnRate, Snr
672 
673         final List<CRDDataBlock> dataBlocks = file.getDataBlocks();
674         Assertions.assertEquals(12, dataBlocks.size());
675 
676         // block0: Full rate
677         final CRDDataBlock block0 = dataBlocks.get(0);
678         final List<RangeMeasurement> b0_rangeData = block0.getRangeData();
679         final List<RangeSupplement> b0_rangeSupplementData = block0.getRangeSupplementData();
680         final List<MeteorologicalMeasurement> b0_meteorologicalMeasurementData = block0.getMeteoData().getData();
681         final List<AnglesMeasurement> b0_anglesData = block0.getAnglesData();
682         final List<Calibration> b0_calibrations = block0.getCalibrationRecords();
683 
684         Assertions.assertEquals(2, block0.getHeader().getVersion());
685         Assertions.assertEquals(3, b0_rangeData.size());
686         Assertions.assertEquals(0, block0.getHeader().getDataType());  // 0=full rate
687         Assertions.assertEquals(DataType.FULL_RATE, DataType.getDataType(block0.getHeader().getDataType()));
688         Assertions.assertInstanceOf(FrRangeMeasurement.class, b0_rangeData.get(0));
689         final FrRangeMeasurement b0_fr0 = (FrRangeMeasurement)b0_rangeData.get(0);
690         Assertions.assertEquals(0.047960587856, b0_fr0.getTimeOfFlight(), DELTA_PS);
691         Assertions.assertEquals(2, b0_fr0.getEpochEvent());
692         Assertions.assertEquals(Double.NaN, b0_fr0.getSnr(), DELTA_CENTI);
693         Assertions.assertEquals("2006-11-13T15:23:52.0414338", b0_fr0.getDate().toStringWithoutUtcOffset(utc, 7));
694         Assertions.assertEquals("std1", b0_fr0.getSystemConfigurationId());
695         Assertions.assertEquals(0, b0_fr0.getFilterFlag());
696         Assertions.assertEquals(0, b0_fr0.getDetectorChannel());
697         Assertions.assertEquals(0, b0_fr0.getStopNumber());
698         Assertions.assertEquals(-1, b0_fr0.getReceiveAmplitude());
699         Assertions.assertEquals(-1, b0_fr0.getTransmitAmplitude());
700         Assertions.assertEquals("10 55432.041433800000     0.047960587856 std1 2 0 0 0    na    na", b0_fr0.toCrdString());
701 
702         final RangeSupplement b0_rangeSupplement1 = b0_rangeSupplementData.get(1);
703         Assertions.assertEquals(3, b0_rangeSupplementData.size());
704         Assertions.assertEquals("2006-11-13T15:23:55.6429746", b0_rangeSupplement1.getDate().toStringWithoutUtcOffset(utc, 7));
705         Assertions.assertEquals("std1", b0_rangeSupplement1.getSystemConfigurationId());
706         Assertions.assertEquals(20697.0e-12, b0_rangeSupplement1.getTroposphericRefractionCorrection(), DELTA_TENTH_PS);
707         Assertions.assertEquals(1601.0000, b0_rangeSupplement1.getCenterOfMassCorrection(), DELTA_TENTH_MM);
708         Assertions.assertEquals(0.00, b0_rangeSupplement1.getNdFilterValue(), DELTA_CENTI);
709         Assertions.assertEquals(0.0000, b0_rangeSupplement1.getTimeBiasApplied(), 0.1e-4);
710         Assertions.assertEquals(0.0, b0_rangeSupplement1.getRangeRate(), DELTA_MILLI);
711         Assertions.assertEquals("12 55435.642974600000 std1 20697.0 1601.0000  0.00   0.0000 0.000000", b0_rangeSupplement1.toCrdString());
712 
713         final MeteorologicalMeasurement b0_meteorologicalMeasurement0 = b0_meteorologicalMeasurementData.get(0);
714         Assertions.assertEquals(1, b0_meteorologicalMeasurementData.size());
715         Assertions.assertEquals("2006-11-13T15:23:52.0414338", b0_meteorologicalMeasurement0.getDate().toStringWithoutUtcOffset(utc, 7));
716         Assertions.assertEquals(801.80e-3, b0_meteorologicalMeasurement0.getPressure(), 0.01e-3);
717         Assertions.assertEquals(301.36, b0_meteorologicalMeasurement0.getTemperature(), DELTA_CENTI);
718         Assertions.assertEquals(39, b0_meteorologicalMeasurement0.getHumidity(), 1);
719         Assertions.assertEquals(0, b0_meteorologicalMeasurement0.getOriginOfValues());
720         Assertions.assertEquals("20 55432.041  801.80 301.36   39 0", b0_meteorologicalMeasurement0.toCrdString());
721 
722         final AnglesMeasurement b0_angles2 = b0_anglesData.get(2);
723         Assertions.assertEquals(3, b0_anglesData.size());
724         Assertions.assertEquals("2006-11-13T15:45:35.8021609", b0_angles2.getDate().toStringWithoutUtcOffset(utc, 7));
725         Assertions.assertEquals(15.2330, FastMath.toDegrees(b0_angles2.getAzimuth()), 1e-4);
726         Assertions.assertEquals(45.7100, FastMath.toDegrees(b0_angles2.getElevation()), 1e-4);
727         Assertions.assertEquals(0, b0_angles2.getDirectionFlag());
728         Assertions.assertEquals(2, b0_angles2.getOriginIndicator());
729         Assertions.assertEquals(true, b0_angles2.isRefractionCorrected());
730         Assertions.assertEquals(Double.NaN, b0_angles2.getAzimuthRate(), 1e-6);
731         Assertions.assertEquals(Double.NaN, b0_angles2.getElevationRate(), 1e-6);
732         Assertions.assertEquals("30 56735.802  15.2330  45.7100 0 2 1        na        na", b0_angles2.toCrdString());
733 
734         final Calibration b0_calibration0 = b0_calibrations.get(0);
735         Assertions.assertEquals(1, b0_calibrations.size());
736         Assertions.assertEquals("2006-11-13T15:23:52.0414338", b0_calibration0.getDate().toStringWithoutUtcOffset(utc, 7));
737         Assertions.assertEquals(0, b0_calibration0.getTypeOfData());
738         Assertions.assertEquals("std1", b0_calibration0.getSystemConfigurationId());
739         Assertions.assertEquals(-1, b0_calibration0.getNumberOfPointsRecorded());
740         Assertions.assertEquals(-1, b0_calibration0.getNumberOfPointsUsed());
741         Assertions.assertEquals(0.000, b0_calibration0.getOneWayDistance(), DELTA_TENTH_MM);
742         Assertions.assertEquals(-913.0e-12, b0_calibration0.getSystemDelay(), DELTA_TENTH_PS);
743         Assertions.assertEquals(0.0, b0_calibration0.getDelayShift(), DELTA_TENTH_PS);
744         Assertions.assertEquals(56.0e-12, b0_calibration0.getRms(), DELTA_TENTH_PS);
745         Assertions.assertEquals(Double.NaN, b0_calibration0.getSkew(), DELTA_MILLI);
746         Assertions.assertEquals(Double.NaN, b0_calibration0.getKurtosis(), DELTA_MILLI);
747         Assertions.assertEquals(Double.NaN, b0_calibration0.getPeakMinusMean(), DELTA_TENTH_PS);
748         Assertions.assertEquals(3, b0_calibration0.getTypeIndicator());
749         Assertions.assertEquals(3, b0_calibration0.getShiftTypeIndicator());
750         Assertions.assertEquals(0, b0_calibration0.getDetectorChannel());
751         Assertions.assertEquals(4, b0_calibration0.getSpan());
752         Assertions.assertEquals(Double.NaN, b0_calibration0.getReturnRate(), DELTA_CENTI);
753         Assertions.assertEquals("40 55432.041433800000 0 std1       na       na   0.0000     -913.0      0.0   56.0     na     na    na 3 3 0 4   na", 
754                 b0_calibration0.toCrdString());
755 
756         // There is no SessionStatisticsRecord.
757         Assertions.assertEquals(true, block0.getSessionStatisticsData().isEmpty());
758         Assertions.assertEquals(null, block0.getSessionStatisticsRecord());
759 
760         // block1: Normal Point
761         final CRDDataBlock block1 = dataBlocks.get(1);
762         final List<RangeMeasurement> b1_rangeData = block1.getRangeData();
763         Assertions.assertEquals(2, block1.getHeader().getVersion());
764         Assertions.assertEquals(8, b1_rangeData.size());
765         Assertions.assertEquals(1, block1.getHeader().getDataType());  // 1=normal point
766         Assertions.assertEquals(DataType.NORMAL_POINT, DataType.getDataType(block1.getHeader().getDataType()));
767         Assertions.assertInstanceOf(NptRangeMeasurement.class, b1_rangeData.get(0));
768         final NptRangeMeasurement b1_npt3 = (NptRangeMeasurement)b1_rangeData.get(3);
769         Assertions.assertEquals(0.044605221903, b1_npt3.getTimeOfFlight(), DELTA_PS);
770         Assertions.assertEquals(2, b1_npt3.getEpochEvent());
771         Assertions.assertEquals(0.0, b1_npt3.getSnr(), DELTA_CENTI);
772         Assertions.assertEquals("2006-11-13T15:37:03.2817254", b1_npt3.getDate().toStringWithoutUtcOffset(utc, 7));
773         Assertions.assertEquals("std1", b1_npt3.getSystemConfigurationId());
774         Assertions.assertEquals(120, b1_npt3.getWindowLength(), 1e-15);
775         Assertions.assertEquals(25, b1_npt3.getNumberOfRawRanges());
776         Assertions.assertEquals(87.0e-12, b1_npt3.getBinRms(), DELTA_TENTH_PS);
777         Assertions.assertEquals(Double.NaN, b1_npt3.getBinSkew(), DELTA_MILLI);
778         Assertions.assertEquals(Double.NaN, b1_npt3.getBinKurtosis(), DELTA_MILLI);
779         Assertions.assertEquals(Double.NaN, b1_npt3.getBinPeakMinusMean(), DELTA_TENTH_PS);
780         Assertions.assertEquals(0.0, b1_npt3.getReturnRate(), DELTA_CENTI);
781         Assertions.assertEquals(0, b1_npt3.getDetectorChannel());
782         Assertions.assertEquals("11 56223.281725400000     0.044605221903 std1 2  120.0     25      87.0     na     na       na  0.00 0   0.0", 
783                 b1_npt3.toCrdString());
784 
785         final SessionStatistics b1_sessionStatistics = block1.getSessionStatisticsRecord();
786         Assertions.assertEquals("std1", b1_sessionStatistics.getSystemConfigurationId());
787         Assertions.assertEquals(86.0e-12, b1_sessionStatistics.getRms(), DELTA_TENTH_PS);
788         Assertions.assertEquals(Double.NaN, b1_sessionStatistics.getSkewness(), DELTA_MILLI);
789         Assertions.assertEquals(Double.NaN, b1_sessionStatistics.getKurtosis(), DELTA_MILLI);
790         Assertions.assertEquals(Double.NaN, b1_sessionStatistics.getPeakMinusMean(), DELTA_TENTH_PS);
791         Assertions.assertEquals(0, b1_sessionStatistics.getDataQulityIndicator());
792         Assertions.assertEquals("50 std1   86.0     na     na    na 0", b1_sessionStatistics.toCrdString());
793 
794         final List<MeteorologicalMeasurement> b1_meteorologicalMeasurementData = block1.getMeteoData().getData();
795         Assertions.assertEquals(5, b1_meteorologicalMeasurementData.size());
796 
797         // There is only one SessionStatisticsRecord related to "std1".
798         Assertions.assertEquals(null, block1.getSessionStatisticsRecord("std2"));
799 
800         // block2: Sampled Engineering (Quicklook)
801         final CRDDataBlock block2 = dataBlocks.get(2);
802         Assertions.assertEquals(2, block2.getHeader().getDataType());  // 2=sampled engineering
803         Assertions.assertEquals(DataType.SAMPLED_ENGIEERING, DataType.getDataType(block2.getHeader().getDataType()));
804         // There is no CalibrationRecords.
805         Assertions.assertEquals(true, block2.getCalibrationData().isEmpty());
806         Assertions.assertEquals(null, block2.getCalibrationRecords());
807         
808         // block3: Sample 2-Color Normal Point file
809         final CRDDataBlock block3 = dataBlocks.get(3);
810         final CRDConfiguration b3_config = block3.getConfigurationRecords();
811         final List<SystemConfiguration> b3_systemConfigurations = b3_config.getSystemConfigurationRecords();
812         Assertions.assertEquals(2, b3_systemConfigurations.size());
813         Assertions.assertSame(b3_config.getSystemRecord(), b3_config.getSystemRecord(null));
814         final Set<String> b3_config_systemIds = b3_config.getSystemConfigurationIds();
815         Assertions.assertEquals(2, b3_config_systemIds.size());
816         final String b3_systemConfigId_std1 = "std1";
817         final String b3_systemConfigId_std2 = "std2";
818         Assertions.assertEquals(true, b3_config_systemIds.contains(b3_systemConfigId_std1) && b3_config_systemIds.contains(b3_systemConfigId_std2));
819         final SystemConfiguration b3_systemConfig_std1 = b3_config.getSystemRecord(b3_systemConfigId_std1);
820         final SystemConfiguration b3_systemConfig_std2 = b3_config.getSystemRecord(b3_systemConfigId_std2);
821         Assertions.assertEquals(846.000e-9, b3_systemConfig_std1.getWavelength(), DELTA_MILLI_NM);
822         Assertions.assertEquals(423.000e-9, b3_systemConfig_std2.getWavelength(), DELTA_MILLI_NM);
823         
824         final List<Calibration> b3_calibrations_std1 = block3.getCalibrationRecords(b3_systemConfigId_std1);
825         final List<Calibration> b3_calibrations_std2 = block3.getCalibrationRecords(b3_systemConfigId_std2);
826         Assertions.assertEquals(1, b3_calibrations_std1.size());
827         Assertions.assertEquals(0, b3_calibrations_std2.size());
828 
829         final List<SessionStatistics> b3_sessionStatisticsData = block3.getSessionStatisticsData();
830         Assertions.assertEquals(2, b3_sessionStatisticsData.size());
831         
832         final SessionStatistics b3_sessionStatistics_std1 = block3.getSessionStatisticsRecord(b3_systemConfigId_std1);
833         final SessionStatistics b3_sessionStatistics_std2 = block3.getSessionStatisticsRecord(b3_systemConfigId_std2);
834         Assertions.assertEquals(165.0e-12, b3_sessionStatistics_std1.getRms(), DELTA_TENTH_PS);
835         Assertions.assertEquals(78.0e-12, b3_sessionStatistics_std2.getRms(), DELTA_TENTH_PS);
836 
837         final List<RangeMeasurement> b3_rangeData = block3.getRangeData();
838         Assertions.assertEquals(20, b3_rangeData.size());
839         final NptRangeMeasurement b3_npt3 = (NptRangeMeasurement)b3_rangeData.get(3);
840         Assertions.assertEquals(0.050886342010, b3_npt3.getTimeOfFlight(), DELTA_PS);
841         Assertions.assertEquals(2, b3_npt3.getEpochEvent());
842         Assertions.assertEquals(0.0, b3_npt3.getSnr(), DELTA_CENTI);
843         Assertions.assertEquals("2006-12-30T07:36:13.1080893", b3_npt3.getDate().toStringWithoutUtcOffset(utc, 7));
844         Assertions.assertEquals("std1", b3_npt3.getSystemConfigurationId());
845         Assertions.assertEquals(120, b3_npt3.getWindowLength(), 1e-15);
846         Assertions.assertEquals(17, b3_npt3.getNumberOfRawRanges());
847         Assertions.assertEquals(158.0e-12, b3_npt3.getBinRms(), DELTA_TENTH_PS);
848         Assertions.assertEquals(Double.NaN, b3_npt3.getBinSkew(),DELTA_MILLI);
849         Assertions.assertEquals(Double.NaN, b3_npt3.getBinKurtosis(), DELTA_MILLI);
850         Assertions.assertEquals(Double.NaN, b3_npt3.getBinPeakMinusMean(), DELTA_TENTH_PS);
851         Assertions.assertEquals(0.0, b3_npt3.getReturnRate(), DELTA_CENTI);
852         Assertions.assertEquals(0, b3_npt3.getDetectorChannel());
853         Assertions.assertEquals("11 27373.108089300000     0.050886342010 std1 2  120.0     17     158.0     na     na       na  0.00 0   0.0", 
854                 b3_npt3.toCrdString());
855         final NptRangeMeasurement b3_npt5 = (NptRangeMeasurement)b3_rangeData.get(5);
856         Assertions.assertEquals(0.042208378233, b3_npt5.getTimeOfFlight(), DELTA_PS);
857         Assertions.assertEquals(2, b3_npt5.getEpochEvent());
858         Assertions.assertEquals(0.0, b3_npt5.getSnr(), DELTA_CENTI);
859         Assertions.assertEquals("2006-12-30T07:46:48.7080899", b3_npt5.getDate().toStringWithoutUtcOffset(utc, 7));
860         Assertions.assertEquals("std2", b3_npt5.getSystemConfigurationId());
861         Assertions.assertEquals(120, b3_npt5.getWindowLength(), 1e-15);
862         Assertions.assertEquals(85, b3_npt5.getNumberOfRawRanges());
863         Assertions.assertEquals(71.0e-12, b3_npt5.getBinRms(), DELTA_TENTH_PS);
864         Assertions.assertEquals(Double.NaN, b3_npt5.getBinSkew(), DELTA_MILLI);
865         Assertions.assertEquals(Double.NaN, b3_npt5.getBinKurtosis(), DELTA_MILLI);
866         Assertions.assertEquals(Double.NaN, b3_npt5.getBinPeakMinusMean(), DELTA_TENTH_PS);
867         Assertions.assertEquals(0.0, b3_npt5.getReturnRate(), DELTA_CENTI);
868         Assertions.assertEquals(0, b3_npt5.getDetectorChannel());
869         Assertions.assertEquals("11 28008.708089900000     0.042208378233 std2 2  120.0     85      71.0     na     na       na  0.00 0   0.0", 
870                 b3_npt5.toCrdString());
871 
872         Assertions.assertEquals(846.000e-9, 
873                 block3.getConfigurationRecords().getSystemRecord(b3_npt3.getSystemConfigurationId()).getWavelength(),
874                 DELTA_MILLI_NM);
875         Assertions.assertEquals(846.000e-9, block3.getWavelength(b3_npt3), DELTA_MILLI_NM);
876         Assertions.assertEquals(423.000e-9, 
877                 block3.getConfigurationRecords().getSystemRecord(b3_npt5.getSystemConfigurationId()).getWavelength(),
878                 DELTA_MILLI_NM);
879         Assertions.assertEquals(423.000e-9, block3.getWavelength(b3_npt5), DELTA_MILLI_NM);
880 
881         // block4: Sample showing all current record types
882         final CRDDataBlock block4 = dataBlocks.get(4);
883         final CRDConfiguration b4_config = block4.getConfigurationRecords();
884         final SystemConfiguration b4_systemConfig = b4_config.getSystemRecord();
885         final LaserConfiguration b4_laserConfig = b4_config.getLaserRecord();
886         final DetectorConfiguration b4_detectorConfig = b4_config.getDetectorRecord();
887         final TimingSystemConfiguration b4_timingConfig = b4_config.getTimingRecord();
888         final SoftwareConfiguration b4_softwareConfig = b4_config.getSoftwareRecord();
889         final MeteorologicalConfiguration b4_meteorologicalConfig = b4_config.getMeteorologicalRecord();
890         final TransponderConfiguration b4_transponderConfig = b4_config.getTransponderRecord();
891 
892         Assertions.assertEquals(6, b4_config.getConfigurationRecordMap().size());
893         Assertions.assertInstanceOf(LaserConfiguration.class, b4_config.getConfigurationRecord("ml1"));
894 
895         Assertions.assertEquals(532.000e-9, b4_systemConfig.getWavelength(), DELTA_MILLI_NM);
896         Assertions.assertEquals("std", b4_systemConfig.getSystemId());
897         Assertions.assertEquals("[ml1, mcp, mt1, swv, met]", b4_systemConfig.getComponents().toString());
898         Assertions.assertEquals("C0 0    532.000 std ml1 mcp mt1 swv met", b4_systemConfig.toCrdString());
899 
900         Assertions.assertEquals("ml1", b4_laserConfig.getLaserId());
901         Assertions.assertEquals("Nd-Yag", b4_laserConfig.getLaserType());
902         Assertions.assertEquals(1064.00e-9, b4_laserConfig.getPrimaryWavelength(), DELTA_MILLI_NM);
903         Assertions.assertEquals(10.00, b4_laserConfig.getNominalFireRate(), DELTA_CENTI);
904         Assertions.assertEquals(100.00, b4_laserConfig.getPulseEnergy(), DELTA_CENTI);
905         Assertions.assertEquals(200.0, b4_laserConfig.getPulseWidth(), DELTA_CENTI);
906         Assertions.assertEquals(Double.NaN, b4_laserConfig.getBeamDivergence(), DELTA_CENTI);
907         Assertions.assertEquals(1, b4_laserConfig.getPulseInOutgoingSemiTrain());
908         Assertions.assertEquals("C1 0 ml1 Nd-Yag 1064.00 10.00 100.00 200.0 na 1", b4_laserConfig.toCrdString());
909 
910         Assertions.assertEquals("mcp", b4_detectorConfig.getDetectorId());
911         Assertions.assertEquals("mcp", b4_detectorConfig.getDetectorType());
912         Assertions.assertEquals(532.00e-9, b4_detectorConfig.getApplicableWavelength(), DELTA_MILLI_NM);
913         Assertions.assertEquals(Double.NaN, b4_detectorConfig.getQuantumEfficiency(), DELTA_CENTI);
914         Assertions.assertEquals(3800.0, b4_detectorConfig.getAppliedVoltage(), DELTA_CENTI);
915         Assertions.assertEquals(0.0, b4_detectorConfig.getDarkCount(), 0.1e3);
916         Assertions.assertEquals("unknown", b4_detectorConfig.getOutputPulseType());
917         Assertions.assertEquals(Double.NaN, b4_detectorConfig.getOutputPulseWidth(), DELTA_CENTI);
918         Assertions.assertEquals(0.0, b4_detectorConfig.getSpectralFilter(), 0.1e-9);
919         Assertions.assertEquals(Double.NaN, b4_detectorConfig.getTransmissionOfSpectralFilter());
920         Assertions.assertEquals(0.0, b4_detectorConfig.getSpatialFilter(), 0.1);
921         Assertions.assertEquals("none", b4_detectorConfig.getExternalSignalProcessing());
922         Assertions.assertEquals(5.0, b4_detectorConfig.getAmplifierGain(), 0.1);
923         Assertions.assertEquals(10.0e3, b4_detectorConfig.getAmplifierBandwidth(), 0.1e3);
924         Assertions.assertEquals("1", b4_detectorConfig.getAmplifierInUse());
925         Assertions.assertEquals("C2 0 mcp mcp 532.000 na 3800.0 0.0 unknown na 0.00 na 0.0 none 5.0 10.0 1", b4_detectorConfig.toCrdString());
926 
927         Assertions.assertEquals("mt1", b4_timingConfig.getLocalTimingId());
928         Assertions.assertEquals("TAC", b4_timingConfig.getTimeSource());
929         Assertions.assertEquals("TAC", b4_timingConfig.getFrequencySource());
930         Assertions.assertEquals("MLRS_CMOS_TMRB_TD811", b4_timingConfig.getTimer());
931         Assertions.assertEquals("na", b4_timingConfig.getTimerSerialNumber());
932         Assertions.assertEquals(445.9e-6, b4_timingConfig.getEpochDelayCorrection(), DELTA_TENTH_US);
933         Assertions.assertEquals("C3 0 mt1 TAC TAC MLRS_CMOS_TMRB_TD811 na 445.9", b4_timingConfig.toCrdString());
934 
935         Assertions.assertEquals("swv", b4_softwareConfig.getConfigurationId());
936         Assertions.assertEquals("swv", b4_softwareConfig.getSoftwareId());
937         Assertions.assertEquals("[Monitor, Sattrk]", Arrays.toString(b4_softwareConfig.getTrackingSoftwares()));
938         Assertions.assertEquals("[2.000Bm, 2.00Cm]", Arrays.toString(b4_softwareConfig.getTrackingSoftwareVersions()));
939         Assertions.assertEquals("[conpro, crd_cal, PoissonCRD, gnp]", Arrays.toString(b4_softwareConfig.getProcessingSoftwares()));
940         Assertions.assertEquals("[2.4a, 1.7, 2.2a, CM-2.01a]", Arrays.toString(b4_softwareConfig.getProcessingSoftwareVersions()));
941         Assertions.assertEquals("C5 0 swv Monitor,Sattrk 2.000Bm,2.00Cm conpro,crd_cal,PoissonCRD,gnp 2.4a,1.7,2.2a,CM-2.01a", b4_softwareConfig.toCrdString());
942 
943         Assertions.assertEquals("met", b4_meteorologicalConfig.getConfigurationId());
944         Assertions.assertEquals("met", b4_meteorologicalConfig.getMeteorologicalId());
945         Assertions.assertEquals("Paroscientific", b4_meteorologicalConfig.getPressSensorManufacturer());
946         Assertions.assertEquals("Met4", b4_meteorologicalConfig.getPressSensorModel());
947         Assertions.assertEquals("123456", b4_meteorologicalConfig.getPressSensorSerialNumber());
948         Assertions.assertEquals("Paroscientific", b4_meteorologicalConfig.getTempSensorManufacturer());
949         Assertions.assertEquals("Met4", b4_meteorologicalConfig.getTempSensorModel());
950         Assertions.assertEquals("123456", b4_meteorologicalConfig.getTempSensorSerialNumber());
951         Assertions.assertEquals("Paroscientific", b4_meteorologicalConfig.getHumiSensorManufacturer());
952         Assertions.assertEquals("Met4", b4_meteorologicalConfig.getHumiSensorModel());
953         Assertions.assertEquals("123456", b4_meteorologicalConfig.getHumiSensorSerialNumber());
954         Assertions.assertEquals("C6 0 met Paroscientific Met4 123456 Paroscientific Met4 123456 Paroscientific Met4 123456", b4_meteorologicalConfig.toCrdString());
955 
956         final SessionStatistics b4_sessionStatistics = block4.getSessionStatisticsRecord();
957         Assertions.assertEquals("std", b4_sessionStatistics.getSystemConfigurationId());
958         Assertions.assertEquals(72.7e-12, b4_sessionStatistics.getRms(), DELTA_TENTH_PS);
959         Assertions.assertEquals(1.494, b4_sessionStatistics.getSkewness(), DELTA_MILLI);
960         Assertions.assertEquals(-0.536, b4_sessionStatistics.getKurtosis(), DELTA_MILLI);
961         Assertions.assertEquals(-32.4e-12, b4_sessionStatistics.getPeakMinusMean(), DELTA_TENTH_PS);
962         Assertions.assertEquals(0, b4_sessionStatistics.getDataQulityIndicator());
963         Assertions.assertEquals("50  std   72.7   1.494  -0.536  -32.4 0", b4_sessionStatistics.toCrdString());
964 
965         Assertions.assertEquals(null, b4_transponderConfig);
966 
967         Assertions.assertEquals(false, b4_systemConfig.equals(null));
968         Assertions.assertEquals(true, b4_systemConfig.equals(b4_systemConfig));
969         Assertions.assertEquals(-766950339, b4_systemConfig.hashCode());
970         Assertions.assertEquals(false, b4_systemConfig.equals(b3_systemConfig_std1));
971         final SystemConfiguration b4_systemConfig_new = new SystemConfiguration();
972         b4_systemConfig_new.setSystemId(b4_systemConfig.getConfigurationId());
973         b4_systemConfig_new.setWavelength(b4_systemConfig.getWavelength());
974         String[] components = new String[b4_systemConfig.getComponents().size()];
975         b4_systemConfig_new.setComponents(b4_systemConfig.getComponents().toArray(components));
976         Assertions.assertEquals(true, b4_systemConfig.equals(b4_systemConfig_new));
977 
978         // block5: c4
979         final CRDDataBlock block5 = dataBlocks.get(5);
980         final TransponderConfiguration b5_transponderConfig = block5.getConfigurationRecords().getTransponderRecord();
981         Assertions.assertEquals("C4 0 mc1 0.000 0.00 1234567890123456.800 0.00 0.000000000000 0 0 0", b5_transponderConfig.toCrdString());
982 
983         // block9: real npt, rollover
984         final CRDDataBlock block9 = dataBlocks.get(9);
985         Assertions.assertEquals(1, block9.getHeader().getVersion());
986         final List<RangeMeasurement> b9_rangeData = block9.getRangeData();
987         Assertions.assertEquals(10, b9_rangeData.size());
988         final NptRangeMeasurement b9_npt7 = (NptRangeMeasurement)b9_rangeData.get(7);
989         Assertions.assertEquals(0.049383687622, b9_npt7.getTimeOfFlight(), DELTA_PS);
990         Assertions.assertEquals(2, b9_npt7.getEpochEvent());
991         Assertions.assertEquals(Double.NaN, b9_npt7.getSnr(), DELTA_CENTI);
992         Assertions.assertEquals("2022-03-25T23:59:06.0200637", b9_npt7.getDate().toStringWithoutUtcOffset(utc, 7));
993         Assertions.assertEquals("0902", b9_npt7.getSystemConfigurationId());
994         Assertions.assertEquals(120, b9_npt7.getWindowLength(), 1e-15);
995         Assertions.assertEquals(1516, b9_npt7.getNumberOfRawRanges());
996         Assertions.assertEquals(34.4e-12, b9_npt7.getBinRms(), DELTA_TENTH_PS);
997         Assertions.assertEquals(-0.017, b9_npt7.getBinSkew(),DELTA_MILLI);
998         Assertions.assertEquals(-1.038, b9_npt7.getBinKurtosis(), DELTA_MILLI);
999         Assertions.assertEquals(11.4e-12, b9_npt7.getBinPeakMinusMean(), DELTA_TENTH_PS);
1000         Assertions.assertEquals(0.6, b9_npt7.getReturnRate(), DELTA_CENTI);
1001         Assertions.assertEquals(0, b9_npt7.getDetectorChannel());
1002         Assertions.assertEquals("11 86346.020063735530     0.049383687622 0902 2  120.0   1516      34.4  -0.017  -1.038      11.4  0.60 0   na", 
1003                 b9_npt7.toCrdString());
1004         final NptRangeMeasurement b9_npt8 = (NptRangeMeasurement)b9_rangeData.get(8);
1005         Assertions.assertEquals(0.056059159587, b9_npt8.getTimeOfFlight(), DELTA_PS);
1006         Assertions.assertEquals(2, b9_npt8.getEpochEvent());
1007         Assertions.assertEquals(Double.NaN, b9_npt8.getSnr(), DELTA_CENTI);
1008         Assertions.assertEquals("2022-03-26T00:05:45.6451637", b9_npt8.getDate().toStringWithoutUtcOffset(utc, 7));
1009         Assertions.assertEquals("0902", b9_npt8.getSystemConfigurationId());
1010         Assertions.assertEquals(120, b9_npt8.getWindowLength(), 1e-15);
1011         Assertions.assertEquals(525, b9_npt8.getNumberOfRawRanges());
1012         Assertions.assertEquals(33.7e-12, b9_npt8.getBinRms(), DELTA_TENTH_PS);
1013         Assertions.assertEquals(0.023, b9_npt8.getBinSkew(),DELTA_MILLI);
1014         Assertions.assertEquals(-0.939, b9_npt8.getBinKurtosis(), DELTA_MILLI);
1015         Assertions.assertEquals(12.9e-12, b9_npt8.getBinPeakMinusMean(), DELTA_TENTH_PS);
1016         Assertions.assertEquals(0.2, b9_npt8.getReturnRate(), DELTA_CENTI);
1017         Assertions.assertEquals(0, b9_npt8.getDetectorChannel());
1018         Assertions.assertEquals("11   345.645163732581     0.056059159587 0902 2  120.0    525      33.7   0.023  -0.939      12.9  0.20 0   na", 
1019                 b9_npt8.toCrdString());
1020 
1021         final MeteorologicalMeasurement b9_meteorologicalMeasurement1 = block9.getMeteoData().getData().get(1);
1022         Assertions.assertEquals("2022-03-26T00:06:50.0000000", b9_meteorologicalMeasurement1.getDate().toStringWithoutUtcOffset(utc, 7));
1023         Assertions.assertEquals(969.45e-3, b9_meteorologicalMeasurement1.getPressure(), 0.01e-3);
1024         Assertions.assertEquals(283.15, b9_meteorologicalMeasurement1.getTemperature(), DELTA_CENTI);
1025         Assertions.assertEquals(37.5, b9_meteorologicalMeasurement1.getHumidity(), 1);
1026         Assertions.assertEquals(1, b9_meteorologicalMeasurement1.getOriginOfValues());
1027         Assertions.assertEquals("20   410.000  969.45 283.15   38 1", b9_meteorologicalMeasurement1.toCrdString());
1028 
1029         final Calibration b9_calibration1 = block9.getCalibrationRecords().get(1);
1030         Assertions.assertEquals("2022-03-26T00:06:50.0000000", b9_calibration1.getDate().toStringWithoutUtcOffset(utc, 7));
1031         Assertions.assertEquals(0, b9_calibration1.getTypeOfData());
1032         Assertions.assertEquals("0902", b9_calibration1.getSystemConfigurationId());
1033         Assertions.assertEquals(10000, b9_calibration1.getNumberOfPointsRecorded());
1034         Assertions.assertEquals(8073, b9_calibration1.getNumberOfPointsUsed());
1035         Assertions.assertEquals(1.742, b9_calibration1.getOneWayDistance(), DELTA_TENTH_MM);
1036         Assertions.assertEquals(112205.4e-12, b9_calibration1.getSystemDelay(), DELTA_TENTH_PS);
1037         Assertions.assertEquals(3.8e-12, b9_calibration1.getDelayShift(), DELTA_TENTH_PS);
1038         Assertions.assertEquals(16e-12, b9_calibration1.getRms(), DELTA_TENTH_PS);
1039         Assertions.assertEquals(0.043, b9_calibration1.getSkew(), DELTA_MILLI);
1040         Assertions.assertEquals(-0.665, b9_calibration1.getKurtosis(), DELTA_MILLI);
1041         Assertions.assertEquals(-1e-12, b9_calibration1.getPeakMinusMean(), DELTA_TENTH_PS);
1042         Assertions.assertEquals(2, b9_calibration1.getTypeIndicator());
1043         Assertions.assertEquals(2, b9_calibration1.getShiftTypeIndicator());
1044         Assertions.assertEquals(0, b9_calibration1.getDetectorChannel());
1045         Assertions.assertEquals(0, b9_calibration1.getSpan());
1046         Assertions.assertEquals(Double.NaN, b9_calibration1.getReturnRate(), DELTA_CENTI);
1047         Assertions.assertEquals("40   410.000000000000 0 0902    10000     8073   1.7420   112205.4      3.8   16.0   0.043  -0.665   -1.0 2 2 0 0   na", 
1048                 b9_calibration1.toCrdString());
1049 
1050         final SessionStatistics b9_sessionStatistics = block9.getSessionStatisticsRecord();
1051         Assertions.assertEquals("0902", b9_sessionStatistics.getSystemConfigurationId());
1052         Assertions.assertEquals(34.0e-12, b9_sessionStatistics.getRms(), DELTA_TENTH_PS);
1053         Assertions.assertEquals(0.258, b9_sessionStatistics.getSkewness(), DELTA_MILLI);
1054         Assertions.assertEquals(-0.949, b9_sessionStatistics.getKurtosis(), DELTA_MILLI);
1055         Assertions.assertEquals(-18.6e-12, b9_sessionStatistics.getPeakMinusMean(), DELTA_TENTH_PS);
1056         Assertions.assertEquals(1, b9_sessionStatistics.getDataQulityIndicator());
1057         Assertions.assertEquals("50  std   72.7   1.494  -0.536  -32.4 0", b4_sessionStatistics.toCrdString());
1058 
1059         Assertions.assertEquals(null, block9.getConfigurationRecords().getCalibrationTargetRecord());
1060         
1061         final List<Calibration> b9_calibrationData = block9.getCalibrationData();
1062         Assertions.assertEquals(2, b9_calibrationData.size());
1063 
1064         final List<CalibrationDetail> b9_calibrationDetailData = block9.getCalibrationDetailData();
1065         Assertions.assertEquals(true, b9_calibrationDetailData.isEmpty());
1066         Assertions.assertEquals(null, block9.getCalibrationDetailRecords());
1067 
1068         final CRDHeader b9_header = block9.getHeader();
1069         Assertions.assertEquals("H1 CRD  1 2022 03 26 20", b9_header.getH1CrdString());
1070         Assertions.assertEquals("H2 GRZL 7839 34 02  4 na", b9_header.getH2CrdString());
1071         Assertions.assertEquals("H3 lageos1 7603901 1155 08820 0 1  1", b9_header.getH3CrdString());
1072         Assertions.assertEquals("H4  1 2022 03 25 23 10 20 2022 03 26 00 14 20 0 0 0 0 1 0 2 0", b9_header.getH4CrdString());
1073         Assertions.assertEquals("H5  0 00 null null     0", b9_header.getH5CrdString());
1074 
1075         // block10: real npt, c7
1076         final CRDDataBlock block10 = dataBlocks.get(10);
1077         Assertions.assertEquals(2, block10.getHeader().getVersion());
1078         final List<RangeMeasurement> b10_rangeData = block10.getRangeData();
1079         Assertions.assertEquals(4, b10_rangeData.size());
1080         final NptRangeMeasurement b10_npt0 = (NptRangeMeasurement)b10_rangeData.get(0);
1081         Assertions.assertEquals(0.040190018544, b10_npt0.getTimeOfFlight(), DELTA_PS);
1082         Assertions.assertEquals(532.000e-9, block10.getWavelength(b10_npt0), DELTA_MILLI_NM);
1083         
1084         final CRDConfiguration b10_config = block10.getConfigurationRecords();
1085         final SystemConfiguration b10_systemConfig = b10_config.getSystemRecord();
1086         final LaserConfiguration b10_laserConfig = b10_config.getLaserRecord();
1087         final DetectorConfiguration b10_detectorConfig = b10_config.getDetectorRecord();
1088         final TimingSystemConfiguration b10_timingConfig = b10_config.getTimingRecord();
1089         final SoftwareConfiguration b10_softwareConfig = b10_config.getSoftwareRecord();
1090         final MeteorologicalConfiguration b10_meteorologicalConfig = b10_config.getMeteorologicalRecord();
1091         final CalibrationTargetConfiguration b10_calibrationTargetConfig = b10_config.getCalibrationTargetRecord();
1092         
1093         Assertions.assertEquals(7, b10_config.getConfigurationRecordMap().size());
1094         Assertions.assertInstanceOf(LaserConfiguration.class, b10_config.getConfigurationRecord("la1"));
1095 
1096         Assertions.assertEquals(532.000e-9, b10_systemConfig.getWavelength(), DELTA_MILLI_NM);
1097         Assertions.assertEquals("new", b10_systemConfig.getSystemId());
1098         Assertions.assertEquals("[la1, mcp, ti1, swm, met, cac]", b10_systemConfig.getComponents().toString());
1099         Assertions.assertEquals("C0 0    532.000 new la1 mcp ti1 swm met cac", b10_systemConfig.toCrdString());
1100 
1101         Assertions.assertEquals("la1", b10_laserConfig.getLaserId());
1102         Assertions.assertEquals("Nd:Yag", b10_laserConfig.getLaserType());
1103         Assertions.assertEquals(1064.00e-9, b10_laserConfig.getPrimaryWavelength(), DELTA_MILLI_NM);
1104         Assertions.assertEquals(5.00, b10_laserConfig.getNominalFireRate(), DELTA_CENTI);
1105         Assertions.assertEquals(100.00, b10_laserConfig.getPulseEnergy(), DELTA_CENTI);
1106         Assertions.assertEquals(150.0, b10_laserConfig.getPulseWidth(), DELTA_CENTI);
1107         Assertions.assertEquals(15.00, b10_laserConfig.getBeamDivergence(), DELTA_CENTI);
1108         Assertions.assertEquals(1, b10_laserConfig.getPulseInOutgoingSemiTrain());
1109         Assertions.assertEquals("C1 0 la1 Nd:Yag 1064.00 5.00 100.00 150.0 15.00 1", b10_laserConfig.toCrdString());
1110 
1111         Assertions.assertEquals("mcp", b10_detectorConfig.getDetectorId());
1112         Assertions.assertEquals("MCP-PMT", b10_detectorConfig.getDetectorType());
1113         Assertions.assertEquals(532.00e-9, b10_detectorConfig.getApplicableWavelength(), DELTA_MILLI_NM);
1114         Assertions.assertEquals(15.0, b10_detectorConfig.getQuantumEfficiency(), DELTA_CENTI);
1115         Assertions.assertEquals(3488.3, b10_detectorConfig.getAppliedVoltage(), 0.1);
1116         Assertions.assertEquals(31.0e3, b10_detectorConfig.getDarkCount(), 0.1e3);
1117         Assertions.assertEquals("analog", b10_detectorConfig.getOutputPulseType());
1118         Assertions.assertEquals(400.0, b10_detectorConfig.getOutputPulseWidth(), 0.1);
1119         Assertions.assertEquals(1.0e-9, b10_detectorConfig.getSpectralFilter(), 0.1e-9);
1120         Assertions.assertEquals(80.0, b10_detectorConfig.getTransmissionOfSpectralFilter(), 0.1);
1121         Assertions.assertEquals(30.00, b10_detectorConfig.getSpatialFilter(), DELTA_CENTI);
1122         Assertions.assertEquals("none", b10_detectorConfig.getExternalSignalProcessing());
1123         Assertions.assertEquals(Double.NaN, b10_detectorConfig.getAmplifierGain(), 0.1);
1124         Assertions.assertEquals(Double.NaN, b10_detectorConfig.getAmplifierBandwidth(), 0.1e3);
1125         Assertions.assertEquals("0", b10_detectorConfig.getAmplifierInUse());
1126         Assertions.assertEquals("C2 0 mcp MCP-PMT 532.000 15.00 3488.3 31.0 analog 400.0 1.00 80.0 30.0 none na na 0", 
1127                 b10_detectorConfig.toCrdString());
1128 
1129         Assertions.assertEquals("ti1", b10_timingConfig.getLocalTimingId());
1130         Assertions.assertEquals("Truetime_XLDC", b10_timingConfig.getTimeSource());
1131         Assertions.assertEquals("Truetime_XLDC", b10_timingConfig.getFrequencySource());
1132         Assertions.assertEquals("Cybi_ETM", b10_timingConfig.getTimer());
1133         Assertions.assertEquals("na", b10_timingConfig.getTimerSerialNumber());
1134         Assertions.assertEquals(0.0, b10_timingConfig.getEpochDelayCorrection(), DELTA_TENTH_US);
1135         Assertions.assertEquals("C3 0 ti1 Truetime_XLDC Truetime_XLDC Cybi_ETM na 0.0", b10_timingConfig.toCrdString());
1136 
1137         Assertions.assertEquals("swm", b10_softwareConfig.getConfigurationId());
1138         Assertions.assertEquals("swm", b10_softwareConfig.getSoftwareId());
1139         Assertions.assertEquals("[sattrk]", Arrays.toString(b10_softwareConfig.getTrackingSoftwares()));
1140         Assertions.assertEquals("[6.10]", Arrays.toString(b10_softwareConfig.getTrackingSoftwareVersions()));
1141         Assertions.assertEquals("[HPLDP, GNP]", Arrays.toString(b10_softwareConfig.getProcessingSoftwares()));
1142         Assertions.assertEquals("[9.11.3, 2.8.3]", Arrays.toString(b10_softwareConfig.getProcessingSoftwareVersions()));
1143         Assertions.assertEquals("C5 0 swm sattrk 6.10 HPLDP,GNP 9.11.3,2.8.3", b10_softwareConfig.toCrdString());
1144 
1145         Assertions.assertEquals("met", b10_meteorologicalConfig.getConfigurationId());
1146         Assertions.assertEquals("met", b10_meteorologicalConfig.getMeteorologicalId());
1147         Assertions.assertEquals("Paroscientific", b10_meteorologicalConfig.getPressSensorManufacturer());
1148         Assertions.assertEquals("MET-4", b10_meteorologicalConfig.getPressSensorModel());
1149         Assertions.assertEquals("106772", b10_meteorologicalConfig.getPressSensorSerialNumber());
1150         Assertions.assertEquals("Paroscientific", b10_meteorologicalConfig.getTempSensorManufacturer());
1151         Assertions.assertEquals("MET-4", b10_meteorologicalConfig.getTempSensorModel());
1152         Assertions.assertEquals("106772", b10_meteorologicalConfig.getTempSensorSerialNumber());
1153         Assertions.assertEquals("Paroscientific", b10_meteorologicalConfig.getHumiSensorManufacturer());
1154         Assertions.assertEquals("MET-4", b10_meteorologicalConfig.getHumiSensorModel());
1155         Assertions.assertEquals("106772", b10_meteorologicalConfig.getHumiSensorSerialNumber());
1156         Assertions.assertEquals("C6 0 met Paroscientific MET-4 106772 Paroscientific MET-4 106772 Paroscientific MET-4 106772", 
1157                 b10_meteorologicalConfig.toCrdString());
1158 
1159         Assertions.assertEquals("cac", b10_calibrationTargetConfig.getConfigurationId());
1160         Assertions.assertEquals("B", b10_calibrationTargetConfig.getTargetName());
1161         Assertions.assertEquals(150.42450, b10_calibrationTargetConfig.getSurveyedTargetDistance(), DELTA_TENTH_MM);
1162         Assertions.assertEquals(1.0e-3, b10_calibrationTargetConfig.getSurveyError(), DELTA_TENTH_MM);
1163         Assertions.assertEquals(0.1651, b10_calibrationTargetConfig.getSumOfAllConstantDelays(), DELTA_TENTH_MM);
1164         Assertions.assertEquals(Double.NaN, b10_calibrationTargetConfig.getPulseEnergy(), DELTA_CENTI);
1165         Assertions.assertEquals("HPLDP", b10_calibrationTargetConfig.getProcessingSoftwareName());
1166         Assertions.assertEquals("9.11.3", b10_calibrationTargetConfig.getProcessingSoftwareVersion());
1167         Assertions.assertEquals("C7 0 cac B 150.42450 1.00 0.1651 na HPLDP 9.11.3", b10_calibrationTargetConfig.toCrdString());
1168 
1169         final List<CalibrationDetail> b10_calibrationDetailData = block10.getCalibrationDetailData();
1170         Assertions.assertEquals(2, b10_calibrationDetailData.size());
1171         final List<CalibrationDetail> b10_calibrationDetails = block10.getCalibrationDetailRecords();
1172         Assertions.assertEquals(2, b10_calibrationDetails.size());
1173         final CalibrationDetail b10_calibrationDetail0 = b10_calibrationDetails.get(0);
1174         Assertions.assertEquals("41  7907.550577400252 0  new      822      819 150.4245    96809.6      na   18.0     na     na    na 2 2 0 1   na",
1175                 b10_calibrationDetail0.toCrdString());
1176         Assertions.assertEquals(true, block10.getCalibrationDetailRecords("std").isEmpty());
1177         Assertions.assertEquals(2, block10.getCalibrationDetailRecords("new").size());
1178 
1179         final CRDHeader b10_header = block10.getHeader();
1180         Assertions.assertEquals("H1 CRD  2 2022 05 01 03", b10_header.getH1CrdString());
1181         Assertions.assertEquals("H2 YARL 7090 05 13  3 ILRS", b10_header.getH2CrdString());
1182         Assertions.assertEquals("H3 lageos2 9207002 5986 22195 0 1  1", b10_header.getH3CrdString());
1183         Assertions.assertEquals("H4  1 2022 05 01 02 18 58 2022 05 01 02 24 03 0 0 0 0 1 0 2 0", b10_header.getH4CrdString());
1184         Assertions.assertEquals("H5  1 22 043000 HTS 12001", b10_header.getH5CrdString());
1185 
1186         final CRDConfiguration config = new CRDConfiguration();
1187         Assertions.assertEquals(true, config.getSystemConfigurationRecords().isEmpty());
1188         Assertions.assertEquals(null, config.getSystemRecord());
1189         Assertions.assertEquals(null, config.getSystemRecord(null));
1190         Assertions.assertEquals(null, config.getSystemRecord("std"));
1191         
1192         config.addConfigurationRecord(b3_systemConfig_std1);
1193         config.addConfigurationRecord(b3_systemConfig_std2);
1194         Assertions.assertEquals(2, config.getSystemConfigurationRecords().size());
1195         Assertions.assertSame(b3_systemConfig_std1, config.getSystemRecord());        
1196 
1197         final RangeMeasurement range_new = new RangeMeasurement(b10_npt0.getDate(), 
1198                 b10_npt0.getTimeOfFlight(), b10_npt0.getEpochEvent());
1199         Assertions.assertEquals(0.040190018544,range_new.getTimeOfFlight(), DELTA_PS);
1200         Assertions.assertEquals(8357.400568200001, 
1201                 range_new.getDate().getComponents(utc).getTime().getSecondsInUTCDay(), DELTA_PS);
1202         final RangeMeasurement range_new2 = new RangeMeasurement(b10_npt0.getDate(), 
1203                 b10_npt0.getTimeOfFlight(), b10_npt0.getEpochEvent(), b10_npt0.getSnr());
1204         Assertions.assertEquals("00 not supported. use NptRangeMeasurement or FrRangeMeasurement instead.", 
1205                 range_new2.toCrdString());
1206 
1207         final NptRangeMeasurement npt_new = new NptRangeMeasurement(b10_npt0.getDate(), 
1208                 b10_npt0.getTimeOfFlight(), b10_npt0.getEpochEvent(), b10_npt0.getSnr(),
1209                 b10_npt0.getSystemConfigurationId());
1210         Assertions.assertEquals("11  8357.400568200000     0.040190018544  new 2   -1.0     -1       na     na     na       na   na 0   na", 
1211                 npt_new.toCrdString());
1212 
1213         Assertions.assertEquals(0, DataType.FULL_RATE.getIndicator());
1214         Assertions.assertEquals(1, DataType.NORMAL_POINT.getIndicator());
1215         Assertions.assertEquals(2, DataType.SAMPLED_ENGIEERING.getIndicator());
1216         Assertions.assertEquals(DataType.FULL_RATE, DataType.getDataType(0));
1217         Assertions.assertEquals(DataType.NORMAL_POINT, DataType.getDataType(1));
1218         Assertions.assertEquals(DataType.SAMPLED_ENGIEERING, DataType.getDataType(2));
1219         try {
1220             DataType.getDataType(3);
1221             Assertions.fail("an exception should have been thrown");
1222         } catch (RuntimeException oe) {
1223         }
1224 
1225         // block11: real npt, monthE=-1
1226         final CRDDataBlock block11 = dataBlocks.get(11);
1227         final AbsoluteDate startEpoch = new AbsoluteDate("2012-01-16T03:11:54", utc);
1228         final AbsoluteDate endEpoch = new AbsoluteDate("2012-01-16T00:00:00", utc).shiftedBy(11532.317500081099);
1229         Assertions.assertEquals(1, block11.getHeader().getVersion());
1230         Assertions.assertEquals(startEpoch, block11.getHeader().getStartEpoch());
1231         Assertions.assertEquals(endEpoch, block11.getHeader().getEndEpoch());
1232     }
1233     
1234     @BeforeEach
1235     public void setUp() {
1236         Utils.setDataRoot("regular-data");
1237     }
1238 
1239 }