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_meanbaseline_stdbaseline_countsspike_height
int16[2,1855,4096]int16[2,1855,4096]uint16[2,1855,4096]int16[2,1855,3]
398 .. 39710 .. 3149 .. 13150 .. 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})

../../_images/user-guide_notebooks_read_DRS4_baseline_11_0.png
[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})

../../_images/user-guide_notebooks_read_DRS4_baseline_12_0.png

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