Skip to main content

babamul

PyPI

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

Privacy

This package contains no analytics or telemetry SDK. It does not phone home, and it collects and transmits nothing about you or your machine.

The one piece of client information the BOOM servers see is a standard software-description string, sent as the User-Agent header on API requests and as the Kafka client.id when consuming alerts. It describes the software rather than you:

babamul-python/0.2.0 (Python/3.12.1; Linux)

That is the package version, the Python version, and the OS name — no hostname, username, machine identifier, architecture, OS version, locale, or timezone. It lets the BOOM team see which package versions are still in use, which is what tells them when an old release can be retired.

Separately, and as you would expect of any hosted service, the BOOM servers record their own API requests and Kafka consumer-group offsets. That happens server-side regardless of which client you use.

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).

Download files

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

Source Distribution

babamul-0.1.0.tar.gz (331.0 kB view details)

Uploaded Source

Built Distribution

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

babamul-0.1.0-py3-none-any.whl (33.1 kB view details)

Uploaded Python 3

File details

Details for the file babamul-0.1.0.tar.gz.

File metadata

  • Download URL: babamul-0.1.0.tar.gz
  • Upload date:
  • Size: 331.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for babamul-0.1.0.tar.gz
Algorithm Hash digest
SHA256 711b8690729c187364a33a1930354b31cce8ef91c65c96fd9b57819f14b512f2
MD5 d1e76e3254803c83558f4107f368e91a
BLAKE2b-256 6902a2a10144efdebae34f41c90ba11a990dc6ee9fa8aace54e34980dbe54d89

See more details on using hashes here.

Provenance

The following attestation bundles were made for babamul-0.1.0.tar.gz:

Publisher: publish.yml on boom-astro/babamul

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file babamul-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: babamul-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 33.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for babamul-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 015d150591f39e834679406aeb4505ba8186eb51a4bd1fbf35b1c6bd8425496f
MD5 97ebe95c9ddf79e968b3113c2d5d784c
BLAKE2b-256 51b6997b961e2d9dc92903e20dc0ebbdd02cbba334d68a5dae62a19fc34e863e

See more details on using hashes here.

Provenance

The following attestation bundles were made for babamul-0.1.0-py3-none-any.whl:

Publisher: publish.yml on boom-astro/babamul

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 files

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