1+ import warnings
2+ import glob
3+ import pandas as pd
4+ import numpy as np
5+
6+
7+ class dummy_nwb :
8+ def __init__ (self , df_trials , df_events , df_fip , ses_idx = None , df_licks = None , grouped = False ) -> None :
9+ if grouped is True :
10+ self .df_events = df_events
11+ self .df_fip = df_fip
12+ self .df_trials = df_trials
13+ self .session_id = ', ' .join (df_trials .ses_idx .unique ())
14+ return
15+ if ses_idx is None and grouped is False :
16+
17+ if len (df_trials .ses_idx .unique ()) > 1 or \
18+ len (df_events .ses_idx .unique ()) > 1 or \
19+ len (df_fip .ses_idx .unique ()) > 1 :
20+
21+ warnings .warn ('multiple sessions found, only one will be attached to this nwb' )
22+ ses_idx = df_trials .ses_idx .unique ()[0 ]
23+
24+
25+ assert df_fip [df_fip ['ses_idx' ] == ses_idx ].shape [0 ] != 0 ,(
26+ "No session exists in the df_fip"
27+ )
28+ self .session_id = ses_idx
29+ self .df_events = df_events [df_events ['ses_idx' ] == ses_idx ]
30+ self .df_fip = df_fip [df_fip ['ses_idx' ] == ses_idx ].copy ().reset_index (drop = True )
31+ self .df_trials = df_trials [df_trials ['ses_idx' ] == ses_idx ]
32+ if df_licks :
33+ self .df_licks = df_licks [df_licks ['ses_idx' ] == ses_idx ]
34+
35+ nwb_file_name = glob .glob (f"/root/capsule/data/**{ ses_idx } **/nwb/**.nwb" )
36+ if len (nwb_file_name ):
37+ self .nwb_file_loc = nwb_file_name [0 ]
38+ else :
39+ self .nwb_file_loc = None
40+
41+
42+ def __str__ (self ):
43+ return f"session { self .session_id } "
44+
45+ def __repr__ (self ):
46+ return f"{ self .session_id } "
47+
48+
49+ def get_dummy_nwbs (df_trials , df_events , df_fip ):
50+ ses_idx_list = df_trials .ses_idx .unique ()
51+ dummy_nwbs_list = []
52+ ses_dates_order = np .argsort (pd .to_datetime ([ses_idx .split ('_' )[1 ] for ses_idx in ses_idx_list ]))
53+
54+ for ses_idx in ses_idx_list [ses_dates_order ]:
55+ # Check if ses_idx exists in all 3 dataframes
56+ if (
57+ ses_idx in df_events ['ses_idx' ].values and
58+ ses_idx in df_fip ['ses_idx' ].values and
59+ ses_idx in df_trials ['ses_idx' ].values
60+ ):
61+ df_trials_i = df_trials [df_trials ['ses_idx' ] == ses_idx ]
62+ df_events_i = df_events [df_events ['ses_idx' ] == ses_idx ]
63+ df_fip_i = df_fip [df_fip ['ses_idx' ] == ses_idx ]
64+
65+ dummy_nwbs_list .append (dummy_nwb (df_trials_i , df_events_i , df_fip_i ))
66+ else :
67+ warnings .warn (f"Skipping { ses_idx } : not found in all input DataFrames." , UserWarning )
68+
69+ return dummy_nwbs_list
70+
71+ def get_dummy_nwbs_by_subject (df_trials , df_events , df_fip ):
72+ df_trials ['subject_id' ] = df_trials ['ses_idx' ].str .split ('_' ).str [0 ]
73+ df_events ['subject_id' ] = df_events ['ses_idx' ].str .split ('_' ).str [0 ]
74+ df_fip ['subject_id' ] = df_fip ['ses_idx' ].str .split ('_' ).str [0 ]
75+ subject_id_list = df_trials .subject_id .unique ()
76+ dummy_nwbs_list = []
77+ for subject_id in subject_id_list :
78+ # Check if ses_idx exists in all 3 dataframes
79+ if (
80+ subject_id in df_events ['subject_id' ].values and
81+ subject_id in df_fip ['subject_id' ].values and
82+ subject_id in df_trials ['subject_id' ].values
83+ ):
84+ df_trials_i = df_trials [df_trials ['subject_id' ] == subject_id ]
85+ df_events_i = df_events [df_events ['subject_id' ] == subject_id ]
86+ df_fip_i = df_fip [df_fip ['subject_id' ] == subject_id ]
87+
88+ dummy_nwbs_list .append (get_dummy_nwbs (df_trials_i , df_events_i , df_fip_i ))
89+ else :
90+ warnings .warn (f"Skipping { subject_id } : not found in all input DataFrames." , UserWarning )
91+
92+ return dummy_nwbs_list
93+
94+ def get_date_and_week_interval (df , start_date ):
95+ date_series = pd .to_datetime (df ['ses_idx' ].str .split ('_' ).str [1 ], format = '%Y-%m-%d' )
96+ week_interval_series = ((date_series - start_date ).dt .days // 7 ) + 1
97+ return week_interval_series
98+
99+ def get_dummy_nwbs_by_week (df_sess ,df_trials , df_events , df_fip ):
100+ start_date = pd .to_datetime (df_sess ['session_date' ].min ())
101+
102+ df_sess ['week_interval' ] = get_date_and_week_interval (df_sess , start_date )
103+ df_trials ['week_interval' ] = get_date_and_week_interval (df_trials , start_date )
104+ df_events ['week_interval' ] = get_date_and_week_interval (df_events , start_date )
105+ df_fip ['week_interval' ] = get_date_and_week_interval (df_fip , start_date )
106+
107+ week_interval_list = df_trials .week_interval .unique ()
108+ dummy_nwbs_list = []
109+ for week_interval in week_interval_list :
110+ # Check if ses_idx exists in all 3 dataframes
111+ if (
112+ week_interval in df_events ['week_interval' ].values and
113+ week_interval in df_fip ['week_interval' ].values and
114+ week_interval in df_trials ['week_interval' ].values
115+ ):
116+ df_trials_i = df_trials [df_trials ['week_interval' ] == week_interval ]
117+ df_events_i = df_events [df_events ['week_interval' ] == week_interval ]
118+ df_fip_i = df_fip [df_fip ['week_interval' ] == week_interval ]
119+
120+ dummy_nwbs_list .append (get_dummy_nwbs (df_trials_i , df_events_i , df_fip_i ))
121+ else :
122+ warnings .warn (f"Skipping { week_interval } : not found in all input DataFrames." , UserWarning )
123+
124+ return df_sess , dummy_nwbs_list
125+
126+
127+
128+ def combine_dummy_nwbs_to_dfs (dummy_nwbs_list ):
129+ """
130+ Given a list of dummy_nwb objects, concatenate their df_trials, df_events, and df_fip
131+ into three large DataFrames.
132+
133+ Parameters
134+ ----------
135+ dummy_nwbs : list of dummy_nwb
136+
137+ Returns
138+ -------
139+ tuple of pd.DataFrame
140+ (df_trials_all, df_events_all, df_fip_all)
141+ """
142+
143+ df_trials_list = []
144+ df_events_list = []
145+ df_fip_list = []
146+
147+ for nwb in dummy_nwbs_list :
148+ df_trials_list .append (nwb .df_trials )
149+ df_events_list .append (nwb .df_events )
150+ df_fip_list .append (nwb .df_fip )
151+
152+ df_trials_all = pd .concat (df_trials_list , ignore_index = True )
153+ df_events_all = pd .concat (df_events_list , ignore_index = True )
154+ df_fip_all = pd .concat (df_fip_list , ignore_index = True )
155+
156+ return df_trials_all , df_events_all , df_fip_all
0 commit comments