def _calc_halftime(times, values, half_value): for i, v in enumerate(values): if v > half_value: break left_time = times[i - 1] left_value = values[i - 1] right_time = times[i] right_value = values[i] if (left_value == right_value): log.warn('Matching values: left = %s, right = %s', left_value, right_value) if (left_time == right_time): log.warn('Matching times: left = %s, right = %s', left_time, right_time) y = _interpolation.linear_project(left_value, left_time, right_value, right_time, half_value) if y == float('nan'): log.error( 'Halftime is not a number: i = %s, lt = %s, rt = %s, lv = %s, rv = %s', i, left_time, right_time, left_value, right_value) return y
def perform(self, run, target): times, values, errors = run.analyses[self.analysis_name] # log.warn('times: %s', times) # log.warn('values: %s', values) # log.warn('errors: %s', errors) halftime = _calc_halftime(times, values, self.half_value) # log.warn('half_value = %s, calculated halftime = %s', # self.half_value, halftime) left_index = bisect.bisect_left(times, halftime) left_index = min(left_index, len(times) - 2) # log.warn('left_index = %s, times: %s', left_index, # times[left_index:left_index + 2]) left_time, right_time = times[left_index:left_index + 2] left_value, right_value = values[left_index:left_index + 2] left_error, right_error = errors[left_index:left_index + 2] half_value_error = interpolation.linear_project(left_time, left_error, right_time, right_error, halftime) slope = (right_value - left_value) / (right_time - left_time) target.value = half_value_error / slope
def perform(self, run, target): times, values, errors = run.analyses[self.analysis_name] # log.warn('times: %s', times) # log.warn('values: %s', values) # log.warn('errors: %s', errors) halftime = _calc_halftime(times, values, self.half_value) # log.warn('half_value = %s, calculated halftime = %s', # self.half_value, halftime) left_index = bisect.bisect_left(times, halftime) left_index = min(left_index, len(times) - 2) # log.warn('left_index = %s, times: %s', left_index, # times[left_index:left_index + 2]) left_time, right_time = times[left_index:left_index + 2] left_value, right_value = values[left_index:left_index + 2] left_error, right_error = errors[left_index:left_index + 2] half_value_error = interpolation.linear_project( left_time, left_error, right_time, right_error, halftime) slope = (right_value - left_value) / (right_time - left_time) target.value = half_value_error / slope
def test_linear_project(self): test_data = [({ 'x1': 2, 'x2': 3, 'x3': 5, 'y1': 6, 'y2': 7 }, 9), ({ 'x1': 2, 'x2': 3, 'x3': 1, 'y1': 6, 'y2': 7 }, 5), ({ 'x1': 2, 'x2': 3, 'x3': 5, 'y1': 1, 'y2': 5 }, 13), ({ 'x1': 2, 'x2': 3, 'x3': 1, 'y1': 1, 'y2': 5 }, -3), ({ 'x1': 1, 'x2': 3, 'x3': 2, 'y1': 1, 'y2': 5 }, 3)] for kwargs, result in test_data: self.assertEqual(result, interpolation.linear_project(**kwargs))
def test_linear_project(self): test_data = [({'x1': 2, 'x2': 3, 'x3': 5, 'y1': 6, 'y2': 7}, 9), ({'x1': 2, 'x2': 3, 'x3': 1, 'y1': 6, 'y2': 7}, 5), ({'x1': 2, 'x2': 3, 'x3': 5, 'y1': 1, 'y2': 5}, 13), ({'x1': 2, 'x2': 3, 'x3': 1, 'y1': 1, 'y2': 5}, -3), ({'x1': 1, 'x2': 3, 'x3': 2, 'y1': 1, 'y2': 5}, 3)] for kwargs, result in test_data: self.assertEqual(result, interpolation.linear_project(**kwargs))
def _calc_halftime(times, values, half_value): for i, v in enumerate(values): if v > half_value: break; left_time = times[i-1] left_value = values[i-1] right_time = times[i] right_value = values[i] if (left_value == right_value): log.warn('Matching values: left = %s, right = %s', left_value, right_value) if (left_time == right_time): log.warn('Matching times: left = %s, right = %s', left_time, right_time) y = interpolation.linear_project(left_value, left_time, right_value, right_time, half_value) if y == float('nan'): log.error('Halftime is not a number: i = %s, lt = %s, rt = %s, lv = %s, rv = %s', i, left_time, right_time, left_value, right_value) return y