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