def psy_by_mouse(unique_signed_contrasts): mice = pd.DataFrame.from_dict( (subject.Subject()) * (subject.SubjectLab()) * (behavior_analysis.SessionTrainingStatus() & 'training_status="trained" ')) psy_df = pd.DataFrame(columns=unique_signed_contrasts) for row, mouse in enumerate(mice.subject_nickname.unique()): key = ((subject.Subject() & 'subject_nickname = "{}"'.format(mouse)) * (behavior.TrialSet() & 'n_trials > 100') * (subject.SubjectLab()) * (behavior_analysis.SessionTrainingStatus() & 'training_status="trained" ')).fetch('KEY') choice, cont_left, cont_right = (behavior.TrialSet.Trial & key).fetch( 'trial_response_choice', 'trial_stim_contrast_left', 'trial_stim_contrast_right') signed_contrasts = cont_right - cont_left right_choices = choice == 'CCW' total_trials = [] right_trials = [] for cont in unique_signed_contrasts: matching = (signed_contrasts == cont) total_trials.append(np.sum(matching)) right_trials.append(np.sum(right_choices[matching])) prop_right_trials = np.divide(right_trials, total_trials) psy_df.loc[row, :] = prop_right_trials return psy_df
def query_subjects(as_dataframe=False, from_list=False, criterion='trained'): """ Query all mice for analysis of behavioral data Parameters ---------- as_dataframe: boolean if true returns a pandas dataframe (default is False) from_list: loads files from list uuids (array of uuids objects) criterion: what criterion by the 30th of November - trained (includes a and b), biased, ready4ephysrig """ # Query all subjects with project ibl_neuropixel_brainwide_01 and get the date at which # they were flagged as trained_1a if criterion == 'trained': subj_query = (subject.Subject * subject.SubjectLab * reference.Lab * subject.SubjectProject & 'subject_project = "ibl_neuropixel_brainwide_01"').aggr( (acquisition.Session * behavior_analysis.SessionTrainingStatus()) & 'training_status="trained_1a" OR training_status="trained_1b"', 'subject_nickname', 'sex', 'subject_birth_date', 'institution_short', date_trained='min(date(session_start_time))') if criterion == 'biased': subj_query = (subject.Subject * subject.SubjectLab * reference.Lab * subject.SubjectProject & 'subject_project = "ibl_neuropixel_brainwide_01"').aggr( (acquisition.Session * behavior_analysis.SessionTrainingStatus()) & 'task_protocol LIKE "%biased%"', 'subject_nickname', 'sex', 'subject_birth_date', 'institution_short', date_trained='min(date(session_start_time))') if criterion == 'ready4ephysrig': subj_query = (subject.Subject * subject.SubjectLab * reference.Lab * subject.SubjectProject & 'subject_project = "ibl_neuropixel_brainwide_01"').aggr( (acquisition.Session * behavior_analysis.SessionTrainingStatus()) & 'training_status="ready4ephysrig"', 'subject_nickname', 'sex', 'subject_birth_date', 'institution_short', date_trained='min(date(session_start_time))') if from_list is True: ids = np.load('uuids_trained1.npy', allow_pickle=True) subj_query = subj_query & [{'subject_uuid': u_id} for u_id in ids] # Select subjects that reached trained_1a criterium before November 30th if as_dataframe is True: # subjects = ( # subj_query & 'date_trained < "2019-11-30"').fetch(format='frame') subjects = ( subj_query & 'date_trained <= "2020-03-23"').fetch(format='frame') subjects = subjects.sort_values(by=['lab_name']).reset_index() else: # subjects = (subj_query & 'date_trained < "2019-11-30"') subjects = (subj_query & 'date_trained <= "2020-03-23"') return subjects
def query_subjects(as_dataframe=False, from_list=False, criterion='trained'): """ Query all mice for analysis of behavioral data Parameters ---------- as_dataframe: boolean if true returns a pandas dataframe (default is False) from_list: loads files from list uuids (array of uuids objects) criterion: what criterion by the 30th of November - trained (a and b), biased, ephys (includes ready4ephysrig, ready4delay and ready4recording). If None, all mice that completed a training session are returned, with date_trained being the date of their first training session. """ from ibl_pipeline import subject, acquisition, reference from ibl_pipeline.analyses import behavior as behavior_analysis # Query all subjects with project ibl_neuropixel_brainwide_01 and get the date at which # they reached a given training status all_subjects = (subject.Subject * subject.SubjectLab * reference.Lab * subject.SubjectProject & 'subject_project = "ibl_neuropixel_brainwide_01"') sessions = acquisition.Session * behavior_analysis.SessionTrainingStatus() fields = ('subject_nickname', 'sex', 'subject_birth_date', 'institution_short') if criterion is None: # Find first session of all mice; date_trained = date of first training session subj_query = all_subjects.aggr( sessions, *fields, date_trained='min(date(session_start_time))') else: # date_trained = date of first session when criterion was reached if criterion == 'trained': restriction = 'training_status="trained_1a" OR training_status="trained_1b"' elif criterion == 'biased': restriction = 'task_protocol LIKE "%biased%"' elif criterion == 'ephys': restriction = 'training_status LIKE "ready%"' else: raise ValueError( 'criterion must be "trained", "biased" or "ephys"') subj_query = all_subjects.aggr( sessions & restriction, *fields, date_trained='min(date(session_start_time))') if from_list is True: data_path = os.path.join(datapath(), 'uuids_trained.npy') ids = np.load(data_path, allow_pickle=True) subj_query = subj_query & [{'subject_uuid': u_id} for u_id in ids] # Select subjects that reached criterion before cutoff date subjects = (subj_query & 'date_trained <= "%s"' % CUTOFF_DATE) if as_dataframe is True: subjects = subjects.fetch(format='frame') subjects = subjects.sort_values(by=['lab_name']).reset_index() return subjects
#requires Alex glm module import matplotlib.pyplot as plt import pandas as pd ## CONNECT TO datajoint import datajoint as dj dj.config['database.host'] = 'datajoint.internationalbrainlab.org' from ibl_pipeline.analyses import behavior as behavior_analysis from ibl_pipeline import reference, subject, behavior from alexfigs_datajoint_functions import * # this has all plotting functions import seaborn as sns from glm import * key = ((subject.Subject() & 'sex!="U"') * (behavior.TrialSet() & 'n_trials > 100') * (subject.SubjectLab()) * (behavior_analysis.SessionTrainingStatus() & 'training_status="ready for ephys" ')).fetch('KEY') trials_ibl = pd.DataFrame.from_dict( (subject.Subject() * behavior.TrialSet.Trial & key).fetch(as_dict=True)) trials_ibl['signed_contrasts'] = trials_ibl[ 'trial_stim_contrast_right'] - trials_ibl['trial_stim_contrast_left'] ##Rename for GLM function trials_ibl = trials_ibl.rename(index=str, columns={ "session_start_time": "ses", "subject_uuid": "mouse_name", "trial_feedback_type": "feedbackType", "trial_response_choice": "choice" })
# ================================================== # Mice that reached trained # ================================================== trained = query_subjects(criterion='trained') print('4. Number of mice that reached trained: %d' % len(trained)) print('5. Number of mice that reached ready4ephys: %d' % len(query_subjects(criterion='ephys'))) # ================================================== # Trained mice yet to meet final criterion at the cut off date. # These mice did not quite reach ready4ephysrig by the cut-off date, but were likely to # ================================================== # mice that reached trained but not ready4ephys, didn't die before the cut-off, and had fewer # than 40 sessions (no session marked as 'untrainable') session_training_status = acquisition.Session * behavior_analysis.SessionTrainingStatus( ) trained_not_ready = (trained.aggr( session_training_status, unfinished='SUM(training_status="ready4ephys" OR ' 'training_status="untrainable" OR ' 'training_status="unbiasable") = 0').aggr( subject.Death, 'unfinished', alive='death_date IS NULL OR death_date > "%s"' % CUTOFF_DATE, keep_all_rows=True)) print('6. Number of mice that remain in training at the time of writing: %d' % len(trained_not_ready & 'alive = True AND unfinished = True'))
# ================================= # use_subjects = subject.Subject * subject.SubjectProject & 'subject_project = "ibl_neuropixel_brainwide_01"' use_sessions = use_subjects * subject.SubjectLab * subject.Subject.aggr(behavior.TrialSet, session_start_time='max(session_start_time)') # QUICK PIE PLOT plt.close('all') sns.set_palette("cubehelix") fig, ax = plt.subplots(1, 2, figsize=(13, 13)) # ================================= # # v0 # ================================= # sess = behavioral_analyses.SessionTrainingStatus() * use_sessions df1 = pd.DataFrame(sess.fetch(as_dict=True)) df2 = df1.groupby(['training_status'])['subject_uuid'].count().reset_index() df2.index = df2.training_status df2 = df2.reindex(['-', 'over40days', 'training in progress', 'trained', '.', 'ready for ephys', '..']) df2.fillna(0, inplace=True) original = df2.copy() print(df2) ax[0].pie(df2['subject_uuid'], autopct='%1.2f%%', labels=df2.index) ax[0].set_title('Original criteria (v0), n = %d'%df2['subject_uuid'].sum()) # ================================= # # v1 # ================================= #
from ibl_pipeline import reference, subject, action, acquisition, data, behavior from ibl_pipeline.utils import psychofit as psy from ibl_pipeline.analyses import behavior as behavioral_analyses from dj_tools import * # import training_criteria_schemas as criteria_urai figpath = os.path.join(os.path.expanduser('~'), 'Data/Figures_IBL') # ================================= # # GRAB ALL DATA FROM DATAJOINT # ================================= # use_subjects = subject.Subject( ) & 'subject_birth_date between "2018-09-01" and "2019-02-01"' & 'subject_line IS NULL OR subject_line="C57BL/6J"' # criterion = criteria_urai.SessionTrainingStatus_v1() criterion = behavioral_analyses.SessionTrainingStatus() sess = ((acquisition.Session & 'task_protocol LIKE "%biased%"') * \ (criterion & 'training_status="ready for ephys"')) \ * subject.SubjectLab * use_subjects s = pd.DataFrame.from_dict(sess.fetch(as_dict=True)) labs = list(s['lab_name'].unique()) labs = ['zadorlab'] print(labs) # hack to get around SQL limit for lidx, lab in enumerate(labs): print(lab) subjects = s[s['lab_name'].str.contains(lab)].reset_index()
@author: Anne Urai & Guido Meijer 16 Jan 2020 """ from paper_behavior_functions import query_subjects from ibl_pipeline import subject, acquisition, reference from ibl_pipeline.analyses import behavior as behavior_analysis # Query all mice on brainwide map project all_mice = subject.SubjectProject() & 'subject_project = "ibl_neuropixel_brainwide_01"' # Exclude mice that were still in training at the date of cutt-off subj_query = (subject.Subject * subject.SubjectLab * reference.Lab * subject.SubjectProject & 'subject_project = "ibl_neuropixel_brainwide_01"').aggr( (acquisition.Session * behavior_analysis.SessionTrainingStatus()) & 'training_status="in_training"', 'subject_nickname', 'sex', 'subject_birth_date', 'institution_short', last_training_session='max(date(session_start_time))') mice_in_training = (subj_query & 'last_training_session > "2019-11-30"') mice_at_start = len(all_mice)-len(mice_in_training) print('Number of mice at start: %d' % mice_at_start) # Get mice that when into training mice_training = (subj_query & 'last_training_session < "2019-11-30"') # Get dropout during habituation training_query = (subject.Subject * subject.SubjectLab * reference.Lab * subject.SubjectProject & 'subject_project = "ibl_neuropixel_brainwide_01"').aggr( acquisition.Session() & 'task_protocol LIKE "%training%"', num_sessions='count(session_start_time)').fetch(format='frame')
# import wrappers etc from ibl_pipeline import reference, subject, action, acquisition, data, behavior from ibl_pipeline.utils import psychofit as psy from ibl_pipeline.analyses import behavior as behavioral_analyses from dj_tools import * import training_criteria_schemas as criteria_urai figpath = os.path.join(os.path.expanduser('~'), 'Data/Figures_IBL') # ================================= # # 1. get training status from original DJ table # ================================= # use_subjects = subject.Subject() & 'subject_birth_date between "2018-09-01" and "2019-02-01"' & 'subject_line IS NULL OR subject_line="C57BL/6J"' sess = behavioral_analyses.SessionTrainingStatus() \ * use_subjects * subject.SubjectLab * subject.Subject.aggr(behavior.TrialSet, session_start_time='max(session_start_time)') df = pd.DataFrame(sess.fetch(as_dict=True)) df2 = df.groupby(['training_status'])['subject_uuid'].count().reset_index() # remove the erroneous mice that were wrongly trained on biasedChoiceWorld already # df2 = df2[~df2.training_status.str.contains("wrong session type run")] df2 = df2.replace({'over40days': 'untrainable'}) df2 = df2.sort_values('training_status') print(df2) # QUICK PIE PLOT fig, ax = plt.subplots(1, 2, figsize=(13,13)) # ax[0,0].pie(df2['subject_uuid'], labels=df2['training_status'], autopct='%1.2f%%') # ax[0,0].set_title('Original criteria, n = %d'%df2['subject_uuid'].sum())
sns.set(style="darkgrid", context="paper", font_scale=1.3) # import wrappers etc from ibl_pipeline import reference, subject, action, acquisition, data, behavior from ibl_pipeline.utils import psychofit as psy from ibl_pipeline.analyses import behavior as behavioral_analyses from dj_tools import * figpath = os.path.join(os.path.expanduser('~'), 'Data/Figures_IBL') # ================================= # # GRAB ALL DATA FROM DATAJOINT # ================================= # sess = ((acquisition.Session & 'task_protocol LIKE "%trainingchoice%"') * \ (behavioral_analyses.SessionTrainingStatus() & 'training_status="trained"')) * \ subject.SubjectLab() s = pd.DataFrame.from_dict(sess.fetch(as_dict=True)) labs = list(s['lab_name'].unique()) print(labs) # hack to get around SQL limit for lidx, lab in enumerate(labs): print(lab) b = (behavior.TrialSet.Trial & (subject.SubjectLab() & 'lab_name="%s"'%lab)) \ * sess.proj('session_uuid','task_protocol') \ * subject.SubjectLab.proj('lab_name') \ * subject.Subject() & 'subject_birth_date between "2018-09-01" and "2019-02-01"' & 'subject_line IS NULL OR subject_line="C57BL/6J"'
The International Brain Laboratory Anne Urai, CSHL, 2020-09-07 Starting from reaching 1a/1b, show distributions of days to next training stages """ import seaborn as sns import matplotlib import os import numpy as np import datajoint as dj import pandas as pd import matplotlib.pyplot as plt from ibl_pipeline import subject, acquisition, reference from ibl_pipeline.analyses import behavior as behavior_analysis # Query all subjects with project ibl_neuropixel_brainwide_01 and get the date at which # they reached a given training status all_subjects = (subject.Subject * subject.SubjectLab * reference.Lab * subject.SubjectProject & 'subject_project = "ibl_neuropixel_brainwide_01"') summ_by_date = all_subjects * behavior_analysis.BehavioralSummaryByDate training_status_by_day = summ_by_date.aggr(behavior_analysis.SessionTrainingStatus(), daily_status='(training_status)') df = training_status_by_day.fetch(format='frame').reset_index().sort_values(by=['lab_name', 'session_date']) print(df.daily_status.unique()) #sessions =