Metadata-Version: 2.4
Name: astro-mmdc
Version: 0.1.0
Summary: Python SDK for the MMDC astrophysics platform (mmdc.am)
License-Expression: MIT
Requires-Python: >=3.10
Requires-Dist: httpx<1,>=0.27
Requires-Dist: pydantic<3,>=2
Provides-Extra: dev
Requires-Dist: pytest>=8; extra == 'dev'
Requires-Dist: respx>=0.21; extra == 'dev'
Description-Content-Type: text/markdown

# astro-mmdc

Python SDK for the [MMDC astrophysics platform](https://mmdc.am) — access SED data preparation and blazar broadband emission modeling APIs.

## Installation

```bash
pip install astro-mmdc
# or
uv pip install astro-mmdc
```

## Quick Start

### SED Data Preparation

```python
from astro_mmdc import MMDC

client = MMDC()

# Submit SED preparation job and wait for completion
job = client.sed.prepare_and_wait(
    ra=187.28, dec=2.05, database_name="3C273", source_name="3C 273"
)
print(f"Job {job.uuid} finished with status: {job.status}")

# Retrieve frequency/flux data
data = client.sed.get_data(job.uuid)

# Get source metadata
info = client.sed.get_info(job.uuid)
print(f"Redshift: {info.redshift}")

# Download as CSV
client.sed.download_csv(job.uuid, "sed_data.csv")
```

### Batch Modeling

```python
from astro_mmdc import MMDC

client = MMDC()

# Submit and wait for SSC model fit
result = client.modeling.batch_infer(
    "observations.csv",
    z=0.158,
    ebl=True,
    model_type="SSC",
)
print(f"PDF report: {result.pdf_link}")
print(f"Best parameters: {result.best_parameters}")

# Or submit without waiting
submission = client.modeling.submit_batch(
    "observations.csv", z=0.158, ebl=True, model_type="SSC"
)
# ... do other work ...
result = client.modeling.wait_for_batch(submission.batch_result_id)
```

### HADRONIC Model with Neutrino Parameters

```python
result = client.modeling.batch_infer(
    "observations.csv",
    z=1.0,
    ebl=True,
    model_type="HADRONIC",
    likelihood_type="poisson",
    n_icecube=3,
    dt=12.0,  # months
)
```

### CSV Validation

```python
validation = client.modeling.validate_csv("observations.csv")
if validation.success:
    print(f"{validation.data_points} data points, ready for modeling")
```

## Configuration

```python
# Custom base URL (e.g., local development)
client = MMDC(base_url="http://localhost:8000")

# Custom timeout
client = MMDC(timeout=60.0)

# Context manager (auto-closes connection)
with MMDC() as client:
    data = client.sed.get_data("some-uuid")
```

## Error Handling

```python
from astro_mmdc import MMDC, APIError, ValidationError, PollingTimeoutError, NotFoundError

client = MMDC()

try:
    result = client.modeling.batch_infer("data.csv", z=0.5, ebl=True, model_type="SSC")
except ValidationError as e:
    print(f"CSV validation failed: {e} (type: {e.validation_type})")
except PollingTimeoutError:
    print("Job took too long")
except NotFoundError:
    print("Resource not found")
except APIError as e:
    print(f"API error {e.status_code}: {e.detail}")
```
