def __init__(self, subarray, **kwargs): """ Parameters ---------- reducer_product : ctapipe.image.reducer.DataVolumeReducer The DataVolumeReducer to use. If None, then NullDataVolumeReducer will be used by default, and waveforms will not be reduced. extractor_product : ctapipe.image.extractor.ImageExtractor The ImageExtractor to use. If None, then LocalPeakWindowSum will be used by default. calibration_path : Path to LST calibration file to get the pedestal and flat-field corrections kwargs """ super().__init__(subarray, **kwargs) # load the waveform charge extractor self.image_extractor = ImageExtractor.from_name(self.extractor_product, subarray=self.subarray, config=self.config) self.log.info(f"extractor {self.extractor_product}") print("EXTRACTOR", self.image_extractor) self.data_volume_reducer = DataVolumeReducer.from_name( self.reducer_product, subarray=self.subarray, config=self.config) self.log.info(f" {self.reducer_product}") # declare gain selector if the threshold is defined if self.gain_threshold: self.gain_selector = gainselection.ThresholdGainSelector( threshold=self.gain_threshold) # declare time calibrator if correction file exist if os.path.exists(self.time_calibration_path): self.time_corrector = PulseTimeCorrection( calib_file_path=self.time_calibration_path) else: raise IOError( f"Time calibration file {self.time_calibration_path} not found!" ) # calibration data container self.mon_data = MonitoringContainer() # initialize the MonitoringContainer() for the moment it reads it from a hdf5 file self._initialize_correction() self.log.info(f"Global charge scale {self.charge_scale}")
def gain_selection(waveform, charges, pulse_time, threshold): """ Custom lst calibration. Update event.dl1.tel[telescope_id] with calibrated image and peakpos Parameters ---------- waveform: array of waveforms of the events charges: array of calibrated pixel charges pulse_time: array of pixel peak positions cam_id: str threshold: int threshold to change form high gain to low gain """ assert charges.shape[0] == 2 gain_selector = gainselection.ThresholdGainSelector(threshold=threshold) waveform, gain_mask = gain_selector(waveform) combined_image = charges[gain_mask, np.arange(charges.shape[1])] combined_pulse_time = pulse_time[gain_mask, np.arange(pulse_time.shape[1])] return combined_image, combined_pulse_time