def calculate_total_errors(variable, is_number_list, min_errs, max_errs, values):
        for i, entry in enumerate(variable['values']):
            if not is_number_list[i]: continue # skip non-numeric y values
            if 'value' in entry:
                values.append(entry['value'])
                if 'errors' in entry:
                    errors_min = 0.0
                    errors_max = 0.0
                    for error in entry['errors']:
                        if 'asymerror' in error:
                            err_minus = error_value_processor(entry['value'], error['asymerror']['minus'])
                            err_plus = error_value_processor(entry['value'], error['asymerror']['plus'])
                            errors_min += pow(min(err_plus, err_minus, 0.0), 2)
                            errors_max += pow(max(err_plus, err_minus, 0.0), 2)
                        elif 'symerror' in error:
                            try:
                                err = error_value_processor(entry['value'], error['symerror'])
                                errors_min += pow(err, 2)
                                errors_max += pow(err, 2)
                            except TypeError:
                                print log.error('TypeError encountered when parsing {0}'.format(error['symerror']))

                    min_errs.append(sqrt(errors_min))
                    max_errs.append(sqrt(errors_max))
                elif 'low' in entry and 'high' in entry:
                    min_errs.append(entry['value'] - entry['low'])
                    max_errs.append(entry['high'] - entry['value'])
                else:
                    min_errs.append(0.0)
                    max_errs.append(0.0)
            else:
                middle_val = (entry['high'] - entry['low']) * 0.5 + entry['low']
                values.append(middle_val)
                min_errs.append(middle_val - entry['low'])
                max_errs.append(entry['high'] - middle_val)
    def calculate_total_errors(variable,
                               is_number_list,
                               min_errs,
                               max_errs,
                               values,
                               err_breakdown={}):
        for i, entry in enumerate(variable['values']):
            if not is_number_list[i]: continue  # skip non-numeric y values
            if 'value' in entry:
                values.append(entry['value'])
                if 'errors' in entry:
                    errors_min = 0.0
                    errors_max = 0.0
                    err_breakdown[i] = {}
                    # process the error labels to ensure uniqueness
                    ArrayWriter.process_error_labels(entry)
                    for error in entry['errors']:
                        label = error.get('label', 'error')
                        err_breakdown[i][label] = {}
                        if 'asymerror' in error:
                            err_minus = error_value_processor(
                                entry['value'], error['asymerror']['minus'])
                            err_plus = error_value_processor(
                                entry['value'], error['asymerror']['plus'])
                            errors_min += pow(min(err_plus, err_minus, 0.0), 2)
                            errors_max += pow(max(err_plus, err_minus, 0.0), 2)
                            err_breakdown[i][label][
                                'up'] = err_plus  # want to maintain directionality of errors
                            err_breakdown[i][label][
                                'dn'] = err_minus  # want to maintain directionality of errors
                        elif 'symerror' in error:
                            try:
                                err = error_value_processor(
                                    entry['value'], error['symerror'])
                                errors_min += pow(err, 2)
                                errors_max += pow(err, 2)
                                err_breakdown[i][label]['up'] = err
                                err_breakdown[i][label]['dn'] = -err
                            except TypeError:
                                print log.error(
                                    'TypeError encountered when parsing {0}'.
                                    format(error['symerror']))

                    min_errs.append(sqrt(errors_min))
                    max_errs.append(sqrt(errors_max))
                elif 'low' in entry and 'high' in entry:
                    min_errs.append(entry['value'] - entry['low'])
                    max_errs.append(entry['high'] - entry['value'])
                else:
                    min_errs.append(0.0)
                    max_errs.append(0.0)
            else:
                middle_val = (entry['high'] -
                              entry['low']) * 0.5 + entry['low']
                values.append(middle_val)
                min_errs.append(middle_val - entry['low'])
                max_errs.append(entry['high'] - middle_val)
    def calculate_total_errors(variable, is_number_list, min_errs, max_errs,
                               values):
        for i, entry in enumerate(variable['values']):
            if not is_number_list[i]: continue  # skip non-numeric y values
            if 'value' in entry:
                values.append(entry['value'])
                if 'errors' in entry:
                    errors_min = 0.0
                    errors_max = 0.0
                    for error in entry['errors']:
                        if 'asymerror' in error:
                            err_minus = error_value_processor(
                                entry['value'], error['asymerror']['minus'])
                            err_plus = error_value_processor(
                                entry['value'], error['asymerror']['plus'])
                            errors_min += pow(min(err_plus, err_minus, 0.0), 2)
                            errors_max += pow(max(err_plus, err_minus, 0.0), 2)
                        elif 'symerror' in error:
                            try:
                                err = error_value_processor(
                                    entry['value'], error['symerror'])
                                errors_min += pow(err, 2)
                                errors_max += pow(err, 2)
                            except TypeError:
                                print log.error(
                                    'TypeError encountered when parsing {0}'.
                                    format(error['symerror']))

                    min_errs.append(sqrt(errors_min))
                    max_errs.append(sqrt(errors_max))
                elif 'low' in entry and 'high' in entry:
                    min_errs.append(entry['value'] - entry['low'])
                    max_errs.append(entry['high'] - entry['value'])
                else:
                    min_errs.append(0.0)
                    max_errs.append(0.0)
            else:
                middle_val = (entry['high'] -
                              entry['low']) * 0.5 + entry['low']
                values.append(middle_val)
                min_errs.append(middle_val - entry['low'])
                max_errs.append(entry['high'] - middle_val)
Example #4
0
    def create_objects(self):
        self.calculate_total_errors()

        error_hists = []
        error_labels = {}
        error_indices = {}
        index = 0

        is_number_list = self.is_number_var(self.dependent_variable)

        for i, value in enumerate(self.dependent_variable.get('values', [])):

            if not is_number_list[i]: continue  # skip non-numeric y values

            # process the error labels to ensure uniqueness
            ArrayWriter.process_error_labels(value)

            for error in value.get('errors', []):
                if 'label' not in error:
                    error['label'] = 'error'
                label = error['label']
                if label not in error_labels:
                    index += 1
                    error_indices[index] = label
                if 'symerror' in error and label not in error_labels:
                    error_labels[label] = 'symerror'
                elif 'asymerror' in error and error_labels.get(
                        label, 'symerror') == 'symerror':
                    error_labels[label] = 'asymerror'

        yvals = []
        for index in range(1, len(error_labels) + 1):
            error_label = error_indices[index]
            if error_labels[error_label] == 'asymerror':
                yval_plus_label = error_label + '_plus'
                yval_plus = []
                yval_minus_label = error_label + '_minus'
                yval_minus = []

                for i, value in enumerate(
                        self.dependent_variable.get('values', [])):
                    if not is_number_list[i]:
                        continue  # skip non-numeric y values
                    error = [
                        x for x in value.get('errors', [])
                        if x.get('label') == error_label
                    ]
                    if len(error) == 0:
                        yval_plus.append(0.0)
                        yval_minus.append(0.0)
                    elif 'symerror' in error[0]:
                        err_val = error_value_processor(
                            value['value'], error[0]['symerror'])
                        yval_plus.append(err_val)
                        yval_minus.append(-err_val)
                    elif 'asymerror' in error[0]:
                        err_plus = error_value_processor(
                            value['value'], error[0]['asymerror']['plus'])
                        err_min = error_value_processor(
                            value['value'], error[0]['asymerror']['minus'])
                        yval_plus.append(err_plus)
                        yval_minus.append(err_min)
                    else:
                        yval_plus.append(0.0)
                        yval_minus.append(0.0)

                yvals += [
                    (yval_plus_label, yval_plus, '%s%s' % (index, 'plus')),
                    (yval_minus_label, yval_minus, '%s%s' % (index, 'minus'))
                ]
            else:
                yval = []

                for i, value in enumerate(
                        self.dependent_variable.get('values', [])):
                    if not is_number_list[i]:
                        continue  # skip non-numeric y values
                    error = [
                        x for x in value.get('errors', [])
                        if x.get('label') == error_label
                    ]
                    if len(error) == 0:
                        yval.append(0.0)
                    elif 'symerror' in error[0]:
                        err_val = error_value_processor(
                            value['value'], error[0]['symerror'])
                        yval.append(err_val)
                    else:
                        yval.append(0.0)

                yvals += [(error_label, yval, index)]

        for name, vals, index in yvals:
            try:
                error_hists.append(self._create_empty_hist(name, index, vals))
            except:
                log.error("Failed to create empty histogram")

        xval = []
        for i in range(self.dim):
            xval.append([])
            i_var = self.independent_variables[i]['values']
            for ix, x in enumerate(i_var):
                if not is_number_list[
                        ix] and 'labels' not in self.independent_variables[i]:
                    continue  # skip defining bins for non-numeric y values unless alphanumeric bin labels are present
                if x['low'] not in xval[i]:
                    xval[i].append(x['low'])
                if x['high'] not in xval[i]:
                    xval[i].append(x['high'])

        try:
            hist = self._create_hist(xval)
        except:
            log.error("Failed to create histogram")
            return [] + error_hists

        return [hist] + error_hists
Example #5
0
    def create_objects(self):
        self.calculate_total_errors()

        error_hists = []
        error_labels = {}
        error_indices = {}
        index = 0

        is_number_list = self.is_number_var(self.dependent_variable)

        for i, value in enumerate(self.dependent_variable.get('values', [])):

            if not is_number_list[i]: continue  # skip non-numeric y values

            # process the labels to ensure uniqueness
            observed_error_labels = {}
            for error in value.get('errors', []):
                label = error.get('label', '')

                if label not in observed_error_labels:
                    observed_error_labels[label] = 0
                observed_error_labels[label] += 1

                if observed_error_labels[label] > 1:
                    error['label'] = label + '_' + str(
                        observed_error_labels[label])

                # append "_1" to first error label that has a duplicate
                if observed_error_labels[label] == 2:
                    for error1 in value.get('errors', []):
                        error1_label = error1.get('label', 'error')
                        if error1_label == label:
                            error1['label'] = label + "_1"
                            break

            for error in value.get('errors', []):
                if 'label' not in error:
                    error['label'] = 'error'
                label = error['label']
                if label not in error_labels:
                    index += 1
                    error_indices[index] = label
                if 'symerror' in error and label not in error_labels:
                    error_labels[label] = 'symerror'
                elif 'asymerror' in error and error_labels.get(
                        label, 'symerror') == 'symerror':
                    error_labels[label] = 'asymerror'

        yvals = []
        for index in xrange(1, len(error_labels) + 1):
            error_label = error_indices[index]
            if error_labels[error_label] == 'asymerror':
                yval_plus_label = error_label + '_plus'
                yval_plus = []
                yval_minus_label = error_label + '_minus'
                yval_minus = []

                for i, value in enumerate(
                        self.dependent_variable.get('values', [])):
                    if not is_number_list[i]:
                        continue  # skip non-numeric y values
                    error = filter(lambda x: x.get('label') == error_label,
                                   value.get('errors', []))
                    if len(error) == 0:
                        yval_plus.append(0.0)
                        yval_minus.append(0.0)
                    elif 'symerror' in error[0]:
                        err_val = error_value_processor(
                            value['value'], error[0]['symerror'])
                        yval_plus.append(err_val)
                        yval_minus.append(-err_val)
                    elif 'asymerror' in error[0]:
                        err_plus = error_value_processor(
                            value['value'], error[0]['asymerror']['plus'])
                        err_min = error_value_processor(
                            value['value'], error[0]['asymerror']['minus'])
                        yval_plus.append(err_plus)
                        yval_minus.append(err_min)
                    else:
                        yval_plus.append(0.0)
                        yval_minus.append(0.0)

                yvals += [
                    (yval_plus_label, yval_plus, '%s%s' % (index, 'plus')),
                    (yval_minus_label, yval_minus, '%s%s' % (index, 'minus'))
                ]
            else:
                yval = []

                for i, value in enumerate(
                        self.dependent_variable.get('values', [])):
                    if not is_number_list[i]:
                        continue  # skip non-numeric y values
                    error = filter(lambda x: x.get('label') == error_label,
                                   value.get('errors', []))
                    if len(error) == 0:
                        yval.append(0.0)
                    elif 'symerror' in error[0]:
                        err_val = error_value_processor(
                            value['value'], error[0]['symerror'])
                        yval.append(err_val)
                    else:
                        yval.append(0.0)

                yvals += [(error_label, yval, index)]

        for name, vals, index in yvals:
            try:
                error_hists.append(self._create_empty_hist(name, index, vals))
            except:
                log.error("Failed to create empty histogram")

        xval = []
        for i in xrange(self.dim):
            xval.append([])
            i_var = self.independent_variables[i]['values']
            for x in i_var:
                xval[i].append(x['low'])
            xval[i].append(i_var[-1]['high'])

        try:
            hist = self._create_hist(xval)
        except:
            log.error("Failed to create histogram")
            return [] + error_hists

        return [hist] + error_hists
Example #6
0
    def create_objects(self):
        self.calculate_total_errors()

        error_hists = []
        error_labels = {}
        error_indices = {}

        is_number_list = self.is_number_var(self.dependent_variable)

        for i, value in enumerate(self.dependent_variable.get('values', [])):

            if not is_number_list[i]: continue # skip non-numeric y values

            # process the labels to ensure uniqueness
            observed_error_labels = {}
            for error in value.get('errors', []):
                label = error.get('label', '')

                if label not in observed_error_labels:
                    observed_error_labels[label] = 0
                observed_error_labels[label] += 1

                if observed_error_labels[label] > 1:
                    error['label'] = label + '_' + str(observed_error_labels[label])

                # append "_1" to first error label that has a duplicate
                if observed_error_labels[label] == 2:
                    for error1 in value.get('errors', []):
                        error1_label = error1.get('label', 'error')
                        if error1_label == label:
                            error1['label'] = label + "_1"
                            break

            for index, error in enumerate(value.get('errors', []), 1):
                if 'label' not in error:
                    error['label'] = 'error'
                label = error['label']
                if 'symerror' in error and label not in error_labels:
                    error_labels[label] = 'symerror'
                elif 'asymerror' in error and error_labels.get(label, 'symerror') == 'symerror':
                    error_labels[label] = 'asymerror'
                error_indices[index] = label

        yvals = []
        for index in xrange(1, len(error_labels) + 1):
            error_label = error_indices[index]
            if error_labels[error_label] == 'asymerror':
                yval_plus_label = error_label + '_plus'
                yval_plus = []
                yval_minus_label = error_label + '_minus'
                yval_minus = []

                for i, value in enumerate(self.dependent_variable.get('values', [])):
                    if not is_number_list[i]: continue # skip non-numeric y values
                    error = filter(lambda x: x.get('label') == error_label, value.get('errors', []))
                    if len(error) == 0:
                        yval_plus.append(0.0)
                        yval_minus.append(0.0)
                    elif 'symerror' in error[0]:
                        err_val = error_value_processor(value['value'], error[0]['symerror'])
                        yval_plus.append(err_val)
                        yval_minus.append(-err_val)
                    elif 'asymerror' in error[0]:
                        err_plus = error_value_processor(value['value'], error[0]['asymerror']['plus'])
                        err_min = error_value_processor(value['value'], error[0]['asymerror']['minus'])
                        yval_plus.append(err_plus)
                        yval_minus.append(err_min)
                    else:
                        yval_plus.append(0.0)
                        yval_minus.append(0.0)

                yvals += [(yval_plus_label, yval_plus, '%s%s' % (index, 'plus')),
                          (yval_minus_label, yval_minus, '%s%s' % (index, 'minus'))]
            else:
                yval = []

                for i, value in enumerate(self.dependent_variable.get('values', [])):
                    if not is_number_list[i]: continue # skip non-numeric y values
                    error = filter(lambda x: x.get('label') == error_label, value.get('errors', []))
                    if len(error) == 0:
                        yval.append(0.0)
                    elif 'symerror' in error[0]:
                        err_val = error_value_processor(value['value'], error[0]['symerror'])
                        yval.append(err_val)
                    else:
                        yval.append(0.0)

                yvals += [(error_label, yval, index)]

        for name, vals, index in yvals:
            try:
                error_hists.append(self._create_empty_hist(name, index, vals))
            except:
                log.error("Failed to create empty histogram")

        xval = []
        for i in xrange(self.dim):
            xval.append([])
            i_var = self.independent_variables[i]['values']
            for x in i_var:
                xval[i].append(x['low'])
            xval[i].append(i_var[-1]['high'])

        try:
            hist = self._create_hist(xval)
        except:
            log.error("Failed to create histogram")
            return [] + error_hists

        return [hist] + error_hists