Python client for consuming ZTF/LSST alerts from BABAMUL Kafka streams
Project description
babamul
Python client for consuming ZTF/LSST astronomical transient alerts from Babamul Kafka streams.
Installation
uv add babamul
or
pip install babamul
Quick Start
Set your credentials via environment variables or a local .env, then start
consuming alerts:
export BABAMUL_KAFKA_USERNAME="your_username"
export BABAMUL_KAFKA_PASSWORD="your_password"
export BABAMUL_API_TOKEN="your_api_token"
from babamul import AlertConsumer
# Iterate over alerts (credentials loaded from env vars or .env)
with AlertConsumer(topics=["babamul.ztf.lsst-match.hosted"]) as consumer:
for alert in consumer:
print(
f"{alert.objectId}: RA={alert.candidate.ra:.4f}, "
f"Dec={alert.candidate.dec:.4f}"
)
break
Configuration
Avoid hardcoding credentials in code. Prefer environment variables or a local
.env file that is not committed to version control. Passing
username/password in code should be limited to one-off REPL usage.
Environmental Variables
export BABAMUL_KAFKA_USERNAME="your_username"
export BABAMUL_KAFKA_PASSWORD="your_password"
export BABAMUL_API_TOKEN="your_api_token"
export BABAMUL_KAFKA_SERVER="kaboom.caltech.edu:9093" # Optional
or define these in a .env file kept out of version control and read
with the python-dotenv package.
Constructor Options
Use the constructor for runtime options like offsets and timeouts.
from babamul import AlertConsumer
with AlertConsumer(
topics=["babamul.ztf.lsst-match.hosted"], # Topic(s) to subscribe to
offset="earliest", # "latest" or "earliest"
timeout=30.0, # Seconds to wait for messages (None = forever)
group_id="my-consumer-group", # Optional, auto-generated if not set
) as consumer:
# Consume alerts here
for alert in consumer:
print(
f"{alert.objectId}: RA={alert.candidate.ra:.4f}, "
f"Dec={alert.candidate.dec:.4f}"
)
Working with Alerts
Alert Properties
from babamul import AlertConsumer
with AlertConsumer(topics=["babamul.ztf.lsst-match.hosted"]) as consumer:
for alert in consumer:
# Basic info
print(f" Object ID: {alert.objectId}")
print(f" Candidate ID: {alert.candid}")
print(f" Position: RA={alert.candidate.ra:.6f}, Dec={alert.candidate.dec:.6f}")
print(f" Time: {alert.candidate.datetime.isoformat()} (JD={alert.candidate.jd:.5f})")
print(f" Magnitude: {alert.candidate.magpsf:.2f}±{alert.candidate.sigmapsf:.2f}")
Photometry / Light Curves
from babamul import AlertConsumer
with AlertConsumer(topics=["babamul.ztf.lsst-match.hosted"]) as consumer:
for alert in consumer:
for phot in alert.get_photometry(): # Full light curve
if phot.magpsf is not None:
print(f" JD {phot.jd:.5f}: {phot.magpsf:.2f} mag ({phot.band})")
else:
print(f" JD {phot.jd:.5f}: non-detection, limit={phot.diffmaglim:.2f} ({phot.band})")
Cutouts
from babamul import AlertConsumer
with AlertConsumer(topics=["babamul.ztf.lsst-match.hosted"]) as consumer:
for alert in consumer:
alert.show_cutouts() # Displays science, template, and difference images
Context Manager
For proper resource cleanup:
from babamul import AlertConsumer
with AlertConsumer(topics=["babamul.ztf.lsst-match.hosted"]) as consumer:
for i, alert in enumerate(consumer):
# process alerts
if i >= 100:
break
# Consumer is automatically closed
Error Handling
from babamul import AlertConsumer, AuthenticationError, BabamulConnectionError
try:
with AlertConsumer(
topics=["babamul.ztf.lsst-match.hosted"],
) as consumer:
for alert in consumer:
# process alerts
pass
except AuthenticationError:
print("Invalid credentials")
except BabamulConnectionError:
print("Cannot connect to Kafka server")
Available Topics
Babamul provides several topic categories based on survey and classification:
LSST Topics
LSST-only (no ZTF counterpart):
| Topic | Description |
|---|---|
babamul.lsst.no-ztf-match.stellar |
Alerts classified as stellar |
babamul.lsst.no-ztf-match.hosted |
Alerts with a host galaxy |
babamul.lsst.no-ztf-match.hostless |
Alerts without a host galaxy |
babamul.lsst.no-ztf-match.unknown |
Unclassified alerts |
LSST with ZTF match:
| Topic | Description |
|---|---|
babamul.lsst.ztf-match.stellar |
Alerts classified as stellar |
babamul.lsst.ztf-match.hosted |
Alerts with a host galaxy |
babamul.lsst.ztf-match.hostless |
Alerts without a host galaxy |
babamul.lsst.ztf-match.unknown |
Unclassified alerts |
ZTF Topics
ZTF-only (no LSST counterpart):
| Topic | Description |
|---|---|
babamul.ztf.no-lsst-match.stellar |
Alerts classified as stellar |
babamul.ztf.no-lsst-match.hosted |
Alerts with a host galaxy |
babamul.ztf.no-lsst-match.hostless |
Alerts without a host galaxy |
babamul.ztf.no-lsst-match.unknown |
Unclassified alerts |
ZTF with LSST match:
| Topic | Description |
|---|---|
babamul.ztf.lsst-match.stellar |
Alerts classified as stellar |
babamul.ztf.lsst-match.hosted |
Alerts with a host galaxy |
babamul.ztf.lsst-match.hostless |
Alerts without a host galaxy |
babamul.ztf.lsst-match.unknown |
Unclassified alerts |
Wildcard Subscriptions
You can use wildcards to subscribe to multiple topics:
from babamul import AlertConsumer
# All LSST topics
with AlertConsumer(topics=["babamul.lsst.*"], ...) as consumer:
pass
# All ZTF topics with LSST matches
with AlertConsumer(topics=["babamul.ztf.lsst-match.*"], ...) as consumer:
pass
# All hosted alerts from both surveys
with AlertConsumer(topics=["babamul.*.*.hosted"], ...) as consumer:
pass
Development Setup
For development and testing, use a .env file to manage your credentials:
# 1. Copy the example file
cp tests/.env.example tests/.env
# 2. Edit tests/.env with your credentials
# Get credentials at: https://babamul.caltech.edu/signup
nano tests/.env
# 3. Load automatically when running tests
# The .env file is gitignored and will not be committed
Your tests/.env file should look like:
BABAMUL_KAFKA_USERNAME=your_username
BABAMUL_KAFKA_PASSWORD=your_password
BABAMUL_API_TOKEN=your_api_token
Most examples and tests will automatically load credentials from .env using python-dotenv.
Acknowledgments
The Babamul alerts broker and BOOM software infrastructure (du Laz et al. 2026) is co-developed by the California Institute of Technology and the University of Minnesota. This work acknowledges support from the National Science Foundation through AST Award No. 2432476 (PI Kasliwal; co-PI Coughlin) and leverages experience from the Zwicky Transient Facility (co-PIs Graham and Kasliwal).
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file babamul-0.1.0a7.tar.gz.
File metadata
- Download URL: babamul-0.1.0a7.tar.gz
- Upload date:
- Size: 284.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0938438e7a218eb9794012f899e7e6554ea3db6f23a3662aa4205ea06d482206
|
|
| MD5 |
0b90c8f63dc61ae104da70d1ab0512d1
|
|
| BLAKE2b-256 |
a88f1ebfd41e736f405417b461bcef0f4f0a4e2ef9e33466229323ef46e6a53c
|
Provenance
The following attestation bundles were made for babamul-0.1.0a7.tar.gz:
Publisher:
publish.yml on boom-astro/babamul
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
babamul-0.1.0a7.tar.gz -
Subject digest:
0938438e7a218eb9794012f899e7e6554ea3db6f23a3662aa4205ea06d482206 - Sigstore transparency entry: 1347962951
- Sigstore integration time:
-
Permalink:
boom-astro/babamul@63eee0afa920f16d87c50b7ba4dd90b163c08f32 -
Branch / Tag:
refs/tags/v0.1.0a7 - Owner: https://github.com/boom-astro
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@63eee0afa920f16d87c50b7ba4dd90b163c08f32 -
Trigger Event:
release
-
Statement type:
File details
Details for the file babamul-0.1.0a7-py3-none-any.whl.
File metadata
- Download URL: babamul-0.1.0a7-py3-none-any.whl
- Upload date:
- Size: 32.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4457f26a76e28c509926c16df9e8d6abd8d7a6ef3ccc44c4f68e789b55523791
|
|
| MD5 |
9bab6be6bbb264092b7ae082b2695df4
|
|
| BLAKE2b-256 |
86ff735062bfd57806986d7b7b145f26e048a978854ff91ab4f8de1f0ef99a41
|
Provenance
The following attestation bundles were made for babamul-0.1.0a7-py3-none-any.whl:
Publisher:
publish.yml on boom-astro/babamul
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
babamul-0.1.0a7-py3-none-any.whl -
Subject digest:
4457f26a76e28c509926c16df9e8d6abd8d7a6ef3ccc44c4f68e789b55523791 - Sigstore transparency entry: 1347962955
- Sigstore integration time:
-
Permalink:
boom-astro/babamul@63eee0afa920f16d87c50b7ba4dd90b163c08f32 -
Branch / Tag:
refs/tags/v0.1.0a7 - Owner: https://github.com/boom-astro
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@63eee0afa920f16d87c50b7ba4dd90b163c08f32 -
Trigger Event:
release
-
Statement type: