Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions setup.cfg
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
[bumpversion]
current_version = 0.4.0
current_version = 0.4.1
commit = True
tag = False
parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)(\.(?P<release>[a-z]+)(?P<n>\d+))?
serialize =
serialize =
{major}.{minor}.{patch}.{release}{n}
{major}.{minor}.{patch}

[bumpversion:part:release]
optional_value = gamma
values =
values =
dev
a
b
Expand Down Expand Up @@ -37,3 +37,4 @@ exclude = git/*, notebooks/*, tests/*, scripts/*
[coverage:run]
omit = tests/*, visual_behavior/cohorts/*, visual_behavior/inscopix/*, scripts/*,
notebooks/*, circleci/*, .git/*, .tox/*, .cache/*, visual_behavior/pizza/*

2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

setuptools.setup(
name="visual-behavior",
version="0.4.0",
version="0.4.1",
author="Justin Kiggins",
author_email="justink@alleninstitute.org",
description="analysis package for visual behavior",
Expand Down
3 changes: 3 additions & 0 deletions tests/translator/foraging2/test_foraging2_extract.py
Original file line number Diff line number Diff line change
Expand Up @@ -690,3 +690,6 @@ def test_get_max_session_duration(foraging2_data_stage4_2018_05_10):

def test_get_abort_on_early_response(foraging2_data_stage4_2018_05_10):
assert extract.get_abort_on_early_response(foraging2_data_stage4_2018_05_10) == True

def test_get_periodic_flash(foraging2_data_stage4_2018_05_10):
assert extract.get_periodic_flash(foraging2_data_stage4_2018_05_10) == (0.25, 0.5)
1 change: 1 addition & 0 deletions tests/translator/foraging2/test_foraging2_translator.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ def test_data_to_metadata(monkeypatch, foraging2_data_fixture):
"behavior_session_uuid": '',
"abort_on_early_response": True,
"auto_reward_delay": 0.0,
"periodic_flash": (0.25, 0.5),
}


Expand Down
4 changes: 4 additions & 0 deletions tests/translator/test_translator_functional.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from visual_behavior.translator import foraging2, foraging
from visual_behavior.translator.core import create_extended_dataframe
from visual_behavior.uuid_utils import create_session_uuid
from visual_behavior.validation.qc import generate_qc_report


"""test the schemas vs the outputs here
Expand Down Expand Up @@ -56,6 +57,8 @@ def test_foraging2_translator_schema(foraging2_data_stage4_2018_05_10):
core_data['metadata']['startdatetime'],
)
_test_core_data_schemas(core_data)
generate_qc_report(core_data)


def test_foraging_translator_schema(behavioral_session_output_fixture):
core_data = foraging.data_to_change_detection_core(
Expand All @@ -68,3 +71,4 @@ def test_foraging_translator_schema(behavioral_session_output_fixture):
)

_test_core_data_schemas(core_data)
generate_qc_report(core_data)
2 changes: 1 addition & 1 deletion visual_behavior/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "0.4.0"
__version__ = "0.4.1"
10 changes: 10 additions & 0 deletions visual_behavior/schemas/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,16 @@ class MetadataSchema(Schema):
description='maximum volume of water to deliver in a session, in mL',
required=True,
)
auto_reward_delay = fields.Float(
description='delay between change time and reward on autoreward trials',
required=True,
)
periodic_flash = fields.List(
fields.Float,
description='duration of flash and grey screen',
required=True,
allow_none=True,
)


# class ChangeDetectionSessionCoreSchema(Schema):
Expand Down
4 changes: 4 additions & 0 deletions visual_behavior/translator/foraging/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,10 @@ def load_metadata(data):
metadata['initial_blank_duration'] = data['initial_blank']
metadata['warm_up_trials'] = data['warmup_trials']
metadata['stimulus_window'] = data['trial_duration'] - data['delta_minimum']
metadata['auto_reward_delay'] = 0.0 # hard coded

blank_dur = np.mean(data['blank_duration_range'])
metadata['periodic_flash'] = (data['stim_duration'], blank_dur) if blank_dur > 0 else None

block_length = data['lick_detect_training_block_length']

Expand Down
3 changes: 2 additions & 1 deletion visual_behavior/translator/foraging2/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
get_stimulus_window, get_volume_limit, get_failure_repeats, \
get_catch_frequency, get_free_reward_trials, get_min_no_lick_time, \
get_max_session_duration, get_abort_on_early_response, get_session_id, \
get_even_sampling, get_auto_reward_delay
get_even_sampling, get_auto_reward_delay, get_periodic_flash


from .extract_stimuli import get_visual_stimuli
Expand Down Expand Up @@ -164,6 +164,7 @@ def data_to_metadata(data):
"initial_blank_duration": get_initial_blank_duration(data),
"even_sampling_enabled": get_even_sampling(data),
"behavior_session_uuid": behavior_session_uuid,
"periodic_flash": get_periodic_flash(data),
}


Expand Down
4 changes: 4 additions & 0 deletions visual_behavior/translator/foraging2/extract.py
Original file line number Diff line number Diff line change
Expand Up @@ -1434,3 +1434,7 @@ def get_abort_on_early_response(data):
abort on early response boolean or None if not found
"""
return data["items"]["behavior"]["config"]["DoC"]["abort_on_early_response"]


def get_periodic_flash(data):
return tuple(data['items']['behavior']['config']['DoC']['periodic_flash'])
44 changes: 20 additions & 24 deletions visual_behavior/validation/extended_trials.py
Original file line number Diff line number Diff line change
Expand Up @@ -168,31 +168,27 @@ def count_stimuli_per_trial(trials, visual_stimuli):
elif all(pd.isnull(visual_stimuli.orientation)) == False:
col_to_check = 'orientation'

# get the index of the first stimulus that started on or before the trial start
start_stim = visual_stimuli[
(visual_stimuli.frame <= trial.startframe + 1) &
(visual_stimuli.end_frame >= trial.startframe + 1)
].index[-1]

# get the index of the last stimulus that ended on or before the trial end
end_stim = visual_stimuli[
(visual_stimuli.frame <= trial.endframe)
].index[-1]

# get all unique stimuli on this trial
stimuli = np.unique(visual_stimuli.loc[start_stim:end_stim][col_to_check])
# add to array
stimuli_per_trial[idx] = len(stimuli)
try:
# get the index of the first stimulus that started on or before the trial start
start_stim = visual_stimuli[
(visual_stimuli.frame <= trial.startframe + 1) &
(visual_stimuli.end_frame >= trial.startframe + 1)
].index[-1]

# get the index of the last stimulus that ended on or before the trial end
end_stim = visual_stimuli[
(visual_stimuli.frame <= trial.endframe)
].index[-1]

# get all unique stimuli on this trial
stimuli = np.unique(visual_stimuli.loc[start_stim:end_stim][col_to_check])
# add to array
stimuli_per_trial[idx] = len(stimuli)
except IndexError:
stimuli_per_trial[idx] = 0
return stimuli_per_trial


def fix_periodic_flash(pf):
'''
deal with core_data['metadata']['params']['periodic_flash']='None'
'''
return None if pf == 'None' else pf


# test functions
def validate_autoreward_volume(trials, auto_reward_volume):
'''Each dispense of water for autorewards should be `auto_reward_vol`.'''
Expand Down Expand Up @@ -859,7 +855,7 @@ def validate_change_frame_at_flash_onset(trials, visual_stimuli, periodic_flash)
'''
if `periodic_flash` is not null, changes should always coincide with a stimulus onset
'''
if fix_periodic_flash(periodic_flash) is None:
if periodic_flash is None:
return True
else:
# get all non-null change frames
Expand All @@ -877,7 +873,7 @@ def validate_initial_blank(trials, visual_stimuli, initial_blank, periodic_flash
'''

# this test doesn't make sense for static stimuli with no initial blank. just return True
if fix_periodic_flash(periodic_flash) is None and initial_blank == 0:
if periodic_flash is None and initial_blank == 0:
return True
else:
# preallocate array
Expand Down
2 changes: 1 addition & 1 deletion visual_behavior/validation/qc.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ def define_validation_functions(core_data):
STIMULUS_WINDOW = core_data['metadata']['stimulus_window']
VOLUME_LIMIT = core_data['metadata']['volume_limit']

PERIODIC_FLASH = et.fix_periodic_flash(core_data['metadata']['params']['periodic_flash'])
PERIODIC_FLASH = core_data['metadata']['periodic_flash']

validation_functions = {
# et.validate_schema
Expand Down