From ef6e7335e9871295c52fda52e91857add3decbd6 Mon Sep 17 00:00:00 2001 From: Chris Kerr Date: Thu, 6 Nov 2014 09:54:38 +0000 Subject: [PATCH] Added the test data files sent by Matthias Richter (see #1) Had to make a few changes to ensure that they open correctly --- BioLogic.py | 24 +++++++++++++++++++++--- get_testdata.sh | 4 ++++ tests/test_BioLogic.py | 17 ++++++++++++++++- 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/BioLogic.py b/BioLogic.py index 76c689c..115b70f 100644 --- a/BioLogic.py +++ b/BioLogic.py @@ -9,7 +9,7 @@ import csv from os import SEEK_SET, SEEK_CUR import time from datetime import date, datetime, timedelta -from collections import OrderedDict +from collections import OrderedDict, defaultdict from warnings import warn import numpy as np @@ -35,7 +35,9 @@ def fieldname_to_dtype(fieldname): "|Ewe|/V", "|I|/A", "Phase(Z)/deg", "|Z|/Ohm", "Re(Z)/Ohm", "-Im(Z)/Ohm"): return (fieldname, np.float_) - elif fieldname in ("cycle number", "I Range"): + # N.B. I'm not sure what 'Ns' is as in the only file I have with that + # header it never has any value other than '0' + elif fieldname in ("cycle number", "I Range", "Ns"): return (fieldname, np.int_) elif fieldname in ("dq/mA.h", "dQ/mA.h"): return ("dQ/mA.h", np.float_) @@ -47,6 +49,12 @@ def fieldname_to_dtype(fieldname): raise ValueError("Invalid column header: %s" % fieldname) +def comma_converter(float_string): + """Convert numbers to floats whether the decimal point is '.' or ','""" + trans_table = bytes.maketrans(b',', b'.') + return float(float_string.translate(trans_table)) + + def MPTfile(file_or_path): """Opens .mpt files as numpy record arrays @@ -75,7 +83,11 @@ def MPTfile(file_or_path): fieldnames = str3(next(mpt_file)).strip().split('\t') record_type = np.dtype(list(map(fieldname_to_dtype, fieldnames))) - mpt_array = np.loadtxt(mpt_file, dtype=record_type) + ## Must be able to parse files where commas are used for decimal points + converter_dict = dict(((i, comma_converter) + for i in range(len(fieldnames)))) + mpt_array = np.loadtxt(mpt_file, dtype=record_type, + converters=converter_dict) return mpt_array, comments @@ -320,10 +332,16 @@ class MPRfile: dtype=' 40000 and ole_timestamp1 < 50000: ole_timestamp = ole_timestamp1 elif ole_timestamp2 > 40000 and ole_timestamp2 < 50000: ole_timestamp = ole_timestamp2 + elif ole_timestamp3 > 40000 and ole_timestamp3 < 50000: + ole_timestamp = ole_timestamp3 + else: + raise ValueError("Could not find timestamp in the LOG module") ole_base = datetime(1899, 12, 30, tzinfo=None) ole_timedelta = timedelta(days=ole_timestamp[0]) diff --git a/get_testdata.sh b/get_testdata.sh index 4f671ac..1804031 100755 --- a/get_testdata.sh +++ b/get_testdata.sh @@ -18,4 +18,8 @@ http://files.figshare.com/1778944/bio_logic6.mpt http://files.figshare.com/1778945/bio_logic1.mpt http://files.figshare.com/1778946/bio_logic3.mpr http://files.figshare.com/1780444/bio_logic4.mpr +http://files.figshare.com/1780529/121_CA_455nm_6V_30min_C01.mpr +http://files.figshare.com/1780530/121_CA_455nm_6V_30min_C01.mpt +http://files.figshare.com/1780526/CV_C01.mpr +http://files.figshare.com/1780527/CV_C01.mpt END_FILELIST diff --git a/tests/test_BioLogic.py b/tests/test_BioLogic.py index 65c2ca5..78ce0bc 100644 --- a/tests/test_BioLogic.py +++ b/tests/test_BioLogic.py @@ -122,7 +122,7 @@ def assert_MPR_matches_MPT(mpr, mpt, comments): assert_array_almost_equal(mpr.data["time/s"], mpt["time/s"], - decimal=4) # 5 digits in CSV + decimal=2) # 2 digits in CSV assert_field_matches("control/V/mA", decimal=6) assert_field_matches("control/V", decimal=6) @@ -178,3 +178,18 @@ def test_MPR6_matches_MPT6(): mpt, comments = MPTfile(os.path.join(testdata_dir, 'bio-logic6.mpt')) mpr.data = mpr.data[:958] # .mpt file is incomplete assert_MPR_matches_MPT(mpr, mpt, comments) + + +## Tests for issue #1 -- new dtypes ## + + +def test_CV_C01(): + mpr = MPRfile(os.path.join(testdata_dir, 'CV_C01.mpr')) + mpt, comments = MPTfile(os.path.join(testdata_dir, 'CV_C01.mpt')) + assert_MPR_matches_MPT(mpr, mpt, comments) + + +def test_CA_455nm(): + mpr = MPRfile(os.path.join(testdata_dir, '121-CA-455nm-6V_30min_C01.mpr')) + mpt, comments = MPTfile(os.path.join(testdata_dir, '121-CA-455nm-6V_30min_C01.mpt')) + assert_MPR_matches_MPT(mpr, mpt, comments)