Source code for allensdk.brain_observatory.behavior.running_processing
import scipy.signal
import numpy as np
import pandas as pd
[docs]def calc_deriv(x, time):
dx = np.diff(x)
dt = np.diff(time)
dxdt_rt = np.hstack((np.nan, dx / dt))
dxdt_lt = np.hstack((dx / dt, np.nan))
dxdt = np.vstack((dxdt_rt, dxdt_lt))
dxdt = np.nanmean(dxdt, axis=0)
return dxdt
[docs]def deg_to_dist(speed_deg_per_s):
'''
takes speed in degrees per second
converts to radians
multiplies by radius (in cm) to get linear speed in cm/s
'''
wheel_diameter = 6.5 * 2.54 # 6.5" wheel diameter
running_radius = 0.5 * (
2.0 * wheel_diameter / 3.0) # assume the animal runs at 2/3 the distance from the wheel center
running_speed_cm_per_sec = np.pi * speed_deg_per_s * running_radius / 180.
return running_speed_cm_per_sec
[docs]def get_running_df(data, time):
dx_raw = data["items"]["behavior"]["encoders"][0]["dx"]
v_sig = data["items"]["behavior"]["encoders"][0]["vsig"]
v_in = data["items"]["behavior"]["encoders"][0]["vin"]
assert len(v_in) == len(time), "length of v_in ({}) must match length of time ({}), they are off by {}".format(
len(v_in),
len(time),
abs(len(v_in) - len(time))
)
# remove big, single frame spikes in encoder values
dx = scipy.signal.medfilt(dx_raw, kernel_size=5)
dx = np.cumsum(dx) # wheel rotations
speed = calc_deriv(dx, time) # speed in degrees/s
speed = deg_to_dist(speed)
return pd.DataFrame({
'speed': speed,
'dx': dx_raw,
'v_sig': v_sig,
'v_in': v_in,
}, index=pd.Index(time, name='timestamps'))