1   /* Copyright 2002-2024 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.rinex.observation;
18  
19  import java.util.ArrayList;
20  import java.util.Collections;
21  import java.util.HashMap;
22  import java.util.List;
23  import java.util.Map;
24  
25  import org.hipparchus.geometry.euclidean.threed.Vector3D;
26  import org.hipparchus.geometry.euclidean.twod.Vector2D;
27  import org.orekit.files.rinex.AppliedDCBS;
28  import org.orekit.files.rinex.AppliedPCVS;
29  import org.orekit.files.rinex.section.RinexBaseHeader;
30  import org.orekit.files.rinex.utils.RinexFileType;
31  import org.orekit.gnss.ObservationType;
32  import org.orekit.gnss.SatInSystem;
33  import org.orekit.gnss.SatelliteSystem;
34  import org.orekit.time.AbsoluteDate;
35  
36  /** Container for Rinex observation file header.
37   * @since 9.2
38   */
39  public class RinexObservationHeader extends RinexBaseHeader {
40  
41      /** Name of the Antenna Marker. */
42      private String markerName;
43  
44      /** Number of Antenna marker. */
45      private String markerNumber;
46  
47      /** Type of Antenna marker. */
48      private String markerType;
49  
50      /** Name of Observer. */
51      private String observerName;
52  
53      /** Name of Agency. */
54      private String agencyName;
55  
56      /** Receiver Number. */
57      private String receiverNumber;
58  
59      /** Receiver Type. */
60      private String receiverType;
61  
62      /** Receiver version. */
63      private String receiverVersion;
64  
65      /** Antenna Number. */
66      private String antennaNumber;
67  
68      /** Antenna Type. */
69      private String antennaType;
70  
71      /** Approximate Marker Position (WGS84). */
72      private Vector3D approxPos;
73  
74      /** Antenna Height. */
75      private double antennaHeight;
76  
77      /** Eccentricities of antenna center. */
78      private Vector2D eccentricities;
79  
80      /** Position of antenna reference point for antenna on vehicle. */
81      private Vector3D antRefPoint;
82  
83      /** Satellite system for average phasecenter position.
84       * @since 12.0
85       */
86      private SatelliteSystem phaseCenterSystem;
87  
88      /** Observation code of the average phasecenter position w/r to antenna reference point. */
89      private String observationCode;
90  
91      /** Antenna phasecenter.
92       * North/East/Up (fixed station) or X/Y/Z in body fixed system (vehicle). */
93      private Vector3D antennaPhaseCenter;
94  
95      /** Antenna B.Sight.
96       * Direction of the “vertical” antenna axis towards the GNSS satellites.  */
97      private Vector3D antennaBSight;
98  
99      /** Azimuth of the zero direction of a fixed antenna (degrees, from north). */
100     private double antennaAzimuth;
101 
102     /** Zero direction of antenna. */
103     private Vector3D antennaZeroDirection;
104 
105     /** Current center of mass (X,Y,Z, meters) of vehicle in body fixed coordinate system. */
106     private Vector3D centerMass;
107 
108     /** Unit of the carrier to noise ratio observables Snn (if present) DBHZ: S/N given in dbHz. */
109     private String signalStrengthUnit;
110 
111     /** Observation interval in seconds. */
112     private double interval;
113 
114     /** Time of First observation record. */
115     private AbsoluteDate tFirstObs;
116 
117     /** Time of last observation record. */
118     private AbsoluteDate tLastObs;
119 
120     /** Real time-derived receiver clock offset. */
121     private int clkOffset;
122 
123     /** List of applied differential code bias corrections. */
124     private List<AppliedDCBS> listAppliedDCBS;
125 
126     /** List of antenna center variation corrections. */
127     private List<AppliedPCVS> listAppliedPCVS;
128 
129     /** List of phase shift correction used to generate phases consistent w/r to cycle shifts. */
130     private List<PhaseShiftCorrection> phaseShiftCorrections;
131 
132     /** List of scale factor corrections. */
133     private Map<SatelliteSystem, List<ScaleFactorCorrection>> scaleFactorCorrections;
134 
135     /** List of GLONASS satellite-channel associations.
136      * @since 12.0
137      */
138     private final List<GlonassSatelliteChannel> glonassChannels;
139 
140     /** Number of satellites.
141      * @since 12.0
142      */
143     private int nbSat;
144 
145     /** Number of observations per satellite.
146      * @since 12.0
147      */
148     private final Map<SatInSystem, Map<ObservationType, Integer>> nbObsPerSat;
149 
150     /** Observation types for each satellite systems.
151      * @since 12.0
152      */
153     private final Map<SatelliteSystem, List<ObservationType>> mapTypeObs;
154 
155     /** Number of leap seconds since 6-Jan-1980. */
156     private int leapSeconds;
157 
158     /** Future or past leap seconds ΔtLSF (BNK).
159      * i.e. future leap second if the week and day number are in the future.
160      */
161     private int leapSecondsFuture;
162 
163     /** Respective leap second week number.
164      * For GPS, GAL, QZS and IRN, weeks since 6-Jan-1980.
165      * When BDS only file leap seconds specified, weeks since 1-Jan-2006
166      */
167     private int leapSecondsWeekNum;
168 
169     /** Respective leap second day number. */
170     private int leapSecondsDayNum;
171 
172     /** Code phase bias correction for GLONASS C1C signal.
173      * @since 12.0
174      */
175     private double c1cCodePhaseBias;
176 
177     /** Code phase bias correction for GLONASS C1P signal.
178      * @since 12.0
179      */
180     private double c1pCodePhaseBias;
181 
182     /** Code phase bias correction for GLONASS C2C signal.
183      * @since 12.0
184      */
185     private double c2cCodePhaseBias;
186 
187     /** Code phase bias correction for GLONASS C2P signal.
188      * @since 12.0
189      */
190     private double c2pCodePhaseBias;
191 
192     /** Simple constructor.
193      */
194     public RinexObservationHeader() {
195         super(RinexFileType.OBSERVATION);
196         antennaAzimuth         = Double.NaN;
197         antennaHeight          = Double.NaN;
198         eccentricities         = Vector2D.ZERO;
199         clkOffset              = -1;
200         nbSat                  = -1;
201         interval               = Double.NaN;
202         leapSeconds            = 0;
203         listAppliedDCBS        = new ArrayList<>();
204         listAppliedPCVS        = new ArrayList<>();
205         phaseShiftCorrections  = new ArrayList<>();
206         scaleFactorCorrections = new HashMap<>();
207         glonassChannels        = new ArrayList<>();
208         nbObsPerSat            = new HashMap<>();
209         mapTypeObs             = new HashMap<>();
210         tLastObs               = AbsoluteDate.FUTURE_INFINITY;
211         c1cCodePhaseBias       = Double.NaN;
212         c1pCodePhaseBias       = Double.NaN;
213         c2cCodePhaseBias       = Double.NaN;
214         c2pCodePhaseBias       = Double.NaN;
215     }
216 
217     /** Set name of the antenna marker.
218      * @param markerName name of the antenna marker
219      */
220     public void setMarkerName(final String markerName) {
221         this.markerName = markerName;
222     }
223 
224     /** Get name of the antenna marker.
225      * @return name of the antenna marker
226      */
227     public String getMarkerName() {
228         return markerName;
229     }
230 
231     /** Set number of the antenna marker.
232      * @param markerNumber number of the antenna marker
233      */
234     public void setMarkerNumber(final String markerNumber) {
235         this.markerNumber = markerNumber;
236     }
237 
238     /** Get number of the antenna marker.
239      * @return number of the antenna marker
240      */
241     public String getMarkerNumber() {
242         return markerNumber;
243     }
244 
245     /** Set name of the observer.
246      * @param observerName name of the observer
247      */
248     public void setObserverName(final String observerName) {
249         this.observerName = observerName;
250     }
251 
252     /** Get name of the observer.
253      * @return name of the observer
254      */
255     public String getObserverName() {
256         return observerName;
257     }
258 
259     /**
260      * Setter for the agency name.
261      * @param agencyName the agency name to set
262      */
263     public void setAgencyName(final String agencyName) {
264         this.agencyName = agencyName;
265     }
266 
267     /** Get name of the agency.
268      * @return name of the agency
269      */
270     public String getAgencyName() {
271         return agencyName;
272     }
273 
274     /** Set the number of the receiver.
275      * @param receiverNumber number of the receiver
276      */
277     public void setReceiverNumber(final String receiverNumber) {
278         this.receiverNumber = receiverNumber;
279     }
280 
281     /** Get the number of the receiver.
282      * @return number of the receiver
283      */
284     public String getReceiverNumber() {
285         return receiverNumber;
286     }
287 
288     /** Set the type of the receiver.
289      * @param receiverType type of the receiver
290      */
291     public void setReceiverType(final String receiverType) {
292         this.receiverType = receiverType;
293     }
294 
295     /** Get the type of the receiver.
296      * @return type of the receiver
297      */
298     public String getReceiverType() {
299         return receiverType;
300     }
301 
302     /** Set the version of the receiver.
303      * @param receiverVersion version of the receiver
304      */
305     public void setReceiverVersion(final String receiverVersion) {
306         this.receiverVersion = receiverVersion;
307     }
308 
309     /** Get the version of the receiver.
310      * @return version of the receiver
311      */
312     public String getReceiverVersion() {
313         return receiverVersion;
314     }
315 
316     /** Set the number of the antenna.
317      * @param antennaNumber number of the antenna
318      */
319     public void setAntennaNumber(final String antennaNumber) {
320         this.antennaNumber = antennaNumber;
321     }
322 
323     /** Get the number of the antenna.
324      * @return number of the antenna
325      */
326     public String getAntennaNumber() {
327         return antennaNumber;
328     }
329 
330     /** Set the type of the antenna.
331      * @param antennaType type of the antenna
332      */
333     public void setAntennaType(final String antennaType) {
334         this.antennaType = antennaType;
335     }
336 
337     /** Get the type of the antenna.
338      * @return type of the antenna
339      */
340     public String getAntennaType() {
341         return antennaType;
342     }
343 
344     /** Set the Approximate Marker Position.
345      * @param approxPos Approximate Marker Position
346      */
347     public void setApproxPos(final Vector3D approxPos) {
348         this.approxPos = approxPos;
349     }
350 
351     /** Get the Approximate Marker Position.
352      * @return Approximate Marker Position
353      */
354     public Vector3D getApproxPos() {
355         return approxPos;
356     }
357 
358     /** Set the antenna height.
359      * @param antennaHeight height of the antenna
360      */
361     public void setAntennaHeight(final double antennaHeight) {
362         this.antennaHeight = antennaHeight;
363     }
364 
365     /** Get the antenna height.
366      * @return height of the antenna
367      */
368     public double getAntennaHeight() {
369         return antennaHeight;
370     }
371 
372     /** Set the eccentricities of antenna center.
373      * @param eccentricities Eccentricities of antenna center
374      */
375     public void setEccentricities(final Vector2D eccentricities) {
376         this.eccentricities = eccentricities;
377     }
378 
379     /** Get the eccentricities of antenna center.
380      * @return Eccentricities of antenna center
381      */
382     public Vector2D getEccentricities() {
383         return eccentricities;
384     }
385 
386     /** Set the realtime-derived receiver clock offset.
387      * @param clkOffset realtime-derived receiver clock offset
388      */
389     public void setClkOffset(final int clkOffset) {
390         this.clkOffset = clkOffset;
391     }
392 
393     /** Get the realtime-derived receiver clock offset.
394      * @return realtime-derived receiver clock offset
395      */
396     public int getClkOffset() {
397         return clkOffset;
398     }
399 
400     /** Set the observation interval in seconds.
401      * @param interval Observation interval in seconds
402      */
403     public void setInterval(final double interval) {
404         this.interval = interval;
405     }
406 
407     /** Get the observation interval in seconds.
408      * @return Observation interval in seconds
409      */
410     public double getInterval() {
411         return interval;
412     }
413 
414     /** Set the time of First observation record.
415      * @param firstObs Time of First observation record
416      */
417     public void setTFirstObs(final AbsoluteDate firstObs) {
418         this.tFirstObs = firstObs;
419     }
420 
421     /** Get the time of First observation record.
422      * @return Time of First observation record
423      */
424     public AbsoluteDate getTFirstObs() {
425         return tFirstObs;
426     }
427 
428     /** Set the time of last observation record.
429      * @param lastObs Time of last observation record
430      */
431     public void setTLastObs(final AbsoluteDate lastObs) {
432         this.tLastObs = lastObs;
433     }
434 
435     /** Get the time of last observation record.
436      * @return Time of last observation record
437      */
438     public AbsoluteDate getTLastObs() {
439         return tLastObs;
440     }
441 
442     /** Set the Number of leap seconds since 6-Jan-1980.
443      * @param leapSeconds Number of leap seconds since 6-Jan-1980
444      */
445     public void setLeapSeconds(final int leapSeconds) {
446         this.leapSeconds = leapSeconds;
447     }
448 
449     /** Get the Number of leap seconds since 6-Jan-1980.
450      * @return Number of leap seconds since 6-Jan-1980
451      */
452     public int getLeapSeconds() {
453         return leapSeconds;
454     }
455 
456     /** Set type of the antenna marker.
457      * @param markerType type of the antenna marker
458      */
459     public void setMarkerType(final String markerType) {
460         this.markerType = markerType;
461     }
462 
463     /** Get type of the antenna marker.
464      * @return type of the antenna marker
465      */
466     public String getMarkerType() {
467         return markerType;
468     }
469 
470     /** Set the position of antenna reference point for antenna on vehicle.
471      * @param refPoint Position of antenna reference point for antenna on vehicle
472      */
473     public void setAntennaReferencePoint(final Vector3D refPoint) {
474         this.antRefPoint = refPoint;
475     }
476 
477     /** Get the position of antenna reference point for antenna on vehicle.
478      * @return Position of antenna reference point for antenna on vehicle
479      */
480     public Vector3D getAntennaReferencePoint() {
481         return antRefPoint;
482     }
483 
484     /** Set satellite system for average phase center.
485      * @param phaseCenterSystem satellite system for average phase center
486      * @since 12.0
487      */
488     public void setPhaseCenterSystem(final SatelliteSystem phaseCenterSystem) {
489         this.phaseCenterSystem = phaseCenterSystem;
490     }
491 
492     /** Get satellite system for average phase center.
493      * @return satellite system for average phase center
494      * @since 12.0
495      */
496     public SatelliteSystem getPhaseCenterSystem() {
497         return phaseCenterSystem;
498     }
499 
500     /** Set the observation code of the average phasecenter position w/r to antenna reference point.
501      * @param observationCode Observation code of the average phasecenter position w/r to antenna reference point
502      */
503     public void setObservationCode(final String observationCode) {
504         this.observationCode = observationCode;
505     }
506 
507     /** Get the observation code of the average phasecenter position w/r to antenna reference point.
508      * @return Observation code of the average phasecenter position w/r to antenna reference point
509      */
510     public String getObservationCode() {
511         return observationCode;
512     }
513 
514     /** Set the antenna phasecenter.
515      * @param antennaPhaseCenter Antenna phasecenter
516      */
517     public void setAntennaPhaseCenter(final Vector3D antennaPhaseCenter) {
518         this.antennaPhaseCenter = antennaPhaseCenter;
519     }
520 
521     /** Get the antenna phasecenter.
522      * @return Antenna phasecenter
523      */
524     public Vector3D getAntennaPhaseCenter() {
525         return antennaPhaseCenter;
526     }
527 
528     /** Set the antenna B.Sight.
529      * @param antennaBSight Antenna B.Sight
530      */
531     public void setAntennaBSight(final Vector3D antennaBSight) {
532         this.antennaBSight = antennaBSight;
533     }
534 
535     /** Get the antenna B.Sight.
536      * @return Antenna B.Sight
537      */
538     public Vector3D getAntennaBSight() {
539         return antennaBSight;
540     }
541 
542     /** Set the azimuth of the zero direction of a fixed antenna.
543      * @param antennaAzimuth Azimuth of the zero direction of a fixed antenna
544      */
545     public void setAntennaAzimuth(final double antennaAzimuth) {
546         this.antennaAzimuth = antennaAzimuth;
547     }
548 
549     /** Get the azimuth of the zero direction of a fixed antenna.
550      * @return Azimuth of the zero direction of a fixed antenna
551      */
552     public double getAntennaAzimuth() {
553         return antennaAzimuth;
554     }
555 
556     /** Set the zero direction of antenna.
557      * @param antennaZeroDirection Zero direction of antenna
558      */
559     public void setAntennaZeroDirection(final Vector3D antennaZeroDirection) {
560         this.antennaZeroDirection = antennaZeroDirection;
561     }
562 
563     /** Get the zero direction of antenna.
564      * @return Zero direction of antenna
565      */
566     public Vector3D getAntennaZeroDirection() {
567         return antennaZeroDirection;
568     }
569 
570     /** Set the current center of mass of vehicle in body fixed coordinate system.
571      * @param centerMass Current center of mass of vehicle in body fixed coordinate system
572      */
573     public void setCenterMass(final Vector3D centerMass) {
574         this.centerMass = centerMass;
575     }
576 
577     /** Get the current center of mass of vehicle in body fixed coordinate system.
578      * @return Current center of mass of vehicle in body fixed coordinate system
579      */
580     public Vector3D getCenterMass() {
581         return centerMass;
582     }
583 
584     /** Set the unit of the carrier to noise ratio observables.
585      * @param signalStrengthUnit Unit of the carrier to noise ratio observables
586      */
587     public void setSignalStrengthUnit(final String signalStrengthUnit) {
588         this.signalStrengthUnit = signalStrengthUnit;
589     }
590 
591     /** Get the unit of the carrier to noise ratio observables.
592      * @return Unit of the carrier to noise ratio observables
593      */
594     public String getSignalStrengthUnit() {
595         return signalStrengthUnit;
596     }
597 
598     /** Set the future or past leap seconds.
599      * @param leapSecondsFuture Future or past leap seconds
600      */
601     public void setLeapSecondsFuture(final int leapSecondsFuture) {
602         this.leapSecondsFuture = leapSecondsFuture;
603     }
604 
605     /** Get the future or past leap seconds.
606      * @return Future or past leap seconds
607      */
608     public int getLeapSecondsFuture() {
609         return leapSecondsFuture;
610     }
611 
612     /** Set the respective leap second week number.
613      * @param leapSecondsWeekNum Respective leap second week number
614      */
615     public void setLeapSecondsWeekNum(final int leapSecondsWeekNum) {
616         this.leapSecondsWeekNum = leapSecondsWeekNum;
617     }
618 
619     /** Get the respective leap second week number.
620      * @return Respective leap second week number
621      */
622     public int getLeapSecondsWeekNum() {
623         return leapSecondsWeekNum;
624     }
625 
626     /** Set the respective leap second day number.
627      * @param leapSecondsDayNum Respective leap second day number
628      */
629     public void setLeapSecondsDayNum(final int leapSecondsDayNum) {
630         this.leapSecondsDayNum = leapSecondsDayNum;
631     }
632 
633     /** Get the respective leap second day number.
634      * @return Respective leap second day number
635      */
636     public int getLeapSecondsDayNum() {
637         return leapSecondsDayNum;
638     }
639 
640     /** Add applied differential code bias corrections.
641      * @param appliedDCBS applied differential code bias corrections to add
642      */
643     public void addAppliedDCBS(final AppliedDCBS appliedDCBS) {
644         listAppliedDCBS.add(appliedDCBS);
645     }
646 
647     /** Get the list of applied differential code bias corrections.
648      * @return list of applied differential code bias corrections
649      */
650     public List<AppliedDCBS> getListAppliedDCBS() {
651         return Collections.unmodifiableList(listAppliedDCBS);
652     }
653 
654     /** Add antenna center variation corrections.
655      * @param appliedPCVS antenna center variation corrections
656      */
657     public void addAppliedPCVS(final AppliedPCVS appliedPCVS) {
658         listAppliedPCVS.add(appliedPCVS);
659     }
660 
661     /** Get the list of antenna center variation corrections.
662      * @return List of antenna center variation corrections
663      */
664     public List<AppliedPCVS> getListAppliedPCVS() {
665         return Collections.unmodifiableList(listAppliedPCVS);
666     }
667 
668     /** Add phase shift correction used to generate phases consistent w/r to cycle shifts.
669      * @param phaseShiftCorrection phase shift correction used to generate phases consistent w/r to cycle shifts
670      */
671     public void addPhaseShiftCorrection(final PhaseShiftCorrection phaseShiftCorrection) {
672         phaseShiftCorrections.add(phaseShiftCorrection);
673     }
674 
675     /** Get the list of phase shift correction used to generate phases consistent w/r to cycle shifts.
676      * @return List of phase shift correction used to generate phases consistent w/r to cycle shifts
677      */
678     public List<PhaseShiftCorrection> getPhaseShiftCorrections() {
679         return Collections.unmodifiableList(phaseShiftCorrections);
680     }
681 
682     /** Add scale factor correction.
683      * @param satelliteSystem system to which this scaling factor applies
684      * @param scaleFactorCorrection scale factor correction
685      */
686     public void addScaleFactorCorrection(final SatelliteSystem satelliteSystem, final ScaleFactorCorrection scaleFactorCorrection) {
687         List<ScaleFactorCorrection> sfc = scaleFactorCorrections.get(satelliteSystem);
688         if (sfc == null) {
689             sfc = new ArrayList<>();
690             scaleFactorCorrections.put(satelliteSystem, sfc);
691         }
692         sfc.add(scaleFactorCorrection);
693     }
694 
695     /** Get the list of scale factor correction.
696      * @param satelliteSystem system to which this scaling factor applies
697      * @return List of scale factor correction
698      */
699     public List<ScaleFactorCorrection> getScaleFactorCorrections(final SatelliteSystem satelliteSystem) {
700         final List<ScaleFactorCorrection> sfc = scaleFactorCorrections.get(satelliteSystem);
701         return sfc == null ? Collections.emptyList() : Collections.unmodifiableList(sfc);
702     }
703 
704     /** Add GLONASS satellite/channel association.
705      * @param glonassChannel GLONASS satellite/channel association
706      * @since 12.0
707      */
708     public void addGlonassChannel(final GlonassSatelliteChannel glonassChannel) {
709         glonassChannels.add(glonassChannel);
710     }
711 
712     /** Get the list of GLONASS satellite/channel associations.
713      * @return List of GLONASS satellite/channel associations
714      * @since 12.0
715      */
716     public List<GlonassSatelliteChannel> getGlonassChannels() {
717         return Collections.unmodifiableList(glonassChannels);
718     }
719 
720     /** Set number of satellites.
721      * @param nbSat number of satellites
722      * @since 12.0
723      */
724     public void setNbSat(final int nbSat) {
725         this.nbSat = nbSat;
726     }
727 
728     /** Get number of satellites.
729      * @return number of satellites
730      * @since 12.0
731      */
732     public int getNbSat() {
733         return nbSat;
734     }
735 
736     /** Set number of observations for a satellite.
737      * @param sat satellite
738      * @param type observation type
739      * @param nbObs number of observations of this type for this satellite
740      * @since 12.0
741      */
742     public void setNbObsPerSatellite(final SatInSystem sat, final ObservationType type, final int nbObs) {
743         Map<ObservationType, Integer> satNbObs = nbObsPerSat.get(sat);
744         if (satNbObs == null) {
745             satNbObs = new HashMap<>();
746             nbObsPerSat.put(sat, satNbObs);
747         }
748         satNbObs.put(type, nbObs);
749     }
750 
751     /** Get an unmodifiable view of the map of number of observations per satellites.
752      * @return unmodifiable view of the map of number of observations per satellites
753      * @since 12.0
754      */
755     public Map<SatInSystem, Map<ObservationType, Integer>> getNbObsPerSat() {
756         return Collections.unmodifiableMap(nbObsPerSat);
757     }
758 
759     /** Set number of observations for a satellite.
760      * @param system satellite system
761      * @param types observation types
762      * @since 12.0
763      */
764     public void setTypeObs(final SatelliteSystem system, final List<ObservationType> types) {
765         mapTypeObs.put(system, new ArrayList<>(types));
766     }
767 
768     /** Get an unmodifiable view of the map of observation types.
769      * @return unmodifiable view of the map of observation types
770      * @since 12.0
771      */
772     public Map<SatelliteSystem, List<ObservationType>> getTypeObs() {
773         return Collections.unmodifiableMap(mapTypeObs);
774     }
775 
776     /** Set the code phase bias correction for GLONASS {@link ObservationType#C1C} signal.
777      * @param c1cCodePhaseBias code phase bias correction for GLONASS {@link ObservationType#C1C} signal
778      * @since 12.0
779      */
780     public void setC1cCodePhaseBias(final double c1cCodePhaseBias) {
781         this.c1cCodePhaseBias = c1cCodePhaseBias;
782     }
783 
784     /** Get the code phase bias correction for GLONASS {@link ObservationType#C1C} signal.
785      * @return code phase bias correction for GLONASS {@link ObservationType#C1C} signal
786      * @since 12.0
787      */
788     public double getC1cCodePhaseBias() {
789         return c1cCodePhaseBias;
790     }
791 
792     /** Set the code phase bias correction for GLONASS {@link ObservationType#C1P} signal.
793      * @param c1pCodePhaseBias code phase bias correction for GLONASS {@link ObservationType#C1P} signal
794      * @since 12.0
795      */
796     public void setC1pCodePhaseBias(final double c1pCodePhaseBias) {
797         this.c1pCodePhaseBias = c1pCodePhaseBias;
798     }
799 
800     /** Get the code phase bias correction for GLONASS {@link ObservationType#C1P} signal.
801      * @return code phase bias correction for GLONASS {@link ObservationType#C1P} signal
802      * @since 12.0
803      */
804     public double getC1pCodePhaseBias() {
805         return c1pCodePhaseBias;
806     }
807 
808     /** Set the code phase bias correction for GLONASS {@link ObservationType#C2C} signal.
809      * @param c2cCodePhaseBias code phase bias correction for GLONASS {@link ObservationType#C2C} signal
810      * @since 12.0
811      */
812     public void setC2cCodePhaseBias(final double c2cCodePhaseBias) {
813         this.c2cCodePhaseBias = c2cCodePhaseBias;
814     }
815 
816     /** Get the code phase bias correction for GLONASS {@link ObservationType#C2C} signal.
817      * @return code phase bias correction for GLONASS {@link ObservationType#C2C} signal
818      * @since 12.0
819      */
820     public double getC2cCodePhaseBias() {
821         return c2cCodePhaseBias;
822     }
823 
824     /** Set the code phase bias correction for GLONASS {@link ObservationType#C2P} signal.
825      * @param c2pCodePhaseBias code phase bias correction for GLONASS {@link ObservationType#C2P} signal
826      * @since 12.0
827      */
828     public void setC2pCodePhaseBias(final double c2pCodePhaseBias) {
829         this.c2pCodePhaseBias = c2pCodePhaseBias;
830     }
831 
832     /** Get the code phase bias correction for GLONASS {@link ObservationType#C2P} signal.
833      * @return code phase bias correction for GLONASS {@link ObservationType#C2P} signal
834      * @since 12.0
835      */
836     public double getC2pCodePhaseBias() {
837         return c2pCodePhaseBias;
838     }
839 
840 }