1   /* Copyright 2002-2019 CS Systèmes d'Information
2    * Licensed to CS Systèmes d'Information (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  
18  package org.orekit.files.ccsds;
19  
20  import java.util.ArrayList;
21  import java.util.Collections;
22  import java.util.TreeMap;
23  import java.util.List;
24  import java.util.Map;
25  
26  import org.orekit.errors.OrekitException;
27  import org.orekit.errors.OrekitMessages;
28  import org.orekit.frames.Frame;
29  import org.orekit.time.AbsoluteDate;
30  
31  /** This class stocks all the information of the CCSDS Tracking Data Message file parsed by TDMParser or TDMXMLParser. <p>
32   * It contains the header and a list of Observations Blocks each containing
33   * TDM metadata and a list of observation data lines. <p>
34   * At this level the observations are not Orekit objects but custom object containing a keyword (type of observation),
35   * a timetag (date of the observation) and a measurement (value of the observation). <p>
36   * It is up to the user to convert these observations to Orekit tracking object (Range, Angular, TurnAroundRange etc...).<p>
37   * References:<p>
38   *  <a href="https://public.ccsds.org/Pubs/503x0b1c1.pdf">CCSDS 503.0-B-1 recommended standard</a> ("Tracking Data Message", Blue Book, Version 1.0, November 2007).
39   * @author Maxime Journot
40   * @since 9.0
41   */
42  public class TDMFile {
43  
44      /** CCSDS Format version. */
45      private double formatVersion;
46  
47      /** Header comments. The list contains a string for each line of comment. */
48      private List<String> headerComment;
49  
50      /** File creation date and time in UTC. */
51      private AbsoluteDate creationDate;
52  
53      /** Creating agency or operator. */
54      private String originator;
55  
56      /** List of observation blocks. */
57      private List<ObservationsBlock> observationsBlocks;
58  
59      /** OEMFile constructor. */
60      public TDMFile() {
61          observationsBlocks = new ArrayList<>();
62      }
63  
64      /** Get the CCSDS TDM format version.
65       * @return format version
66       */
67      public double getFormatVersion() {
68          return formatVersion;
69      }
70  
71      /** Set the CCSDS ODM (OPM, OMM or OEM) format version.
72       * @param formatVersion the format version to be set
73       */
74      public void setFormatVersion(final double formatVersion) {
75          this.formatVersion = formatVersion;
76      }
77  
78      /** Get the header comment.
79       * @return header comment
80       */
81      public List<String> getHeaderComment() {
82          return headerComment;
83      }
84  
85      /** Set the header comment.
86       * @param headerComment header comment
87       */
88      public void setHeaderComment(final List<String> headerComment) {
89          this.headerComment = new ArrayList<>(headerComment);
90      }
91  
92      /** Get the file creation date and time in UTC.
93       * @return the file creation date and time in UTC.
94       */
95      public AbsoluteDate getCreationDate() {
96          return creationDate;
97      }
98  
99      /** Set the file creation date and time in UTC.
100      * @param creationDate the creation date to be set
101      */
102     public void setCreationDate(final AbsoluteDate creationDate) {
103         this.creationDate = creationDate;
104     }
105 
106     /** Get the file originator.
107      * @return originator the file originator.
108      */
109     public String getOriginator() {
110         return originator;
111     }
112 
113     /** Set the file originator.
114      * @param originator the originator to be set
115      */
116     public void setOriginator(final String originator) {
117         this.originator = originator;
118     }
119 
120     /** Add a block to the list of observations blocks. */
121     public void addObservationsBlock() {
122         observationsBlocks.add(new ObservationsBlock());
123     }
124 
125     /** Get the list of observations blocks as an unmodifiable list.
126      * @return the list of observations blocks
127      */
128     public List<ObservationsBlock> getObservationsBlocks() {
129         return Collections.unmodifiableList(observationsBlocks);
130     }
131 
132     /** Set the list of Observations Blocks.
133      * @param observationsBlocks the list of Observations Blocks to set
134      */
135     public void setObservationsBlocks(final List<ObservationsBlock> observationsBlocks) {
136         this.observationsBlocks = new ArrayList<>(observationsBlocks);
137     }
138 
139     /** Check that, according to the CCSDS standard, every ObservationsBlock has the same time system.
140      */
141     public void checkTimeSystems() {
142         final CcsdsTimeScale timeSystem = getObservationsBlocks().get(0).getMetaData().getTimeSystem();
143         for (final ObservationsBlock block : observationsBlocks) {
144             if (!timeSystem.equals(block.getMetaData().getTimeSystem())) {
145                 throw new OrekitException(OrekitMessages.CCSDS_TDM_INCONSISTENT_TIME_SYSTEMS,
146                                           timeSystem, block.getMetaData().getTimeSystem());
147             }
148         }
149     }
150 
151     /** The Observations Block class contain metadata and the list of observation data lines.<p>
152      * The reason for which the observations have been separated into blocks is that the different
153      * data blocks in a TDM file usually refers to different types of observations.<p>
154      * An observation block contains a TDM metadata object and a list of observations.<p>
155      * At this level, an observation is not an Orekit object, it is a custom object containing:<p>
156      *  - a keyword, the type of the observation;<p>
157      *  - a timetag, the date of the observation;<p>
158      *  - a measurement, the value of the observation.
159      * @author Maxime Journot
160      */
161     public static class ObservationsBlock {
162 
163         /** Meta-data for the block. */
164         private TDMMetaData metaData;
165 
166         /** List of observations data lines. */
167         private List<Observation> observations;
168 
169         /** Observations Data Lines comments. The list contains a string for each line of comment. */
170         private List<String> observationsComment;
171 
172         /** ObservationsBlock constructor. */
173         public ObservationsBlock() {
174             metaData = new TDMMetaData();
175             observations = new ArrayList<>();
176             observationsComment = new ArrayList<>();
177         }
178 
179         /** Get the list of Observations data lines.
180          * @return a reference to the internal list of Observations data lines
181          */
182         public List<Observation> getObservations() {
183             return this.observations;
184         }
185 
186         /** Set the list of Observations Data Lines.
187          * @param observations the list of Observations Data Lines to set
188          */
189         public void setObservations(final List<Observation> observations) {
190             this.observations = new ArrayList<>(observations);
191         }
192 
193         /** Adds an observation data line.
194          * @param observation the observation to add to the list
195          */
196         public void addObservation(final Observation observation) {
197             this.observations.add(observation);
198         }
199 
200         /** Adds an observation data line.
201          * @param keyword the keyword
202          * @param epoch the timetag
203          * @param measurement the measurement
204          */
205         public void addObservation(final String keyword,
206                                    final AbsoluteDate epoch,
207                                    final double measurement) {
208             this.addObservation(new Observation(keyword, epoch, measurement));
209         }
210 
211         /** Get the meta-data for the block.
212          * @return meta-data for the block
213          */
214         public TDMMetaData getMetaData() {
215             return metaData;
216         }
217 
218         /** Set the meta-data for the block.
219          * @param metaData the meta-data to set
220          */
221         public void setMetaData(final TDMMetaData metaData) {
222             this.metaData = metaData;
223         }
224 
225         /** Get the observations data lines comment.
226          * @return the comment
227          */
228         public List<String> getObservationsComment() {
229             return observationsComment;
230         }
231 
232         /** Set the observations data lines comment.
233          * @param observationsComment the comment to be set
234          */
235         public void setObservationsComment(final List<String> observationsComment) {
236             this.observationsComment = new ArrayList<>(observationsComment);
237         }
238 
239         /** Add an observation data line comment.
240          *  @param observationComment the comment line to add
241          */
242         public void addObservationComment(final String observationComment) {
243             this.observationsComment.add(observationComment);
244         }
245 
246     }
247 
248     /** The Observation class contains the data from an observation line.<p>
249      * It is not an Orekit object yet.<p>
250      * It is a simple container holding:<p>
251      *  - a keyword, the type of the observation;<p>
252      *  - a timetag, the epoch of the observation;<p>
253      *  - a measurement, the value of the observation.<p>
254      * @see Keyword
255      * @author mjournot
256      */
257     public static class Observation {
258 
259         /** CCSDS Keyword: the type of the observation. */
260         private String keyword;
261 
262         /** Epoch: the timetag of the observation. */
263         private AbsoluteDate epoch;
264 
265         /** Measurement: the value of the observation. */
266         private double measurement;
267 
268         /** Simple constructor.
269          * @param keyword the keyword
270          * @param epoch the timetag
271          * @param measurement the measurement
272          */
273         Observation(final String keyword, final AbsoluteDate epoch, final double measurement) {
274             this.keyword = keyword;
275             this.epoch = epoch;
276             this.measurement = measurement;
277         }
278 
279         /** Getter for the keyword.
280          * @return the keyword
281          */
282         public String getKeyword() {
283             return keyword;
284         }
285 
286         /** Setter for the keyword.
287          * @param keyword the keyword to set
288          */
289         public void setKeyword(final String keyword) {
290             this.keyword = keyword;
291         }
292 
293         /** Getter for the epoch.
294          * @return the epoch
295          */
296         public AbsoluteDate getEpoch() {
297             return epoch;
298         }
299 
300         /** Setter for the epoch.
301          * @param epoch the epoch to set
302          */
303         public void setEpoch(final AbsoluteDate epoch) {
304             this.epoch = epoch;
305         }
306 
307         /** Getter for the measurement.
308          * @return the measurement
309          */
310         public double getMeasurement() {
311             return measurement;
312         }
313 
314         /** Setter for the measurement.
315          * @param measurement the measurement to set
316          */
317         public void setMeasurement(final double measurement) {
318             this.measurement = measurement;
319         }
320     }
321 
322     /** The TDMMetadata class gathers the meta-data present in the Tracking Data Message (TDM).<p>
323      *  References:<p>
324      *  <a href="https://public.ccsds.org/Pubs/503x0b1c1.pdf">CCSDS 503.0-B-1 recommended standard</a>. §3.3 ("Tracking Data Message", Blue Book, Version 1.0, November 2007).
325      *
326      * @author Maxime Journot
327      * @since 9.0
328      */
329     public static class TDMMetaData {
330 
331         /** Time System used in the tracking data session. */
332         private CcsdsTimeScale timeSystem;
333 
334         /** Start epoch of total time span covered by observations block. */
335         private AbsoluteDate startTime;
336 
337         /** Start time as read in the file. */
338         private String startTimeString;
339         /** End epoch of total time span covered by observations block. */
340         private AbsoluteDate stopTime;
341 
342         /** Stop time as read in the file. */
343         private String stopTimeString;
344 
345         /** Map of participants in the tracking data session (minimum 1 and up to 5).<p>
346          *  Participants may include ground stations, spacecraft, and/or quasars.<p>
347          *  Participants represent the classical transmitting parties, transponding parties, and receiving parties.
348          */
349         private Map<Integer, String> participants;
350 
351         /** Tracking mode associated with the Data Section of the segment.<p>
352          *  - SEQUENTIAL : Sequential signal path between participants (range, Doppler, angles and line of sight ionosphere calibration);<p>
353          *  - SINGLE_DIFF: Differenced data.
354          */
355         private String mode;
356 
357         /** The path shall reflect the signal path by listing the index of each participant
358          *  in order, separated by commas, with no inserted white space.<p>
359          *  The integers 1, 2, 3, 4, 5 used to specify the signal path correlate
360          *  with the indices of the PARTICIPANT keywords.<p>
361          *  The first entry in the PATH shall be the transmit participant.<p>
362          *  The non-indexed ‘PATH’ keyword shall be used if the MODE is ‘SEQUENTIAL’.<p>
363          *  The indexed ‘PATH_1’ and ‘PATH_2’ keywords shall be used where the MODE is ‘SINGLE_DIFF’.
364          */
365         private String path;
366 
367         /** Path 1 (see above). */
368         private String path1;
369 
370         /** Path 2 (see above). */
371         private String path2;
372 
373         /** Frequency band for transmitted frequencies. */
374         private String transmitBand;
375 
376         /** Frequency band for received frequencies. */
377         private String receiveBand;
378 
379         /** Turn-around ratio numerator.<p>
380          *  Numerator of the turn-around ratio that is necessary to calculate the coherent downlink from the uplink frequency.
381          */
382         private int turnaroundNumerator;
383 
384         /** Turn-around ratio denominator .*/
385         private int turnaroundDenominator;
386 
387         /** Timetag reference.<p>
388          *  Provides a reference for time tags in the tracking data.<p>
389          *  It indicates whether the timetag associated with the data is the transmit time or the receive time.
390          */
391         private String timetagRef;
392 
393         /** Integration interval. <p>
394          *  Provides the Doppler count time in seconds for Doppler data or for the creation
395          *  of normal points.
396          */
397         private double integrationInterval;
398 
399         /** Integration reference.<p>
400          *  Used in conjunction with timetag reference and integration interval.<p>
401          *  Indicates whether the timetag represents the start, middle or end of the integration interval.
402          */
403         private String integrationRef;
404 
405         /** Frequency offset.<p>
406          *  A frequency in Hz that must be added to every RECEIVE_FREQ to reconstruct it.
407          */
408         private double freqOffset;
409 
410         /** Range mode.<p>
411          *  COHERENT, CONSTANT or ONE_WAY.
412          */
413         private String rangeMode;
414 
415         /** Range modulus.<p>
416          *  Modulus of the range observable in the units as specified by the RANGE_UNITS keyword.
417          */
418         private double rangeModulus;
419 
420         /** Range units.<p>
421          *  The units for the range observable: 'km', 's' or 'RU' (for 'range units').
422          */
423         private String rangeUnits;
424 
425         /** Angle type.<p>
426          *  Type of the antenna geometry represented in the angle data ANGLE_1 and ANGLE_2.<p>
427          *  – AZEL for azimuth, elevation (local horizontal);<p>
428          *  – RADEC for right ascension, declination or hour angle, declination (needs to be referenced to an inertial frame);<p>
429          *  – XEYN for x-east, y-north;<p>
430          *  – XSYE for x-south, y-east.<p>
431          *  Note: Angle units are always degrees
432          */
433         private String angleType;
434 
435         /** The reference frame specifier, as it appeared in the file. */
436         private String referenceFrameString;
437 
438         /** Reference frame in which data are given: used in combination with ANGLE_TYPE=RADEC. */
439         private Frame referenceFrame;
440 
441         /** Transmit delays map.<p>
442          *  Specifies a fixed interval of time, in seconds, for the signal to travel from the transmitting
443          *  electronics to the transmit point. Each item in the list corresponds to the each participants.
444          */
445         private Map<Integer, Double> transmitDelays;
446 
447         /** Receive delays list.<p>
448          *  Specifies a fixed interval of time, in seconds, for the signal to travel from the tracking
449          *  point to the receiving electronics. Each item in the list corresponds to the each participants.
450          */
451         private Map<Integer, Double> receiveDelays;
452 
453         /** Data quality.<p>
454          *  Estimate of the quality of the data: RAW, DEGRADED or VALIDATED.
455          */
456         private String dataQuality;
457 
458         /** Correction angle 1.<p>
459          *  Angle correction that has been added or should be added to the ANGLE_1 data.
460          */
461         private double correctionAngle1;
462 
463         /** Correction angle 2.<p>
464          *  Angle correction that has been added or should be added to the ANGLE_2 data.
465          */
466         private double correctionAngle2;
467 
468         /** Correction Doppler.<p>
469          *  Doppler correction that has been added or should be added to the DOPPLER data.
470          */
471         private double correctionDoppler;
472 
473         /** Correction Range.<p>
474          *  Range correction that has been added or should be added to the RANGE data.
475          */
476         private double correctionRange;
477 
478         /** Correction receive.<p>
479          *  Receive correction that has been added or should be added to the RECEIVE data.
480          */
481         private double correctionReceive;
482 
483         /** Correction transmit.<p>
484          *  Transmit correction that has been added or should be added to the TRANSMIT data.
485          */
486         private double correctionTransmit;
487 
488         /** Correction applied ? YES/NO<p>
489          *  Indicate whethers or not the values associated with the CORRECTION_* keywords have been
490          *  applied to the tracking data.
491          */
492         private String correctionsApplied;
493 
494         /** Meta-data comments. The list contains a string for each line of comment. */
495         private List<String> comment;
496 
497         /** Create a new TDM meta-data.
498          */
499         public TDMMetaData() {
500             participants   = new TreeMap<>();
501             transmitDelays = new TreeMap<>();
502             receiveDelays  = new TreeMap<>();
503             comment        = new ArrayList<>();
504         }
505 
506 
507         /** Get the Time System that: for OPM, is used for metadata, state vector,
508          * maneuver and covariance data, for OMM, is used for metadata, orbit state
509          * and covariance data, for OEM, is used for metadata, ephemeris and
510          * covariance data.
511          * @return the time system
512          */
513         public CcsdsTimeScale getTimeSystem() {
514             return timeSystem;
515         }
516 
517         /** Set the Time System that: for OPM, is used for metadata, state vector,
518          * maneuver and covariance data, for OMM, is used for metadata, orbit state
519          * and covariance data, for OEM, is used for metadata, ephemeris and
520          * covariance data.
521          * @param timeSystem the time system to be set
522          */
523         public void setTimeSystem(final CcsdsTimeScale timeSystem) {
524             this.timeSystem = timeSystem;
525         }
526 
527         /** Getter for the startTime.
528          * @return the startTime
529          */
530         public AbsoluteDate getStartTime() {
531             return startTime;
532         }
533 
534         /** Setter for the startTime.
535          * @param startTime the startTime to set
536          */
537         public void setStartTime(final AbsoluteDate startTime) {
538             this.startTime = startTime;
539         }
540 
541         /** Getter for the startTime String.
542          * @return the startTime String
543          */
544         public String getStartTimeString() {
545             return startTimeString;
546         }
547 
548         /** Setter for the startTime String.
549          * @param startTimeString the startTime String to set
550          */
551         public void setStartTimeString(final String startTimeString) {
552             this.startTimeString = startTimeString;
553         }
554 
555         /** Getter for the stopTime.
556          * @return the stopTime
557          */
558         public AbsoluteDate getStopTime() {
559             return stopTime;
560         }
561 
562         /** Setter for the stopTime.
563          * @param stopTime the stopTime to set
564          */
565         public void setStopTime(final AbsoluteDate stopTime) {
566             this.stopTime = stopTime;
567         }
568 
569         /** Getter for the stopTime String.
570          * @return the stopTime String
571          */
572         public String getStopTimeString() {
573             return stopTimeString;
574         }
575 
576         /** Setter for the stopTime String.
577          * @param stopTimeString the stopTime String to set
578          */
579         public void setStopTimeString(final String stopTimeString) {
580             this.stopTimeString = stopTimeString;
581         }
582 
583         /** Getter for the participants.
584          * @return the participants
585          */
586         public Map<Integer, String> getParticipants() {
587             return participants;
588         }
589 
590         /** Setter for the participants.
591          * @param participants the participants to set
592          */
593         public void setParticipants(final Map<Integer, String> participants) {
594             this.participants = new TreeMap<Integer, String>();
595             this.participants.putAll(participants);
596         }
597 
598         /** Adds a participant to the list.
599          * @param participantNumber the number of the participant to add
600          * @param participant the name of the participant to add
601          */
602         public void addParticipant(final int participantNumber, final String participant) {
603             this.participants.put(participantNumber, participant);
604         }
605 
606         /** Getter for the mode.
607          * @return the mode
608          */
609         public String getMode() {
610             return mode;
611         }
612 
613         /** Setter for the mode.
614          * @param mode the mode to set
615          */
616         public void setMode(final String mode) {
617             this.mode = mode;
618         }
619 
620         /** Getter for the path.
621          * @return the path
622          */
623         public String getPath() {
624             return path;
625         }
626 
627         /** Setter for the path.
628          * @param path the path to set
629          */
630         public void setPath(final String path) {
631             this.path = path;
632         }
633 
634         /** Getter for the path1.
635          * @return the path1
636          */
637         public String getPath1() {
638             return path1;
639         }
640 
641         /** Setter for the path1.
642          * @param path1 the path1 to set
643          */
644         public void setPath1(final String path1) {
645             this.path1 = path1;
646         }
647 
648         /** Getter for the path2.
649          * @return the path2
650          */
651         public String getPath2() {
652             return path2;
653         }
654 
655         /** Setter for the path2.
656          * @param path2 the path2 to set
657          */
658         public void setPath2(final String path2) {
659             this.path2 = path2;
660         }
661 
662         /** Getter for the transmitBand.
663          * @return the transmitBand
664          */
665         public String getTransmitBand() {
666             return transmitBand;
667         }
668 
669         /** Setter for the transmitBand.
670          * @param transmitBand the transmitBand to set
671          */
672         public void setTransmitBand(final String transmitBand) {
673             this.transmitBand = transmitBand;
674         }
675 
676         /** Getter for the receiveBand.
677          * @return the receiveBand
678          */
679         public String getReceiveBand() {
680             return receiveBand;
681         }
682 
683         /** Setter for the receiveBand.
684          * @param receiveBand the receiveBand to set
685          */
686         public void setReceiveBand(final String receiveBand) {
687             this.receiveBand = receiveBand;
688         }
689 
690         /** Getter for the turnaroundNumerator.
691          * @return the turnaroundNumerator
692          */
693         public int getTurnaroundNumerator() {
694             return turnaroundNumerator;
695         }
696 
697         /** Setter for the turnaroundNumerator.
698          * @param turnaroundNumerator the turnaroundNumerator to set
699          */
700         public void setTurnaroundNumerator(final int turnaroundNumerator) {
701             this.turnaroundNumerator = turnaroundNumerator;
702         }
703 
704         /** Getter for the turnaroundDenominator.
705          * @return the turnaroundDenominator
706          */
707         public int getTurnaroundDenominator() {
708             return turnaroundDenominator;
709         }
710 
711         /** Setter for the turnaroundDenominator.
712          * @param turnaroundDenominator the turnaroundDenominator to set
713          */
714         public void setTurnaroundDenominator(final int turnaroundDenominator) {
715             this.turnaroundDenominator = turnaroundDenominator;
716         }
717 
718         /** Getter for the timetagRef.
719          * @return the timetagRef
720          */
721         public String getTimetagRef() {
722             return timetagRef;
723         }
724 
725         /** Setter for the timetagRef.
726          * @param timetagRef the timetagRef to set
727          */
728         public void setTimetagRef(final String timetagRef) {
729             this.timetagRef = timetagRef;
730         }
731 
732         /** Getter for the integrationInterval.
733          * @return the integrationInterval
734          */
735         public double getIntegrationInterval() {
736             return integrationInterval;
737         }
738 
739         /** Setter for the integrationInterval.
740          * @param integrationInterval the integrationInterval to set
741          */
742         public void setIntegrationInterval(final double integrationInterval) {
743             this.integrationInterval = integrationInterval;
744         }
745 
746         /** Getter for the integrationRef.
747          * @return the integrationRef
748          */
749         public String getIntegrationRef() {
750             return integrationRef;
751         }
752 
753         /** Setter for the integrationRef.
754          * @param integrationRef the integrationRef to set
755          */
756         public void setIntegrationRef(final String integrationRef) {
757             this.integrationRef = integrationRef;
758         }
759 
760         /** Getter for the freqOffset.
761          * @return the freqOffset
762          */
763         public double getFreqOffset() {
764             return freqOffset;
765         }
766 
767         /** Setter for the freqOffset.
768          * @param freqOffset the freqOffset to set
769          */
770         public void setFreqOffset(final double freqOffset) {
771             this.freqOffset = freqOffset;
772         }
773 
774         /** Getter for the rangeMode.
775          * @return the rangeMode
776          */
777         public String getRangeMode() {
778             return rangeMode;
779         }
780 
781         /** Setter for the rangeMode.
782          * @param rangeMode the rangeMode to set
783          */
784         public void setRangeMode(final String rangeMode) {
785             this.rangeMode = rangeMode;
786         }
787 
788         /** Getter for the rangeModulus.
789          * @return the rangeModulus
790          */
791         public double getRangeModulus() {
792             return rangeModulus;
793         }
794 
795         /** Setter for the rangeModulus.
796          * @param rangeModulus the rangeModulus to set
797          */
798         public void setRangeModulus(final double rangeModulus) {
799             this.rangeModulus = rangeModulus;
800         }
801 
802         /** Getter for the rangeUnits.
803          * @return the rangeUnits
804          */
805         public String getRangeUnits() {
806             return rangeUnits;
807         }
808 
809         /** Setter for the rangeUnits.
810          * @param rangeUnits the rangeUnits to set
811          */
812         public void setRangeUnits(final String rangeUnits) {
813             this.rangeUnits = rangeUnits;
814         }
815 
816         /** Getter for angleType.
817          * @return the angleType
818          */
819         public String getAngleType() {
820             return angleType;
821         }
822 
823         /** Setter for the angleType.
824          * @param angleType the angleType to set
825          */
826         public void setAngleType(final String angleType) {
827             this.angleType = angleType;
828         }
829 
830         /** Get the the value of {@code REFERENCE_FRAME} as an Orekit {@link Frame}.
831          * @return The reference frame specified by the {@code REFERENCE_FRAME} keyword.
832          */
833         public Frame getReferenceFrame() {
834             return referenceFrame;
835         }
836 
837         /** Set the reference frame in which data are given: used for RADEC tracking data.
838          * @param refFrame the reference frame to be set
839          */
840         public void setReferenceFrame(final Frame refFrame) {
841             this.referenceFrame = refFrame;
842         }
843 
844         /** Get the reference frame specifier as it appeared in the file.
845          * @return the frame name as it appeared in the file.
846          */
847         public String getReferenceFrameString() {
848             return this.referenceFrameString;
849         }
850 
851         /** Set the reference frame name.
852          * @param frame specifier as it appeared in the file.
853          */
854         public void setReferenceFrameString(final String frame) {
855             this.referenceFrameString = frame;
856         }
857 
858         /** Getter for the transmitDelays.
859          * @return the transmitDelays
860          */
861         public Map<Integer, Double> getTransmitDelays() {
862             return transmitDelays;
863         }
864 
865         /** Setter for the transmitDelays.
866          * @param transmitDelays the transmitDelays to set
867          */
868         public void setTransmitDelays(final Map<Integer, Double> transmitDelays) {
869             this.transmitDelays = new TreeMap<Integer, Double>();
870             this.transmitDelays.putAll(transmitDelays);
871         }
872 
873         /** Adds a transmit delay to the list.
874          *  @param participantNumber the number of the participants for which the transmit delay is given
875          *  @param transmitDelay the transmit delay value to add
876          */
877         public void addTransmitDelay(final int participantNumber, final double transmitDelay) {
878             this.transmitDelays.put(participantNumber, transmitDelay);
879         }
880 
881         /** Getter for receiveDelays.
882          * @return the receiveDelays
883          */
884         public Map<Integer, Double> getReceiveDelays() {
885             return receiveDelays;
886         }
887 
888         /** Setter for the receiveDelays.
889          * @param receiveDelays the receiveDelays to set
890          */
891         public void setReceiveDelays(final Map<Integer, Double> receiveDelays) {
892             this.receiveDelays = new TreeMap<Integer, Double>();
893             this.receiveDelays.putAll(receiveDelays);
894         }
895 
896         /** Adds a receive delay to the list.
897          * @param participantNumber the number of the participants for which the receive delay is given
898          * @param receiveDelay the receive delay value to add
899          */
900         public void addReceiveDelay(final int participantNumber, final double receiveDelay) {
901             this.receiveDelays.put(participantNumber, receiveDelay);
902         }
903         /** Getter for the dataQuality.
904          * @return the dataQuality
905          */
906         public String getDataQuality() {
907             return dataQuality;
908         }
909 
910         /** Setter for the dataQuality.
911          * @param dataQuality the dataQuality to set
912          */
913         public void setDataQuality(final String dataQuality) {
914             this.dataQuality = dataQuality;
915         }
916 
917         /** Getter for the correctionAngle1.
918          * @return the correctionAngle1
919          */
920         public double getCorrectionAngle1() {
921             return correctionAngle1;
922         }
923 
924         /** Setter for the correctionAngle1.
925          * @param correctionAngle1 the correctionAngle1 to set
926          */
927         public void setCorrectionAngle1(final double correctionAngle1) {
928             this.correctionAngle1 = correctionAngle1;
929         }
930 
931         /** Getter for the correctionAngle2.
932          * @return the correctionAngle2
933          */
934         public double getCorrectionAngle2() {
935             return correctionAngle2;
936         }
937 
938         /** Setter for the correctionAngle2.
939          * @param correctionAngle2 the correctionAngle2 to set
940          */
941         public void setCorrectionAngle2(final double correctionAngle2) {
942             this.correctionAngle2 = correctionAngle2;
943         }
944 
945         /** Getter for the correctionDoppler.
946          * @return the correctionDoppler
947          */
948         public double getCorrectionDoppler() {
949             return correctionDoppler;
950         }
951 
952         /** Setter for the correctionDoppler.
953          * @param correctionDoppler the correctionDoppler to set
954          */
955         public void setCorrectionDoppler(final double correctionDoppler) {
956             this.correctionDoppler = correctionDoppler;
957         }
958 
959         /** Getter for the correctionRange.
960          * @return the correctionRange
961          */
962         public double getCorrectionRange() {
963             return correctionRange;
964         }
965 
966         /** Setter for the correctionRange.
967          * @param correctionRange the correctionRange to set
968          */
969         public void setCorrectionRange(final double correctionRange) {
970             this.correctionRange = correctionRange;
971         }
972 
973         /** Getter for the correctionReceive.
974          * @return the correctionReceive
975          */
976         public double getCorrectionReceive() {
977             return correctionReceive;
978         }
979 
980         /** Setter for the correctionReceive.
981          * @param correctionReceive the correctionReceive to set
982          */
983         public void setCorrectionReceive(final double correctionReceive) {
984             this.correctionReceive = correctionReceive;
985         }
986 
987         /** Getter for the correctionTransmit.
988          * @return the correctionTransmit
989          */
990         public double getCorrectionTransmit() {
991             return correctionTransmit;
992         }
993 
994         /** Setter for the correctionTransmit.
995          * @param correctionTransmit the correctionTransmit to set
996          */
997         public void setCorrectionTransmit(final double correctionTransmit) {
998             this.correctionTransmit = correctionTransmit;
999         }
1000 
1001         /** Getter for the correctionApplied.
1002          * @return the correctionApplied
1003          */
1004         public String getCorrectionsApplied() {
1005             return correctionsApplied;
1006         }
1007 
1008         /** Setter for the correctionApplied.
1009          * @param correctionsApplied the correctionApplied to set
1010          */
1011         public void setCorrectionsApplied(final String correctionsApplied) {
1012             this.correctionsApplied = correctionsApplied;
1013         }
1014 
1015         /** Get the meta-data comment.
1016          * @return meta-data comment
1017          */
1018         public List<String> getComment() {
1019             return Collections.unmodifiableList(comment);
1020         }
1021 
1022         /** Set the meta-data comment.
1023          * @param comment comment to set
1024          */
1025         public void setComment(final List<String> comment) {
1026             this.comment = new ArrayList<>(comment);
1027         }
1028     }
1029 }