DOI: 10.5281/zenodo.10781524
title: Data files for "Curvature in the very-high energy gamma-ray spectrum of M87"

description: Summary

In this repository, we provide some auxiliary material in connection to our paper “Curvature in the very-high energy gamma-ray spectrum of M87" accepted for publication in the Astronomy and Astrophysics (A&A) Journal and available on Arxiv through the ID arXiv:2402.13330. For the full list of authors, please refer to the paper.

In the publication, we study the very-high energy gamma-ray spectrum of a stacked high emission state of M87 using H.E.S.S. observations. We detect a curvature in the spectrum that is not related to the EBL absorption. In addition to that, we show that the gamma-gamma absorption by star light from the galaxy is weak to explain the measured curvature and that it is unlikely that different high states with similar spectral distribution could be able to explain the same curvature.

Data and example code

ECSV tables

The ecsv tables provide the means to reproduce the figures found in the paper. They can be opened with `astropy.QTable`  as demonstrated below.

from astropy.table import QTable
table = QTable.read('Fig1_lightcurve_table.ecsv')
print(table)

The following example shows how to reproduce Fig. A2 from the paper (the modules imported are needed in the loaded enviroment):

from astropy.table import QTable
from scipy.stats import gmean
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from ebltable.ebl_from_model import EBL

cmap = sns.color_palette("colorblind", as_cmap=True)
colors = sns.color_palette("colorblind", 6)

ebl = {}
for m in ["finke2022", "kneiske", "dominguez-upper"]:
    ebl[m] = EBL.readmodel(m)
lmu = np.logspace(-1,3.,100)
z = 0.0042
nuInu = {}
for m, e in ebl.items():
    nuInu[m] = e.ebl_array(z,lmu)
nuInu

table = QTable.read('FigA2_EBL_ULs.ecsv')
wavelengths = table["Wavelength"].value
wavelengths = wavelengths
counter = 0
for m in ["finke2022", "kneiske", "dominguez-upper"]:
    plt.loglog(lmu,nuInu[m],
           lw = 2.,label=f"{m} UL",
               color=colors[counter]
          )
    ULs = table[f"{m} UL"][(wavelengths>12.4)*(wavelengths<40)].value
    plt.loglog(wavelengths[(wavelengths>12.4)*(wavelengths<40)],ULs,
           lw = 2., label = f"UL (this work)", ls='dashed', color=colors[counter])
    plt.arrow(gmean(wavelengths[(wavelengths>12.4)*(wavelengths<40)]), np.median(ULs),
             0, -0.2*np.median(ULs), head_width=5 ,head_length=0.1*np.median(ULs),
              alpha=0.5, color=colors[counter])

    counter+=1

plt.gca().set_xlabel('Wavelength ($\mu$m)',size = 'x-large')
plt.gca().set_ylabel(r'$\nu I_\nu (\mathrm{nW}\,\mathrm{sr}^{-1}\mathrm{m}^{-2})$',size = 'x-large')
plt.legend(loc = 'lower center', ncol = 2)
plt.tight_layout()
plt.show()

Text files

The text files provide the gammapy fit results for the various analyses in the main text of the paper. For a complete definition of the models, we refer the reader to the paper. The name of the file is given by fit_stacked_M87_MODEL_flux_90perc_ENERGYRANGE_90perc.txt, where MODEL is the spectral model fitted (e.g., PLxEBLfinke2022 or PLxEBLfinke2022-free in case the EBL intensity alpha_norm is a free parameter) and ENERGYRANGE is the energy range of the reduced dataset (e.g., 0.3_31.6TeV).