Source code for lib_dd.test_functions

# -*- coding: utf-8 -*-
""" Copyright 2014-2017 Maximilian Weigand

This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.

This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along
with this program.  If not, see <http://www.gnu.org/licenses/>.
"""
import os

import numpy as np
from nose.tools import *


[docs]class tcolors: # see http://ascii-table.com/ansi-escape-sequences.php HEADER = '\033[95m' OKBLUE = '\033]94m' OKGREEN = '\033[92m' WARNING = '\033[93m' FAIL = '\033[91m' ENDC = '\033[0m' GRAY = '\033[37m'
# some files got renamed during refactoring # this dict collects the various names for those files equivalent_rms_files = { 'both_no_err': ['rms_both_no_err.dat', 'rms_all_noerr.dat'], 're_no_err': ['rms_part1_no_err.dat', 'rms_real_parts_noerr.dat'], 'im_no_err': ['rms_part2_no_err.dat', 'rms_imag_parts_noerr.dat'], 'both_err': ['rms_both_err.dat', 'rms_all_error.dat'], 're_err': ['rms_part1_err.dat', 'rms_real_parts_error.dat'], 'im_err': ['rms_part2_err.dat', 'rms_imag_parts_error.dat'] }
[docs]def t_rms_pos_change(old_result, new_result, allowed_percentage): """ Test for positive rms changes Parameters ---------- old_result: dd directory containing the old run new_rusult: dd directory containing the new run allowed_percentage: percentage threshold for positive changes. If this variable is a list of length three the values will be treated as rms, rms_re, rms_im thresholds """ """ rms_files = ('rms_both_err.dat', 'rms_both_no_err.dat', 'rms_part1_err.dat', 'rms_part1_no_err.dat', 'rms_part2_err.dat', 'rms_part2_no_err.dat') """ for rms_key, rms_files in equivalent_rms_files.items(): print('Testing key {0}'.format(rms_key)) base_old = old_result + os.sep + 'results/stats_and_rms/' filename_old = [base_old + x for x in rms_files if os.path.isfile(base_old + x)] if filename_old: rms_old_result = np.atleast_1d(np.loadtxt(filename_old[0])) else: raise IOError('No RMS file found for old RMS (key {0}) {1}'.format( rms_key, base_old)) base_new = new_result + os.sep + 'stats_and_rms/' filename_new = [base_new + x for x in rms_files if os.path.isfile(base_new + x)] if filename_new: rms_new_result = np.atleast_1d(np.loadtxt(filename_new[0])) else: raise IOError( 'No RMS file found for new RMS (key {0}) {1} {2}'.format( rms_key, base_new, os.getcwd())) for spec_id in range(0, rms_old_result.size): print('Spectrum {0}'.format(spec_id + 1)) assert_single_t_rms_pos_change(rms_old_result[spec_id], rms_new_result[spec_id], allowed_percentage)
[docs]def single_t_rms_pos_change(rms_old_result, rms_new_result, allowed_percentage): """ Process one spectrum as described in the documentation of t_rms_pos_change Parameters ---------- rms_old_result : list/array with 3 entries containing the RMS-values from the last recorded dd fit: Overall RMS, Real part RMS, Imaginary part RMS rms_new_result : list/array with 3 entries containing the RMS-values from the test dd fit: Overall RMS, Real part RMS, Imaginary part RMS allowed_percentage : one percentage value for the allowed change between old and new result. Returns ------- rms_within_limit : list with 3 bool entries; True for values within the allow percentage change, False for a larger deviation """ rms_change = (rms_new_result - rms_old_result) / rms_old_result * 100 # a positive change always indicates that rms_new was smaller than old line_color = None if(rms_change > 0 and rms_change > allowed_percentage): line_color = (tcolors.FAIL) change = False elif(rms_change < 0): line_color = (tcolors.OKGREEN) change = True else: line_color = (tcolors.GRAY) change = True print('{0} percentage change: {1:.5} % (from {2} to {3}) {4}\n' .format(line_color, rms_change, rms_old_result, rms_new_result, tcolors.ENDC)) return change
[docs]def assert_single_t_rms_pos_change(rms_old_result, rms_new_result, allowed_percentage): """ Wrap assertTrue statements around the function """ change = single_t_rms_pos_change(rms_old_result, rms_new_result, allowed_percentage) # raise errors for too large values assert_true(change, True)