Skip to content

Commit ec2d08c

Browse files
adding base files
1 parent bb0e2d1 commit ec2d08c

2 files changed

Lines changed: 212 additions & 0 deletions

File tree

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
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
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
2+
3+
import warnings
4+
5+
from aind_dynamic_foraging_data_utils import nwb_utils, enrich_dfs
6+
from aind_dynamic_foraging_data_utils import code_ocean_utils as co_utils
7+
8+
9+
def attach_dfs(nwb_file):
10+
11+
nwb_file.df_events = nwb_utils.create_df_events(nwb_file)
12+
nwb_file.df_fip = nwb_utils.create_df_fip(nwb_file)
13+
nwb_file.df_trials = nwb_utils.create_df_trials(nwb_file)
14+
15+
return nwb_file
16+
17+
18+
def get_nwb_processed(file_locations, **parameters) -> None:
19+
interested_channels = list(parameters["channels"].keys())
20+
if parameters['preprocessing'] is not "raw":
21+
interested_channels = [channel + '_' + parameters['preprocessing'] for channel in interested_channels]
22+
df_sess = nwb_utils.create_df_session(file_locations)
23+
df_sess['s3_location'] = file_locations
24+
25+
# check for multiple sessions on the same day
26+
dup_mask = df_sess.duplicated(subset=['ses_idx'], keep=False)
27+
if dup_mask.any():
28+
warnings.warn(f"Duplicate sessions found for ses_idx: {df_sess[dup_mask]['ses_idx'].tolist()}."
29+
"Keeping the one with more finished trials.")
30+
df_sess = (df_sess.sort_values(by=['ses_idx','finished_trials'], ascending=False)
31+
.drop_duplicates(subset=['ses_idx'], keep='first')
32+
)
33+
# sort sessions
34+
df_sess = (df_sess.sort_values(by=['session_date'])
35+
.reset_index(drop=True)
36+
)
37+
# only read last N sessions unless daily, weekly plots are requested
38+
if parameters["plot_types"]=="avg_lastN_sess":
39+
df_sess = df_sess.tail(parameters["last_N_sess"])
40+
41+
42+
(df_trials, df_events, df_fip) = co_utils.get_all_df_for_nwb(filename_sessions=df_sess['s3_location'].values, interested_channels = interested_channels)
43+
44+
45+
df_trials_fm, df_sess_fm = co_utils.get_foraging_model_info(df_trials, df_sess, loc = None, model_name = parameters["fitted_model"])
46+
df_trials_enriched = enrich_dfs.enrich_df_trials_fm(df_trials_fm)
47+
if len(df_fip):
48+
[df_fip_all, df_trials_fip_enriched] = enrich_dfs.enrich_fip_in_df_trials(df_fip, df_trials_enriched)
49+
(df_fip_final, df_trials_final, df_trials_fip) = enrich_dfs.remove_tonic_df_fip(df_fip_all, df_trials_enriched, df_trials_fip_enriched)
50+
else:
51+
warnings.warn(f"channels {interested_channels} not found in df_fip.")
52+
df_fip_final = df_fip
53+
df_trials_final = df_trials
54+
55+
# return all dataframes
56+
return (df_sess, df_trials_final, df_events, df_fip_final)

0 commit comments

Comments
 (0)