Exemplo n.º 1
0
 def _append_empty(self, num_obs, memo):
     empty = PosVel(np.full((num_obs, 6), np.nan),
                    system=self.data.system,
                    ellipsoid=self.data.ellipsoid)
     id_empty = id(empty)
     self.data = PosVelArray.insert(self.data, self.num_obs, empty, memo)
     memo.pop(id_empty, None)
Exemplo n.º 2
0
 def _read(cls, h5_group, memo) -> "PosVelField":
     """Read a PosVelField from a HDF5 data source"""
     name = h5_group.attrs["fieldname"]
     if name in memo:
         pos = memo[name]
     else:
         pos = PosVelArray._read(h5_group, memo)
     return cls(num_obs=len(pos), name=name.split(".")[-1], val=pos)
Exemplo n.º 3
0
    def _extend(self, other_field, memo) -> None:
        """Add observations from another field"""
        if self.data.ellipsoid != other_field.data.ellipsoid:
            raise ValueError(
                f"Field '{self.name}' cannot be extended. Ellipsoid must be equal. ({other_field.data.ellipsoid} != {self.data.ellipsoid})"
            )

        self.data = PosVelArray.insert(self.data, self.num_obs,
                                       other_field.data, memo)
Exemplo n.º 4
0
def PosVel(val: np.ndarray, system: str, **pos_args: Any) -> "PosVelArray":
    """Factory for creating PosVelArrays for different systems

    See each position class for exact optional parameters.

    Args:
        val:       Array of position values.
        system:    Name of position system.
        pos_args:  Additional arguments used to create the PosVelArray.

    Returns:
        Array with positions in the given system.
    """
    return PosVelArray.create(val, system, **pos_args)
Exemplo n.º 5
0
              "meter/second")


@_position.register_system(convert_to=dict(trs=trans.delta_enu2trs_posvel))
class EnuPosVelDelta(PosVelDeltaArray):

    system = "enu"
    column_names = ("east", "north", "up", "veast", "vnorth", "vup")
    _units = ("meter", "meter", "meter", "meter/second", "meter/second",
              "meter/second")


@_position.register_system(convert_to=dict(trs=trans.delta_acr2trs_posvel))
class AcrPosVelDelta(PosVelDeltaArray):

    system = "acr"
    column_names = ("along", "cross", "radial", "valong", "vcross", "vradial")
    _units = ("meter", "meter", "meter", "meter/second", "meter/second",
              "meter/second")


# Define shorthands for available systems and conversions
Position.SYSTEMS = PositionArray._systems()
PositionDelta.SYSTEMS = PositionDeltaArray._systems()
PosVel.SYSTEMS = PosVelArray._systems()
PosVelDelta.SYSTEMS = PosVelDeltaArray._systems()
Position.CONVERSIONS = PositionArray._conversions()
PositionDelta.CONVERSIONS = PositionDeltaArray._conversions()
PosVel.CONVERSIONS = PosVelArray._conversions()
PosVelDelta.CONVERSIONS = PosVelDeltaArray._conversions()
Exemplo n.º 6
0
class PosVelField(FieldType):

    _subfields = PosVelArray.fieldnames()
    _factory = staticmethod(PosVel)

    def _post_init(self, val, **field_args):
        """Initialize posvel field"""
        if isinstance(val, PosVelArray):
            data = val
        else:
            try:
                system = field_args.pop("system")
            except KeyError:
                raise exceptions.InitializationError(
                    f"{self._factory.__name__}() missing 1 required positional argument: 'system'"
                ) from None
            data = self._factory(val, system, **field_args)

        # Check that unit is not given, overwrite with system units
        if self._unit is not None and self._unit != data.unit():
            raise exceptions.InitializationError(
                "Parameter 'unit' should not be specified for positions and velocities"
            )
        self._unit = data.unit()

        # Check that the correct number of observations are given
        if len(data) != self.num_obs:
            raise ValueError(
                f"{self.name!r} initialized with {len(data)} values, expected {self.num_obs}"
            )

        # Store the data as a PosVelArray
        self.data = data
        self._plotfields = data.plot_fields()

    def plot_values(self, field=None) -> np.array:
        """Return values of the field in a form that can be plotted"""
        if not field:
            return self.data.val

        values = getattr(self.data, field)
        if isinstance(values, PosVelArray):
            return values.val
        else:
            return values

    def _prepend_empty(self, num_obs, memo):
        empty = PosVel(np.full((num_obs, 6), np.nan),
                       system=self.data.system,
                       ellipsoid=self.data.ellipsoid)
        id_empty = id(empty)
        self.data = PosVelArray.insert(self.data, 0, empty, memo)
        memo.pop(id_empty, None)

    def _append_empty(self, num_obs, memo):
        empty = PosVel(np.full((num_obs, 6), np.nan),
                       system=self.data.system,
                       ellipsoid=self.data.ellipsoid)
        id_empty = id(empty)
        self.data = PosVelArray.insert(self.data, self.num_obs, empty, memo)
        memo.pop(id_empty, None)

    def _extend(self, other_field, memo) -> None:
        """Add observations from another field"""
        if self.data.ellipsoid != other_field.data.ellipsoid:
            raise ValueError(
                f"Field '{self.name}' cannot be extended. Ellipsoid must be equal. ({other_field.data.ellipsoid} != {self.data.ellipsoid})"
            )

        self.data = PosVelArray.insert(self.data, self.num_obs,
                                       other_field.data, memo)

    def _subset(self, idx, memo):
        self.data = self.data.subset(idx, memo)

    @classmethod
    def _read(cls, h5_group, memo) -> "PosVelField":
        """Read a PosVelField from a HDF5 data source"""
        name = h5_group.attrs["fieldname"]
        if name in memo:
            pos = memo[name]
        else:
            pos = PosVelArray._read(h5_group, memo)
        return cls(num_obs=len(pos), name=name.split(".")[-1], val=pos)

    def _write(self, h5_group, memo) -> None:
        """Write a PosVelField to a HDF5 data source"""
        self.data._write(h5_group, memo)