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
Exemple #2
0
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"
                               })
Exemple #5
0
# ==================================================
# 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"'
Exemple #11
0
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 =