es_sfgtools.data_models.sv3_models module

Author: Franklyn Dunbar Email: franklyn.dunbar@earthscope.org

this file contains data models for parsing sonardyne sv3 data

class es_sfgtools.data_models.sv3_models.NovatelAHRSData(*, acx: Decimal, acy: Decimal, acz: Decimal, h: Annotated[Decimal, Ge(ge=0), Le(le=360)], h_mag: Annotated[Decimal | None, Ge(ge=Decimal('0')), Le(le=Decimal('360'))], p: Annotated[Decimal, Ge(ge=-90), Le(le=90)], r: Annotated[Decimal, Ge(ge=-180), Le(le=180)], time: TimeData)

Bases: BaseModel

acx: Decimal
acy: Decimal
acz: Decimal
h: Decimal
h_mag: Decimal | None
model_computed_fields = {}

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

model_config = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

model_fields = {'acx': FieldInfo(annotation=Decimal, required=True, description='Acceleration X axis in m/s^2'), 'acy': FieldInfo(annotation=Decimal, required=True, description='Acceleration Y axis in m/s^2'), 'acz': FieldInfo(annotation=Decimal, required=True, description='Acceleration Z axis in m/s^2'), 'h': FieldInfo(annotation=Decimal, required=True, description='Heading in degrees', metadata=[Ge(ge=Decimal('0')), Le(le=Decimal('360'))]), 'h_mag': FieldInfo(annotation=Union[Decimal, NoneType], required=True, description='Magnetic heading in degrees', metadata=[Ge(ge=Decimal('0')), Le(le=Decimal('360'))]), 'p': FieldInfo(annotation=Decimal, required=True, description='Pitch in degrees', metadata=[Ge(ge=Decimal('-90')), Le(le=Decimal('90'))]), 'r': FieldInfo(annotation=Decimal, required=True, description='Roll in degrees', metadata=[Ge(ge=Decimal('-180')), Le(le=Decimal('180'))]), 'time': FieldInfo(annotation=TimeData, required=True, description='Time data associated with the log')}

Metadata about the fields defined on the model, mapping of field names to [FieldInfo][pydantic.fields.FieldInfo].

This replaces Model.__fields__ from Pydantic V1.

p: Decimal
r: Decimal
time: TimeData
class es_sfgtools.data_models.sv3_models.NovatelGNSSData(*, hae: Annotated[Decimal, Ge(ge=-1000), Le(le=1000)], latitude: Annotated[Decimal, Ge(ge=-90), Le(le=90)], longitude: Annotated[Decimal, Ge(ge=-180), Le(le=180)], q: SV3GPSQuality, sdx: Annotated[Decimal | None, Ge(ge=0)], sdy: Annotated[Decimal | None, Ge(ge=0)], sdz: Annotated[Decimal | None, Ge(ge=0)], separation: Decimal | None, time: TimeData)

Bases: BaseModel

hae: Decimal
latitude: Decimal
longitude: Decimal
model_computed_fields = {}

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

model_config = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

model_fields = {'hae': FieldInfo(annotation=Decimal, required=True, description='Height above ellipsoid in meters', metadata=[Ge(ge=-1000), Le(le=1000)]), 'latitude': FieldInfo(annotation=Decimal, required=True, description='Latitude in degrees', metadata=[Ge(ge=-90), Le(le=90)]), 'longitude': FieldInfo(annotation=Decimal, required=True, description='Longitude in degrees', metadata=[Ge(ge=-180), Le(le=180)]), 'q': FieldInfo(annotation=SV3GPSQuality, required=True, description='Quality indicator'), 'sdx': FieldInfo(annotation=Union[Decimal, NoneType], required=True, description='Standard deviation in east direction in meters', metadata=[Ge(ge=0)]), 'sdy': FieldInfo(annotation=Union[Decimal, NoneType], required=True, description='Standard deviation in north direction in meters', metadata=[Ge(ge=0)]), 'sdz': FieldInfo(annotation=Union[Decimal, NoneType], required=True, description='Standard deviation in up direction in meters', metadata=[Ge(ge=0)]), 'separation': FieldInfo(annotation=Union[Decimal, NoneType], required=True, description='Separation'), 'time': FieldInfo(annotation=TimeData, required=True, description='Time data associated with the log')}

Metadata about the fields defined on the model, mapping of field names to [FieldInfo][pydantic.fields.FieldInfo].

This replaces Model.__fields__ from Pydantic V1.

q: SV3GPSQuality
sdx: Decimal | None
sdy: Decimal | None
sdz: Decimal | None
separation: Decimal | None
time: TimeData
class es_sfgtools.data_models.sv3_models.NovatelHeadingData(*, gpst: Annotated[Decimal, Ge(ge=0)], h: Annotated[Decimal, Ge(ge=0), Le(le=360)], p: Annotated[Decimal, Ge(ge=-90), Le(le=90)], position_type: NovatelPositionType, receiver_status: str, sdh: Annotated[Decimal | None, Ge(ge=0)], sdp: Annotated[Decimal | None, Ge(ge=0)], solution_type: NovatelSolutionStatus, sv_used: Annotated[int, Ge(ge=0)], sv_visable: Annotated[int, Ge(ge=0)], time: TimeData)

Bases: BaseModel

gpst: Decimal
h: Decimal
model_computed_fields = {}

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

model_config = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

model_fields = {'gpst': FieldInfo(annotation=Decimal, required=True, description='GPS time in seconds since GNSS start time', metadata=[Ge(ge=0)]), 'h': FieldInfo(annotation=Decimal, required=True, description='GNSS Computed Heading in degrees', metadata=[Ge(ge=0), Le(le=360)]), 'p': FieldInfo(annotation=Decimal, required=True, description='GNSS Computed Pitch in degrees', metadata=[Ge(ge=-90), Le(le=90)]), 'position_type': FieldInfo(annotation=NovatelPositionType, required=True, description='Type of position data'), 'receiver_status': FieldInfo(annotation=str, required=True, description='Status of the receiver'), 'sdh': FieldInfo(annotation=Union[Decimal, NoneType], required=True, description='Standard deviation of heading in degrees', metadata=[Ge(ge=0)]), 'sdp': FieldInfo(annotation=Union[Decimal, NoneType], required=True, description='Standard deviation of pitch in degrees', metadata=[Ge(ge=0)]), 'solution_type': FieldInfo(annotation=NovatelSolutionStatus, required=True, description='Solution type of the heading data'), 'sv_used': FieldInfo(annotation=int, required=True, description='Number of satellites used in the solution', metadata=[Ge(ge=0)]), 'sv_visible': FieldInfo(annotation=int, required=True, alias='sv_visable', alias_priority=2, description='Number of satellites visible', metadata=[Ge(ge=0)]), 'time': FieldInfo(annotation=TimeData, required=True, description='Time data associated with the log')}

Metadata about the fields defined on the model, mapping of field names to [FieldInfo][pydantic.fields.FieldInfo].

This replaces Model.__fields__ from Pydantic V1.

p: Decimal
position_type: NovatelPositionType
receiver_status: str
sdh: Decimal | None
sdp: Decimal | None
solution_type: NovatelSolutionStatus
sv_used: int
sv_visible: int
time: TimeData
class es_sfgtools.data_models.sv3_models.NovatelINSData(*, gpst: Annotated[Decimal, Ge(ge=0)], h: Annotated[Decimal, Ge(ge=0), Le(le=360)], p: Annotated[Decimal, Ge(ge=-90), Le(le=90)], r: Annotated[Decimal, Ge(ge=-180), Le(le=180)], receiver_status: str, solution_type: NovatelSolutionStatus, time: TimeData, vx: Decimal, vy: Decimal, vz: Decimal)

Bases: BaseModel

gpst: Decimal
h: Decimal
model_computed_fields = {}

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

model_config = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

model_fields = {'gpst': FieldInfo(annotation=Decimal, required=True, description='GPS time in seconds since GNSS start time', metadata=[Ge(ge=0)]), 'h': FieldInfo(annotation=Decimal, required=True, description='SPAN INS Computed Heading in degrees', metadata=[Ge(ge=0), Le(le=360)]), 'p': FieldInfo(annotation=Decimal, required=True, description='SPAN INS Computed Pitch in degrees', metadata=[Ge(ge=-90), Le(le=90)]), 'r': FieldInfo(annotation=Decimal, required=True, description='SPAN INS Computed Roll in degrees', metadata=[Ge(ge=-180), Le(le=180)]), 'receiver_status': FieldInfo(annotation=str, required=True, description='Status of the receiver'), 'solution_type': FieldInfo(annotation=NovatelSolutionStatus, required=True, description='Solution type of the INS data'), 'time': FieldInfo(annotation=TimeData, required=True, description='Time data associated with the log'), 'velx': FieldInfo(annotation=Decimal, required=True, alias='vx', alias_priority=2, description='SPAN INS measured acceleration X axis in m/s^2'), 'vely': FieldInfo(annotation=Decimal, required=True, alias='vy', alias_priority=2, description='SPAN INS measured acceleration Y axis in m/s^2'), 'velz': FieldInfo(annotation=Decimal, required=True, alias='vz', alias_priority=2, description='SPAN INS measured acceleration Z axis in m/s^2')}

Metadata about the fields defined on the model, mapping of field names to [FieldInfo][pydantic.fields.FieldInfo].

This replaces Model.__fields__ from Pydantic V1.

p: Decimal
r: Decimal
receiver_status: str
solution_type: NovatelSolutionStatus
time: TimeData
velx: Decimal
vely: Decimal
velz: Decimal
class es_sfgtools.data_models.sv3_models.NovatelInterrogationEvent(*, event: str = 'interrogation', event_id: Annotated[int, Ge(ge=0)], observations: NovatelObservations, sequence: Annotated[int, Ge(ge=0)], time: TimeData, type: str)

Bases: BaseModel

event: str
event_id: int
model_computed_fields = {}

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

model_config = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

model_fields = {'event': FieldInfo(annotation=str, required=False, default='interrogation'), 'event_id': FieldInfo(annotation=int, required=True, description='ID of the tracking cycle being used', metadata=[Ge(ge=0)]), 'observations': FieldInfo(annotation=NovatelObservations, required=True, description='Observations associated with the interrogation'), 'sequence': FieldInfo(annotation=int, required=True, description='Sequence ID of the tracking cycle', metadata=[Ge(ge=0)]), 'time': FieldInfo(annotation=TimeData, required=True, description='Time data associated with the interrogation'), 'type': FieldInfo(annotation=str, required=True, description='Interrogation type')}

Metadata about the fields defined on the model, mapping of field names to [FieldInfo][pydantic.fields.FieldInfo].

This replaces Model.__fields__ from Pydantic V1.

observations: NovatelObservations
sequence: int
time: TimeData
type: str
class es_sfgtools.data_models.sv3_models.NovatelObservations(*, AHRS: NovatelAHRSData | None, GNSS: NovatelGNSSData | None, NOV_HEADING: NovatelHeadingData | None, NOV_INS: NovatelINSData | None, NOV_RANGE: NovatelRangeData | None)

Bases: BaseModel

AHRS: NovatelAHRSData | None
GNSS: NovatelGNSSData | None
NOV_HEADING: NovatelHeadingData | None
NOV_INS: NovatelINSData | None
NOV_RANGE: NovatelRangeData | None
model_computed_fields = {}

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

model_config = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

model_fields = {'AHRS': FieldInfo(annotation=Union[NovatelAHRSData, NoneType], required=True, description='AHRS data'), 'GNSS': FieldInfo(annotation=Union[NovatelGNSSData, NoneType], required=True, description='GNSS data'), 'NOV_HEADING': FieldInfo(annotation=Union[NovatelHeadingData, NoneType], required=True, description='Novatel heading data'), 'NOV_INS': FieldInfo(annotation=Union[NovatelINSData, NoneType], required=True, description='Novatel INS data'), 'NOV_RANGE': FieldInfo(annotation=Union[NovatelRangeData, NoneType], required=True, description='Novatel range data')}

Metadata about the fields defined on the model, mapping of field names to [FieldInfo][pydantic.fields.FieldInfo].

This replaces Model.__fields__ from Pydantic V1.

class es_sfgtools.data_models.sv3_models.NovatelPositionType(value)

Bases: Enum

DOPPLER_VELOCITY = 8
FIXEDHEIGHT = 2
FIXEDPOS = 1
FLOAT_L1 = 32
INS_PPP = 74
INS_PPP_BASIC = 80
INS_PPP_BASIC_CONVERGING = 79
INS_PPP_CONVERGING = 73
INS_PSRDIFF = 54
INS_PSRSP = 53
INS_RTKFIXED = 56
INS_RTKFLOAT = 55
INS_SBAS = 52
L1_INT = 48
NARROW_FLOAT = 34
NARROW_INT = 50
NONE = 0
OPERATIONAL = 70
OUT_OF_BOUNDS = 72
PPP = 69
PPP_BASIC = 78
PPP_BASIC_CONVERGING = 77
PPP_CONVERGING = 68
PROPAGATED = 19
PSRDIFF = 17
RTK_DIRECT_INS = 51
SINGLE = 16
WAAS = 18
WARNING = 71
WIDE_INT = 49
class es_sfgtools.data_models.sv3_models.NovatelRangeData(*, raw: str, time: TimeData)

Bases: BaseModel

model_computed_fields = {}

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

model_config = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

model_fields = {'raw': FieldInfo(annotation=str, required=True, description='Raw range data as a string'), 'time': FieldInfo(annotation=TimeData, required=True, description='Time data associated with the range data')}

Metadata about the fields defined on the model, mapping of field names to [FieldInfo][pydantic.fields.FieldInfo].

This replaces Model.__fields__ from Pydantic V1.

raw: str
time: TimeData
class es_sfgtools.data_models.sv3_models.NovatelRangeDiagnosticData(*, dbv: Decimal, snr: Decimal, xc: Decimal)

Bases: BaseModel

classmethod convert_from_list(value: List[int | float])
dbv: Decimal
model_computed_fields = {}

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

model_config = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

model_fields = {'dbv': FieldInfo(annotation=Decimal, required=True, description='Decibel voltage in volts'), 'snr': FieldInfo(annotation=Decimal, required=True, description='Signal-to-noise ratio in dB'), 'xc': FieldInfo(annotation=Decimal, required=True, description='Cross-correlation % - Signal quality')}

Metadata about the fields defined on the model, mapping of field names to [FieldInfo][pydantic.fields.FieldInfo].

This replaces Model.__fields__ from Pydantic V1.

snr: Decimal
xc: Decimal
class es_sfgtools.data_models.sv3_models.NovatelRangeEvent(*, event: str = 'range', event_id: Annotated[int, Ge(ge=0)], observations: NovatelObservations, range: NovatelRangeReplyData, sequence: Annotated[int, Ge(ge=0)], time: TimeData, uid: Annotated[str | None, MaxLen(max_length=50)])

Bases: BaseModel

event: str
event_id: int
model_computed_fields = {}

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

model_config = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

model_fields = {'event': FieldInfo(annotation=str, required=False, default='range'), 'event_id': FieldInfo(annotation=int, required=True, description='ID of the tracking cycle being used', metadata=[Ge(ge=0)]), 'observations': FieldInfo(annotation=NovatelObservations, required=True, description='Observations associated with the range event'), 'range': FieldInfo(annotation=NovatelRangeReplyData, required=True, description='Range reply data'), 'sequence': FieldInfo(annotation=int, required=True, description='Sequence ID of the tracking cycle', metadata=[Ge(ge=0)]), 'time': FieldInfo(annotation=TimeData, required=True, description='Time data associated with the range event'), 'uid': FieldInfo(annotation=Union[str, NoneType], required=True, description='Unique identifier for the range event', metadata=[MaxLen(max_length=50)])}

Metadata about the fields defined on the model, mapping of field names to [FieldInfo][pydantic.fields.FieldInfo].

This replaces Model.__fields__ from Pydantic V1.

observations: NovatelObservations
range: NovatelRangeReplyData
sequence: int
time: TimeData
uid: str | None
class es_sfgtools.data_models.sv3_models.NovatelRangeReplyData(*, cn: Annotated[str, MaxLen(max_length=20)], diag: NovatelRangeDiagnosticData, range: Decimal, tat: Annotated[Decimal, Ge(ge=0)])

Bases: BaseModel

cn: str
classmethod convert_tat(value: Decimal)
diag: NovatelRangeDiagnosticData
model_computed_fields = {}

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

model_config = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

model_fields = {'cn': FieldInfo(annotation=str, required=True, description='transponder ID', metadata=[MaxLen(max_length=20)]), 'diag': FieldInfo(annotation=NovatelRangeDiagnosticData, required=True, description='Range diagnostic data'), 'range': FieldInfo(annotation=Decimal, required=True, description='Two way travel time in seconds, including beacons turn around time'), 'tat': FieldInfo(annotation=Decimal, required=True, description='Beacon turn around time in seconds', metadata=[Ge(ge=0)])}

Metadata about the fields defined on the model, mapping of field names to [FieldInfo][pydantic.fields.FieldInfo].

This replaces Model.__fields__ from Pydantic V1.

range: Decimal
tat: Decimal
class es_sfgtools.data_models.sv3_models.NovatelSolutionStatus(value)

Bases: Enum

COLD_START = 6
COV_TRACE = 4
INSUFFICIENT_OBS = 1
INTEGRITY_WARNING = 13
INVALID_FIX = 19
INVALID_RATE = 22
NO_CONVERGENCE = 2
PENDING = 18
RESIDUALS = 9
SINGULARITY = 3
SOL_COMPUTED = 0
TEST_DIST = 5
UNAUTHORIZED = 20
VARIANCE = 8
V_H_LIMIT = 7
class es_sfgtools.data_models.sv3_models.SV3GPSQuality(value)

Bases: Enum

DEAD_RECKONING = 6
FIX_NOT_AVAILABLE = 0
FLOAT_RTK = 5
MANUAL_INPUT_MODE = 7
PSEUDO_RANGE_DIFFERENTIAL = 2
REAL_TIME_KINEMATIC = 4
SIMULATION_MODE = 8
SINGLE_POINT = 1
WAAS_SBAS = 9
class es_sfgtools.data_models.sv3_models.TimeData(*, common: Annotated[Decimal, Ge(ge=315964800.0)], instrument: Annotated[Decimal, Ge(ge=0)], start_count: Annotated[int, Ge(ge=0)], status: str)

Bases: BaseModel

common: Decimal
instrument: Decimal
model_computed_fields = {}

A dictionary of computed field names and their corresponding ComputedFieldInfo objects.

model_config = {}

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

model_fields = {'common': FieldInfo(annotation=Decimal, required=True, description='TZ unaware UNIX time', metadata=[Ge(ge=315964800.0)]), 'instrument': FieldInfo(annotation=Decimal, required=True, description='Instrument time in seconds', metadata=[Ge(ge=0)]), 'start_count': FieldInfo(annotation=int, required=True, description='Start count for the time', metadata=[Ge(ge=0)]), 'status': FieldInfo(annotation=str, required=True, description='Status of the time data')}

Metadata about the fields defined on the model, mapping of field names to [FieldInfo][pydantic.fields.FieldInfo].

This replaces Model.__fields__ from Pydantic V1.

start_count: int
status: str