Catalog PyPI
Back to packageRELEASE DETAILS

1.2.7

PyPI

adjeff

Library that provides utilities to simulate adjacency effects.

Published20 Oct 2026
Direct dependencies12
Transitive dependenciesNot calculated

README

Version 1.2.7 documentation

Adjeff

Adjeff simulates and corrects the adjacency effect in Sentinel-2 imagery: the light that the atmosphere scatters from neighbouring pixels into the one observed.

  • Forward simulation: top-of-atmosphere reflectance of any surface, by GPU Monte Carlo radiative transfer (Smart-G).
  • PSF learning: the atmospheric point spread function $P$, fitted per band and atmospheric state as an analytical kernel.
  • Correction: surface reflectance recovered from an observed scene, with the learned PSF.

$$\rho_{toa} = \rho_{atm} + T^\downarrow \frac{T^\uparrow_{dir},\rho_s + T^\uparrow_{dif},(\rho_s \ast P)}{1 - s,(\rho_s \ast P)}$$

Installation

Adjeff is managed with pixi: Smart-G and part of its dependencies come from conda-forge.

git clone https://github.com/walcark/Adjeff.git && cd Adjeff
pixi install -e gpu          # or -e cpu, without Smart-G simulations
export SMARTG_DIR_AUXDATA=/path/to/smartg/auxdata

Simulations need a CUDA 12.6 GPU and the Smart-G auxiliary data. Analysis, PSF models and the 5S formulas run on CPU.

Example

import adjeff
from adjeff.core import KingPSF, S2Band, disk_image_dict
from adjeff.modules.models import Unif2Surface
from adjeff.optim import TrainingImages

bands = [S2Band.B03]
cfg = adjeff.make_full_config(bands, aot=0.2, rh=50.0, h=0.0, sza=30.0, vza=5.0)

# Bright disks of 1, 5 and 50 km on a dark ground, 120 m pixels.
disks = [
    disk_image_dict(radius=r, res_km=0.12, rho_max=0.5, bands=bands, n=1999)
    for r in (1.0, 5.0, 50.0)
]

# Simulate their radiative terms, rho_toa and rho_unif (GPU).
disks = adjeff.run_forward_pipeline(disks, **cfg)

# Fit the King PSF that recovers rho_s from rho_unif.
model = adjeff.make_model(
    Unif2Surface, KingPSF, bands, res_km=0.12, n=1999,
    init_parameters={"sigma": 0.5, "gamma": 2.0},
)
tree = adjeff.fit(model, TrainingImages(disks))

# Correct a scene carrying rho_unif and the radiative terms.
corrected = adjeff.apply_psf(disks[0], tree, S2Band.B03)

adjeff.fit_psf(scene, bands, KingPSF, ...) does the same in one call, at the mean atmosphere of a loaded product.

Documentation

User guideConcepts, configuration, samplers, PSF, fitting, cache, logging
NotebooksSix worked examples, from a synthetic scene to a PSF fitted and measured
ChangelogWhat changed, and why
RoadmapOpen questions and planned work

Development

pixi install -e dev
pixi run -e dev all                    # format, lint, mypy --strict, tests
pixi run -e dev-gpu test-integration   # Smart-G tests, on GPU

License

Apache-2.0.

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Declared dependencies 12

Native requirements
12 direct targetsNot calculated transitive count
Package / targetRequirementRelationship
dask
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": "<3.13,>=3.11",
  "evaluation": "NOT_EVALUATED"
}
dask>=2024.1.0runtime
joblib
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": "<3.13,>=3.11",
  "evaluation": "NOT_EVALUATED"
}
joblib>=1.3.0runtime
numpy
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": "<3.13,>=3.11",
  "evaluation": "NOT_EVALUATED"
}
numpy>=2.0.0runtime
pydantic
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": "<3.13,>=3.11",
  "evaluation": "NOT_EVALUATED"
}
pydantic>=2.12.5runtime
rasterio
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": "<3.13,>=3.11",
  "evaluation": "NOT_EVALUATED"
}
rasterio>=1.3.0runtime
scipy
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": "<3.13,>=3.11",
  "evaluation": "NOT_EVALUATED"
}
scipy>=1.10.0runtime
structlog
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": "<3.13,>=3.11",
  "evaluation": "NOT_EVALUATED"
}
structlog>=24.0.0runtime
torch
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": "<3.13,>=3.11",
  "evaluation": "NOT_EVALUATED"
}
torch>=2.0.0runtime
tqdm
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": "<3.13,>=3.11",
  "evaluation": "NOT_EVALUATED"
}
tqdm>=4.0.0runtime
xarray
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": "<3.13,>=3.11",
  "evaluation": "NOT_EVALUATED"
}
xarray>=2026.1.0runtime
xsweep
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": "<3.13,>=3.11",
  "evaluation": "NOT_EVALUATED"
}
xsweep>=0.4.0runtime
zarr
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": "<3.13,>=3.11",
  "evaluation": "NOT_EVALUATED"
}
zarr>=3.0.0runtime

Distribution files

2 collected
adjeff-1.2.7-py3-none-any.whl

bdist_wheel · 135.5 KB · Python py3

Source file
adjeff-1.2.7.tar.gz

sdist · 1,549.63 KB · Python source

Source file

Repository

PENDING
walcark/adjeff

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 19:35 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package_version:b568d4155528e7fbd11fc23904bdf343bbb252e9ae3fc7f916662bc4617fb04d

Other collected versions

View all collected versions →