Source code for neurokin.utils.kinematics.import_export
import itertools
import c3d
import numpy as np
import pandas as pd
[docs]
def import_c3d(path):
"""
Fills df from c3d file
:param path: path to .c3d
:return: first_frame, last_frame, sample_rate, df
"""
with open(path, "rb") as f:
c3d_reader = c3d.Reader(f)
first_frame = c3d_reader._header.first_frame
last_frame = c3d_reader._header.last_frame
sample_rate = c3d_reader._header.frame_rate
bodyparts = get_c3d_labels(f)
axis = ["x", "y", "z"]
run = []
for frame_no, points, analog in c3d_reader.read_frames(copy=False):
fields = []
for x, y, z, err, cam in points:
fields.append(x)
fields.append(y)
fields.append(z)
run.append(fields)
run = np.asarray(run)
columns = [ f"{b}_{a}" for b, a in itertools.product(bodyparts, axis)]
df = pd.DataFrame(run, columns=columns)
return first_frame, last_frame, sample_rate, df
#TESTME
[docs]
def create_empty_df(scorer, bodyparts, frames_no):
"""
Creates empty dataframe to receive 3d data frm c3d file
:param scorer: mock data scorer
:param bodyparts: list of bodyparts that will be in the dataframe
:param frames_no: number of frames
:return: empty dataframe with correct shape and columns
"""
dataFrame = None
a = np.full((frames_no, 3), np.nan)
for bodypart in bodyparts:
pdindex = pd.MultiIndex.from_product(
[[scorer], [bodypart], ["x", "y", "z"]],
names=["scorer", "bodyparts", "coords"])
frame = pd.DataFrame(a, columns=pdindex, index=range(0, frames_no))
dataFrame = pd.concat([frame, dataFrame], axis=1)
return dataFrame
[docs]
def get_c3d_labels(handle):
"""
Reads in the labels from a .c3d handle
:param handle:
:return: labels
"""
reader = c3d.Reader(handle)
a = reader._groups["POINT"]._params["LABELS"]
C, R = a.dimensions
labels = [a.bytes[r * C: (r + 1) * C].strip().decode() for r in range(R)]
return labels
[docs]
def import_dlc_df(filename):
if filename.endswith(".csv"):
df = pd.read_csv(filename, header=[0, 1, 2], skipinitialspace=False, index_col=[0])
elif filename.endswith(".hd5"):
df = pd.read_hdf(filename)
else:
raise ValueError("File format not supported, please provide .csv or .hd5 files for DLC datasets")
return df