DRS4 baseline files#
[1]:
import tables
import matplotlib.pyplot as plt
import numpy as np
from lstcam_calib.io import get_dataset_keys
HDF5 format#
[2]:
file = "../../../test_data/real/service/PixelCalibration/Cat-A/drs4_baseline/20200218/pro/drs4_pedestal.Run02005.0000.h5"
hdf5_f=tables.open_file(file, "r")
hdf5_f
[2]:
File(filename=../../../test_data/real/service/PixelCalibration/Cat-A/drs4_baseline/20200218/pro/drs4_pedestal.Run02005.0000.h5, title=np.str_(''), mode='r', root_uep='/', filters=Filters(complevel=5, complib='blosc:zstd', shuffle=True, bitshuffle=False, fletcher32=True, least_significant_digit=None))
/ (RootGroup) np.str_('')
/r1 (Group) np.str_('')
/r1/monitoring (Group) np.str_('')
/r1/monitoring/drs4_baseline (Group) np.str_('')
/r1/monitoring/drs4_baseline/tel_001 (Table(np.int64(1),)fletcher32, shuffle, blosc:zstd(5)) np.str_('Storage of DRS4CalibrationContainer')
description := {
"baseline_mean": Int16Col(shape=(np.int64(2), np.int64(1855), np.int64(4096)), dflt=np.int16(0), pos=0),
"baseline_std": Int16Col(shape=(np.int64(2), np.int64(1855), np.int64(4096)), dflt=np.int16(0), pos=1),
"baseline_counts": UInt16Col(shape=(np.int64(2), np.int64(1855), np.int64(4096)), dflt=np.uint16(0), pos=2),
"spike_height": Int16Col(shape=(np.int64(2), np.int64(1855), np.int64(3)), dflt=np.int16(0), pos=3)}
byteorder := 'little'
chunkshape := (np.int64(1),)
Keys#
[3]:
key=get_dataset_keys(file)
key
[3]:
['/r1/monitoring/drs4_baseline/tel_001']
Data#
[4]:
# Date used for calibration are:
# - baseline_mean : baseline to be subtracted per channel/pixel/capacitor (2, 1855, 4096)
# - spike_height : spike to be subtracted, per channel/pixel/spike-type (2, 1855, 3)
drs4_data = hdf5_f.root.r1.monitoring.drs4_baseline.tel_001[0]
drs4_data["baseline_mean"]
[4]:
array([[[398, 397, 399, ..., 398, 397, 397],
[401, 399, 398, ..., 400, 399, 399],
[398, 400, 398, ..., 398, 397, 397],
...,
[396, 396, 395, ..., 395, 395, 394],
[398, 398, 399, ..., 397, 398, 397],
[400, 398, 398, ..., 398, 397, 398]],
[[399, 398, 398, ..., 398, 398, 398],
[393, 393, 392, ..., 393, 394, 394],
[397, 398, 398, ..., 397, 398, 398],
...,
[401, 401, 400, ..., 399, 400, 400],
[399, 398, 397, ..., 397, 397, 396],
[397, 397, 397, ..., 398, 397, 397]]],
shape=(2, 1855, 4096), dtype=int16)
[5]:
# other way, with ctapipe
from ctapipe.io import read_table
# read the table
table = read_table(file, key[0])
table
/usr/local/lib/python3.11/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
from .autonotebook import tqdm as notebook_tqdm
[5]:
Table length=1
baseline_mean | baseline_std | baseline_counts | spike_height |
---|---|---|---|
int16[2,1855,4096] | int16[2,1855,4096] | uint16[2,1855,4096] | int16[2,1855,3] |
398 .. 397 | 10 .. 3 | 149 .. 131 | 50 .. 10 |
Meta-data#
[6]:
hdf5_f.root._v_attrs
[6]:
/._v_attrs (AttributeSet), 41 attributes:
[CLASS := np.str_('GROUP'),
CTA ACTIVITY ID := np.str_('4af121ae-4f6e-45d6-8f46-c5eb45c78c01'),
CTA ACTIVITY NAME := np.str_('create_drs4_pedestal_file'),
CTA ACTIVITY SOFTWARE NAME := np.str_('lstcam_calib'),
CTA ACTIVITY SOFTWARE VERSION := np.str_('0.1.dev217+g01a60dd'),
CTA ACTIVITY START TIME := np.str_('2024-07-15 14:10:15.460'),
CTA ACTIVITY STOP TIME := np.str_('2024-07-15 14:16:36.307'),
CTA ACTIVITY TYPE := np.str_('software'),
CTA CONTACT EMAIL := np.str_('unknown'),
CTA CONTACT NAME := np.str_('Franca Cassol'),
CTA CONTACT ORGANIZATION := np.str_('LST Consortium'),
CTA INSTRUMENT CLASS := np.str_('Camera'),
CTA INSTRUMENT ID := np.str_('unspecified'),
CTA INSTRUMENT SITE := np.str_('CTA-North'),
CTA INSTRUMENT SUBTYPE := np.str_('unspecified'),
CTA INSTRUMENT TYPE := np.str_('LST'),
CTA INSTRUMENT VERSION := np.str_('unspecified'),
CTA PROCESS ID := np.str_(''),
CTA PROCESS SUBTYPE := np.str_('Calibration'),
CTA PROCESS TYPE := np.str_('Observation'),
CTA PRODUCT CREATION TIME := np.str_('2024-07-15 14:16:41.507'),
CTA PRODUCT DATA ASSOCIATION := np.str_('Telescope'),
CTA PRODUCT DATA CATEGORY := np.str_('A'),
CTA PRODUCT DATA LEVELS := np.str_('R1'),
CTA PRODUCT DATA MODEL NAME := np.str_('Unofficial monitoring R1'),
CTA PRODUCT DATA MODEL URL := np.str_('unknown'),
CTA PRODUCT DATA MODEL VERSION := np.str_('1.0'),
CTA PRODUCT DESCRIPTION := np.str_('DRS4 baseline and spike coefficients'),
CTA PRODUCT FORMAT := np.str_(''),
CTA PRODUCT ID := np.str_('53198bd6-aa29-4291-b1f1-ead02cd48cad'),
CTA REFERENCE VERSION := np.str_('1'),
CTAPIPE_IO_LST_VERSION := np.str_('0.22.6'),
CTAPIPE_VERSION := np.str_('0.19.3'),
FILTERS := Filters(complevel=5, complib='blosc:zstd', shuffle=True, bitshuffle=False, fletcher32=True, least_significant_digit=None),
LSTCAM_CALIB_VERSION := np.str_('0.1.dev217+g01a60dd'),
PROV_LOG := np.str_('/fefs/aswg/workspace/franca.cassol/data/real/monitoring/PixelCalibration/Cat-A_ctapipe_v0.17/drs4_baseline/20200218/v0.1.dev217+g01a60dd/log/drs4_pedestal.Run02005.0000_2024-07-15T14:10:06.provenance.log'),
PYTABLES_FORMAT_VERSION := np.str_('2.1'),
RUN_START := np.str_('2020-02-18 19:43:25.000'),
TEL_ID := np.int64(1),
TITLE := np.str_(''),
VERSION := np.str_('1.0')]
[7]:
# plot baseline as function of capacitor for a given pixel
pixel=0
channel=["HG","LG"]
baseline=drs4_data["baseline_mean"]
fig, ax = plt.subplots(1, 2, figsize=(12,6),constrained_layout=True)
for chan in np.arange(2):
label=f"channel {channel[chan]}"
ax[chan].grid(True)
ax[chan].set_ylim(380,420)
ped_median=np.median(baseline[chan,pixel,:])
ax[chan].plot(baseline[chan,pixel,:],label=label)
ax[chan].axhline(ped_median, color='red',linestyle="--")
ax[chan].set_ylabel(f'baseline [ADC]',fontsize=20)
ax[chan].set_xlabel(f'capacitor',fontsize=20)
ax[chan].legend(prop={'size':15})

[8]:
# plot the spikes
spike_data=drs4_data["spike_height"]
fig, ax = plt.subplots(1, 2, figsize=(12,6),constrained_layout=True)
for chan in np.arange(2):
label=f"channel {channel[chan]}"
ax[chan].set_title(label, fontsize=15)
ax[chan].grid(True)
for spike in np.arange(3):
label=f"spike {spike}: median {np.median(spike_data[chan,:,spike]):3.1f}"
ax[chan].hist(spike_data[chan,:,spike], label=label)
ax[chan].set_xlabel(f'spikes [ADC]',fontsize=20)
ax[chan].set_ylabel(f'pixel',fontsize=20)
ax[chan].legend(prop={'size':15})

Fits format#
[9]:
from astropy.io import fits
file = "../../../test_data/real/service/PixelCalibration/Cat-A/drs4_baseline/20200218/pro/drs4_pedestal.Run02005.0000.fits.gz"
fits_f = fits.open(file)
HDU#
[10]:
fits_f.info()
Filename: ../../../test_data/real/service/PixelCalibration/Cat-A/drs4_baseline/20200218/pro/drs4_pedestal.Run02005.0000.fits.gz
No. Name Ver Type Cards Dimensions Format
0 PRIMARY 1 PrimaryHDU 40 ()
1 BASELINE_MEAN 1 ImageHDU 9 (4096, 1855, 2) int16
2 BASELINE_STD 1 ImageHDU 9 (4096, 1855, 2) int16
3 BASELINE_COUNTS 1 ImageHDU 11 (4096, 1855, 2) int16 (rescales to uint16)
4 SPIKE_HEIGHT 1 ImageHDU 9 (3, 1855, 2) int16
Data#
[11]:
fits_f["BASELINE_MEAN"].data
[11]:
array([[[398, 397, 399, ..., 398, 397, 397],
[401, 399, 398, ..., 400, 399, 399],
[398, 400, 398, ..., 398, 397, 397],
...,
[396, 396, 395, ..., 395, 395, 394],
[398, 398, 399, ..., 397, 398, 397],
[400, 398, 398, ..., 398, 397, 398]],
[[399, 398, 398, ..., 398, 398, 398],
[393, 393, 392, ..., 393, 394, 394],
[397, 398, 398, ..., 397, 398, 398],
...,
[401, 401, 400, ..., 399, 400, 400],
[399, 398, 397, ..., 397, 397, 396],
[397, 397, 397, ..., 398, 397, 397]]],
shape=(2, 1855, 4096), dtype='>i2')
Meta-data#
[12]:
fits_f["PRIMARY"].header
[12]:
SIMPLE = T / conforms to FITS standard
BITPIX = 8 / array data type
NAXIS = 0 / number of array dimensions
EXTEND = T
HIERARCH CTA REFERENCE VERSION = '1 '
HIERARCH CTA CONTACT EMAIL = 'unknown '
HIERARCH CTA CONTACT NAME = 'Franca Cassol'
HIERARCH CTA CONTACT ORGANIZATION = 'LST Consortium'
HIERARCH CTA PRODUCT CREATION TIME = '2024-09-06 10:16:20.413'
HIERARCH CTA PRODUCT DATA ASSOCIATION = 'Telescope'
HIERARCH CTA PRODUCT DATA CATEGORY = 'A '
HIERARCH CTA PRODUCT DATA LEVELS = 'R1 '
HIERARCH CTA PRODUCT DATA MODEL NAME = 'Unofficial monitoring R1'
HIERARCH CTA PRODUCT DATA MODEL URL = 'unknown '
HIERARCH CTA PRODUCT DATA MODEL VERSION = '1.0 '
HIERARCH CTA PRODUCT DESCRIPTION = 'DRS4 baseline and spike coefficients'
HIERARCH CTA PRODUCT FORMAT = ''
HIERARCH CTA PRODUCT ID = '9ba1c696-aa75-4cba-ae8f-3f6712c19bc2'
HIERARCH CTA PROCESS ID = ''
HIERARCH CTA PROCESS SUBTYPE = 'Calibration'
HIERARCH CTA PROCESS TYPE = 'Observation'
HIERARCH CTA ACTIVITY ID = '32e15dc8-540c-4d30-9945-e06377ad261c'
HIERARCH CTA ACTIVITY NAME = 'create_drs4_pedestal_file'
HIERARCH CTA ACTIVITY SOFTWARE NAME = 'lstcam_calib'
HIERARCH CTA ACTIVITY SOFTWARE VERSION = '0.1.dev281+g2847245'
HIERARCH CTA ACTIVITY START TIME = '2024-09-06 10:09:36.750'
HIERARCH CTA ACTIVITY STOP TIME = '2024-09-06 10:16:20.403'
HIERARCH CTA ACTIVITY TYPE = 'software'
HIERARCH CTA INSTRUMENT CLASS = 'Camera '
HIERARCH CTA INSTRUMENT ID = 'unspecified'
HIERARCH CTA INSTRUMENT SITE = 'CTA-North'
HIERARCH CTA INSTRUMENT SUBTYPE = 'unspecified'
HIERARCH CTA INSTRUMENT TYPE = 'LST '
HIERARCH CTA INSTRUMENT VERSION = 'unspecified'
HIERARCH LSTCAM_CALIB_VERSION = '0.1.dev281+g2847245'
HIERARCH CTAPIPE_VERSION = '0.19.3 '
HIERARCH CTAPIPE_IO_LST_VERSION = '0.22.6 '
TEL_ID = 1
PROV_LOG= '/fefs/aswg/workspace/franca.cassol/data/real/monitoring/PixelCalibr&'
CONTINUE 'ation/Cat-A_ctapipe_v0.17/drs4_baseline/20200218/v0.1.dev281+g28472&'
CONTINUE '45/log/drs4_pedestal.Run02005.0000_2024-09-06T10:09:19.provenance.l&'
CONTINUE 'og'
HIERARCH RUN_START = '2020-02-18 19:43:25.000'
[13]:
fits_f["BASELINE_MEAN"].header
[13]:
XTENSION= 'IMAGE ' / Image extension
BITPIX = 16 / array data type
NAXIS = 3 / number of array dimensions
NAXIS1 = 4096
NAXIS2 = 1855
NAXIS3 = 2
PCOUNT = 0 / number of parameters
GCOUNT = 1 / number of groups
EXTNAME = 'BASELINE_MEAN' / extension name