From 027cad745bfae374e334275b39eb626eced3f5a4 Mon Sep 17 00:00:00 2001 From: jungheejung Date: Sat, 9 Mar 2024 14:12:25 -0500 Subject: [PATCH] DEV: filter ratings that are within 1/3 of the range --- spacetop_prep/events/bidsify_cue_cognitive.py | 29 +++++++++++++++++-- spacetop_prep/events/bidsify_cue_vicarious.py | 29 +++++++++++++++++-- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/spacetop_prep/events/bidsify_cue_cognitive.py b/spacetop_prep/events/bidsify_cue_cognitive.py index d320ffe..e177ba3 100644 --- a/spacetop_prep/events/bidsify_cue_cognitive.py +++ b/spacetop_prep/events/bidsify_cue_cognitive.py @@ -53,6 +53,30 @@ def calc_adjusted_angle_df(df, x_col, y_col, xcenter, ycenter): return angles_deg +def calc_adjusted_angle_df(df, x_col, y_col, xcenter, ycenter): + # Calculate distance from the origin (xcenter, ycenter) + distance = np.sqrt((df[x_col] - xcenter)**2 + (ycenter - df[y_col])**2) + + # Initialize angles array with NaN or another default value for points too close to the origin + angles_deg = np.full(df.shape[0], np.nan) + + # Only calculate angles for points more than 80 units away from the origin + mask = distance > 80 + angles = np.arctan2((ycenter - df.loc[mask, y_col]), (df.loc[mask, x_col] - xcenter)) + + # Adjust the angle so it's between 0 and π radians + angles = np.pi - angles + + # Convert angles to degrees and ensure they are positive + angles_deg[mask] = np.abs(np.degrees(angles)) + + # Ensure all angles fall within the 0 to 180 range + angles_deg = angles_deg % 360 + angles_deg[angles_deg > 180] = 360 - angles_deg[angles_deg > 180] + + return angles_deg + + bids_dir = '/Users/h/Documents/projects_local/1076_spacetop' # the top directory of datalad code_dir = '/Users/h/Documents/projects_local/1076_spacetop/code' # where this code live source_dir = '/Users/h/Documents/projects_local/1076_spacetop/sourcedata'# where the source behavioral directory lives @@ -122,6 +146,7 @@ def calc_adjusted_angle_df(df, x_col, y_col, xcenter, ycenter): except FileNotFoundError as e: logger.warning(str(e)) + logger.warning(f"_______ {sub_bids} {ses_bids} {run_bids} {runtype} _______Trajectory preproc is empty") continue except Exception as e: # This catches any other exceptions that might occur @@ -142,9 +167,9 @@ def calc_adjusted_angle_df(df, x_col, y_col, xcenter, ycenter): # traj_df['adjusted_outcomeangle_degrees'] = traj_df['outcomeangle_degrees'] % 180 # 3-2. Calculate the angle in radians and then convert to degrees - traj_df['expectangle_degrees'] = calc_adjusted_angle_df( + traj_df['adjusted_expectangle_degrees'] = calc_adjusted_angle_df( traj_df, 'expectrating_end_x', 'expectrating_end_y', trajectory_x, trajectory_y) - traj_df['outcomeangle_degrees'] = calc_adjusted_angle_df( + traj_df['adjusted_outcomeangle_degrees'] = calc_adjusted_angle_df( traj_df, 'outcomerating_end_x', 'outcomerating_end_y', trajectory_x, trajectory_y) diff --git a/spacetop_prep/events/bidsify_cue_vicarious.py b/spacetop_prep/events/bidsify_cue_vicarious.py index 1aced48..8f88307 100644 --- a/spacetop_prep/events/bidsify_cue_vicarious.py +++ b/spacetop_prep/events/bidsify_cue_vicarious.py @@ -52,6 +52,30 @@ def calc_adjusted_angle_df(df, x_col, y_col, xcenter, ycenter): return angles_deg +def calc_adjusted_angle_df(df, x_col, y_col, xcenter, ycenter): + # Calculate distance from the origin (xcenter, ycenter) + distance = np.sqrt((df[x_col] - xcenter)**2 + (ycenter - df[y_col])**2) + + # Initialize angles array with NaN or another default value for points too close to the origin + angles_deg = np.full(df.shape[0], np.nan) + + # Only calculate angles for points more than 80 units away from the origin + mask = distance > 80 + angles = np.arctan2((ycenter - df.loc[mask, y_col]), (df.loc[mask, x_col] - xcenter)) + + # Adjust the angle so it's between 0 and π radians + angles = np.pi - angles + + # Convert angles to degrees and ensure they are positive + angles_deg[mask] = np.abs(np.degrees(angles)) + + # Ensure all angles fall within the 0 to 180 range + angles_deg = angles_deg % 360 + angles_deg[angles_deg > 180] = 360 - angles_deg[angles_deg > 180] + + return angles_deg + + bids_dir = '/Users/h/Documents/projects_local/1076_spacetop' # the top directory of datalad code_dir = '/Users/h/Documents/projects_local/1076_spacetop/code' # where this code live source_dir = '/Users/h/Documents/projects_local/1076_spacetop/sourcedata'# where the source behavioral directory lives @@ -121,6 +145,7 @@ def calc_adjusted_angle_df(df, x_col, y_col, xcenter, ycenter): except FileNotFoundError as e: logger.warning(str(e)) + logger.warning(f"{sub_bids}_{ses_bids}_task-cue_{run_bids} Trajectory preproc is empty") continue except Exception as e: # This catches any other exceptions that might occur @@ -142,9 +167,9 @@ def calc_adjusted_angle_df(df, x_col, y_col, xcenter, ycenter): # traj_df['adjusted_expectangle_degrees'] = traj_df['expectangle_degrees'] % 180 # traj_df['adjusted_outcomeangle_degrees'] = traj_df['outcomeangle_degrees'] % 180 - traj_df['expectangle_degrees'] = calc_adjusted_angle_df( + traj_df['adjusted_expectangle_degrees'] = calc_adjusted_angle_df( traj_df, 'expectrating_end_x', 'expectrating_end_y', trajectory_x, trajectory_y) - traj_df['outcomeangle_degrees'] = calc_adjusted_angle_df( + traj_df['adjusted_outcomeangle_degrees'] = calc_adjusted_angle_df( traj_df, 'outcomerating_end_x', 'outcomerating_end_y', trajectory_x, trajectory_y)