TDMFile.java

  1. /* Copyright 2002-2020 CS GROUP
  2.  * Licensed to CS GROUP (CS) under one or more
  3.  * contributor license agreements.  See the NOTICE file distributed with
  4.  * this work for additional information regarding copyright ownership.
  5.  * CS licenses this file to You under the Apache License, Version 2.0
  6.  * (the "License"); you may not use this file except in compliance with
  7.  * the License.  You may obtain a copy of the License at
  8.  *
  9.  *   http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */

  17. package org.orekit.files.ccsds;

  18. import java.util.ArrayList;
  19. import java.util.Collections;
  20. import java.util.TreeMap;
  21. import java.util.List;
  22. import java.util.Map;

  23. import org.orekit.errors.OrekitException;
  24. import org.orekit.errors.OrekitMessages;
  25. import org.orekit.frames.Frame;
  26. import org.orekit.time.AbsoluteDate;

  27. /** This class stocks all the information of the CCSDS Tracking Data Message file parsed by TDMParser or TDMXMLParser. <p>
  28.  * It contains the header and a list of Observations Blocks each containing
  29.  * TDM metadata and a list of observation data lines. <p>
  30.  * At this level the observations are not Orekit objects but custom object containing a keyword (type of observation),
  31.  * a timetag (date of the observation) and a measurement (value of the observation). <p>
  32.  * It is up to the user to convert these observations to Orekit tracking object (Range, Angular, TurnAroundRange etc...).<p>
  33.  * References:<p>
  34.  *  <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).
  35.  * @author Maxime Journot
  36.  * @since 9.0
  37.  */
  38. public class TDMFile extends NDMFile {

  39.     /** List of observation blocks. */
  40.     private List<ObservationsBlock> observationsBlocks;

  41.     /** OEMFile constructor. */
  42.     public TDMFile() {
  43.         observationsBlocks = new ArrayList<>();
  44.     }

  45.     /** Add a block to the list of observations blocks. */
  46.     public void addObservationsBlock() {
  47.         observationsBlocks.add(new ObservationsBlock());
  48.     }

  49.     /** Get the list of observations blocks as an unmodifiable list.
  50.      * @return the list of observations blocks
  51.      */
  52.     public List<ObservationsBlock> getObservationsBlocks() {
  53.         return Collections.unmodifiableList(observationsBlocks);
  54.     }

  55.     /** Set the list of Observations Blocks.
  56.      * @param observationsBlocks the list of Observations Blocks to set
  57.      */
  58.     public void setObservationsBlocks(final List<ObservationsBlock> observationsBlocks) {
  59.         this.observationsBlocks = new ArrayList<>(observationsBlocks);
  60.     }

  61.     /** Check that, according to the CCSDS standard, every ObservationsBlock has the same time system.
  62.      */
  63.     public void checkTimeSystems() {
  64.         final CcsdsTimeScale timeSystem = getObservationsBlocks().get(0).getMetaData().getTimeSystem();
  65.         for (final ObservationsBlock block : observationsBlocks) {
  66.             if (!timeSystem.equals(block.getMetaData().getTimeSystem())) {
  67.                 throw new OrekitException(OrekitMessages.CCSDS_TDM_INCONSISTENT_TIME_SYSTEMS,
  68.                                           timeSystem, block.getMetaData().getTimeSystem());
  69.             }
  70.         }
  71.     }

  72.     /** The Observations Block class contain metadata and the list of observation data lines.<p>
  73.      * The reason for which the observations have been separated into blocks is that the different
  74.      * data blocks in a TDM file usually refers to different types of observations.<p>
  75.      * An observation block contains a TDM metadata object and a list of observations.<p>
  76.      * At this level, an observation is not an Orekit object, it is a custom object containing:<p>
  77.      *  - a keyword, the type of the observation;<p>
  78.      *  - a timetag, the date of the observation;<p>
  79.      *  - a measurement, the value of the observation.
  80.      * @author Maxime Journot
  81.      */
  82.     public static class ObservationsBlock {

  83.         /** Meta-data for the block. */
  84.         private TDMMetaData metaData;

  85.         /** List of observations data lines. */
  86.         private List<Observation> observations;

  87.         /** Observations Data Lines comments. The list contains a string for each line of comment. */
  88.         private List<String> observationsComment;

  89.         /** ObservationsBlock constructor. */
  90.         public ObservationsBlock() {
  91.             metaData = new TDMMetaData();
  92.             observations = new ArrayList<>();
  93.             observationsComment = new ArrayList<>();
  94.         }

  95.         /** Get the list of Observations data lines.
  96.          * @return a reference to the internal list of Observations data lines
  97.          */
  98.         public List<Observation> getObservations() {
  99.             return this.observations;
  100.         }

  101.         /** Set the list of Observations Data Lines.
  102.          * @param observations the list of Observations Data Lines to set
  103.          */
  104.         public void setObservations(final List<Observation> observations) {
  105.             this.observations = new ArrayList<>(observations);
  106.         }

  107.         /** Adds an observation data line.
  108.          * @param observation the observation to add to the list
  109.          */
  110.         public void addObservation(final Observation observation) {
  111.             this.observations.add(observation);
  112.         }

  113.         /** Adds an observation data line.
  114.          * @param keyword the keyword
  115.          * @param epoch the timetag
  116.          * @param measurement the measurement
  117.          */
  118.         public void addObservation(final String keyword,
  119.                                    final AbsoluteDate epoch,
  120.                                    final double measurement) {
  121.             this.addObservation(new Observation(keyword, epoch, measurement));
  122.         }

  123.         /** Get the meta-data for the block.
  124.          * @return meta-data for the block
  125.          */
  126.         public TDMMetaData getMetaData() {
  127.             return metaData;
  128.         }

  129.         /** Set the meta-data for the block.
  130.          * @param metaData the meta-data to set
  131.          */
  132.         public void setMetaData(final TDMMetaData metaData) {
  133.             this.metaData = metaData;
  134.         }

  135.         /** Get the observations data lines comment.
  136.          * @return the comment
  137.          */
  138.         public List<String> getObservationsComment() {
  139.             return observationsComment;
  140.         }

  141.         /** Set the observations data lines comment.
  142.          * @param observationsComment the comment to be set
  143.          */
  144.         public void setObservationsComment(final List<String> observationsComment) {
  145.             this.observationsComment = new ArrayList<>(observationsComment);
  146.         }

  147.         /** Add an observation data line comment.
  148.          *  @param observationComment the comment line to add
  149.          */
  150.         public void addObservationComment(final String observationComment) {
  151.             this.observationsComment.add(observationComment);
  152.         }

  153.     }

  154.     /** The Observation class contains the data from an observation line.<p>
  155.      * It is not an Orekit object yet.<p>
  156.      * It is a simple container holding:<p>
  157.      *  - a keyword, the type of the observation;<p>
  158.      *  - a timetag, the epoch of the observation;<p>
  159.      *  - a measurement, the value of the observation.<p>
  160.      * @see Keyword
  161.      * @author mjournot
  162.      */
  163.     public static class Observation {

  164.         /** CCSDS Keyword: the type of the observation. */
  165.         private String keyword;

  166.         /** Epoch: the timetag of the observation. */
  167.         private AbsoluteDate epoch;

  168.         /** Measurement: the value of the observation. */
  169.         private double measurement;

  170.         /** Simple constructor.
  171.          * @param keyword the keyword
  172.          * @param epoch the timetag
  173.          * @param measurement the measurement
  174.          */
  175.         Observation(final String keyword, final AbsoluteDate epoch, final double measurement) {
  176.             this.keyword = keyword;
  177.             this.epoch = epoch;
  178.             this.measurement = measurement;
  179.         }

  180.         /** Getter for the keyword.
  181.          * @return the keyword
  182.          */
  183.         public String getKeyword() {
  184.             return keyword;
  185.         }

  186.         /** Setter for the keyword.
  187.          * @param keyword the keyword to set
  188.          */
  189.         public void setKeyword(final String keyword) {
  190.             this.keyword = keyword;
  191.         }

  192.         /** Getter for the epoch.
  193.          * @return the epoch
  194.          */
  195.         public AbsoluteDate getEpoch() {
  196.             return epoch;
  197.         }

  198.         /** Setter for the epoch.
  199.          * @param epoch the epoch to set
  200.          */
  201.         public void setEpoch(final AbsoluteDate epoch) {
  202.             this.epoch = epoch;
  203.         }

  204.         /** Getter for the measurement.
  205.          * @return the measurement
  206.          */
  207.         public double getMeasurement() {
  208.             return measurement;
  209.         }

  210.         /** Setter for the measurement.
  211.          * @param measurement the measurement to set
  212.          */
  213.         public void setMeasurement(final double measurement) {
  214.             this.measurement = measurement;
  215.         }
  216.     }

  217.     /** The TDMMetadata class gathers the meta-data present in the Tracking Data Message (TDM).<p>
  218.      *  References:<p>
  219.      *  <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).
  220.      *
  221.      * @author Maxime Journot
  222.      * @since 9.0
  223.      */
  224.     public static class TDMMetaData {

  225.         /** Time System used in the tracking data session. */
  226.         private CcsdsTimeScale timeSystem;

  227.         /** Start epoch of total time span covered by observations block. */
  228.         private AbsoluteDate startTime;

  229.         /** Start time as read in the file. */
  230.         private String startTimeString;
  231.         /** End epoch of total time span covered by observations block. */
  232.         private AbsoluteDate stopTime;

  233.         /** Stop time as read in the file. */
  234.         private String stopTimeString;

  235.         /** Map of participants in the tracking data session (minimum 1 and up to 5).<p>
  236.          *  Participants may include ground stations, spacecraft, and/or quasars.<p>
  237.          *  Participants represent the classical transmitting parties, transponding parties, and receiving parties.
  238.          */
  239.         private Map<Integer, String> participants;

  240.         /** Tracking mode associated with the Data Section of the segment.<p>
  241.          *  - SEQUENTIAL : Sequential signal path between participants (range, Doppler, angles and line of sight ionosphere calibration);<p>
  242.          *  - SINGLE_DIFF: Differenced data.
  243.          */
  244.         private String mode;

  245.         /** The path shall reflect the signal path by listing the index of each participant
  246.          *  in order, separated by commas, with no inserted white space.<p>
  247.          *  The integers 1, 2, 3, 4, 5 used to specify the signal path correlate
  248.          *  with the indices of the PARTICIPANT keywords.<p>
  249.          *  The first entry in the PATH shall be the transmit participant.<p>
  250.          *  The non-indexed ‘PATH’ keyword shall be used if the MODE is ‘SEQUENTIAL’.<p>
  251.          *  The indexed ‘PATH_1’ and ‘PATH_2’ keywords shall be used where the MODE is ‘SINGLE_DIFF’.
  252.          */
  253.         private String path;

  254.         /** Path 1 (see above). */
  255.         private String path1;

  256.         /** Path 2 (see above). */
  257.         private String path2;

  258.         /** Frequency band for transmitted frequencies. */
  259.         private String transmitBand;

  260.         /** Frequency band for received frequencies. */
  261.         private String receiveBand;

  262.         /** Turn-around ratio numerator.<p>
  263.          *  Numerator of the turn-around ratio that is necessary to calculate the coherent downlink from the uplink frequency.
  264.          */
  265.         private int turnaroundNumerator;

  266.         /** Turn-around ratio denominator .*/
  267.         private int turnaroundDenominator;

  268.         /** Timetag reference.<p>
  269.          *  Provides a reference for time tags in the tracking data.<p>
  270.          *  It indicates whether the timetag associated with the data is the transmit time or the receive time.
  271.          */
  272.         private String timetagRef;

  273.         /** Integration interval. <p>
  274.          *  Provides the Doppler count time in seconds for Doppler data or for the creation
  275.          *  of normal points.
  276.          */
  277.         private double integrationInterval;

  278.         /** Integration reference.<p>
  279.          *  Used in conjunction with timetag reference and integration interval.<p>
  280.          *  Indicates whether the timetag represents the start, middle or end of the integration interval.
  281.          */
  282.         private String integrationRef;

  283.         /** Frequency offset.<p>
  284.          *  A frequency in Hz that must be added to every RECEIVE_FREQ to reconstruct it.
  285.          */
  286.         private double freqOffset;

  287.         /** Range mode.<p>
  288.          *  COHERENT, CONSTANT or ONE_WAY.
  289.          */
  290.         private String rangeMode;

  291.         /** Range modulus.<p>
  292.          *  Modulus of the range observable in the units as specified by the RANGE_UNITS keyword.
  293.          */
  294.         private double rangeModulus;

  295.         /** Range units.<p>
  296.          *  The units for the range observable: 'km', 's' or 'RU' (for 'range units').
  297.          */
  298.         private String rangeUnits;

  299.         /** Angle type.<p>
  300.          *  Type of the antenna geometry represented in the angle data ANGLE_1 and ANGLE_2.<p>
  301.          *  – AZEL for azimuth, elevation (local horizontal);<p>
  302.          *  – RADEC for right ascension, declination or hour angle, declination (needs to be referenced to an inertial frame);<p>
  303.          *  – XEYN for x-east, y-north;<p>
  304.          *  – XSYE for x-south, y-east.<p>
  305.          *  Note: Angle units are always degrees
  306.          */
  307.         private String angleType;

  308.         /** The reference frame specifier, as it appeared in the file. */
  309.         private String referenceFrameString;

  310.         /** Reference frame in which data are given: used in combination with ANGLE_TYPE=RADEC. */
  311.         private Frame referenceFrame;

  312.         /** Transmit delays map.<p>
  313.          *  Specifies a fixed interval of time, in seconds, for the signal to travel from the transmitting
  314.          *  electronics to the transmit point. Each item in the list corresponds to the each participants.
  315.          */
  316.         private Map<Integer, Double> transmitDelays;

  317.         /** Receive delays list.<p>
  318.          *  Specifies a fixed interval of time, in seconds, for the signal to travel from the tracking
  319.          *  point to the receiving electronics. Each item in the list corresponds to the each participants.
  320.          */
  321.         private Map<Integer, Double> receiveDelays;

  322.         /** Data quality.<p>
  323.          *  Estimate of the quality of the data: RAW, DEGRADED or VALIDATED.
  324.          */
  325.         private String dataQuality;

  326.         /** Correction angle 1.<p>
  327.          *  Angle correction that has been added or should be added to the ANGLE_1 data.
  328.          */
  329.         private double correctionAngle1;

  330.         /** Correction angle 2.<p>
  331.          *  Angle correction that has been added or should be added to the ANGLE_2 data.
  332.          */
  333.         private double correctionAngle2;

  334.         /** Correction Doppler.<p>
  335.          *  Doppler correction that has been added or should be added to the DOPPLER data.
  336.          */
  337.         private double correctionDoppler;

  338.         /** Correction Range.<p>
  339.          *  Range correction that has been added or should be added to the RANGE data.
  340.          */
  341.         private double correctionRange;

  342.         /** Correction receive.<p>
  343.          *  Receive correction that has been added or should be added to the RECEIVE data.
  344.          */
  345.         private double correctionReceive;

  346.         /** Correction transmit.<p>
  347.          *  Transmit correction that has been added or should be added to the TRANSMIT data.
  348.          */
  349.         private double correctionTransmit;

  350.         /** Correction applied ? YES/NO<p>
  351.          *  Indicate whethers or not the values associated with the CORRECTION_* keywords have been
  352.          *  applied to the tracking data.
  353.          */
  354.         private String correctionsApplied;

  355.         /** Meta-data comments. The list contains a string for each line of comment. */
  356.         private List<String> comment;

  357.         /** Create a new TDM meta-data.
  358.          */
  359.         public TDMMetaData() {
  360.             participants   = new TreeMap<>();
  361.             transmitDelays = new TreeMap<>();
  362.             receiveDelays  = new TreeMap<>();
  363.             comment        = new ArrayList<>();
  364.         }


  365.         /** Get the Time System that: for OPM, is used for metadata, state vector,
  366.          * maneuver and covariance data, for OMM, is used for metadata, orbit state
  367.          * and covariance data, for OEM, is used for metadata, ephemeris and
  368.          * covariance data.
  369.          * @return the time system
  370.          */
  371.         public CcsdsTimeScale getTimeSystem() {
  372.             return timeSystem;
  373.         }

  374.         /** Set the Time System that: for OPM, is used for metadata, state vector,
  375.          * maneuver and covariance data, for OMM, is used for metadata, orbit state
  376.          * and covariance data, for OEM, is used for metadata, ephemeris and
  377.          * covariance data.
  378.          * @param timeSystem the time system to be set
  379.          */
  380.         public void setTimeSystem(final CcsdsTimeScale timeSystem) {
  381.             this.timeSystem = timeSystem;
  382.         }

  383.         /** Getter for the startTime.
  384.          * @return the startTime
  385.          */
  386.         public AbsoluteDate getStartTime() {
  387.             return startTime;
  388.         }

  389.         /** Setter for the startTime.
  390.          * @param startTime the startTime to set
  391.          */
  392.         public void setStartTime(final AbsoluteDate startTime) {
  393.             this.startTime = startTime;
  394.         }

  395.         /** Getter for the startTime String.
  396.          * @return the startTime String
  397.          */
  398.         public String getStartTimeString() {
  399.             return startTimeString;
  400.         }

  401.         /** Setter for the startTime String.
  402.          * @param startTimeString the startTime String to set
  403.          */
  404.         public void setStartTimeString(final String startTimeString) {
  405.             this.startTimeString = startTimeString;
  406.         }

  407.         /** Getter for the stopTime.
  408.          * @return the stopTime
  409.          */
  410.         public AbsoluteDate getStopTime() {
  411.             return stopTime;
  412.         }

  413.         /** Setter for the stopTime.
  414.          * @param stopTime the stopTime to set
  415.          */
  416.         public void setStopTime(final AbsoluteDate stopTime) {
  417.             this.stopTime = stopTime;
  418.         }

  419.         /** Getter for the stopTime String.
  420.          * @return the stopTime String
  421.          */
  422.         public String getStopTimeString() {
  423.             return stopTimeString;
  424.         }

  425.         /** Setter for the stopTime String.
  426.          * @param stopTimeString the stopTime String to set
  427.          */
  428.         public void setStopTimeString(final String stopTimeString) {
  429.             this.stopTimeString = stopTimeString;
  430.         }

  431.         /** Getter for the participants.
  432.          * @return the participants
  433.          */
  434.         public Map<Integer, String> getParticipants() {
  435.             return participants;
  436.         }

  437.         /** Setter for the participants.
  438.          * @param participants the participants to set
  439.          */
  440.         public void setParticipants(final Map<Integer, String> participants) {
  441.             this.participants = new TreeMap<Integer, String>();
  442.             this.participants.putAll(participants);
  443.         }

  444.         /** Adds a participant to the list.
  445.          * @param participantNumber the number of the participant to add
  446.          * @param participant the name of the participant to add
  447.          */
  448.         public void addParticipant(final int participantNumber, final String participant) {
  449.             this.participants.put(participantNumber, participant);
  450.         }

  451.         /** Getter for the mode.
  452.          * @return the mode
  453.          */
  454.         public String getMode() {
  455.             return mode;
  456.         }

  457.         /** Setter for the mode.
  458.          * @param mode the mode to set
  459.          */
  460.         public void setMode(final String mode) {
  461.             this.mode = mode;
  462.         }

  463.         /** Getter for the path.
  464.          * @return the path
  465.          */
  466.         public String getPath() {
  467.             return path;
  468.         }

  469.         /** Setter for the path.
  470.          * @param path the path to set
  471.          */
  472.         public void setPath(final String path) {
  473.             this.path = path;
  474.         }

  475.         /** Getter for the path1.
  476.          * @return the path1
  477.          */
  478.         public String getPath1() {
  479.             return path1;
  480.         }

  481.         /** Setter for the path1.
  482.          * @param path1 the path1 to set
  483.          */
  484.         public void setPath1(final String path1) {
  485.             this.path1 = path1;
  486.         }

  487.         /** Getter for the path2.
  488.          * @return the path2
  489.          */
  490.         public String getPath2() {
  491.             return path2;
  492.         }

  493.         /** Setter for the path2.
  494.          * @param path2 the path2 to set
  495.          */
  496.         public void setPath2(final String path2) {
  497.             this.path2 = path2;
  498.         }

  499.         /** Getter for the transmitBand.
  500.          * @return the transmitBand
  501.          */
  502.         public String getTransmitBand() {
  503.             return transmitBand;
  504.         }

  505.         /** Setter for the transmitBand.
  506.          * @param transmitBand the transmitBand to set
  507.          */
  508.         public void setTransmitBand(final String transmitBand) {
  509.             this.transmitBand = transmitBand;
  510.         }

  511.         /** Getter for the receiveBand.
  512.          * @return the receiveBand
  513.          */
  514.         public String getReceiveBand() {
  515.             return receiveBand;
  516.         }

  517.         /** Setter for the receiveBand.
  518.          * @param receiveBand the receiveBand to set
  519.          */
  520.         public void setReceiveBand(final String receiveBand) {
  521.             this.receiveBand = receiveBand;
  522.         }

  523.         /** Getter for the turnaroundNumerator.
  524.          * @return the turnaroundNumerator
  525.          */
  526.         public int getTurnaroundNumerator() {
  527.             return turnaroundNumerator;
  528.         }

  529.         /** Setter for the turnaroundNumerator.
  530.          * @param turnaroundNumerator the turnaroundNumerator to set
  531.          */
  532.         public void setTurnaroundNumerator(final int turnaroundNumerator) {
  533.             this.turnaroundNumerator = turnaroundNumerator;
  534.         }

  535.         /** Getter for the turnaroundDenominator.
  536.          * @return the turnaroundDenominator
  537.          */
  538.         public int getTurnaroundDenominator() {
  539.             return turnaroundDenominator;
  540.         }

  541.         /** Setter for the turnaroundDenominator.
  542.          * @param turnaroundDenominator the turnaroundDenominator to set
  543.          */
  544.         public void setTurnaroundDenominator(final int turnaroundDenominator) {
  545.             this.turnaroundDenominator = turnaroundDenominator;
  546.         }

  547.         /** Getter for the timetagRef.
  548.          * @return the timetagRef
  549.          */
  550.         public String getTimetagRef() {
  551.             return timetagRef;
  552.         }

  553.         /** Setter for the timetagRef.
  554.          * @param timetagRef the timetagRef to set
  555.          */
  556.         public void setTimetagRef(final String timetagRef) {
  557.             this.timetagRef = timetagRef;
  558.         }

  559.         /** Getter for the integrationInterval.
  560.          * @return the integrationInterval
  561.          */
  562.         public double getIntegrationInterval() {
  563.             return integrationInterval;
  564.         }

  565.         /** Setter for the integrationInterval.
  566.          * @param integrationInterval the integrationInterval to set
  567.          */
  568.         public void setIntegrationInterval(final double integrationInterval) {
  569.             this.integrationInterval = integrationInterval;
  570.         }

  571.         /** Getter for the integrationRef.
  572.          * @return the integrationRef
  573.          */
  574.         public String getIntegrationRef() {
  575.             return integrationRef;
  576.         }

  577.         /** Setter for the integrationRef.
  578.          * @param integrationRef the integrationRef to set
  579.          */
  580.         public void setIntegrationRef(final String integrationRef) {
  581.             this.integrationRef = integrationRef;
  582.         }

  583.         /** Getter for the freqOffset.
  584.          * @return the freqOffset
  585.          */
  586.         public double getFreqOffset() {
  587.             return freqOffset;
  588.         }

  589.         /** Setter for the freqOffset.
  590.          * @param freqOffset the freqOffset to set
  591.          */
  592.         public void setFreqOffset(final double freqOffset) {
  593.             this.freqOffset = freqOffset;
  594.         }

  595.         /** Getter for the rangeMode.
  596.          * @return the rangeMode
  597.          */
  598.         public String getRangeMode() {
  599.             return rangeMode;
  600.         }

  601.         /** Setter for the rangeMode.
  602.          * @param rangeMode the rangeMode to set
  603.          */
  604.         public void setRangeMode(final String rangeMode) {
  605.             this.rangeMode = rangeMode;
  606.         }

  607.         /** Getter for the rangeModulus.
  608.          * @return the rangeModulus
  609.          */
  610.         public double getRangeModulus() {
  611.             return rangeModulus;
  612.         }

  613.         /** Setter for the rangeModulus.
  614.          * @param rangeModulus the rangeModulus to set
  615.          */
  616.         public void setRangeModulus(final double rangeModulus) {
  617.             this.rangeModulus = rangeModulus;
  618.         }

  619.         /** Getter for the rangeUnits.
  620.          * @return the rangeUnits
  621.          */
  622.         public String getRangeUnits() {
  623.             return rangeUnits;
  624.         }

  625.         /** Setter for the rangeUnits.
  626.          * @param rangeUnits the rangeUnits to set
  627.          */
  628.         public void setRangeUnits(final String rangeUnits) {
  629.             this.rangeUnits = rangeUnits;
  630.         }

  631.         /** Getter for angleType.
  632.          * @return the angleType
  633.          */
  634.         public String getAngleType() {
  635.             return angleType;
  636.         }

  637.         /** Setter for the angleType.
  638.          * @param angleType the angleType to set
  639.          */
  640.         public void setAngleType(final String angleType) {
  641.             this.angleType = angleType;
  642.         }

  643.         /** Get the the value of {@code REFERENCE_FRAME} as an Orekit {@link Frame}.
  644.          * @return The reference frame specified by the {@code REFERENCE_FRAME} keyword.
  645.          */
  646.         public Frame getReferenceFrame() {
  647.             return referenceFrame;
  648.         }

  649.         /** Set the reference frame in which data are given: used for RADEC tracking data.
  650.          * @param refFrame the reference frame to be set
  651.          */
  652.         public void setReferenceFrame(final Frame refFrame) {
  653.             this.referenceFrame = refFrame;
  654.         }

  655.         /** Get the reference frame specifier as it appeared in the file.
  656.          * @return the frame name as it appeared in the file.
  657.          */
  658.         public String getReferenceFrameString() {
  659.             return this.referenceFrameString;
  660.         }

  661.         /** Set the reference frame name.
  662.          * @param frame specifier as it appeared in the file.
  663.          */
  664.         public void setReferenceFrameString(final String frame) {
  665.             this.referenceFrameString = frame;
  666.         }

  667.         /** Getter for the transmitDelays.
  668.          * @return the transmitDelays
  669.          */
  670.         public Map<Integer, Double> getTransmitDelays() {
  671.             return transmitDelays;
  672.         }

  673.         /** Setter for the transmitDelays.
  674.          * @param transmitDelays the transmitDelays to set
  675.          */
  676.         public void setTransmitDelays(final Map<Integer, Double> transmitDelays) {
  677.             this.transmitDelays = new TreeMap<Integer, Double>();
  678.             this.transmitDelays.putAll(transmitDelays);
  679.         }

  680.         /** Adds a transmit delay to the list.
  681.          *  @param participantNumber the number of the participants for which the transmit delay is given
  682.          *  @param transmitDelay the transmit delay value to add
  683.          */
  684.         public void addTransmitDelay(final int participantNumber, final double transmitDelay) {
  685.             this.transmitDelays.put(participantNumber, transmitDelay);
  686.         }

  687.         /** Getter for receiveDelays.
  688.          * @return the receiveDelays
  689.          */
  690.         public Map<Integer, Double> getReceiveDelays() {
  691.             return receiveDelays;
  692.         }

  693.         /** Setter for the receiveDelays.
  694.          * @param receiveDelays the receiveDelays to set
  695.          */
  696.         public void setReceiveDelays(final Map<Integer, Double> receiveDelays) {
  697.             this.receiveDelays = new TreeMap<Integer, Double>();
  698.             this.receiveDelays.putAll(receiveDelays);
  699.         }

  700.         /** Adds a receive delay to the list.
  701.          * @param participantNumber the number of the participants for which the receive delay is given
  702.          * @param receiveDelay the receive delay value to add
  703.          */
  704.         public void addReceiveDelay(final int participantNumber, final double receiveDelay) {
  705.             this.receiveDelays.put(participantNumber, receiveDelay);
  706.         }
  707.         /** Getter for the dataQuality.
  708.          * @return the dataQuality
  709.          */
  710.         public String getDataQuality() {
  711.             return dataQuality;
  712.         }

  713.         /** Setter for the dataQuality.
  714.          * @param dataQuality the dataQuality to set
  715.          */
  716.         public void setDataQuality(final String dataQuality) {
  717.             this.dataQuality = dataQuality;
  718.         }

  719.         /** Getter for the correctionAngle1.
  720.          * @return the correctionAngle1
  721.          */
  722.         public double getCorrectionAngle1() {
  723.             return correctionAngle1;
  724.         }

  725.         /** Setter for the correctionAngle1.
  726.          * @param correctionAngle1 the correctionAngle1 to set
  727.          */
  728.         public void setCorrectionAngle1(final double correctionAngle1) {
  729.             this.correctionAngle1 = correctionAngle1;
  730.         }

  731.         /** Getter for the correctionAngle2.
  732.          * @return the correctionAngle2
  733.          */
  734.         public double getCorrectionAngle2() {
  735.             return correctionAngle2;
  736.         }

  737.         /** Setter for the correctionAngle2.
  738.          * @param correctionAngle2 the correctionAngle2 to set
  739.          */
  740.         public void setCorrectionAngle2(final double correctionAngle2) {
  741.             this.correctionAngle2 = correctionAngle2;
  742.         }

  743.         /** Getter for the correctionDoppler.
  744.          * @return the correctionDoppler
  745.          */
  746.         public double getCorrectionDoppler() {
  747.             return correctionDoppler;
  748.         }

  749.         /** Setter for the correctionDoppler.
  750.          * @param correctionDoppler the correctionDoppler to set
  751.          */
  752.         public void setCorrectionDoppler(final double correctionDoppler) {
  753.             this.correctionDoppler = correctionDoppler;
  754.         }

  755.         /** Getter for the correctionRange.
  756.          * @return the correctionRange
  757.          */
  758.         public double getCorrectionRange() {
  759.             return correctionRange;
  760.         }

  761.         /** Setter for the correctionRange.
  762.          * @param correctionRange the correctionRange to set
  763.          */
  764.         public void setCorrectionRange(final double correctionRange) {
  765.             this.correctionRange = correctionRange;
  766.         }

  767.         /** Getter for the correctionReceive.
  768.          * @return the correctionReceive
  769.          */
  770.         public double getCorrectionReceive() {
  771.             return correctionReceive;
  772.         }

  773.         /** Setter for the correctionReceive.
  774.          * @param correctionReceive the correctionReceive to set
  775.          */
  776.         public void setCorrectionReceive(final double correctionReceive) {
  777.             this.correctionReceive = correctionReceive;
  778.         }

  779.         /** Getter for the correctionTransmit.
  780.          * @return the correctionTransmit
  781.          */
  782.         public double getCorrectionTransmit() {
  783.             return correctionTransmit;
  784.         }

  785.         /** Setter for the correctionTransmit.
  786.          * @param correctionTransmit the correctionTransmit to set
  787.          */
  788.         public void setCorrectionTransmit(final double correctionTransmit) {
  789.             this.correctionTransmit = correctionTransmit;
  790.         }

  791.         /** Getter for the correctionApplied.
  792.          * @return the correctionApplied
  793.          */
  794.         public String getCorrectionsApplied() {
  795.             return correctionsApplied;
  796.         }

  797.         /** Setter for the correctionApplied.
  798.          * @param correctionsApplied the correctionApplied to set
  799.          */
  800.         public void setCorrectionsApplied(final String correctionsApplied) {
  801.             this.correctionsApplied = correctionsApplied;
  802.         }

  803.         /** Get the meta-data comment.
  804.          * @return meta-data comment
  805.          */
  806.         public List<String> getComment() {
  807.             return Collections.unmodifiableList(comment);
  808.         }

  809.         /** Set the meta-data comment.
  810.          * @param comment comment to set
  811.          */
  812.         public void setComment(final List<String> comment) {
  813.             this.comment = new ArrayList<>(comment);
  814.         }
  815.     }
  816. }