From 23ec61ec733ace678b24023ab832ba910d39bcfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Guti=C3=A9rrez?= Date: Thu, 27 Jun 2024 15:45:59 +0200 Subject: [PATCH 1/2] feat(preprocessing): Adds readIvium function to support Ivium .idf files --- impedance/preprocessing.py | 46 +++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/impedance/preprocessing.py b/impedance/preprocessing.py index 1cfe55d4..bf947007 100644 --- a/impedance/preprocessing.py +++ b/impedance/preprocessing.py @@ -25,7 +25,7 @@ def readFile(filename, instrument=None): """ supported_types = ['gamry', 'autolab', 'parstat', 'zplot', 'versastudio', - 'powersuite', 'biologic', 'chinstruments'] + 'powersuite', 'biologic', 'chinstruments','ivium'] if instrument is not None: assert instrument in supported_types,\ @@ -48,8 +48,11 @@ def readFile(filename, instrument=None): f, Z = readPowerSuite(filename) elif instrument == 'chinstruments': f, Z = readCHInstruments(filename) + elif instrument == 'ivium': + f, Z = readIvium(filename) elif instrument is None: f, Z = readCSV(filename) + return f, Z @@ -390,6 +393,47 @@ def readCHInstruments(filename): return np.array(f), np.array(Z) +def readIvium(filename): + """ function for reading the .idf file from Ivium + + Parameters + ---------- + filename: string + Filename of .idf file to extract impedance data from + + Returns + ------- + frequencies : np.ndarray + Array of frequencies + impedance : np.ndarray of complex numbers + Array of complex impedances + + """ + + with open(filename, 'r', encoding='ISO-8859-2') as input_file: + lines = input_file.readlines() + + start_line = 0 + + for i, line in enumerate(lines): + if 'primary_data' in line: + datapoints_number = int(lines[i+2]) + start_line = i+3 + end_line = start_line + datapoints_number + + f, Z = [], [] + + if start_line != 0: + raw_data = lines[start_line:end_line] + + for line in raw_data: + each = line.split() + f.append(float(each[2])) + Z.append(complex(float(each[0]), float(each[1]))) + + + return np.array(f), np.array(Z) + def readCSV(filename): """ function for reading plain csv files From cf2b18ea841d4f5f86061c11f13d10142bab7d8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Guti=C3=A9rrez?= Date: Fri, 28 Jun 2024 19:27:34 +0200 Subject: [PATCH 2/2] adds Ivium data example --- data/exampleDataIvium.idf | Bin 0 -> 39093 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 data/exampleDataIvium.idf diff --git a/data/exampleDataIvium.idf b/data/exampleDataIvium.idf new file mode 100644 index 0000000000000000000000000000000000000000..0ddf815083d8a6b360732290df18e784c3455726 GIT binary patch literal 39093 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 literal 0 HcmV?d00001