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 {

  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.      */
  119.     public void checkTimeSystems() {
  120.         final CcsdsTimeScale timeSystem = getObservationsBlocks().get(0).getMetaData().getTimeSystem();
  121.         for (final ObservationsBlock block : observationsBlocks) {
  122.             if (!timeSystem.equals(block.getMetaData().getTimeSystem())) {
  123.                 throw new OrekitException(OrekitMessages.CCSDS_TDM_INCONSISTENT_TIME_SYSTEMS,
  124.                                           timeSystem, block.getMetaData().getTimeSystem());
  125.             }
  126.         }
  127.     }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  209.     }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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