From 696cac459e34681c0d5fb4837aaffc4dce301baf Mon Sep 17 00:00:00 2001 From: davidpagnon Date: Mon, 30 Oct 2023 11:28:42 +0100 Subject: [PATCH] improved scripts --- Pose2Sim/Utilities/c3d_to_trc.py | 16 ++++++++++++++-- Pose2Sim/Utilities/trc_Zup_to_Yup.py | 8 +++++--- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/Pose2Sim/Utilities/c3d_to_trc.py b/Pose2Sim/Utilities/c3d_to_trc.py index f9660c5..2fe752f 100644 --- a/Pose2Sim/Utilities/c3d_to_trc.py +++ b/Pose2Sim/Utilities/c3d_to_trc.py @@ -67,6 +67,18 @@ def c3d_to_trc_func(*args): value_item = [item[1] for item in items_header_list] header_c3d = dict(zip(label_item, value_item)) + # unit + for k1 in reader.group_items(): + if k1[0]=='POINT': + for k2 in k1[1].param_items(): + if k2[0]=='UNITS': + if 'mm' in k2[1].bytes[:].decode('utf-8'): + unit = 'mm' + unit_scale= 0.001 + else: + unit = 'm' + unit_scale= 1 # mm + # c3d data: reads 3D points (no analog data) and takes off computed data labels = reader.point_labels index_labels_markers = [i for i, s in enumerate(labels) if 'Angle' not in s and 'Power' not in s and 'Force' not in s and 'Moment' not in s and 'GRF' not in s] @@ -80,7 +92,7 @@ def c3d_to_trc_func(*args): header1['CameraRate'] = header1['DataRate'] header1['NumFrames'] = str(int(header_c3d['last_frame']) - int(header_c3d['first_frame']) + 1) header1['NumMarkers'] = str(len(labels_markers)) - header1['Units'] = 'm' + header1['Units'] = unit header1['OrigDataRate'] = header1['DataRate'] header1['OrigDataStartFrame'] = header_c3d['first_frame'] header1['OrigNumFrames'] = header1['NumFrames'] @@ -101,7 +113,7 @@ def c3d_to_trc_func(*args): tf = int(float(header_c3d['last_frame'])) / int(float(header_c3d['frame_rate'])) trc_time = np.linspace(t0, tf, num=(int(header_c3d['last_frame']) - int(header_c3d['first_frame']) + 1)) for n, (i, points, _) in enumerate(list(reader.read_frames())): - c3d_line = np.concatenate([item[:3] for item in points]) + c3d_line = np.concatenate([item[:3] for item in points])*unit_scale c3d_line_markers = c3d_line[index_data_markers] trc_line = '{i}\t{t}\t'.format(i=i, t=trc_time[n]) + '\t'.join(map(str,c3d_line_markers)) trc_o.write(trc_line+'\n') diff --git a/Pose2Sim/Utilities/trc_Zup_to_Yup.py b/Pose2Sim/Utilities/trc_Zup_to_Yup.py index 1aade99..115ae7c 100644 --- a/Pose2Sim/Utilities/trc_Zup_to_Yup.py +++ b/Pose2Sim/Utilities/trc_Zup_to_Yup.py @@ -63,17 +63,19 @@ def trc_Zup_to_Yup_func(*args): frames_col, time_col = trc_df.iloc[:,0], trc_df.iloc[:,1] Q_coord = trc_df.drop(trc_df.columns[[0, 1]], axis=1) - # X->Y, Y->Z, Z->X + # Y->Z, Z->-Y cols = list(Q_coord.columns) - cols = np.array([[cols[i*3+1],cols[i*3+2],cols[i*3]] for i in range(int(len(cols)/3))]).flatten() + # cols = np.array([[cols[i*3+1],cols[i*3+2],cols[i*3]] for i in range(int(len(cols)/3))]).flatten() # X->Y, Y->Z, Z->X + cols = np.array([[cols[i*3],cols[i*3+2],cols[i*3+1]] for i in range(int(len(cols)/3))]).flatten() # Y->Z, Z->-Y Q_Yup = Q_coord[cols] + Q_Yup.iloc[:,2::3] = - Q_Yup.iloc[:,2::3] # write file with open(trc_yup_path, 'w') as trc_o: [trc_o.write(line) for line in header] Q_Yup.insert(0, 'Frame#', frames_col) Q_Yup.insert(1, 'Time', time_col) - Q_Yup.to_csv(trc_o, sep='\t', index=False, header=None, lineterminator='\n') + Q_Yup.to_csv(trc_o, sep='\t', index=False, header=None, line_terminator='\n') if __name__ == '__main__': parser = argparse.ArgumentParser()