Skip to content

Commit 1361336

Browse files
there was a mistake in the rpe_slopes
1 parent 0637bd4 commit 1361336

1 file changed

Lines changed: 44 additions & 30 deletions

File tree

src/rachel_analysis_utils/analysis_utils.py

Lines changed: 44 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -25,60 +25,74 @@ def get_RPE_by_avg_signal_fit(data, avg_signal_col):
2525

2626
output_col_name = lambda channel, data_column, alignment_event: f"avg_{data_column}_{channel[:3]}_{alignment_event.split("_in_")[0]}"
2727

28+
# ...existing code...
2829
def add_AUC_and_rpe_slope(nwbs_by_week, parameters, data_column = 'data_z_norm',
2930
alignment_event = 'choice_time_in_session',offsets = [0.33,1]):
30-
rpe_slope_dict = {}
31+
"""
32+
Enrich NWB weeks with average signal windows and compute RPE slopes per session for each channel.
33+
Fixes previous bug where only the last channel was saved.
34+
"""
3135
nwbs_by_week_enriched = []
36+
37+
# Enrich each week with average signals for every channel
3238
for nwb_week in nwbs_by_week:
3339
nwb_week_enriched = copy.deepcopy(nwb_week)
34-
for channel in list(parameters["channels"].keys()):
35-
if parameters['preprocessing'] != 'raw':
36-
channel = channel + '_' + parameters['preprocessing']
40+
for ch in list(parameters["channels"].keys()):
41+
# build the channel name used for processing (append preprocessing suffix if present)
42+
channel = ch
43+
if parameters.get('preprocessing', 'raw') != 'raw':
44+
channel = channel + '_' + parameters['preprocessing']
3745

3846
avg_signal_col = output_col_name(channel, data_column, alignment_event)
39-
40-
47+
4148
nwb_week_enriched = trial_metrics.get_average_signal_window_multi(
42-
nwb_week_enriched,
43-
alignment_event=alignment_event,
44-
offsets=offsets,
45-
channel=channel,
46-
data_column=data_column,
47-
output_col = avg_signal_col
48-
)
49+
nwb_week_enriched,
50+
alignment_event=alignment_event,
51+
offsets=offsets,
52+
channel=channel,
53+
data_column=data_column,
54+
output_col=avg_signal_col
55+
)
4956
nwbs_by_week_enriched.append(nwb_week_enriched)
50-
51-
# get rpe slope per session
5257

53-
df_trials_all = pd.concat([nwb.df_trials for nwb_week in nwbs_by_week_enriched for nwb in nwb_week])
54-
rpe_slope = []
58+
# After enriching all weeks, compute RPE slopes per session for each channel
59+
df_trials_all = pd.concat([nwb.df_trials for nwb_week in nwbs_by_week_enriched for nwb in nwb_week])
60+
rpe_rows = []
61+
subject_id = str(nwbs_by_week_enriched[0][0]).split(' ')[1].split('_')[0]
62+
63+
for ch in list(parameters["channels"].keys()):
64+
channel = ch
65+
if parameters.get('preprocessing', 'raw') != 'raw':
66+
channel = channel + '_' + parameters['preprocessing']
67+
68+
avg_signal_col = output_col_name(channel, data_column, alignment_event)
69+
70+
5571
for ses_idx in sorted(df_trials_all['ses_idx'].unique()):
56-
5772
data = df_trials_all[df_trials_all['ses_idx'] == ses_idx]
58-
data = data.dropna(subset = [avg_signal_col, 'RPE_earned'])
73+
data = data.dropna(subset=[avg_signal_col, 'RPE_earned'])
5974
if len(data) == 0:
6075
continue
76+
6177
data_neg = data[data['RPE_earned'] < 0]
6278
data_pos = data[data['RPE_earned'] >= 0]
6379

6480
ses_date = pd.to_datetime(ses_idx.split('_')[1])
65-
(_,_, slope_pos) = get_RPE_by_avg_signal_fit(data_pos, avg_signal_col)
66-
(_,_, slope_neg) = get_RPE_by_avg_signal_fit(data_neg, avg_signal_col)
67-
rpe_slope.append([ses_date, slope_pos, slope_neg])
68-
rpe_slope = pd.DataFrame(rpe_slope, columns=['date', 'slope (RPE >= 0)', 'slope (RPE < 0)'])
69-
rpe_slope_dict[channel] = rpe_slope
81+
(_, _, slope_pos) = get_RPE_by_avg_signal_fit(data_pos, avg_signal_col)
82+
(_, _, slope_neg) = get_RPE_by_avg_signal_fit(data_neg, avg_signal_col)
83+
rpe_rows.append([subject_id, ses_date, channel, slope_pos, slope_neg])
7084

71-
subject_id = str(nwbs_by_week_enriched[0][0]).split(' ')[1].split('_')[0]
72-
# Concatenate with keys, turning dict keys into an index
73-
combined_rpe_slope = pd.concat(rpe_slope_dict, names=["channel"])
74-
combined_rpe_slope = combined_rpe_slope.reset_index(level="channel").reset_index(drop=True)
85+
# Combine per-channel dataframes into one table with a channel column
7586

76-
if parameters["save_dfs"] == True:
87+
combined_rpe_slope = pd.DataFrame(rpe_rows, columns=['subject_id', 'date', 'channel', 'slope (RPE >= 0)', 'slope (RPE < 0)'])
88+
89+
90+
91+
if parameters.get("save_dfs", False) == True:
7792
combined_rpe_slope.to_csv(f"/results/data/{subject_id}/rpe_slope.csv")
7893

7994
return nwbs_by_week_enriched, combined_rpe_slope
8095

81-
8296
def enrich_df_trials(df_trials):
8397

8498
##### PART I: REWARD #######

0 commit comments

Comments
 (0)