Skip to content

Commit

Permalink
cherry pick local commit 3cbbd17
Browse files Browse the repository at this point in the history
  • Loading branch information
mayofaulkner committed Jun 4, 2024
1 parent f76a936 commit e6981a9
Show file tree
Hide file tree
Showing 2 changed files with 1 addition and 90 deletions.
57 changes: 1 addition & 56 deletions ibllib/qc/task_metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,11 @@
"""
import logging
import sys
import warnings
from packaging import version
from pathlib import Path, PurePosixPath
from datetime import datetime, timedelta
from inspect import getmembers, isfunction
from functools import reduce, wraps
from functools import reduce
from collections.abc import Sized

import numpy as np
Expand Down Expand Up @@ -91,34 +90,6 @@
}


def _static_check(func):
"""Log a warning when static method called with class instead of object.
The TaskQC 'criteria' attribute is now varies depending on the task version and may be changed
in subclasses depending on hardware and task protocol. Therefore the
TaskQC.compute_session_status_from_dict method should be called with an object instance in
order use the correct criteria.
"""
@wraps(func)
def inner(*args, **kwargs):
warnings.warn('TaskQC.compute_session_status_from_dict is deprecated. '
'Use ibllib.qc.task_metrics.compute_session_status_from_dict instead', DeprecationWarning)
if not args: # allow function to raise on missing param
return compute_session_status_from_dict(*args, **kwargs)
if not isinstance(args[0], TaskQC):
_log.warning(
'Calling TaskQC.compute_session_status_from_dict as a static method yields inconsistent results.'
)
if len(args) == 1 and kwargs.get('criteria', None) is None:
kwargs['criteria'] = BWM_CRITERIA # old behaviour
else:
if kwargs.get('criteria', None) is None and len(args) == 2:
kwargs['criteria'] = args[0].criteria # ensure we use the obj's modified criteria
args = args[1:]
return compute_session_status_from_dict(*args, **kwargs)
return inner


def compute_session_status_from_dict(results, criteria=None):
"""
Given a dictionary of results, computes the overall session QC for each key and aggregates
Expand Down Expand Up @@ -389,32 +360,6 @@ def run(self, update=False, namespace='task', **kwargs):
self.update(outcome, namespace)
return outcome, results

@_static_check
@staticmethod
def compute_session_status_from_dict(results, criteria=None):
"""
(DEPRECATED) Given a dictionary of results, computes the overall session QC for each key
and aggregates in a single value.
NB: Use :func:`ibllib.qc.task_metrics.compute_session_status_from_dict` instead and always
pass in the criteria.
Parameters
----------
results : dict
A dictionary of QC keys containing (usually scalar) values.
criteria : dict
A dictionary of qc keys containing map of PASS, WARNING, FAIL thresholds.
Returns
-------
str
Overall session QC outcome as a string.
dict
A map of QC tests and their outcomes.
"""
... # no longer called by decorator

def compute_session_status(self):
"""
Computes the overall session QC for each key and aggregates in a single value.
Expand Down
34 changes: 0 additions & 34 deletions ibllib/tests/qc/test_task_metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,40 +30,6 @@ def _create_test_qc_outcomes():

class TestAggregateOutcome(unittest.TestCase):

def test_deprecation_warning(self):
"""Remove TaskQC.compute_session_status_from_dict after 2024-06-01. Cherry pick commit
3cbbd1769e1ba82a51b09a992b2d5f4929f396b2 for removal of this test and applicable code"""
from datetime import datetime
self.assertFalse(datetime.now() > datetime(2024, 6, 1), 'remove TaskQC.compute_session_status_from_dict method.')
qc_dict = {'_task_iti_delays': .99}
with self.assertWarns(DeprecationWarning), self.assertLogs(qcmetrics.__name__, spec.QC.WARNING):
out = qcmetrics.TaskQC.compute_session_status_from_dict(qc_dict)
expected = (spec.QC.NOT_SET, {'_task_iti_delays': spec.QC.NOT_SET})
self.assertEqual(expected, out, 'failed to use BWM criteria')
# Should handle criteria as input, both as arg and kwarg
criteria = {'_task_iti_delays': {spec.QC.PASS: 0.9, spec.QC.FAIL: 0},
'default': {spec.QC.PASS: 0.9, spec.QC.WARNING: 0.4}}
out = qcmetrics.TaskQC.compute_session_status_from_dict(qc_dict, criteria=criteria)
expected = (spec.QC.PASS, {'_task_iti_delays': spec.QC.PASS})
self.assertEqual(expected, out, 'failed to use BWM criteria')
out = qcmetrics.TaskQC.compute_session_status_from_dict(qc_dict, criteria)
self.assertEqual(expected, out, 'failed to use BWM criteria')
qc = qcmetrics.TaskQC('/foo/subject/2024-01-01/001', one=ONE(mode='local', **TEST_DB))
self.assertRaises(TypeError, qcmetrics.TaskQC.compute_session_status_from_dict)
if getattr(self, 'assertNoLogs', False) is False:
self.skipTest('Python < 3.10') # py 3.8
with self.assertWarns(DeprecationWarning), self.assertNoLogs(qcmetrics.__name__, 'WARNING'):
out = qc.compute_session_status_from_dict(qc_dict)
expected = (spec.QC.NOT_SET, {'_task_iti_delays': spec.QC.NOT_SET})
self.assertEqual(expected, out, 'failed to use BWM criteria')
# Should handle criteria as input, both as arg and kwarg
criteria = {'_task_iti_delays': {spec.QC.PASS: 0.9, spec.QC.FAIL: 0}, 'default': {spec.QC.PASS: 0}}
out, _ = qc.compute_session_status_from_dict(qc_dict, criteria=criteria)
self.assertEqual(spec.QC.PASS, out)
out, _ = qc.compute_session_status_from_dict(qc_dict, criteria)
self.assertEqual(spec.QC.PASS, out)
self.assertRaises(TypeError, qc.compute_session_status_from_dict)

def test_outcome_from_dict_default(self):
# For a task that has no costume thresholds, default is 0.99 PASS and 0.9 WARNING and 0 FAIL,
# np.nan and None return not set
Expand Down

0 comments on commit e6981a9

Please sign in to comment.