Source code for hippounit.scores.score_ZScore_depolblock
from __future__ import division
from sciunit import Score
import numpy
import math
from sciunit.utils import assert_dimensionless
from quantities import nA
[docs]class ZScore_depolblock(Score):
"""
Z scores. Float indicating standardized difference
from reference means for current threshold (Ith), and equilibrium potential (Veq) during depolarization block.
"""
def __init__(self, score, related_data={}):
#self.score_l=[]
if not isinstance(score, Exception) and not isinstance(score, float):
raise InvalidScoreError("Score must be a float.")
else:
super(ZScore_depolblock,self).__init__(score, related_data=related_data)
[docs] @classmethod
def compute(cls, observation, prediction):
"""Computes a z-scores from an observation and a prediction."""
p_value_I_maxNumAP = prediction['model_I_maxNumAP']
p_value_I_below_depol_block = prediction['model_I_below_depol_block']
o_mean_Ith = observation['mean_Ith']
o_std_Ith = observation['Ith_std']
p_value_Veq = prediction['model_Veq']
o_mean_Veq = observation['mean_Veq']
o_std_Veq = observation['Veq_std']
try:
result_I_maxNumAP = abs(p_value_I_maxNumAP - o_mean_Ith)/o_std_Ith
result_I_maxNumAP = assert_dimensionless(result_I_maxNumAP)
if not math.isnan(p_value_I_below_depol_block):
result_I_below_depol_block = abs(p_value_I_below_depol_block - o_mean_Ith)/o_std_Ith
else:
result_I_below_depol_block = float('NaN')
result_I_below_depol_block = assert_dimensionless(result_I_below_depol_block)
if not math.isnan(p_value_Veq):
result_Veq = abs(p_value_Veq - o_mean_Veq)/o_std_Veq
else:
result_Veq = float('NaN')
result_Veq = assert_dimensionless(result_Veq)
except (TypeError,AssertionError) as e:
result_I_maxNumAP = e
result_I_below_depol_block = e
result_Veq = e
if p_value_I_maxNumAP != p_value_I_below_depol_block and not math.isnan(result_I_below_depol_block): # according to the experiment thesetwo should be equal
I_diff_penalty = 200.0*(abs(p_value_I_maxNumAP - p_value_I_below_depol_block)/(1*nA)) # divided be (1*nA) to make it dimensionless
I_diff_penalty = assert_dimensionless(I_diff_penalty)
else:
I_diff_penalty = 0
if math.isnan(result_I_below_depol_block) or math.isnan(result_Veq) :
final_score = 100.0
else:
final_score = numpy.nanmean([result_I_maxNumAP, result_I_below_depol_block, result_Veq]) + I_diff_penalty
return final_score, result_I_maxNumAP, result_I_below_depol_block, result_Veq, I_diff_penalty
def __str__(self):
#return 'Z_Ith = %.2f, Z_Veq = %.2f' % (self.score_l[0], self.score_l[1])
return 'ZScore_avg+penalty = %.2f' % self.score