Skip to main content

ASGARD

A Sensor Geometry Application Reusable by-Design

ASGARD is available on PyPI and can be installed with:

pip install asgard-eopf

→ Read the full ASGARD documentation here.

Notice

License can be found in LICENSE file.

CS, ESA, and Copernicus project logos are generously provided by entities they represent, but the ownership remains with those entities.

ASGARD logos are available under CC BY-NC-ND: https://creativecommons.org/licenses/by-nc-nd/4.0/deed.fr

Purpose

Main purposes of the GEOLIB are to:

  • Serve as a base geometry bloc for different types of sensors
  • Provide a flexible abstraction layer
  • Support the generation of L1/L2 products.
  • Provide compatibility with Sentinel missions 1, 2, 3 and beyond

The current Legacy codes for geometry application are:

  • EOCFI library for Sentinel-1/3,
  • S2GEO library, which SXGEO is a simplification for Sentinel-2

However, these codes are not in Python and not Open source. ASGARD was first developed to tackle those points of the Sentinel-1/2/3 geo-libraries, being in Python and Open-source.

Two versions of ASGARD can be used:

  • ASGARD (refactored): Full re-implemented library not calling the Legacy code (EOCFI and SXGEO) of Sentinel1/2/3. It contains all the Geometry init schemas and Generic Models presented below
  • ASGARD-Legacy: It is based on ASGARD in order to take and have the same the Geometry init schemas than ASGARD. It also uses generic parts of ASGARD as some models for example. It was developed to have a common interface than ASGARD but calling Legacy libraries instead of the Python re-implementation. This version can be used to assess geometric quality and processing performances of ASGARD. However, it will be deprecated at the end, once the ASGARD library will be fully validated and deployed. Note: It is to be noted that ASGARD is already intensively validated as presented in the Validation, but not yet fully deployed.

High-level API

Geometries

This tool is based on a Geometry abstraction, derived into specialized types of sensors. At the end, you find a geometry object for each Sentinel sensor. These geometries expose the High-level API. This object is initialized from a JSON-like structure with necessary metadata. This metadata must be extracted from products, auxiliary data files.

Each geometry builds a set of coherent Low-level Models.

Geometries initialization

The abstract class AbstractGeometry is derived for each sensor:

  • {class}S1SARGeometry <asgard.sensors.sentinel1.csar.S1SARGeometry>
  • {class}S2MSIGeometry <asgard.sensors.sentinel2.msi.S2MSIGeometry>
  • {class}S3OLCIGeometry <asgard.sensors.sentinel3.olci.S3OLCIGeometry>
  • {class}S3SLSTRGeometry <asgard.sensors.sentinel3.slstr.S3SLSTRGeometry>
  • ...

Each class is initialized with a custom dictionary. This dictionary must match the JSON schema given by the init_schema method. This will look like:

from asgard.sensors.sentinel3 import S3OLCIGeometry

config = {
  "sat": "SENTINEL_3",
  "orbit_aux_info": {
    "orbit_state_vectors": [
      {
        "times": {
            "TAI": {"offsets": np.array([...])},
            "UTC": {"offsets": np.array([...])},
            "UT1": {"offsets": np.array([...])},
        },
        "positions": np.array([...]),
        "velocities": np.array([...]),
        "absolute_orbit": np.array([...]),
      },
    ],
  },
  "dem_config_file": "path_to_dem",
  "pointing_vectors": {
    "X": np.array([...]),
    "Y": np.array([...]),
  },
  "thermoelastic": {
    "julian_days": np.array([...]),
    "quaternions_1": np.array([...]),
    "quaternions_2": np.array([...]),
    "quaternions_3": np.array([...]),
    "quaternions_4": np.array([...]),
    "on_orbit_positions_angle": np.array([...]),
  },
  "frame": {
      "times": {"offsets": np.array([...])},
  },
}

my_product = S3OLCIGeometry(**config)

The input dictionary should contain all numeric and string values necessary to initialize the geometry. Most of the parsing from L0/L1 product tree metadata files should be done before. When the input data is large, Numpy arrays will be used instead of plain Python Lists.

High-level functions

Each class implementing the Geometry abstraction should provide the following features:

  • direct_loc(): perform direct location for a set of measurements
  • inverse_loc(): perform inverse location for a set of ground locations
  • sun_angles(): compute Sun angles for a set of ground locations and times
  • sun_distances(): compute Sun distances given times and optional ground locations
  • incidence_angles(): compute the viewing angles (ground to satellite) for a set of ground locations and times
  • footprint(): compute the ground footprint of a geometric unit

Low-level models

Each geometry builds a set of coherent models. For example for Sentinel-2:

These models are an abstraction layers to provide a set of features:

  • TimestampModel:
    • Give a timestamp for each measurement
  • OrbitModel:
    • Propagates the orbit
    • Interpolates the orbit to retrieve position, velocity and acceleration
  • PlatformModel:
    • Models the different frame transformation between the satellite orbital frame and the instrument frame
    • Computes the attitude of the instrument frame at a given time
  • PointingModel:
    • Models the directions where the instrument can look. Examples:
      • field of view of an optical sensor
      • synthetic antenna orientation
    • Computes the line of sight (at the sensor side) for a given measurement/detector/time.
  • PropagationModel:
    • Handles the propagation of a signal (micro-wave, light, ...) from a target (Earth, Moon, star) to the sensor.
    • Examples:
      • Intersection of a line-of-sight (estimated at the instrument side) with a DEM.
      • Intersection of a range/azimuth SAR pointing with a DEM

Other objects provide some base functions:

  • Frame:
    • Handles frames and coordinate system
  • Transform:
    • Handles frames transforms (maybe time dependant)
  • Body:
    • Model of the Earth, Moon and Sun
    • Handles Earth position bulletin
    • Handle surface models (ellipsoid, DEM)
  • TimeReference:
    • Handles conversion between time references

Low-level API

The low-level API rely on the Model abstraction. Each model will implement a part of the "georeferencing pipeline". Most of them use the Rugged/Orekit wrappers as backend. Only two are also available with the EOCFI backend:

  • {class}ExplorerTimeReference <asgard-legacy.models.explorer.ExplorerTimeReference>
  • {class}ExplorerEarthBody <asgard-legacy.models.explorer.ExplorerEarthBody>

All the models are initialized based on keyword arguments, which conform to the JSON schema returned by init_schema(). Here is a list of low-level models, by category:

Category Model Role
Time {class}TimeReference <asgard.models.time.TimeReference> Conversion between timescales
leap seconds
Conversion from ascii, cuc, transport
Body {class}EarthBody <asgard.models.body.EarthBody> Cartesian geodetic conversion
Frame conversion
Sun position
Topocentric conversion
Timestamp {class}LineDetectorTimestampModel <asgard.models.lineardetector.LineDetectorTimestampModel> Line datation for line detector sensors
Timestamp {class}ScanningDetectorTimestampModel <asgard.models.scanningdetector.ScanningDetectorTimestampModel> Sample datation for scanning detector
(used for SLSTR)
Orbit {class}GenericOrbitModel <asgard.models.orbit.GenericOrbitModel> Interpolate OSV
Interpolate attitude
Orbit information (ANX, ...)
Platform {class}GenericPlatformModel <asgard.models.platform.GenericPlatformModel> Transform instrument frame to satellite frame
Pointing {class}LineDetectorPointingModel <asgard.models.lineardetector.LineDetectorPointingModel> Poining vector for line detector sensors
Pointing {class}ScanningDetectorPointingModel <asgard.models.scanningdetector.ScanningDetectorPointingModel> SLSTR pointing model
Propagation {class}PropagationModel <asgard.models.propagation.PropagationModel> Line of sight propagation
DEM and ellipsoid intersection
Propagation {class}GroundRangePropagationModel <asgard.models.range.GroundRangePropagationModel> Ground range propagation
Replacement of xp_target_ground_range

Validation

The validation of ASGARD and ASGARD-Legacy implementations is presented in the validation document.

Some complementary and new results (overwriting the ones from the validation document) for 0.5.2 are available in the Additional_results_for_V5_2024-12

Additional comparisons/validations were performed (0.5.2) to compare asgard-legacy behaviour versus EOCFI and are available in EOCFI_ASGARD_Comparison_TechnicalNote.pdf

New dedicated L0 footprints validation (0.7.0) is available here: FootprintL0Validation.pdf Please note that this is in complement to the tests implemented directly in ASGARD.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

asgard_eopf-2.0.0.tar.gz (82.9 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

asgard_eopf-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (386.0 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

asgard_eopf-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (376.2 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

asgard_eopf-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (386.2 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

asgard_eopf-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (383.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

File details

Details for the file asgard_eopf-2.0.0.tar.gz.

File metadata

  • Download URL: asgard_eopf-2.0.0.tar.gz
  • Upload date:
  • Size: 82.9 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.7

File hashes

Hashes for asgard_eopf-2.0.0.tar.gz
Algorithm Hash digest
SHA256 117375fac888724dad9bac1b3deb712f0c3e5b9875c26a737cefc6c3f7c3c1b0
MD5 4ed86afe7777bc39e1c37387347faef6
BLAKE2b-256 2782f4f59fda419ce401694eacc7556e0d76ea707d85c55da34380698f3390ad

See more details on using hashes here.

File details

Details for the file asgard_eopf-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for asgard_eopf-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 add114ea8537598cb9d9b6ecc9f27397c45ed8d648b20ca0e2d4776420c0c195
MD5 28770d181ef42d07a409e6011f735bae
BLAKE2b-256 e66a2f7197f5886f369ee3af3bc0fa8cae0c649d713a94e3163d8743a426a280

See more details on using hashes here.

File details

Details for the file asgard_eopf-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for asgard_eopf-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 759d91b052f87614eb3d3a067bb90ffdfd28937098cb2a92951a4d55fe586302
MD5 af4b0ecd86a0ee19d62f85a79ae1fb42
BLAKE2b-256 326a11a4bcd7b625fa98fd056f1f7ffae583619c23124e26410e2ad7124b61ac

See more details on using hashes here.

File details

Details for the file asgard_eopf-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for asgard_eopf-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 3634e699c387d7b5b20e4845258a39243f570d592cf5356b3dbc450de6bb5907
MD5 8e8f433b9cf1d58f1d61fd5a402b42df
BLAKE2b-256 85bc5fc3b4c5862ab917387870623b9f7b3f5311a29e8abeabc5320cc0b7b1ea

See more details on using hashes here.

File details

Details for the file asgard_eopf-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for asgard_eopf-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 d39f386dd9924a6eb96a5ce7a64a45be9d187a19fff17501dbac5d8c91f31c0a
MD5 f18159dcefd036732ace8700f64ed95f
BLAKE2b-256 0a90369762af3ed61c7e9ab28f982cc4ab8921d0ecb7d5694b187927aff2f8d4

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

2.0.0 This release

5 files

1.6.0

5 files

1.5.0

5 files

1.4.0

5 files

1.3.12

5 files

1.3.11

5 files

1.3.10

5 files

1.3.9

5 files

1.3.8

5 files

1.3.7

5 files

1.3.6

5 files

1.3.5

5 files

1.3.4

5 files

1.3.3

5 files

1.3.2

5 files

1.3.1

5 files

1.3.0

5 files

1.2.0

3 files

1.1.0

3 files

1.0.0

3 files

0.9.0

1 file

0.8.1

1 file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page