Skip to main content

MCMC tools for astrophysics

Project description

VegasAfterglow

VegasAfterglow Logo

C++ Version PyPI version Build Status License Platform Python Version Documentation

VegasAfterglow is a high-performance C++ framework with a user-friendly Python interface designed for the comprehensive modeling of afterglows. It achieves exceptional computational efficiency, enabling the generation of multi-wavelength light curves in milliseconds and facilitating robust Markov Chain Monte Carlo (MCMC) parameter inference in seconds to minutes. The framework incorporates advanced models for shock dynamics (both forward and reverse shocks), diverse radiation mechanisms (synchrotron with self-absorption, and inverse Compton scattering with Klein-Nishina corrections), and complex structured jet configurations. For lightweight afterglow modeling, one can also consider the PyFRS package.


Table of Contents


Features

Shock Dynamics

  • Forward and Reverse Shock Modeling: Simulates both shocks via shock crossing dynamics with arbitrary magnetization levels and shell thicknesses.
  • Relativistic and Non-Relativistic Regimes: Accurately models shock evolution across all velocity regimes.
  • Adiabatic and Radiative Blast Waves: Supports smooth transition between adiabatic and radiative blast waves.
  • Ambient Medium: Supports uniform Interstellar Medium (ISM), stellar wind environments, and user-defined density profiles.
  • Energy and Mass Injection: Supports user-defined profiles for continuous energy and/or mass injection into the blast wave.

Jet Structure & Geometry

  • Structured Jet Profiles: Allows user-defined angular profiles for energy distribution, initial Lorentz factor, and magnetization.
  • Arbitrary Viewing Angles: Supports off-axis observers at any viewing angle relative to the jet axis.
  • Jet Spreading: Includes lateral expansion dynamics for realistic jet evolution (experimental).
  • Non-Axisymmetric Jets: Capable of modeling complex, non-axisymmetric jet structures.

Radiation Mechanisms

  • Synchrotron Radiation: Calculates synchrotron emission from shocked electrons.
  • Synchrotron Self-Absorption (SSA): Includes SSA effects, crucial at low frequencies.
  • Inverse Compton (IC) Scattering: Models IC processes, including:
    • Synchrotron Self-Compton (SSC) from both forward and reverse shocks.
    • Pairwise IC between forward and reverse shock electron and photon populations (experimental).
    • Includes Klein-Nishina corrections for accurate synchrotron and IC emission.


Performance Highlights

VegasAfterglow delivers exceptional computational performance through deep optimization of its core algorithms:

  • Ultra-fast Light Curve Computation: Generates a 100-point single-frequency light curve (forward shock & synchrotron only) from a structured jet viewed off-axis in approximately 1 millisecond on an Apple M2 chip with a single core.

  • Rapid MCMC Exploration: Enables parameter estimation with 10,000 MCMC steps for 8 parameters on 20 data points across multi-wavelength light curves and spectra on an 8-core Apple M2 chip in:

    • ~50 seconds for on-axis structured jet scenarios

This level of performance is achieved through optimized algorithm implementation and efficient memory access patterns, facilitating comprehensive Bayesian inference on standard laptop hardware in seconds to minutes rather than hours or days. The accelerated convergence speed enables rapid iteration through different physical models and makes VegasAfterglow suitable for both detailed analysis of individual GRB events and large-scale population studies.



Installation

VegasAfterglow is available as a Python package with C++ source code also provided for direct use.

Python Installation

To install VegasAfterglow using pip:

pip install VegasAfterglow

This is the recommended method for most users. VegasAfterglow requires Python 3.8 or higher.

Alternative: Install from Source (click to expand/collapse)

For cases where pip installation is not viable or when the development version is required:

  1. Clone this repository:
git clone https://github.com/YihanWangAstro/VegasAfterglow.git
  1. Navigate to the directory and install the Python package:
cd VegasAfterglow
pip install .

Standard development environments typically include the necessary prerequisites (C++20 compatible compiler). For build-related issues, refer to the prerequisites section in C++ Installation.

C++ Installation

For advanced users who need to compile and use the C++ library directly:

Instructions for C++ Installation (click to expand/collapse)
  1. Clone the repository (if not previously done):
git clone https://github.com/YihanWangAstro/VegasAfterglow.git
cd VegasAfterglow
  1. Compile and run tests:
make tests

Upon successful compilation, you can create custom C++ problem generators using the VegasAfterglow interfaces. For implementation details, refer to the Creating Custom Problem Generators with C++ section or examine the example problem generators in tests/demo/.

Build Prerequisites (click to expand for dependency information)

The following development tools are required:

  • C++20 compatible compiler:

    • Linux: GCC 10+ or Clang 13+
    • macOS: Apple Clang 13+ (with Xcode 13+) or GCC 10+ (via Homebrew)
    • Windows: MSVC 19.29+ (Visual Studio 2019 16.10+) or MinGW-w64 with GCC 10+
  • Build tools:

    • Make (GNU Make 4.0+ recommended)

Usage

Quick Start

We provide basic example scripts (script/quick.ipynb, script/details.ipynb and script/mcmc.ipynb) that demonstrate how to set up and run afterglow simulations. This section shows how to calculate light curves and spectra for a simple GRB afterglow model without the need for observational data and perform MCMC parameter fitting with observational data. The notebook can be run using either Jupyter Notebook or VSCode with the Jupyter extension.

To avoid conflicts when updating the repository in the future, make a copy of the example notebook in the same directory and work with the copy instead of the original.

Light Curve & Spectrum Calculation

The example below walks through the main components needed to model a GRB afterglow, from setting up the physical parameters to producing light curves and spectra via script/quick.ipynb.

Model Setup (click to expand/collapse)

First, let's set up the physical components of our afterglow model, including the environment, jet, observer, and radiation parameters:

import numpy as np
import matplotlib.pyplot as plt
from VegasAfterglow import ISM, TophatJet, Observer, Radiation, Model

# 1. Define the circumburst environment (constant density ISM)
medium = ISM(n_ism=1) #in cgs unit

# 2. Configure the jet structure (top-hat with opening angle, energy, and Lorentz factor)
jet = TophatJet(theta_c=0.1, E_iso=1e52, Gamma0=300) #in cgs unit

# 3. Set observer parameters (distance, redshift, viewing angle)
obs = Observer(lumi_dist=1e26, z=0.1, theta_obs=0) #in cgs unit

# 4. Define radiation microphysics parameters
rad = Radiation(eps_e=1e-1, eps_B=1e-3, p=2.3)

# 5. Combine all components into a complete afterglow model
model = Model(jet=jet, medium=medium, observer=obs, fwd_rad=rad)
Light Curve Calculation (click to expand/collapse)

Now, let's compute and plot multi-wavelength light curves to see how the afterglow evolves over time:

# 1. Create logarithmic time array from 10² to 10⁸ seconds (100s to ~3yrs)
times = np.logspace(2, 8, 100)

# 2. Define observing frequencies (radio, optical, X-ray bands in Hz)
bands = np.array([1e9, 1e14, 1e17])

# 3. Calculate the afterglow emission at each time and frequency
# NOTE: times array must be in ascending order, frequencies can be in random order
results = model.flux_density_grid(times, bands)

# 4. Visualize the multi-wavelength light curves
plt.figure(figsize=(4.8, 3.6),dpi=200)

# 5. Plot each frequency band
for i, nu in enumerate(bands):
    exp = int(np.floor(np.log10(nu)))
    base = nu / 10**exp
    plt.loglog(times, results.total[i,:], label=fr'${base:.1f} \times 10^{{{exp}}}$ Hz')

def add_note(plt):
    plt.annotate('jet break',xy=(3e4, 1e-26), xytext=(3e3, 5e-28), arrowprops=dict(arrowstyle='->'))
    plt.annotate(r'$\nu_m=\nu_a$',xy=(8e5, 2e-25), xytext=(7.5e4, 5e-24), arrowprops=dict(arrowstyle='->'))
    plt.annotate(r'$\nu=\nu_a$',xy=(4e6, 4e-25), xytext=(7.5e5, 5e-24), arrowprops=dict(arrowstyle='->'))

add_note(plt)
plt.xlabel('Time (s)')
plt.ylabel('Flux Density (erg/cm²/s/Hz)')
plt.legend()
plt.title('Light Curves')
plt.savefig('quick-lc.png',dpi=300,bbox_inches='tight')
Afterglow Light Curves

Running the light curve script will produce this figure showing the afterglow evolution across different frequencies.

Spectrum Analysis (click to expand/collapse)

We can also examine how the broadband spectrum evolves at different times after the burst:

# 1. Define broad frequency range (10⁵ to 10²² Hz)
frequencies = np.logspace(5, 22, 100)

# 2. Select specific time epochs for spectral snapshots
epochs = np.array([1e2, 1e3, 1e4, 1e5 ,1e6, 1e7, 1e8])

# 3. Calculate spectra at each epoch
# NOTE: epochs array must be in ascending order, frequencies can be in random order
results = model.flux_density_grid(epochs, frequencies)

# 4. Plot broadband spectra at each epoch
plt.figure(figsize=(4.8, 3.6),dpi=200)
colors = plt.cm.viridis(np.linspace(0,1,len(epochs)))

for i, t in enumerate(epochs):
    exp = int(np.floor(np.log10(t)))
    base = t / 10**exp
    plt.loglog(frequencies, results.total[:,i], color=colors[i], label=fr'${base:.1f} \times 10^{{{exp}}}$ s')

# 5. Add vertical lines marking the bands from the light curve plot
for i, band in enumerate(bands):
    exp = int(np.floor(np.log10(band)))
    base = band / 10**exp
    plt.axvline(band,ls='--',color='C'+str(i))

plt.xlabel('frequency (Hz)')
plt.ylabel('flux density (erg/cm²/s/Hz)')
plt.legend(ncol=2)
plt.title('Synchrotron Spectra')
plt.savefig('quick-spec.png',dpi=300,bbox_inches='tight')
Broadband Spectra

The spectral analysis code will generate this visualization showing spectra at different times, with vertical lines indicating the frequencies calculated in the light curve example.

Time-Frequency Pairs Calculation (click to expand/collapse)

If you want to calculate flux at specific time-frequency pairs (t_i, nu_i) instead of a grid (t_i, nu_j), you can use the alternative series interfaces:

# Define time and frequency arrays (must be the same length)
times = np.logspace(2, 8, 200)
frequencies = np.logspace(9, 17, 200)

# For time-frequency pairs (times array must be in ascending order)
results = model.flux_density(times, frequencies)

# The returned results is a FluxDict object with different flux components
print("Result attributes:", dir(results))  # Shows .fwd, .rvs, .total attributes
print("Total flux shape:", results.total.shape)  # Same shape as input arrays
print("Forward shock shape:", results.fwd.sync.shape)  # Forward shock synchrotron component

Key differences:

  • flux_density_grid(): Calculates flux on a time-frequency grid (NxM output from N times and M frequencies)
  • flux_density(): Calculates flux at paired time-frequency points (N output from N time-frequency pairs), requires ascending order time arrays
  • flux_density_exposures(): Same as above but with exposure time averaging for realistic observational scenarios

Return value structure: All flux calculation methods return a FluxDict object with:

  • .total: Combined flux from all components
  • .fwd: Forward shock flux (has .sync and .ssc attributes)
  • .rvs: Reverse shock flux (has .sync and .ssc attributes)

Internal Quantities Evolution

The example below walks through how you can check the evolution of internal quantities under various reference frames via script/details.ipynb.

Model Setup (click to expand/collapse)

Same as for light curve generation, let's set up the physical components of our afterglow model, including the environment, jet, observer, and radiation parameters:

import numpy as np
import matplotlib.pyplot as plt
from VegasAfterglow import ISM, TophatJet, Observer, Radiation, Model

medium = ISM(n_ism=1)

jet = TophatJet(theta_c=0.3, E_iso=1e52, Gamma0=100)

obs = Observer(lumi_dist=1e26, z=0.1, theta_obs=0.)

rad = Radiation(eps_e=1e-1, eps_B=1e-3, p=2.3)

model = Model(jet=jet, medium=medium, observer=obs, fwd_rad=rad, resolutions=(0.1,5,10))
Get the simulation quantities (click to expand/collapse)

Now, let's get the internal simulation quantities:

# Get the simulation details over a time range
details = model.details(t_min=1e0, t_max=1e8)

# Print the available attributes
print("Simulation details attributes:", dir(details))
print("Forward shock attributes:", dir(details.fwd))

You will get a SimulationDetails object with the following structure:

Main grid coordinates:

  • details.phi: 1D numpy array of azimuthal angles in radians
  • details.theta: 1D numpy array of polar angles in radians
  • details.t_src: 3D numpy array of source frame times on coordinate (phi_i, theta_j, t_k) grid in seconds

Forward shock details (accessed via details.fwd):

  • details.fwd.t_comv: 3D numpy array of comoving times for the forward shock in seconds
  • details.fwd.t_obs: 3D numpy array of observer times for the forward shock in seconds
  • details.fwd.Gamma: 3D numpy array of downstream Lorentz factors for the forward shock
  • details.fwd.Gamma_th: 3D numpy array of thermal Lorentz factors for the forward shock
  • details.fwd.r: 3D numpy array of lab frame radii in cm
  • details.fwd.B_comv: 3D numpy array of downstream comoving magnetic field strengths for the forward shock in Gauss
  • details.fwd.theta: 3D numpy array of polar angles for the forward shock in radians
  • details.fwd.N_p: 3D numpy array of downstream shocked proton number per solid angle for the forward shock
  • details.fwd.N_e: 3D numpy array of downstream synchrotron electron number per solid angle for the forward shock
  • details.fwd.gamma_a: 3D numpy array of comoving frame self-absorption Lorentz factors for the forward shock
  • details.fwd.gamma_m: 3D numpy array of comoving frame injection Lorentz factors for the forward shock
  • details.fwd.gamma_c: 3D numpy array of comoving frame cooling Lorentz factors for the forward shock
  • details.fwd.gamma_M: 3D numpy array of comoving frame maximum Lorentz factors for the forward shock
  • details.fwd.nu_a: 3D numpy array of comoving frame self-absorption frequencies for the forward shock in Hz
  • details.fwd.nu_m: 3D numpy array of comoving frame injection frequencies for the forward shock in Hz
  • details.fwd.nu_c: 3D numpy array of comoving frame cooling frequencies for the forward shock in Hz
  • details.fwd.nu_M: 3D numpy array of comoving frame maximum frequencies for the forward shock in Hz
  • details.fwd.I_nu_max: 3D numpy array of comoving frame synchrotron maximum specific intensities for the forward shock in erg/cm²/s/Hz
  • details.fwd.Doppler: 3D numpy array of Doppler factors for the forward shock

Reverse shock details (accessed via details.rvs, if reverse shock is enabled):

  • Similar attributes as forward shock but for the reverse shock component
Checking the evolution of various parameters (click to expand/collapse)

To analyze the temporal evolution of physical parameters across different reference frames, we can visualize how key quantities evolve in the source, comoving, and observer frames. The following analysis demonstrates the comprehensive tracking of shock dynamics and microphysical parameters throughout the afterglow evolution:

Multi-parameter evolution visualization: This code creates a comprehensive multi-panel figure displaying the temporal evolution of fundamental shock parameters (Lorentz factor, magnetic field, particle numbers, radius, and peak synchrotron power) across all three reference frames:

attrs =['Gamma', 'B_comv', 'N_p','r','N_e','I_nu_max']
ylabels = [r'$\Gamma$', r'$B^\prime$ [G]', r'$N_p$', r'$r$ [cm]', r'$N_e$', r'$I_{\nu, \rm max}^\prime$ [erg/s/Hz]']

frames = ['t_src', 't_comv', 't_obs']
titles = ['source frame', 'comoving frame', 'observer frame']
colors = ['C0', 'C1', 'C2']
xlabels = [r'$t_{\rm src}$ [s]', r'$t^\prime$ [s]', r'$t_{\rm obs}$ [s]']
plt.figure(figsize= (4.2*len(frames), 3*len(attrs)))

#plot the evolution of various parameters for phi = 0 and theta = 0 (so the first two indexes are 0)
for i, frame in enumerate(frames):
    for j, attr in enumerate(attrs):
        plt.subplot(len(attrs), len(frames) , j * len(frames) + i + 1)
        if j == 0:
            plt.title(titles[i])
        value = getattr(details.fwd, attr)
        if frame == 't_src':
            t = getattr(details, frame)
        else:
            t = getattr(details.fwd, frame)
        plt.loglog(t[0, 0, :], value[0, 0, :], color='k',lw=2.5)
        plt.loglog(t[0, 0, :], value[0, 0, :], color=colors[i])

        plt.xlabel(xlabels[i])
        plt.ylabel(ylabels[j])

plt.tight_layout()
plt.savefig('shock_quantities.png', dpi=300,bbox_inches='tight')
Shock evolution

Electron energy distribution analysis: This visualization focuses specifically on the characteristic electron energies (self-absorption, injection, and cooling) across all three reference frames:

frames = ['t_src', 't_comv', 't_obs']
xlabels = [r'$t_{\rm src}$ [s]', r'$t^\prime$ [s]', r'$t_{\rm obs}$ [s]']
plt.figure(figsize= (4.2*len(frames), 3.6))

for i, frame in enumerate(frames):
    plt.subplot(1, len(frames), i + 1)
    if frame == 't_src':
        t = getattr(details, frame)
    else:
        t = getattr(details.fwd, frame)
    plt.loglog(t[0, 0, :], details.fwd.gamma_a[0, 0, :],label=r'$\gamma_a^\prime$',c='firebrick')
    plt.loglog(t[0, 0, :], details.fwd.gamma_m[0, 0, :],label=r'$\gamma_m^\prime$',c='yellowgreen')
    plt.loglog(t[0, 0, :], details.fwd.gamma_c[0, 0, :],label=r'$\gamma_c^\prime$',c='royalblue')
    plt.loglog(t[0, 0, :], details.fwd.gamma_a[0, 0, :]*details.fwd.Doppler[0,0,:],label=r'$\gamma_a$',ls='--',c='firebrick')
    plt.loglog(t[0, 0, :], details.fwd.gamma_m[0, 0, :]*details.fwd.Doppler[0,0,:],label=r'$\gamma_m$',ls='--',c='yellowgreen')
    plt.loglog(t[0, 0, :], details.fwd.gamma_c[0, 0, :]*details.fwd.Doppler[0,0,:],label=r'$\gamma_c$',ls='--',c='royalblue')
    plt.xlabel(xlabels[i])
    plt.ylabel(r'$\gamma_e^\prime$')
    plt.legend(ncol=2)
plt.tight_layout()
plt.savefig('electron_quantities.png', dpi=300,bbox_inches='tight')
Shock evolution

Synchrotron frequency evolution: This analysis tracks the evolution of characteristic synchrotron frequencies:

frames = ['t_src', 't_comv', 't_obs']
xlabels = [r'$t_{\rm src}$ [s]', r'$t^\prime$ [s]', r'$t_{\rm obs}$ [s]']
plt.figure(figsize= (4.2*len(frames), 3.6))

for i, frame in enumerate(frames):
    plt.subplot(1, len(frames), i + 1)
    if frame == 't_src':
        t = getattr(details, frame)
    else:
        t = getattr(details.fwd, frame)
    plt.loglog(t[0, 0, :], details.fwd.nu_a[0, 0, :],label=r'$\nu_a^\prime$',c='firebrick')
    plt.loglog(t[0, 0, :], details.fwd.nu_m[0, 0, :],label=r'$\nu_m^\prime$',c='yellowgreen')
    plt.loglog(t[0, 0, :], details.fwd.nu_c[0, 0, :],label=r'$\nu_c^\prime$',c='royalblue')
    plt.loglog(t[0, 0, :], details.fwd.nu_a[0, 0, :]*details.fwd.Doppler[0,0,:],label=r'$\nu_a$',ls='--',c='firebrick')
    plt.loglog(t[0, 0, :], details.fwd.nu_m[0, 0, :]*details.fwd.Doppler[0,0,:],label=r'$\nu_m$',ls='--',c='yellowgreen')
    plt.loglog(t[0, 0, :], details.fwd.nu_c[0, 0, :]*details.fwd.Doppler[0,0,:],label=r'$\nu_c$',ls='--',c='royalblue')
    plt.xlabel(xlabels[i])
    plt.ylabel(r'$\nu$ [Hz]')
    plt.legend(ncol=2)
plt.tight_layout()
plt.savefig('photon_quantities.png', dpi=300,bbox_inches='tight')
Shock evolution

Doppler factor spatial distribution: This polar plot visualizes the spatial distribution of the Doppler factor across the jet structure, showing how relativistic beaming varies with angular position and radial distance:

plt.figure(figsize=(6,6))
ax = plt.subplot(111, polar=True)

theta = details.fwd.theta[0,:,:]
r     = details.fwd.r[0,:,:]
D     = details.fwd.Doppler[0,:,:]

# Polar contour plot
scale = 3.0
c = ax.contourf(theta*scale, r, np.log10(D), levels=30, cmap='viridis')

ax.set_rscale('log')
true_ticks = np.linspace(0, 0.3, 6)
ax.set_xticks(true_ticks * scale)
ax.set_xticklabels([f"{t:.2f}" for t in true_ticks])
ax.set_xlim(0,0.3*scale)
ax.set_ylabel(r'$\theta$ [rad]')
ax.set_xlabel(r'$r$ [cm]')

plt.colorbar(c, ax=ax, label=r'$\log_{10} D$')

plt.tight_layout()
plt.savefig('doppler.png', dpi=300,bbox_inches='tight')
Shock evolution

Equal arrival time (EAT) surface visualization: This final visualization maps the equal arrival time surfaces in polar coordinates, illustrating how light from different parts of the jet reaches the observer at the same time:

plt.figure(figsize=(6,6))
ax = plt.subplot(111, polar=True)

theta = details.fwd.theta[0,:,:]
r     = details.fwd.r[0,:,:]
t_obs = details.fwd.t_obs[0,:,:]

scale = 3.0
c = ax.contourf(theta*scale, r, np.log10(t_obs), levels=30, cmap='viridis')

ax.set_rscale('log')
true_ticks = np.linspace(0, 0.3, 6)
ax.set_xticks(true_ticks * scale)
ax.set_xticklabels([f"{t:.2f}" for t in true_ticks])
ax.set_xlim(0,0.3*scale)
ax.set_ylabel(r'$\theta$ [rad]')
ax.set_xlabel(r'$r$ [cm]')

plt.colorbar(c, ax=ax, label=r'$\log_{10} (t_{\rm obs}/s)$')

plt.tight_layout()
plt.savefig('EAT.png', dpi=300,bbox_inches='tight')
Shock evolution

MCMC Parameter Fitting

We provide some example data files in the data folder. Remember to keep your copy in the same directory as the original to ensure all data paths work correctly.

1. Preparing Data and Configuring the Model (click to expand/collapse)
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import corner
from VegasAfterglow import ObsData, Setups, Fitter, ParamDef, Scale

VegasAfterglow provides flexible options for loading observational data through the ObsData class. You can add light curves (specific flux vs. time) and spectra (specific flux vs. frequency) in multiple ways.

# Create an instance to store observational data
data = ObsData()

# Method 1: Add data directly from lists or numpy arrays

# For light curves
t_data = [1e3, 2e3, 5e3, 1e4, 2e4]  # Time in seconds
flux_data = [1e-26, 8e-27, 5e-27, 3e-27, 2e-27]  # Specific flux in erg/cm²/s/Hz
flux_err = [1e-28, 8e-28, 5e-28, 3e-28, 2e-28]  # Specific flux error in erg/cm²/s/Hz
data.add_flux_density(nu=4.84e14, t=t_data, f_nu=flux_data, err=flux_err)  # All quantities in CGS units
# You can also assign weights to each data point to account for systematic uncertainties or correlations. You don't need to worry about the weights' normalization, the code will normalize them automatically.
#data.add_flux_density(nu=4.84e14, t=t_data, f_nu=flux_data, err=flux_err, weights=np.ones(len(t_data)))

# For spectra
nu_data = [...]  # Frequencies in Hz
spectrum_data = [...] # Specific flux values in erg/cm²/s/Hz
spectrum_err = [...]   # Specific flux errors in erg/cm²/s/Hz
data.add_spectrum(t=3000, nu=nu_data, f_nu=spectrum_data, err=spectrum_err, weights=np.ones(len(nu_data)))  # All quantities in CGS units
# Method 2: Load from CSV files

data = ObsData()
# Define your bands and files
bands = [2.4e17, 4.84e14, 1.4e14]  # Example: X-ray, optical R-band
lc_files = ["data/ep.csv", "data/r.csv", "data/vt-r.csv"]

# Load light curves from files
for nu, fname in zip(bands, lc_files):
    df = pd.read_csv(fname)
    data.add_flux_density(nu=nu, t=df["t"], f_nu=df["Fv_obs"], err=df["Fv_err"])  # All quantities in CGS units

times = [3000] # Example: time in seconds
spec_files = ["data/ep-spec.csv"]

# Load spectra from files
for t, fname in zip(times, spec_files):
    df = pd.read_csv(fname)
    data.add_spectrum(t=t, nu=df["nu"], f_nu=df["Fv_obs"], err=df["Fv_err"])  # All quantities in CGS units

Note: The ObsData interface is designed to be flexible. You can mix and match different data sources, and add multiple light curves at different frequencies as well as multiple spectra at different times.

The Setups class defines the global properties and environment for your model. These settings remain fixed during the MCMC process. Check the documentation for all available options.

cfg = Setups()

# Source properties
cfg.lumi_dist = 3.364e28    # Luminosity distance [cm]
cfg.z = 1.58               # Redshift

# Physical model configuration
cfg.medium = "wind"        # Ambient medium: "wind", "ism", etc. (see documentation)
cfg.jet = "powerlaw"       # Jet structure: "powerlaw", "gaussian", "tophat", etc. (see documentation)

These settings affect how the model is calculated but are not varied during the MCMC process.

2. Defining Parameters and Running MCMC (click to expand/collapse)

The ParamDef class is used to define the parameters for MCMC exploration. Each parameter requires a name, prior range, and sampling scale:

mc_params = [
    ParamDef("E_iso",      1e50,  1e54,  Scale.LOG),       # Isotropic energy [erg]
    ParamDef("Gamma0",        5,  1000,  Scale.LOG),       # Lorentz factor at the core
    ParamDef("theta_c",     0.0,   0.5,  Scale.LINEAR),    # Core half-opening angle [rad]
    ParamDef("k_e",           2,     2,  Scale.FIXED),     # Energy power law index
    ParamDef("k_g",           2,     2,  Scale.FIXED),     # Lorentz factor power law index
    ParamDef("theta_v",     0.0,   0.0,  Scale.FIXED),     # Viewing angle [rad]
    ParamDef("p",             2,     3,  Scale.LINEAR),    # Shocked electron power law index
    ParamDef("eps_e",      1e-2,   0.5,  Scale.LOG),       # Electron energy fraction
    ParamDef("eps_B",      1e-4,   0.5,  Scale.LOG),       # Magnetic field energy fraction
    ParamDef("A_star",     1e-3,     1,  Scale.LOG),       # Wind parameter
    ParamDef("xi_e",       1e-3,     1,  Scale.LOG),       # Electron acceleration fraction
]

Scale Types:

  • Scale.LOG: Sample in logarithmic space (log10) - ideal for parameters spanning multiple orders of magnitude
  • Scale.LINEAR: Sample in linear space - appropriate for parameters with narrower ranges
  • Scale.FIXED: Keep parameter fixed at the initial value - use for parameters you don't want to vary

Parameter Choices: The parameters you include depend on your model configuration (See documentation for all options):

  • For "wind" medium: use A_star parameter
  • For "ISM" medium: use n_ism parameter instead
  • Different jet structures may require different parameters

Initialize the Fitter class with your data and configuration, then run the MCMC process:

# Create the fitter object
fitter = Fitter(data, cfg)

# Run the MCMC fitting
result = fitter.fit(
    param_defs=mc_params,          # Parameter definitions
    total_steps=10000,             # Total number of MCMC steps
    burn_frac=0.3,                 # Fraction of steps to discard as burn-in
    thin=1                         # Thinning factor
)

The result object contains:

  • samples: The MCMC chain samples (posterior distribution)
  • labels: Parameter names
  • best_params: Maximum likelihood parameter values
3. Analyzing Results and Generating Predictions (click to expand/collapse)

Check the top-k parameters and their uncertainties:

# Print top-k parameters (maximum likelihood)
top_k_data = []
for i in range(result.top_k_params.shape[0]):
    row = {'Rank': i+1, 'chi^2': f"{-2*result.top_k_log_probs[i]:.2f}"}
    for name, val in zip(result.labels, result.top_k_params[i]):
        row[name] = f"{val:.4f}"
    top_k_data.append(row)

top_k_df = pd.DataFrame(top_k_data)
print("Top-k parameters:")
print(top_k_df.to_string(index=False))

Use the best-fit parameters to generate model predictions

# Define time and frequency ranges for predictions
t_out = np.logspace(2, 9, 150)

nu_out = np.logspace(16,20,150)

best_params = result.top_k_params[0]

# Generate model light curves at the specified bands using the best-fit parameters
lc = fitter.flux_density_grid(best_params, t_out, band)

# Generate model spectra at the specified times using the best-fit parameters
spec = fitter.flux_density_grid(best_params, times, nu_out)

Now you can plot the best-fit model:

# Function to plot model light curves along with observed data
def draw_bestfit(t,lc_fit, nu, spec_fit):
    fig =plt.figure(figsize=(4.5, 7.5))

    ax1 = fig.add_subplot(211)
    ax2 = fig.add_subplot(212)

    shift = [1,1,200]
    colors = ['blue', 'orange', 'green']
    for i, file, sft, c in zip(range(len(lc_files)), lc_files, shift, colors ):
        df = pd.read_csv(file)
        ax1.errorbar(df["t"], df["Fv_obs"]*sft, df["Fv_err"]*sft, fmt='o',markersize=4,label=file, color=c,markeredgecolor='k', markeredgewidth=.4)
        ax1.plot(t, np.array(lc_fit[i,:])*sft, color=c,lw=1)

    ax1.set_xscale('log')
    ax1.set_yscale('log')
    ax1.set_xlabel('t [s]')
    ax1.set_ylabel(r'$F_\nu$ [erg/cm$^2$/s/Hz]')
    ax1.legend()

    for i, file, sft, c in zip(range(len(spec_files)), spec_files, shift, colors ):
        df = pd.read_csv(file)
        ax2.errorbar(df["nu"], df["Fv_obs"]*sft, df["Fv_err"]*sft, fmt='o',markersize=4,label=file, color=c,markeredgecolor='k', markeredgewidth=.4)
        ax2.plot(nu, np.array(spec_fit[:,i])*sft, color=c,lw=1)

    ax2.set_xscale('log')
    ax2.set_yscale('log')
    ax2.set_xlabel(r'$\nu$ [Hz]')
    ax2.set_ylabel(r'$F_\nu$ [erg/cm$^2$/s/Hz]')
    ax2.legend()
    plt.tight_layout()

draw_bestfit(t_out, lc, nu_out, spec)

Corner plots are essential for visualizing parameter correlations and posterior distributions:

def plot_corner(flat_chain, labels, filename="corner_plot.png"):
    fig = corner.corner(
        flat_chain,
        labels=labels,
        quantiles=[0.16, 0.5, 0.84],  # For median and ±1σ
        show_titles=True,
        title_kwargs={"fontsize": 14},
        label_kwargs={"fontsize": 14},
        truths=np.median(flat_chain, axis=0),  # Show median values
        truth_color='red',
        bins=30,
        smooth=1,
        fill_contours=True,
        levels=[0.16, 0.5, 0.68],  # 1σ and 2σ contours
        color='k'
    )
    fig.savefig(filename, dpi=300, bbox_inches='tight')

# Create the corner plot
flat_chain = result.samples.reshape(-1, result.samples.shape[-1])
plot_corner(flat_chain, result.labels)

Documentation

Comprehensive documentation is available at Documentation including:

  • Installation Guide: Detailed instructions for setting up VegasAfterglow
  • Examples: Practical examples showing common use cases
  • Python API Reference: Complete documentation of the Python interface
  • C++ API Reference: Detailed documentation of C++ classes and functions
  • Contributing Guide: Information for developers who wish to contribute

The documentation is regularly updated with the latest features and improvements (not yet officially released).

For a complete history of changes and new features, see our Changelog.


Contributing

If you encounter any issues, have questions about the code, or want to request new features:

  1. GitHub Issues - The most straightforward and fastest way to get help:

    • Open an issue at Issues
    • You can report bugs, suggest features, or ask questions
    • This allows other users to see the problem/solution as well
    • Can be done anonymously if preferred
  2. Pull Requests - If you've implemented a fix or feature:

    • Fork the repository
    • Create a branch for your changes
    • Submit a pull request with your changes
  3. Email - For private questions or discussions:

We value all contributions and aim to respond to issues promptly. All communications are extremely welcome!


License

VegasAfterglow is released under the BSD-3-Clause License.

The BSD 3-Clause License is a permissive open source license that allows you to:

  • Freely use, modify, and distribute the software in source and binary forms
  • Use the software for commercial purposes
  • Integrate the software into proprietary applications

Requirements:

  • You must include the original copyright notice and the license text
  • You cannot use the names of the authors or contributors to endorse derived products
  • The license provides no warranty or liability protection

For the full license text, see the LICENSE file in the repository.


Acknowledgments & Citation

We would like to thank the contributors who helped improve VegasAfterglow. Special thanks to Weihua Lei, Shaoyu Fu, Liang-Jun Chen, Iris Yin, Cuiyuan Dai and Binbin Zhang for their invaluable work as beta testers, providing feedback and helping with bug fixes during development. We also thank the broader community for their suggestions and support.

If you use VegasAfterglow in your research, please cite the relevant paper(s):

https://ui.adsabs.harvard.edu/abs/2025arXiv250710829W/abstract

Project details


Download files

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

Source Distribution

vegasafterglow-1.0.3.tar.gz (15.5 MB view details)

Uploaded Source

Built Distributions

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

vegasafterglow-1.0.3-cp313-cp313-win_arm64.whl (237.6 kB view details)

Uploaded CPython 3.13Windows ARM64

vegasafterglow-1.0.3-cp313-cp313-win_amd64.whl (256.1 kB view details)

Uploaded CPython 3.13Windows x86-64

vegasafterglow-1.0.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (314.4 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

vegasafterglow-1.0.3-cp313-cp313-macosx_11_0_arm64.whl (254.5 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

vegasafterglow-1.0.3-cp313-cp313-macosx_10_13_x86_64.whl (275.5 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

vegasafterglow-1.0.3-cp312-cp312-win_arm64.whl (237.4 kB view details)

Uploaded CPython 3.12Windows ARM64

vegasafterglow-1.0.3-cp312-cp312-win_amd64.whl (256.1 kB view details)

Uploaded CPython 3.12Windows x86-64

vegasafterglow-1.0.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (314.6 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

vegasafterglow-1.0.3-cp312-cp312-macosx_11_0_arm64.whl (254.5 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

vegasafterglow-1.0.3-cp312-cp312-macosx_10_13_x86_64.whl (275.5 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

vegasafterglow-1.0.3-cp311-cp311-win_arm64.whl (237.4 kB view details)

Uploaded CPython 3.11Windows ARM64

vegasafterglow-1.0.3-cp311-cp311-win_amd64.whl (255.1 kB view details)

Uploaded CPython 3.11Windows x86-64

vegasafterglow-1.0.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (311.4 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

vegasafterglow-1.0.3-cp311-cp311-macosx_11_0_arm64.whl (253.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

vegasafterglow-1.0.3-cp311-cp311-macosx_10_9_x86_64.whl (272.9 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

vegasafterglow-1.0.3-cp310-cp310-win_arm64.whl (237.7 kB view details)

Uploaded CPython 3.10Windows ARM64

vegasafterglow-1.0.3-cp310-cp310-win_amd64.whl (254.5 kB view details)

Uploaded CPython 3.10Windows x86-64

vegasafterglow-1.0.3-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (310.2 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

vegasafterglow-1.0.3-cp310-cp310-macosx_11_0_arm64.whl (251.9 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

vegasafterglow-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl (271.6 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

vegasafterglow-1.0.3-cp39-cp39-win_arm64.whl (236.8 kB view details)

Uploaded CPython 3.9Windows ARM64

vegasafterglow-1.0.3-cp39-cp39-win_amd64.whl (261.0 kB view details)

Uploaded CPython 3.9Windows x86-64

vegasafterglow-1.0.3-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (310.5 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

vegasafterglow-1.0.3-cp39-cp39-macosx_11_0_arm64.whl (252.0 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

vegasafterglow-1.0.3-cp39-cp39-macosx_10_9_x86_64.whl (271.7 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

vegasafterglow-1.0.3-cp38-cp38-win_amd64.whl (253.8 kB view details)

Uploaded CPython 3.8Windows x86-64

vegasafterglow-1.0.3-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (310.1 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

vegasafterglow-1.0.3-cp38-cp38-macosx_11_0_arm64.whl (251.7 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

vegasafterglow-1.0.3-cp38-cp38-macosx_10_9_x86_64.whl (271.4 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

File details

Details for the file vegasafterglow-1.0.3.tar.gz.

File metadata

  • Download URL: vegasafterglow-1.0.3.tar.gz
  • Upload date:
  • Size: 15.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for vegasafterglow-1.0.3.tar.gz
Algorithm Hash digest
SHA256 62625dfedb3fdc53548cf91f732d1e9b7d0ce0aa29808c537d792fe4b7d61bf2
MD5 984e36f01b4623f4ef091a250a005c0b
BLAKE2b-256 f3b029b8697d20372989ae40b611936b82b0649c3aa8092bf4da095dc70a829c

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp313-cp313-win_arm64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp313-cp313-win_arm64.whl
Algorithm Hash digest
SHA256 2e9cb4fbd6d67bc84e01cd24fd86551d434e24fbbb1306db507b8f3e543d3154
MD5 1b1aa27ef5a4d3aead049ddd3d24dbda
BLAKE2b-256 de44cb879177bb9d80fbc016e0ffe6cf190a7a9ef3afdb4ade736df95ac4eb21

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 5f307663e4fc08ca11773c991ff4dbe07185c165f348d526cb2e3d8be16cbca8
MD5 b65111c18534d730f10307ebc9d0799f
BLAKE2b-256 b3e95a3464f19e0f8cdb27e81a1abd590fc52fb72a71a01f102ad425e9e36ee6

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fc66a920d115bfe7612e6045fe8eb708e873711941c391af76ab582ce9c8323d
MD5 a38fc5b26821c0f0eef799f87ca9ca77
BLAKE2b-256 89cdb29aa2338a4eef09eddc95bb068f1c8db6ffc275e22ccb6b098700999da9

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 11c97d25e6627c6d41aae069b14b2ebf85c92ae5f17bce765fb03a350a3294d6
MD5 da5d72a64dfae79656e2fe3df3d97e9b
BLAKE2b-256 f335a45368ce8e3449f4b2beb3757b26db5a69b571dfc66224eacb6be6274fb6

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 f37398df5092e90346c8c713b2bb8c625af1585053ea79ee51e8cbe34340748e
MD5 8c0be056b67822d550ac4ace90ef5440
BLAKE2b-256 0bb153f698e58bdd07943580f05f41e030b6cced307f65c5ff9d324054112277

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp312-cp312-win_arm64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp312-cp312-win_arm64.whl
Algorithm Hash digest
SHA256 d7a9f791b4b10b8be7a369614b3782fe93e650615fd3854a1d17abe54763ddb2
MD5 a2d644a62275629ddb148fa90cae228e
BLAKE2b-256 7f08487dfeeaa383b2497b948bcae9b4a9a2568eab51b4def02d86094e4fdeed

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 36e238c6bc3481df576dbbc17aaf4fa749586de787acd9fa974bcaeb4a98910a
MD5 0870bcbb82f9a97a5495fdd19eba7bd8
BLAKE2b-256 80689f366d3f14bc3b8cfaa1e7c66a8bc4b5d2d65053d3bd3018b28fddab5aca

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b0f992ef1f8145b29500a761569dc206fa2fed47bc9f5aaa9518f11dc7a9a75c
MD5 b9519eb44e9e178458fedbe7869f0cfe
BLAKE2b-256 31d54a2ac874d33e560a3e319a16fed2703879c9574ff553f0e1377e23f14f9d

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d678d8deffcd7240beb313e4b73ef0abceae6ca88afc3ab5b6754a950ec098d3
MD5 8c7313a8f31ed73ab6143d52a5c391c9
BLAKE2b-256 8de1ed628991eab2e7597b7d6d8fa76d61777e2d866bda52fc761f0cbb2a6bc8

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 92d99f88a7ec1566c2723897c85fc02b0633e0efb9410ea7560047467077e801
MD5 eba357e93a51b6110f0c11cd44584b70
BLAKE2b-256 d6bc635ad3667b2e88f107b5ac0ef8e83cc96f07ada9c3187d2af6cc9ffc808a

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp311-cp311-win_arm64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp311-cp311-win_arm64.whl
Algorithm Hash digest
SHA256 1e88f6f4130b16b08171742eea9926a78f3c4d437862ba411a22abe5a06fc267
MD5 53504e18ef5068f6208f1ce4aece83d1
BLAKE2b-256 8490e253227935869cb90034613f1500b08f86daff0f95043e4a39f03b442bd1

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 b5fcf5c4b8ad7341cdd35f03afd30df5cbdbc14a01cd8148d7de3455b8662464
MD5 a536a9c57c100ef407d82178a51b5c8f
BLAKE2b-256 03fb05c33213d46fee373c04c64c417d6a9976d03696f543caf335e6022b8d84

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f100ea06a61cb5eb8cbcd618ce4ab9877801ef312711cf9d6ac95d30c9eb72c9
MD5 1b0b795a5d1b325421a707acb6802f04
BLAKE2b-256 69a00a95fe431ff980bd6ac9ac1386c276058f5cb72409a7da45a6a535de4eb4

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0612811f7999d37ad33016e252cb9aeed9fc398fab1f3ff6db0536ad9ae2e737
MD5 982b984931d07973adf932d4b3eabe94
BLAKE2b-256 bca1bdafd3477a53abe4fef66347d0e26e9fabf7c4cadc59ee17e5c240a56ef8

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 01d69e83d6d20f90e6f8a1b08b0be07120cbeed6ea9ddaed3a1802685decef4e
MD5 353dbebd487d452e546007935c034511
BLAKE2b-256 0d563f29aa809eb01da2003dfb6ec7b26f98d0ecca5b68a8481712fdefd08304

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp310-cp310-win_arm64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp310-cp310-win_arm64.whl
Algorithm Hash digest
SHA256 010420e4dae9b4c660cee72911802c0e526d25b1b61c8a5faed795738c2beb5e
MD5 e4aa8d558e140a814b3f13bd0b15fe38
BLAKE2b-256 cc145e9dbcf8a5cc687adb3c642e7b9e34bfb93e06f47dbd4e84156160432d4a

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 5d628f9b6da77c29e40457c6925be1c8aa1430f93ec3b8e6a0db97f99afb9765
MD5 6c2fbc4e91f2e857dd088e18e24914c3
BLAKE2b-256 73babf2d7d1df3fb8b0a63286eceaac891ad7d0f3625e2532c7beef25aeb3735

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 660fe8e02387e0cd195885514448dabe0cc776ae53ee74a761bf75c07329067c
MD5 baa16ceab9faa535a228ed06f217e2e9
BLAKE2b-256 e15a75fb4bd99ca0d2be077f4542f5f13c4175077d63d672021b3d7160d5cfd7

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 db550698cfc01da378fdaad139be59e66c35e2268eb11912598379e1804d3ad5
MD5 69c1185f65e162cdbcc0001a00395f73
BLAKE2b-256 2faa0807f7cfa50b3483b9513b8ae59f0e95c1ddea70650800497a5bbaa1fa55

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 611f6b3b2003e3f5d470eee260ce569998699a8d554a9ac33796488cde32dd3e
MD5 fe2cd0a79bbcac259a66778676b3762e
BLAKE2b-256 f877f4bb05589441623da42dc3518dfcadf24f3c8fb53290e3d63aa5896af4ba

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp39-cp39-win_arm64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp39-cp39-win_arm64.whl
Algorithm Hash digest
SHA256 ccce6a8465266181d1deb1feb9244d6d64b64c1f4e64f47319fa8d9abba1ffdc
MD5 08136ed1520cfa01f1b57ac417ac6fb5
BLAKE2b-256 0fef683c9cf997d7ca30ffc99fc0387073c3c3f694b5c25051ac115ce0dbfcfd

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 82cd45276ad66538f8270b6d6cce91d476f66399793b9a55abe590448219f8b3
MD5 7f91f73ca66cb10d78768c4d2ebf1889
BLAKE2b-256 de983158f6b64d42c6b1720604c15f6074cf15c9a9cb814a715f443d9e52bea5

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 cf6e883dee825b0b577ba6a0e68ae284d603956ffb58efea180ec3a089620c45
MD5 0d172fc12ea8e709b08d6e7b0e4753ac
BLAKE2b-256 50372009a8bc9f91651f77a559a9408c2bed149ff0ec752f86f0058e6241b287

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b135062882f1428c57a3a4299e22157d4989f69958d43c3194a2a4c5c9240730
MD5 f7c6a66a1f6f7431099e5c617c5a1f70
BLAKE2b-256 e38908920f2c4f9f58b17f44d01b14a507b112f0845d263a59cd0877e1857dcb

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2b2fdf434982367b3d1c84b674d117c879d0c06614806bfab19c1371c0433d4c
MD5 7d471ac036e5388e1b7c56e2d0efa25a
BLAKE2b-256 018946b33e24f66cad01000c3b70c8c3f115b2414a7df6a62285960402bbfc40

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 6a4b8e093fdd4b4f16653122d9374fa44e404d0a16cf9aa4eedee1909e7183ee
MD5 7a175e3c65bb8dc7f72ce66ad7c1da02
BLAKE2b-256 2ba63af8c8619e3306baa4145a49d498803a117f27fade4f87de76d26dd509f5

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 56a033f9a444336248629b3b9f32ec184901c0301bf6c2d042d7ba5f66d905cd
MD5 e22286f28133f15590206c4ab4b03a04
BLAKE2b-256 804dbc4e8830ecbe9b2579a2aeb4da53a13ad8f1b0ee77960e0f59ad2e584c53

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 460b35e0f076c739c751422e069a2a636c1a21113dfc8dabf63f52a2d951c3ab
MD5 b4d44a6a4fedf5fef65307f57786d2b6
BLAKE2b-256 bcf2fe0f7fb4fa66ab4efa03e20e963f2bd571037ed19f2618e7481b478083d8

See more details on using hashes here.

File details

Details for the file vegasafterglow-1.0.3-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for vegasafterglow-1.0.3-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 de99214e5b6d6f1a7240019f0614a44a2c1579fdf2082f6d28b644f6f27c6fc4
MD5 4e0b60c644d5d88beb0bbd24d5f0032b
BLAKE2b-256 42b4435055e606941e66bd9789fd2358e159bcdb7c0914abdde40fbe0248fa13

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page