Metadata-Version: 2.4
Name: lemaitre-bandpasses
Version: 0.4.3
Summary: A small package to store and distribute the Lemaitre bandpasses
Author-email: Nicolas Regnault <nicolas.regnault@lpnhe.in2p3.fr>
License-Expression: MIT
Keywords: astronomy,astrophysics
Classifier: Development Status :: 2 - Pre-Alpha
Classifier: Intended Audience :: Science/Research
Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Scientific/Engineering :: Astronomy
Classifier: Topic :: Scientific/Engineering :: Physics
Requires-Python: >=3.11
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: astropy
Requires-Dist: bbf>0.6.0
Requires-Dist: h5py
Requires-Dist: matplotlib
Requires-Dist: numpy>=2.0
Requires-Dist: pandas[parquet,performance]
Requires-Dist: requests
Requires-Dist: scikit-sparse<0.5
Requires-Dist: scipy>=1.14
Requires-Dist: sncosmo>=2.12
Provides-Extra: test
Requires-Dist: pytest>=6.0; extra == "test"
Dynamic: license-file

# bandpasses

[![PyPI - Version](https://img.shields.io/pypi/v/lemaitre-bandpasses.svg)](https://pypi.org/project/lemaitre-bandpasses)
[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/lemaitre-bandpasses.svg)](https://pypi.org/project/lemaitre-bandpasses)


The bandpasses of the instrument involved in the Lemaitre dataset: MeagCam, HSC
and ZTF.

 - The MegaCam bandpasses were re-determined from the decommissioned MegaCam
   filters by M. Betoule and a team from the Laboratoire des matériaux avancés
   (LMA). These determinations differ slightly from the passband models that
   were published along with the SNLS and JLA papers. They are all non-radial.
   They do not (yet?) include per-CCD quantum efficiency determinations.

 - The ZTF bandpasses were re-assembled by P. Rosnet from a series of bench
   measurements sent by the ZTF team at Caltech. These passbands differ from the
   `models` sncosmo (`ztfg`, `ztfr` and `ztfi`), which contains only averaged
   passbands, which account for (1) the QE difference betweem the single- and
   double-coated CCDs (2) the passband radial variations due to the coating
   non-uniformities and to the variations of the incident beam angle w.r.t. the
   filter surface.

 - The HSC passbands are based on the measurements performed by Kawanomoto et
   al. These passband models are radial. They do not (yet?) include any per-CCD
   quantum efficiency determinations.

The passband models are distributed with `sncosmo>=2.12`, which is able to
handle non-radial variations as well as per-CCD quantum efficiencies.

This module contains the raw measurements and the code that was used to prepare
the sncosmo release. It also contain code that automatically registers the
Lemaitre passbands in sncosmo when the module is imported.

We also use the `bbf` module for fast computation of broadband fluxes. Within
`bbf`, the passbands are projected on a wavelength and position-dependent spline
basis, which is cached as a binary hdf5 file. The `bbf` module is


## Getting started

### Installation

#### Using pixi (recommended)

[pixi](https://pixi.sh) handles all compiled dependencies including `scikit-sparse`.
First add it from conda-forge, then the package itself:

```bash
pixi add "scikit-sparse<0.5"
# Install the lastest release on Pypi
pixi add --pypi lemaitre-bandpasses 
# Or from the latest development version on Gitlab
# (UV_GIT_LFS=1 is required due to a known pixi/uv issue: https://github.com/prefix-dev/pixi/issues/2000)
UV_GIT_LFS=1 pixi add --git https://gitlab.in2p3.fr/lemaitre/bandpasses.git --branch main --pypi lemaitre-bandpasses
```

To work from a local clone instead:

```bash
git clone git@gitlab.in2p3.fr:lemaitre/bandpasses.git
cd bandpasses && pixi install
```

#### Using pip

`scikit-sparse` requires the SuiteSparse C library; install it before running `pip`:

- **Linux / macOS — conda:** `conda install "scikit-sparse<0.5"`
- **Linux (Debian/Ubuntu) — apt:** `sudo apt-get install libsuitesparse-dev`
- **macOS — Homebrew:** `brew install suite-sparse`

Then:

```bash
pip install lemaitre-bandpasses
# or from a local clone:
git clone git@gitlab.in2p3.fr:lemaitre/bandpasses.git && cd bandpasses && pip install -e .
```

### Instantiating bandpasses from `sncosmo`

``` python
import sncosmo

# getting the average ZTF/MegaCam6/HSC bandpasses
for name in ['ztf::g', 'ztf::r', 'ztf::I']:
    band = sncosmo.get_bandpass(name)
for name in ['megacam6::' + b for b in ['g', 'r', 'i2', 'z']]:
    band = sncosmo.get_bandpass(name)
for name in ['hsc::' + b for b in ['g', 'r', 'r2', 'i', 'i2', 'z', 'Y']]:
    band = sncosmo.get_bandpass(name)

# getting, e.g. the ZTF r-passband at a given position
r = sncosmo.get_bandpass('ztf::r', x=724, y=2829, sensor_id=55)

# this function can be vectorized
r = sncosmo.get_bandpass('ztf::r', x=[724., 1802, 222.], y=[42., 58., 2512], sensor_id=[5, 42, 22])
```

### Working with `bbf.FilterLib`s

``` python
from lemaitre import bandpasses

flib = bandpasses.get_filterlib(rebuild=False)
```

The filterlib contains all the lemaitre passbands, projected on specific
(adapted) spline bases. Then it is possible to use it to compute efficiently
broadband fluxes.

First, load a stellar library. A stellar library is like a FilterLib: it
consists in a collection of spectra, projected on a spline basis:

``` python
import bbf.stellarlib.pickles
pickles = bbf.stellarlib.pickles.fetch()
```

With that in hand, one can compute broadband fluxes on all (average passbands)
in the library:

``` python
fluxes = bbf.flux(flib, pickles)
```

``` python
from bbf.magsys import SpecMagSys

ms = SpecMagSys('AB')
mags = bbf.mag(flib, pickles, magsys=ms)

# or just
mags = bbf.mag(flib, pickles, 'AB')
```

We may be in a situation where we have actually one passband instance per
measurement. `bbf` handles that:

``` python
nmeas = 10_000

star = np.random.choice(np.arange(len(pickles)), size=nmeas
x = np.random.rand(3000., 3000., nmeas)
y = np.random.rand(3000., 3000., nmeas)
sensor_id = np.random.choice(np.arange(64), size=nmeas)

mags = bbf.mags(flib, pickles, star, x, y, sensor_id, magsys='AB')
```
