From 1682697ec5e4b32615ef7f62ff5bd5f55306e8c5 Mon Sep 17 00:00:00 2001 From: GES-mpalermo Date: Tue, 28 Dec 2021 12:19:17 +0100 Subject: [PATCH 1/4] Extension case, fix exit() and options for cycle timeseries Fixed reading functions so that they can accept files with both upper and lowecase extensions. Added option for using reverse timeserie whe plotting single cycle properties. Fixed bug for calling exit() function. --- echemsuite/cellcycling/read_input.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/echemsuite/cellcycling/read_input.py b/echemsuite/cellcycling/read_input.py index 4f6a74a..edf6819 100644 --- a/echemsuite/cellcycling/read_input.py +++ b/echemsuite/cellcycling/read_input.py @@ -1,6 +1,7 @@ import pandas as pd import numpy as np import scipy.integrate as integrate +import sys class CellCycling: @@ -227,7 +228,7 @@ def build_DTA_cycles(filelist): print("Loading:", filepath, "\n") - if filepath.endswith(".DTA"): + if filepath.endswith(".DTA".lower()): with open(filepath, "r", encoding="utf8", errors="ignore") as file: @@ -291,7 +292,7 @@ def build_DTA_cycles(filelist): else: print("This is not a .DTA file!") - exit() + sys.exit() return cycles @@ -305,7 +306,7 @@ def read_mpt_cycles(filelist): print("Loading:", filepath, "\n") - if filepath.endswith(".mpt"): + if filepath.endswith(".mpt".lower()): with open(filepath, "r", encoding="utf8", errors="ignore") as file: @@ -382,7 +383,7 @@ def read_mpt_cycles(filelist): else: print("This is not a .mpt file!") - exit() + sys.exit() return cycles @@ -401,7 +402,7 @@ def build_cycles(filelist): return CellCycling(cycles) -def time_adjust(cycle): +def time_adjust(cycle, reverse=False): if cycle.time_discharge.iloc[0] != cycle.time_charge.iloc[0]: time_charge = cycle.time_charge.subtract(cycle.time_charge.iloc[0]) @@ -409,5 +410,8 @@ def time_adjust(cycle): else: time_charge = cycle.time_charge time_discharge = cycle.time_discharge + + if reverse is True: + time_discharge=time_discharge.sort_values(ascending=False) return time_charge, time_discharge From 63dc89e399b5d1d41f11c8c4328d831134c4bd31 Mon Sep 17 00:00:00 2001 From: GES-mpalermo Date: Tue, 28 Dec 2021 15:00:06 +0100 Subject: [PATCH 2/4] Automatic efficiency calculation, 0 based cycle indexing Calculate efficiency upon initialization of the CellCycling object, and filter cycles with charge capacity and energy equal or lesser than 0. Switched cycle number of the object to 0 based counting, in order to be consistent with Python array indexing notation. --- echemsuite/cellcycling/read_input.py | 56 +++++++++++++++++++--------- 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/echemsuite/cellcycling/read_input.py b/echemsuite/cellcycling/read_input.py index edf6819..7059b7c 100644 --- a/echemsuite/cellcycling/read_input.py +++ b/echemsuite/cellcycling/read_input.py @@ -2,6 +2,7 @@ import numpy as np import scipy.integrate as integrate import sys +import warnings class CellCycling: @@ -10,6 +11,13 @@ class CellCycling: """ def __init__(self, cycles): self._cycles = cycles + self._number_of_cycles = len(self._cycles) + + self._capacity_retentions = None # to be initialized in calculate_retention() + self._capacity_efficiencies = None # to be initialized in calculate_efficiency() + + self.calculate_capacity_efficiencies() + self.calculate_capacity_retention() def __getitem__(self, cycle): return self._cycles[cycle] @@ -18,7 +26,7 @@ def __iter__(self): for obj in self._cycles: yield obj - def calculate_retention(self, reference = 0): + def calculate_capacity_retention(self, reference = 0): """ Calculates capacity retention between cycles, as the ratio between capacity of cycle n (discharge) minus cycle 1 (discharge) @@ -26,31 +34,33 @@ def calculate_retention(self, reference = 0): initial_capacity = self._cycles[reference].capacity_discharge - self._retention = [] + self._capacity_retentions = [] for cycle in self._cycles: - self._retention.append(cycle.capacity_discharge / initial_capacity * 100) + self._capacity_retentions.append(cycle.capacity_discharge / initial_capacity * 100) - return self._retention - - def calculate_efficiency(self): + def calculate_capacity_efficiencies(self): """ Calculates capacity efficiency of the cycles, as the ratio between capacity of cycle n in charge and discharge """ - self._efficiency = [] + self._capacity_efficiencies = [] for cycle in self._cycles: - self._efficiency.append(cycle.capacity_discharge / cycle.capacity_charge * 100) + self._capacity_efficiencies.append(cycle.capacity_discharge / cycle.capacity_charge * 100) @property - def retention(self): - return self._retention + def capacity_retention(self): + return self._capacity_retentions @property - def efficiency(self): - return self._efficiency + def capacity_efficiency(self): + return self._capacity_efficiencies + + @property + def number_of_cycles(self): + return self._number_of_cycles class Cycle: @@ -60,6 +70,8 @@ class Cycle: def __init__(self, number): self._number = number + + # DEV NOTE: move all variable initializations here to default value @property def number(self): @@ -199,10 +211,18 @@ def calculate_efficiencies(self): Computes the coulombic and energy efficiency of the cycle as the ratio between the discharge and charge energies. """ - - self._coulomb_efficiency = self._capacity_discharge / self._capacity_charge * 100 - self._energy_efficiency = self._total_energy_discharge / self._total_energy_charge * 100 - self._voltage_efficiency = self._energy_efficiency / self._coulomb_efficiency * 100 + if any((self._capacity_charge <= 0, self._total_energy_charge <= 0)): + print(f"Warning: cycle {self._number} will be removed due to unphysical charge/discharge value") + #warnings.warn(f"Cycle {self._number} will be removed due to unphysical charge/discharge value") + + # 101 is a sentinel value + self._coulomb_efficiency = 101 + self._energy_efficiency = 101 + self._voltage_efficiency = 101 + else: + self._coulomb_efficiency = self._capacity_discharge / self._capacity_charge * 100 + self._energy_efficiency = self._total_energy_discharge / self._total_energy_charge * 100 + self._voltage_efficiency = self._energy_efficiency / self._coulomb_efficiency * 100 return self._coulomb_efficiency, self._energy_efficiency, self._voltage_efficiency @@ -222,7 +242,7 @@ def voltage_efficiency(self): def build_DTA_cycles(filelist): cycles = [] - cycle_number = 1 + cycle_number = 0 for filepath in filelist: @@ -300,7 +320,7 @@ def build_DTA_cycles(filelist): def read_mpt_cycles(filelist): cycles = [] - cycle_number = 1 + cycle_number = 0 for filepath in filelist: From 898641a22e97ee9c115133099b11aec85a213ee9 Mon Sep 17 00:00:00 2001 From: GES-mpalermo Date: Tue, 28 Dec 2021 15:12:30 +0100 Subject: [PATCH 3/4] Automatically transform filepath string to raw string --- echemsuite/cellcycling/read_input.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/echemsuite/cellcycling/read_input.py b/echemsuite/cellcycling/read_input.py index 7059b7c..fc7bb16 100644 --- a/echemsuite/cellcycling/read_input.py +++ b/echemsuite/cellcycling/read_input.py @@ -409,14 +409,17 @@ def read_mpt_cycles(filelist): def read_cycles(filelist): - + for filepath in filelist: + filepath = r'%s' %filepath + cycles = read_mpt_cycles(filelist) return CellCycling(cycles) def build_cycles(filelist): - + for filepath in filelist: + filepath = r'%s' %filepath cycles = build_DTA_cycles(filelist) return CellCycling(cycles) From ee4d18ae8e33c809727a5e7317f8269f6012e3a9 Mon Sep 17 00:00:00 2001 From: GES-mpalermo Date: Tue, 28 Dec 2021 15:14:06 +0100 Subject: [PATCH 4/4] Updated code version number --- meta.yaml | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/meta.yaml b/meta.yaml index 1f3dd08..662d98d 100644 --- a/meta.yaml +++ b/meta.yaml @@ -1,5 +1,5 @@ {% set name = "GES-echem-suite" %} -{% set version = "0.1.3a" %} +{% set version = "0.1.4a" %} diff --git a/setup.py b/setup.py index 164d858..fa4ffc8 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ setuptools.setup( name="GES-echem-suite", - version="0.1.3a", + version="0.1.4a", description="", long_description="", packages=["echemsuite"],