123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- from ..ctvs import get_ctv_function
- import numpy as np
- import pandas as pd
- from ..flags import FlagsManager
- class PixelWiseCTVHandler(object):
- def __init__(self, flags: FlagsManager, p1):
- super().__init__()
- try:
- ctv_method_file = flags.get_ctv_method_file()
- except FileNotFoundError as fnfe:
- ctv_method_file = None
- self.ctv_method = get_ctv_function(flags["CTV_Method"], ctv_method_file)
- self.ctv_firstframe = flags["CTV_firstframe"]
- self.ctv_lastframe = flags["CTV_lastframe"]
- self.sampling_period = p1.metadata.trial_ticks
- stim_on_times_td = p1.pulsed_stimuli_handler.get_pulse_start_times()
- if len(stim_on_times_td) > 0:
- self.stim_on_times = stim_on_times_td / pd.Timedelta("1ms")
- else:
- self.stim_on_times = None
- stim_off_times_td = p1.pulsed_stimuli_handler.get_pulse_end_times()
- if len(stim_off_times_td) > 0:
- self.stim_off_times = stim_off_times_td / pd.Timedelta("1ms")
- else:
- self.stim_off_times = None
- self.stimulus_number = flags["CTV_StimulusNumber"]
- self.flags = flags
- self.p1 = p1
- def apply(self, data):
- """
- Apply the CTV specified in self.flags during initialization pixel wise to generate overview frames
- :param numpy.ndarray data: 3D, XYT
- :rtype: numpy.ndarray
- :return: dimensions: features-X-Y
- """
- result_frame = None
- for x_ind, y_ind in np.ndindex(*data.shape[:2]):
- features = self.apply_pixel(data[x_ind, y_ind, :])
- if result_frame is None:
- result_frame = np.empty((len(features), *data.shape[:2]))
- result_frame[:, x_ind, y_ind] = features
- return result_frame # dimensions: features-X-Y
- def apply_pixel(self, timetrace):
- return self.ctv_method(
- time_trace=timetrace,
- first_frame=self.ctv_firstframe,
- last_frame=self.ctv_lastframe,
- sampling_period=self.sampling_period,
- stim_on_times=self.stim_on_times,
- stim_off_times=self.stim_off_times,
- stimulus_number=self.stimulus_number,
- flags=self.flags,
- p1=self.p1)
- def get_ctv_handler(flags, p1):
- if flags["SO_Method"] == 0:
- return PixelWiseCTVHandler(flags=flags, p1=p1)
- else:
- raise NotImplementedError(
- f"Features with 'SO_Method' set to {flags['SO_Method']} have not yet been implemented\n")
|