Source code for bmtk.simulator.filternet.lgnmodel.utilities
import array
import skimage.transform as transform
import numpy as np
[docs]def get_vanhateren(filename, src_dir):
with open(filename, 'rb') as handle:
s = handle.read()
arr = array.array('H', s)
arr.byteswap()
return np.array(arr, dtype='uint16').reshape(1024, 1536)
[docs]def convert_tmin_tmax_framerate_to_trange(t_min, t_max, frame_rate):
duration = t_max-t_min
number_of_frames = duration*frame_rate # Assumes t_min/t_max in same time units as frame_rate
dt = 1./frame_rate
return t_min+np.arange(number_of_frames+1)*dt
[docs]def get_rotation_matrix(rotation, shape):
"""Angle in degrees"""
shift_y, shift_x = np.array(shape) / 2.
tf_rotate = transform.SimilarityTransform(rotation=np.deg2rad(rotation))
tf_shift = transform.SimilarityTransform(translation=[-shift_x, -shift_y])
tf_shift_inv = transform.SimilarityTransform(translation=[shift_x, shift_y])
return (tf_shift + (tf_rotate + tf_shift_inv))
[docs]def get_translation_matrix(translation):
shift_x, shift_y = translation
tf_shift = transform.SimilarityTransform(translation=[-shift_x, shift_y])
return tf_shift
[docs]def get_scale_matrix(scale, shape):
shift_y, shift_x = np.array(shape) / 2.
tf_rotate = transform.SimilarityTransform(scale=(1./scale[0], 1./scale[1]))
tf_shift = transform.SimilarityTransform(translation=[-shift_x, -shift_y])
tf_shift_inv = transform.SimilarityTransform(translation=[shift_x, shift_y])
return tf_shift + (tf_rotate + tf_shift_inv)
[docs]def get_convolution_ind(curr_fi, flipped_t_inds, kernel, data):
flipped_and_offset_t_inds = flipped_t_inds + curr_fi
if np.all(flipped_and_offset_t_inds >= 0):
# No negative entries; still might be over the end though:
try:
return np.dot(data[flipped_and_offset_t_inds], kernel)
except IndexError:
# Requested some indices out of range of data:
indices_within_range = np.where(flipped_and_offset_t_inds < len(data))
valid_t_inds = flipped_and_offset_t_inds[indices_within_range]
valid_kernel = kernel[indices_within_range]
return np.dot(data[valid_t_inds], valid_kernel)
else:
# Only some are negative, so restrict:
indices_within_range = np.where(flipped_and_offset_t_inds >= 0)
valid_t_inds = flipped_and_offset_t_inds[indices_within_range]
valid_kernel = kernel[indices_within_range]
return np.dot(data[valid_t_inds], valid_kernel)
[docs]def get_convolution(t, frame_rate, flipped_t_inds, kernel, data):
# Get frame indices:
fi = frame_rate*float(t)
fim = int(np.floor(fi))
fiM = int(np.ceil(fi))
if fim != fiM:
# Linear interpolation:
sm = get_convolution_ind(fim, flipped_t_inds, kernel, data)
sM = get_convolution_ind(fiM, flipped_t_inds, kernel, data)
return sm*(1-(fi-fim)) + sM*(fi-fim)
else:
# Requested time is exactly one piece of data:
return get_convolution_ind(fim, flipped_t_inds, kernel, data)