Source code for nectarchain.makers.charges_makers

import logging
import os
import pathlib

import numpy as np
from ctapipe.core.traits import Bool, ComponentNameList
from ctapipe.image.extractor import FixedWindowSum  # noqa: F401
from ctapipe.image.extractor import FullWaveformSum  # noqa: F401
from ctapipe.image.extractor import GlobalPeakWindowSum  # noqa: F401
from ctapipe.image.extractor import LocalPeakWindowSum  # noqa: F401
from ctapipe.image.extractor import NeighborPeakWindowSum  # noqa: F401
from ctapipe.image.extractor import SlidingWindowMaxSum  # noqa: F401
from ctapipe.image.extractor import TwoPassWindowSum  # noqa: F401
from ctapipe.image.extractor import (  # noqa: F401
    BaselineSubtractedNeighborPeakWindowSum,
)

from ..data.container import WaveformsContainer, WaveformsContainers
from ..data.management import DataManagement
from .component import ChargesComponent, NectarCAMComponent
from .core import EventsLoopNectarCAMCalibrationTool
from .extractor.utils import CtapipeExtractor

logging.basicConfig(format="%(asctime)s %(name)s %(levelname)s %(message)s")
log = logging.getLogger(__name__)
log.handlers = logging.getLogger("__main__").handlers


__all__ = ["ChargesNectarCAMCalibrationTool"]


[docs] class ChargesNectarCAMCalibrationTool(EventsLoopNectarCAMCalibrationTool): """class use to make the waveform extraction from event read from r0 data""" name = "ChargesNectarCAMCalibration" componentsList = ComponentNameList( NectarCAMComponent, default_value=["ChargesComponent"], help="List of Component names to be apply, the order will be respected", ).tag(config=True) from_computed_waveforms = Bool( default_value=False, help="a flag to compute charge from waveforms stored on disk", ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def _init_output_path(self): str_extractor_kwargs = CtapipeExtractor.get_extractor_kwargs_str( method=self.method, extractor_kwargs=self.extractor_kwargs, ) if self.max_events is None: filename = ( f"{self.name}_run{self.run_number}_{self.method}" f"_{str_extractor_kwargs}.h5" ) else: filename = ( f"{self.name}_run{self.run_number}_maxevents{self.max_events}_" f"{self.method}_{str_extractor_kwargs}.h5" ) self.output_path = pathlib.Path( f"{os.environ.get('NECTARCAMDATA','/tmp')}/runs/charges/{filename}" ) def start( self, n_events=np.inf, # trigger_type: list = None, restart_from_begining: bool = False, *args, **kwargs, ): # cette implémentation est complétement nulle if self.from_computed_waveforms: try: files = DataManagement.find_waveforms( run_number=self.run_number, max_events=self.max_events ) except Exception as e: log.warning(e) files = [] if len(files) != 1: self.log.info( f"{len(files)} computed waveforms files found with max_events >=" f"{self.max_events} for run {self.run_number}, reload waveforms" f"from event loop" ) super().start( n_events=n_events, restart_from_begining=restart_from_begining, *args, **kwargs, ) else: self.log.info( f"{files[0]} is the computed waveforms files found" f"with max_events >=" f"{self.max_events} for run {self.run_number}" ) waveformsContainers = WaveformsContainers.from_hdf5(files[0]) if not (isinstance(waveformsContainers, WaveformsContainer)): n_slices = 0 try: while True: next(waveformsContainers) n_slices += 1 except StopIteration: pass waveformsContainers = WaveformsContainers.from_hdf5(files[0]) if n_slices == 1: self._init_writer(sliced=False) chargesContainers = ( ChargesComponent._create_from_waveforms_looping_eventType( waveformsContainers=next(waveformsContainers), subarray=self.event_source.subarray, tel_id=self.tel_id, method=self.method, **self.extractor_kwargs, ) ) self._write_container(container=chargesContainers) else: self.log.debug( f"WaveformsContainer file contains {n_slices} slices of the" f"run events" ) for slice_index, _waveformsContainers in enumerate( waveformsContainers ): self._init_writer(sliced=True, slice_index=slice_index) chargesContainers = ChargesComponent._create_from_waveforms_looping_eventType( # noqa waveformsContainers=_waveformsContainers, subarray=self.event_source.subarray, tel_id=self.tel_id, method=self.method, **self.extractor_kwargs, ) self._write_container(container=chargesContainers) else: self.log.debug( "WaveformsContainer file container is a simple \ WaveformsContainer (not mapped)" ) self._init_writer(sliced=False) chargesContainers = ChargesComponent.create_from_waveforms( waveformsContainer=waveformsContainers, subarray=self.event_source.subarray, tel_id=self.tel_id, method=self.method, **self.extractor_kwargs, ) self._write_container(container=chargesContainers) self.writer.close() # self.__still_finished = True else: super().start( n_events=n_events, restart_from_begining=restart_from_begining, *args, **kwargs, )