@@ -25,60 +25,74 @@ def get_RPE_by_avg_signal_fit(data, avg_signal_col):
2525
2626output_col_name = lambda channel , data_column , alignment_event : f"avg_{ data_column } _{ channel [:3 ]} _{ alignment_event .split ("_in_" )[0 ]} "
2727
28+ # ...existing code...
2829def 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-
8296def enrich_df_trials (df_trials ):
8397
8498##### PART I: REWARD #######
0 commit comments