TDMFile.java

  1. /* Copyright 2002-2018 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. 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 {

  39.     /** CCSDS Format version. */
  40.     private double formatVersion;

  41.     /** Header comments. The list contains a string for each line of comment. */
  42.     private List<String> headerComment;

  43.     /** File creation date and time in UTC. */
  44.     private AbsoluteDate creationDate;

  45.     /** Creating agency or operator. */
  46.     private String originator;

  47.     /** List of observation blocks. */
  48.     private List<ObservationsBlock> observationsBlocks;

  49.     /** OEMFile constructor. */
  50.     public TDMFile() {
  51.         observationsBlocks = new ArrayList<>();
  52.     }

  53.     /** Get the CCSDS TDM format version.
  54.      * @return format version
  55.      */
  56.     public double getFormatVersion() {
  57.         return formatVersion;
  58.     }

  59.     /** Set the CCSDS ODM (OPM, OMM or OEM) format version.
  60.      * @param formatVersion the format version to be set
  61.      */
  62.     public void setFormatVersion(final double formatVersion) {
  63.         this.formatVersion = formatVersion;
  64.     }

  65.     /** Get the header comment.
  66.      * @return header comment
  67.      */
  68.     public List<String> getHeaderComment() {
  69.         return headerComment;
  70.     }

  71.     /** Set the header comment.
  72.      * @param headerComment header comment
  73.      */
  74.     public void setHeaderComment(final List<String> headerComment) {
  75.         this.headerComment = new ArrayList<>(headerComment);
  76.     }

  77.     /** Get the file creation date and time in UTC.
  78.      * @return the file creation date and time in UTC.
  79.      */
  80.     public AbsoluteDate getCreationDate() {
  81.         return creationDate;
  82.     }

  83.     /** Set the file creation date and time in UTC.
  84.      * @param creationDate the creation date to be set
  85.      */
  86.     public void setCreationDate(final AbsoluteDate creationDate) {
  87.         this.creationDate = creationDate;
  88.     }

  89.     /** Get the file originator.
  90.      * @return originator the file originator.
  91.      */
  92.     public String getOriginator() {
  93.         return originator;
  94.     }

  95.     /** Set the file originator.
  96.      * @param originator the originator to be set
  97.      */
  98.     public void setOriginator(final String originator) {
  99.         this.originator = originator;
  100.     }

  101.     /** Add a block to the list of observations blocks. */
  102.     public void addObservationsBlock() {
  103.         observationsBlocks.add(new ObservationsBlock());
  104.     }

  105.     /** Get the list of observations blocks as an unmodifiable list.
  106.      * @return the list of observations blocks
  107.      */
  108.     public List<ObservationsBlock> getObservationsBlocks() {
  109.         return Collections.unmodifiableList(observationsBlocks);
  110.     }

  111.     /** Set the list of Observations Blocks.
  112.      * @param observationsBlocks the list of Observations Blocks to set
  113.      */
  114.     public void setObservationsBlocks(final List<ObservationsBlock> observationsBlocks) {
  115.         this.observationsBlocks = new ArrayList<>(observationsBlocks);
  116.     }

  117.     /** Check that, according to the CCSDS standard, every ObservationsBlock has the same time system.
  118.      *  @exception OrekitException if some blocks do not have the same time system
  119.      */
  120.     public void checkTimeSystems() throws OrekitException {
  121.         final CcsdsTimeScale timeSystem = getObservationsBlocks().get(0).getMetaData().getTimeSystem();
  122.         for (final ObservationsBlock block : observationsBlocks) {
  123.             if (!timeSystem.equals(block.getMetaData().getTimeSystem())) {
  124.                 throw new OrekitException(OrekitMessages.CCSDS_TDM_INCONSISTENT_TIME_SYSTEMS,
  125.                                           timeSystem, block.getMetaData().getTimeSystem());
  126.             }
  127.         }
  128.     }

  129.     /** The Observations Block class contain metadata and the list of observation data lines.<p>
  130.      * The reason for which the observations have been separated into blocks is that the different
  131.      * data blocks in a TDM file usually refers to different types of observations.<p>
  132.      * An observation block contains a TDM metadata object and a list of observations.<p>
  133.      * At this level, an observation is not an Orekit object, it is a custom object containing:<p>
  134.      *  - a keyword, the type of the observation;<p>
  135.      *  - a timetag, the date of the observation;<p>
  136.      *  - a measurement, the value of the observation.
  137.      * @author Maxime Journot
  138.      */
  139.     public static class ObservationsBlock {

  140.         /** Meta-data for the block. */
  141.         private TDMMetaData metaData;

  142.         /** List of observations data lines. */
  143.         private List<Observation> observations;

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

  146.         /** ObservationsBlock constructor. */
  147.         public ObservationsBlock() {
  148.             metaData = new TDMMetaData();
  149.             observations = new ArrayList<>();
  150.             observationsComment = new ArrayList<>();
  151.         }

  152.         /** Get the list of Observations data lines.
  153.          * @return a reference to the internal list of Observations data lines
  154.          */
  155.         public List<Observation> getObservations() {
  156.             return this.observations;
  157.         }

  158.         /** Set the list of Observations Data Lines.
  159.          * @param observations the list of Observations Data Lines to set
  160.          */
  161.         public void setObservations(final List<Observation> observations) {
  162.             this.observations = new ArrayList<>(observations);
  163.         }

  164.         /** Adds an observation data line.
  165.          * @param observation the observation to add to the list
  166.          */
  167.         public void addObservation(final Observation observation) {
  168.             this.observations.add(observation);
  169.         }

  170.         /** Adds an observation data line.
  171.          * @param keyword the keyword
  172.          * @param epoch the timetag
  173.          * @param measurement the measurement
  174.          */
  175.         public void addObservation(final String keyword,
  176.                                    final AbsoluteDate epoch,
  177.                                    final double measurement) {
  178.             this.addObservation(new Observation(keyword, epoch, measurement));
  179.         }

  180.         /** Get the meta-data for the block.
  181.          * @return meta-data for the block
  182.          */
  183.         public TDMMetaData getMetaData() {
  184.             return metaData;
  185.         }

  186.         /** Set the meta-data for the block.
  187.          * @param metaData the meta-data to set
  188.          */
  189.         public void setMetaData(final TDMMetaData metaData) {
  190.             this.metaData = metaData;
  191.         }

  192.         /** Get the observations data lines comment.
  193.          * @return the comment
  194.          */
  195.         public List<String> getObservationsComment() {
  196.             return observationsComment;
  197.         }

  198.         /** Set the observations data lines comment.
  199.          * @param observationsComment the comment to be set
  200.          */
  201.         public void setObservationsComment(final List<String> observationsComment) {
  202.             this.observationsComment = new ArrayList<>(observationsComment);
  203.         }

  204.         /** Add an observation data line comment.
  205.          *  @param observationComment the comment line to add
  206.          */
  207.         public void addObservationComment(final String observationComment) {
  208.             this.observationsComment.add(observationComment);
  209.         }

  210.     }

  211.     /** The Observation class contains the data from an observation line.<p>
  212.      * It is not an Orekit object yet.<p>
  213.      * It is a simple container holding:<p>
  214.      *  - a keyword, the type of the observation;<p>
  215.      *  - a timetag, the epoch of the observation;<p>
  216.      *  - a measurement, the value of the observation.<p>
  217.      * @see Keyword
  218.      * @author mjournot
  219.      */
  220.     public static class Observation {

  221.         /** CCSDS Keyword: the type of the observation. */
  222.         private String keyword;

  223.         /** Epoch: the timetag of the observation. */
  224.         private AbsoluteDate epoch;

  225.         /** Measurement: the value of the observation. */
  226.         private double measurement;

  227.         /** Simple constructor.
  228.          * @param keyword the keyword
  229.          * @param epoch the timetag
  230.          * @param measurement the measurement
  231.          */
  232.         Observation(final String keyword, final AbsoluteDate epoch, final double measurement) {
  233.             this.keyword = keyword;
  234.             this.epoch = epoch;
  235.             this.measurement = measurement;
  236.         }

  237.         /** Getter for the keyword.
  238.          * @return the keyword
  239.          */
  240.         public String getKeyword() {
  241.             return keyword;
  242.         }

  243.         /** Setter for the keyword.
  244.          * @param keyword the keyword to set
  245.          */
  246.         public void setKeyword(final String keyword) {
  247.             this.keyword = keyword;
  248.         }

  249.         /** Getter for the epoch.
  250.          * @return the epoch
  251.          */
  252.         public AbsoluteDate getEpoch() {
  253.             return epoch;
  254.         }

  255.         /** Setter for the epoch.
  256.          * @param epoch the epoch to set
  257.          */
  258.         public void setEpoch(final AbsoluteDate epoch) {
  259.             this.epoch = epoch;
  260.         }

  261.         /** Getter for the measurement.
  262.          * @return the measurement
  263.          */
  264.         public double getMeasurement() {
  265.             return measurement;
  266.         }

  267.         /** Setter for the measurement.
  268.          * @param measurement the measurement to set
  269.          */
  270.         public void setMeasurement(final double measurement) {
  271.             this.measurement = measurement;
  272.         }
  273.     }

  274.     /** The TDMMetadata class gathers the meta-data present in the Tracking Data Message (TDM).<p>
  275.      *  References:<p>
  276.      *  <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).
  277.      *
  278.      * @author Maxime Journot
  279.      * @since 9.0
  280.      */
  281.     public static class TDMMetaData {

  282.         /** Time System used in the tracking data session. */
  283.         private CcsdsTimeScale timeSystem;

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

  286.         /** Start time as read in the file. */
  287.         private String startTimeString;
  288.         /** End epoch of total time span covered by observations block. */
  289.         private AbsoluteDate stopTime;

  290.         /** Stop time as read in the file. */
  291.         private String stopTimeString;

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

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

  302.         /** The path shall reflect the signal path by listing the index of each participant
  303.          *  in order, separated by commas, with no inserted white space.<p>
  304.          *  The integers 1, 2, 3, 4, 5 used to specify the signal path correlate
  305.          *  with the indices of the PARTICIPANT keywords.<p>
  306.          *  The first entry in the PATH shall be the transmit participant.<p>
  307.          *  The non-indexed ‘PATH’ keyword shall be used if the MODE is ‘SEQUENTIAL’.<p>
  308.          *  The indexed ‘PATH_1’ and ‘PATH_2’ keywords shall be used where the MODE is ‘SINGLE_DIFF’.
  309.          */
  310.         private String path;

  311.         /** Path 1 (see above). */
  312.         private String path1;

  313.         /** Path 2 (see above). */
  314.         private String path2;

  315.         /** Frequency band for transmitted frequencies. */
  316.         private String transmitBand;

  317.         /** Frequency band for received frequencies. */
  318.         private String receiveBand;

  319.         /** Turn-around ratio numerator.<p>
  320.          *  Numerator of the turn-around ratio that is necessary to calculate the coherent downlink from the uplink frequency.
  321.          */
  322.         private int turnaroundNumerator;

  323.         /** Turn-around ratio denominator .*/
  324.         private int turnaroundDenominator;

  325.         /** Timetag reference.<p>
  326.          *  Provides a reference for time tags in the tracking data.<p>
  327.          *  It indicates whether the timetag associated with the data is the transmit time or the receive time.
  328.          */
  329.         private String timetagRef;

  330.         /** Integration interval. <p>
  331.          *  Provides the Doppler count time in seconds for Doppler data or for the creation
  332.          *  of normal points.
  333.          */
  334.         private double integrationInterval;

  335.         /** Integration reference.<p>
  336.          *  Used in conjunction with timetag reference and integration interval.<p>
  337.          *  Indicates whether the timetag represents the start, middle or end of the integration interval.
  338.          */
  339.         private String integrationRef;

  340.         /** Frequency offset.<p>
  341.          *  A frequency in Hz that must be added to every RECEIVE_FREQ to reconstruct it.
  342.          */
  343.         private double freqOffset;

  344.         /** Range mode.<p>
  345.          *  COHERENT, CONSTANT or ONE_WAY.
  346.          */
  347.         private String rangeMode;

  348.         /** Range modulus.<p>
  349.          *  Modulus of the range observable in the units as specified by the RANGE_UNITS keyword.
  350.          */
  351.         private double rangeModulus;

  352.         /** Range units.<p>
  353.          *  The units for the range observable: 'km', 's' or 'RU' (for 'range units').
  354.          */
  355.         private String rangeUnits;

  356.         /** Angle type.<p>
  357.          *  Type of the antenna geometry represented in the angle data ANGLE_1 and ANGLE_2.<p>
  358.          *  – AZEL for azimuth, elevation (local horizontal);<p>
  359.          *  – RADEC for right ascension, declination or hour angle, declination (needs to be referenced to an inertial frame);<p>
  360.          *  – XEYN for x-east, y-north;<p>
  361.          *  – XSYE for x-south, y-east.<p>
  362.          *  Note: Angle units are always degrees
  363.          */
  364.         private String angleType;

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

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

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

  374.         /** Receive delays list.<p>
  375.          *  Specifies a fixed interval of time, in seconds, for the signal to travel from the tracking
  376.          *  point to the receiving electronics. Each item in the list corresponds to the each participants.
  377.          */
  378.         private Map<Integer, Double> receiveDelays;

  379.         /** Data quality.<p>
  380.          *  Estimate of the quality of the data: RAW, DEGRADED or VALIDATED.
  381.          */
  382.         private String dataQuality;

  383.         /** Correction angle 1.<p>
  384.          *  Angle correction that has been added or should be added to the ANGLE_1 data.
  385.          */
  386.         private double correctionAngle1;

  387.         /** Correction angle 2.<p>
  388.          *  Angle correction that has been added or should be added to the ANGLE_2 data.
  389.          */
  390.         private double correctionAngle2;

  391.         /** Correction Doppler.<p>
  392.          *  Doppler correction that has been added or should be added to the DOPPLER data.
  393.          */
  394.         private double correctionDoppler;

  395.         /** Correction Range.<p>
  396.          *  Range correction that has been added or should be added to the RANGE data.
  397.          */
  398.         private double correctionRange;

  399.         /** Correction receive.<p>
  400.          *  Receive correction that has been added or should be added to the RECEIVE data.
  401.          */
  402.         private double correctionReceive;

  403.         /** Correction transmit.<p>
  404.          *  Transmit correction that has been added or should be added to the TRANSMIT data.
  405.          */
  406.         private double correctionTransmit;

  407.         /** Correction applied ? YES/NO<p>
  408.          *  Indicate whethers or not the values associated with the CORRECTION_* keywords have been
  409.          *  applied to the tracking data.
  410.          */
  411.         private String correctionsApplied;

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

  414.         /** Create a new TDM meta-data.
  415.          */
  416.         public TDMMetaData() {
  417.             participants   = new TreeMap<>();
  418.             transmitDelays = new TreeMap<>();
  419.             receiveDelays  = new TreeMap<>();
  420.             comment        = new ArrayList<>();
  421.         }


  422.         /** Get the Time System that: for OPM, is used for metadata, state vector,
  423.          * maneuver and covariance data, for OMM, is used for metadata, orbit state
  424.          * and covariance data, for OEM, is used for metadata, ephemeris and
  425.          * covariance data.
  426.          * @return the time system
  427.          */
  428.         public CcsdsTimeScale getTimeSystem() {
  429.             return timeSystem;
  430.         }

  431.         /** Set the Time System that: for OPM, is used for metadata, state vector,
  432.          * maneuver and covariance data, for OMM, is used for metadata, orbit state
  433.          * and covariance data, for OEM, is used for metadata, ephemeris and
  434.          * covariance data.
  435.          * @param timeSystem the time system to be set
  436.          */
  437.         public void setTimeSystem(final CcsdsTimeScale timeSystem) {
  438.             this.timeSystem = timeSystem;
  439.         }

  440.         /** Getter for the startTime.
  441.          * @return the startTime
  442.          */
  443.         public AbsoluteDate getStartTime() {
  444.             return startTime;
  445.         }

  446.         /** Setter for the startTime.
  447.          * @param startTime the startTime to set
  448.          */
  449.         public void setStartTime(final AbsoluteDate startTime) {
  450.             this.startTime = startTime;
  451.         }

  452.         /** Getter for the startTime String.
  453.          * @return the startTime String
  454.          */
  455.         public String getStartTimeString() {
  456.             return startTimeString;
  457.         }

  458.         /** Setter for the startTime String.
  459.          * @param startTimeString the startTime String to set
  460.          */
  461.         public void setStartTimeString(final String startTimeString) {
  462.             this.startTimeString = startTimeString;
  463.         }

  464.         /** Getter for the stopTime.
  465.          * @return the stopTime
  466.          */
  467.         public AbsoluteDate getStopTime() {
  468.             return stopTime;
  469.         }

  470.         /** Setter for the stopTime.
  471.          * @param stopTime the stopTime to set
  472.          */
  473.         public void setStopTime(final AbsoluteDate stopTime) {
  474.             this.stopTime = stopTime;
  475.         }

  476.         /** Getter for the stopTime String.
  477.          * @return the stopTime String
  478.          */
  479.         public String getStopTimeString() {
  480.             return stopTimeString;
  481.         }

  482.         /** Setter for the stopTime String.
  483.          * @param stopTimeString the stopTime String to set
  484.          */
  485.         public void setStopTimeString(final String stopTimeString) {
  486.             this.stopTimeString = stopTimeString;
  487.         }

  488.         /** Getter for the participants.
  489.          * @return the participants
  490.          */
  491.         public Map<Integer, String> getParticipants() {
  492.             return participants;
  493.         }

  494.         /** Setter for the participants.
  495.          * @param participants the participants to set
  496.          */
  497.         public void setParticipants(final Map<Integer, String> participants) {
  498.             this.participants = new TreeMap<Integer, String>();
  499.             this.participants.putAll(participants);
  500.         }

  501.         /** Adds a participant to the list.
  502.          * @param participantNumber the number of the participant to add
  503.          * @param participant the name of the participant to add
  504.          */
  505.         public void addParticipant(final int participantNumber, final String participant) {
  506.             this.participants.put(participantNumber, participant);
  507.         }

  508.         /** Getter for the mode.
  509.          * @return the mode
  510.          */
  511.         public String getMode() {
  512.             return mode;
  513.         }

  514.         /** Setter for the mode.
  515.          * @param mode the mode to set
  516.          */
  517.         public void setMode(final String mode) {
  518.             this.mode = mode;
  519.         }

  520.         /** Getter for the path.
  521.          * @return the path
  522.          */
  523.         public String getPath() {
  524.             return path;
  525.         }

  526.         /** Setter for the path.
  527.          * @param path the path to set
  528.          */
  529.         public void setPath(final String path) {
  530.             this.path = path;
  531.         }

  532.         /** Getter for the path1.
  533.          * @return the path1
  534.          */
  535.         public String getPath1() {
  536.             return path1;
  537.         }

  538.         /** Setter for the path1.
  539.          * @param path1 the path1 to set
  540.          */
  541.         public void setPath1(final String path1) {
  542.             this.path1 = path1;
  543.         }

  544.         /** Getter for the path2.
  545.          * @return the path2
  546.          */
  547.         public String getPath2() {
  548.             return path2;
  549.         }

  550.         /** Setter for the path2.
  551.          * @param path2 the path2 to set
  552.          */
  553.         public void setPath2(final String path2) {
  554.             this.path2 = path2;
  555.         }

  556.         /** Getter for the transmitBand.
  557.          * @return the transmitBand
  558.          */
  559.         public String getTransmitBand() {
  560.             return transmitBand;
  561.         }

  562.         /** Setter for the transmitBand.
  563.          * @param transmitBand the transmitBand to set
  564.          */
  565.         public void setTransmitBand(final String transmitBand) {
  566.             this.transmitBand = transmitBand;
  567.         }

  568.         /** Getter for the receiveBand.
  569.          * @return the receiveBand
  570.          */
  571.         public String getReceiveBand() {
  572.             return receiveBand;
  573.         }

  574.         /** Setter for the receiveBand.
  575.          * @param receiveBand the receiveBand to set
  576.          */
  577.         public void setReceiveBand(final String receiveBand) {
  578.             this.receiveBand = receiveBand;
  579.         }

  580.         /** Getter for the turnaroundNumerator.
  581.          * @return the turnaroundNumerator
  582.          */
  583.         public int getTurnaroundNumerator() {
  584.             return turnaroundNumerator;
  585.         }

  586.         /** Setter for the turnaroundNumerator.
  587.          * @param turnaroundNumerator the turnaroundNumerator to set
  588.          */
  589.         public void setTurnaroundNumerator(final int turnaroundNumerator) {
  590.             this.turnaroundNumerator = turnaroundNumerator;
  591.         }

  592.         /** Getter for the turnaroundDenominator.
  593.          * @return the turnaroundDenominator
  594.          */
  595.         public int getTurnaroundDenominator() {
  596.             return turnaroundDenominator;
  597.         }

  598.         /** Setter for the turnaroundDenominator.
  599.          * @param turnaroundDenominator the turnaroundDenominator to set
  600.          */
  601.         public void setTurnaroundDenominator(final int turnaroundDenominator) {
  602.             this.turnaroundDenominator = turnaroundDenominator;
  603.         }

  604.         /** Getter for the timetagRef.
  605.          * @return the timetagRef
  606.          */
  607.         public String getTimetagRef() {
  608.             return timetagRef;
  609.         }

  610.         /** Setter for the timetagRef.
  611.          * @param timetagRef the timetagRef to set
  612.          */
  613.         public void setTimetagRef(final String timetagRef) {
  614.             this.timetagRef = timetagRef;
  615.         }

  616.         /** Getter for the integrationInterval.
  617.          * @return the integrationInterval
  618.          */
  619.         public double getIntegrationInterval() {
  620.             return integrationInterval;
  621.         }

  622.         /** Setter for the integrationInterval.
  623.          * @param integrationInterval the integrationInterval to set
  624.          */
  625.         public void setIntegrationInterval(final double integrationInterval) {
  626.             this.integrationInterval = integrationInterval;
  627.         }

  628.         /** Getter for the integrationRef.
  629.          * @return the integrationRef
  630.          */
  631.         public String getIntegrationRef() {
  632.             return integrationRef;
  633.         }

  634.         /** Setter for the integrationRef.
  635.          * @param integrationRef the integrationRef to set
  636.          */
  637.         public void setIntegrationRef(final String integrationRef) {
  638.             this.integrationRef = integrationRef;
  639.         }

  640.         /** Getter for the freqOffset.
  641.          * @return the freqOffset
  642.          */
  643.         public double getFreqOffset() {
  644.             return freqOffset;
  645.         }

  646.         /** Setter for the freqOffset.
  647.          * @param freqOffset the freqOffset to set
  648.          */
  649.         public void setFreqOffset(final double freqOffset) {
  650.             this.freqOffset = freqOffset;
  651.         }

  652.         /** Getter for the rangeMode.
  653.          * @return the rangeMode
  654.          */
  655.         public String getRangeMode() {
  656.             return rangeMode;
  657.         }

  658.         /** Setter for the rangeMode.
  659.          * @param rangeMode the rangeMode to set
  660.          */
  661.         public void setRangeMode(final String rangeMode) {
  662.             this.rangeMode = rangeMode;
  663.         }

  664.         /** Getter for the rangeModulus.
  665.          * @return the rangeModulus
  666.          */
  667.         public double getRangeModulus() {
  668.             return rangeModulus;
  669.         }

  670.         /** Setter for the rangeModulus.
  671.          * @param rangeModulus the rangeModulus to set
  672.          */
  673.         public void setRangeModulus(final double rangeModulus) {
  674.             this.rangeModulus = rangeModulus;
  675.         }

  676.         /** Getter for the rangeUnits.
  677.          * @return the rangeUnits
  678.          */
  679.         public String getRangeUnits() {
  680.             return rangeUnits;
  681.         }

  682.         /** Setter for the rangeUnits.
  683.          * @param rangeUnits the rangeUnits to set
  684.          */
  685.         public void setRangeUnits(final String rangeUnits) {
  686.             this.rangeUnits = rangeUnits;
  687.         }

  688.         /** Getter for angleType.
  689.          * @return the angleType
  690.          */
  691.         public String getAngleType() {
  692.             return angleType;
  693.         }

  694.         /** Setter for the angleType.
  695.          * @param angleType the angleType to set
  696.          */
  697.         public void setAngleType(final String angleType) {
  698.             this.angleType = angleType;
  699.         }

  700.         /** Get the the value of {@code REFERENCE_FRAME} as an Orekit {@link Frame}.
  701.          * @return The reference frame specified by the {@code REFERENCE_FRAME} keyword.
  702.          */
  703.         public Frame getReferenceFrame() {
  704.             return referenceFrame;
  705.         }

  706.         /** Set the reference frame in which data are given: used for RADEC tracking data.
  707.          * @param refFrame the reference frame to be set
  708.          */
  709.         public void setReferenceFrame(final Frame refFrame) {
  710.             this.referenceFrame = refFrame;
  711.         }

  712.         /** Get the reference frame specifier as it appeared in the file.
  713.          * @return the frame name as it appeared in the file.
  714.          */
  715.         public String getReferenceFrameString() {
  716.             return this.referenceFrameString;
  717.         }

  718.         /** Set the reference frame name.
  719.          * @param frame specifier as it appeared in the file.
  720.          */
  721.         public void setReferenceFrameString(final String frame) {
  722.             this.referenceFrameString = frame;
  723.         }

  724.         /** Getter for the transmitDelays.
  725.          * @return the transmitDelays
  726.          */
  727.         public Map<Integer, Double> getTransmitDelays() {
  728.             return transmitDelays;
  729.         }

  730.         /** Setter for the transmitDelays.
  731.          * @param transmitDelays the transmitDelays to set
  732.          */
  733.         public void setTransmitDelays(final Map<Integer, Double> transmitDelays) {
  734.             this.transmitDelays = new TreeMap<Integer, Double>();
  735.             this.transmitDelays.putAll(transmitDelays);
  736.         }

  737.         /** Adds a transmit delay to the list.
  738.          *  @param participantNumber the number of the participants for which the transmit delay is given
  739.          *  @param transmitDelay the transmit delay value to add
  740.          */
  741.         public void addTransmitDelay(final int participantNumber, final double transmitDelay) {
  742.             this.transmitDelays.put(participantNumber, transmitDelay);
  743.         }

  744.         /** Getter for receiveDelays.
  745.          * @return the receiveDelays
  746.          */
  747.         public Map<Integer, Double> getReceiveDelays() {
  748.             return receiveDelays;
  749.         }

  750.         /** Setter for the receiveDelays.
  751.          * @param receiveDelays the receiveDelays to set
  752.          */
  753.         public void setReceiveDelays(final Map<Integer, Double> receiveDelays) {
  754.             this.receiveDelays = new TreeMap<Integer, Double>();
  755.             this.receiveDelays.putAll(receiveDelays);
  756.         }

  757.         /** Adds a receive delay to the list.
  758.          * @param participantNumber the number of the participants for which the receive delay is given
  759.          * @param receiveDelay the receive delay value to add
  760.          */
  761.         public void addReceiveDelay(final int participantNumber, final double receiveDelay) {
  762.             this.receiveDelays.put(participantNumber, receiveDelay);
  763.         }
  764.         /** Getter for the dataQuality.
  765.          * @return the dataQuality
  766.          */
  767.         public String getDataQuality() {
  768.             return dataQuality;
  769.         }

  770.         /** Setter for the dataQuality.
  771.          * @param dataQuality the dataQuality to set
  772.          */
  773.         public void setDataQuality(final String dataQuality) {
  774.             this.dataQuality = dataQuality;
  775.         }

  776.         /** Getter for the correctionAngle1.
  777.          * @return the correctionAngle1
  778.          */
  779.         public double getCorrectionAngle1() {
  780.             return correctionAngle1;
  781.         }

  782.         /** Setter for the correctionAngle1.
  783.          * @param correctionAngle1 the correctionAngle1 to set
  784.          */
  785.         public void setCorrectionAngle1(final double correctionAngle1) {
  786.             this.correctionAngle1 = correctionAngle1;
  787.         }

  788.         /** Getter for the correctionAngle2.
  789.          * @return the correctionAngle2
  790.          */
  791.         public double getCorrectionAngle2() {
  792.             return correctionAngle2;
  793.         }

  794.         /** Setter for the correctionAngle2.
  795.          * @param correctionAngle2 the correctionAngle2 to set
  796.          */
  797.         public void setCorrectionAngle2(final double correctionAngle2) {
  798.             this.correctionAngle2 = correctionAngle2;
  799.         }

  800.         /** Getter for the correctionDoppler.
  801.          * @return the correctionDoppler
  802.          */
  803.         public double getCorrectionDoppler() {
  804.             return correctionDoppler;
  805.         }

  806.         /** Setter for the correctionDoppler.
  807.          * @param correctionDoppler the correctionDoppler to set
  808.          */
  809.         public void setCorrectionDoppler(final double correctionDoppler) {
  810.             this.correctionDoppler = correctionDoppler;
  811.         }

  812.         /** Getter for the correctionRange.
  813.          * @return the correctionRange
  814.          */
  815.         public double getCorrectionRange() {
  816.             return correctionRange;
  817.         }

  818.         /** Setter for the correctionRange.
  819.          * @param correctionRange the correctionRange to set
  820.          */
  821.         public void setCorrectionRange(final double correctionRange) {
  822.             this.correctionRange = correctionRange;
  823.         }

  824.         /** Getter for the correctionReceive.
  825.          * @return the correctionReceive
  826.          */
  827.         public double getCorrectionReceive() {
  828.             return correctionReceive;
  829.         }

  830.         /** Setter for the correctionReceive.
  831.          * @param correctionReceive the correctionReceive to set
  832.          */
  833.         public void setCorrectionReceive(final double correctionReceive) {
  834.             this.correctionReceive = correctionReceive;
  835.         }

  836.         /** Getter for the correctionTransmit.
  837.          * @return the correctionTransmit
  838.          */
  839.         public double getCorrectionTransmit() {
  840.             return correctionTransmit;
  841.         }

  842.         /** Setter for the correctionTransmit.
  843.          * @param correctionTransmit the correctionTransmit to set
  844.          */
  845.         public void setCorrectionTransmit(final double correctionTransmit) {
  846.             this.correctionTransmit = correctionTransmit;
  847.         }

  848.         /** Getter for the correctionApplied.
  849.          * @return the correctionApplied
  850.          */
  851.         public String getCorrectionsApplied() {
  852.             return correctionsApplied;
  853.         }

  854.         /** Setter for the correctionApplied.
  855.          * @param correctionsApplied the correctionApplied to set
  856.          */
  857.         public void setCorrectionsApplied(final String correctionsApplied) {
  858.             this.correctionsApplied = correctionsApplied;
  859.         }

  860.         /** Get the meta-data comment.
  861.          * @return meta-data comment
  862.          */
  863.         public List<String> getComment() {
  864.             return Collections.unmodifiableList(comment);
  865.         }

  866.         /** Set the meta-data comment.
  867.          * @param comment comment to set
  868.          */
  869.         public void setComment(final List<String> comment) {
  870.             this.comment = new ArrayList<>(comment);
  871.         }
  872.     }
  873. }