diff --git a/README.md b/README.md index afc2e7c..3161b6b 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ Currently, the following potentiostats are included in the library: * CHI1242B from CH Instruments (chi1242b) * CHI601E from CH Instruments (chi601e) * CHI760E from CH Instruments (chi760e) +* CHI760F from CH Instruments (chi760f) * Emstat Pico from PalmSens (emstatpico) with the following techniques: @@ -22,7 +23,7 @@ with the following techniques: * Linear sweep voltammetry, LSV * Open circuit potential, OCP -For the CHI601E and CHI760E only: +For the CHI601E and CHI760E/F only: * Normal pulse voltammetry, NPV # Installation @@ -38,7 +39,7 @@ Here are quick examples on how to use the library. For more help check the [Wiki import hardpotato as hp # Potentiostat setup -# Choose the correct model from ['chi760e', 'chi1205b', 'emstatpico']: +# Choose the correct model from ['chi760f','chi760e', 'chi1205b', 'emstatpico']: model = 'chi760e' # Write the path where the chi software is installed (this line is optional when # using the Pico). Make sure to use / instead of \: diff --git a/src/hardpotato/chi760e.py b/src/hardpotato/chi760e.py index 0cb2b1e..587b80c 100644 --- a/src/hardpotato/chi760e.py +++ b/src/hardpotato/chi760e.py @@ -192,7 +192,7 @@ def __init__(self, Eini, Efin, dE, tsample, twidth, tperiod, sens, self.validate(Eini, Efin, dE, tsample, twidth, tperiod, sens) - self.head = 'C\x02\0\0\nfolder: ' + folder + '\n' + fileOverride + \ + self.head = 'C\x02\0\0\nfolder: ' + folder + '\n' + '\nfileoverride\n' + \ 'header: ' + header + '\n\n' self.body = 'tech=NPV\nei=' + str(Eini) + '\nef=' + str(Efin) + \ '\nincre=' + str(dE) + '\npw=' + str(tsample) + \ @@ -266,7 +266,72 @@ def bipot(self, E, sens): self.foot = '\n forcequit: yesiamsure\n' self.text = self.head + self.body2 + self.foot +class PCA: + ''' + ''' + def __init__(self, Eini, E1, E2, nStep, pw, dt, sens, folder, fileName, header, + path_lib, **kwargs): + self.fileName = fileName + self.folder = folder + self.text = '' + if 'qt' in kwargs: + qt = kwargs.get('qt') + else: + qt = 2 + if 'resistance' in kwargs: + resistance = kwargs.get('resistance') + else: + resistance = 0 + + # correcting parameters: + Ei = Eini + if E1 > E2: + eh = E1 + el = E2 + pn = 'p' + else: + eh = E2 + el = E1 + pn = 'n' + + self.head = 'C\x02\0\0\nfolder: ' + folder + '\nfileoverride\n' + \ + 'header: ' + header + '\n\n' + self.body = 'tech=CA\nei=' + str(Ei) + '\neh=' + str(eh) + '\nel=' + str(el) + '\npn=' + pn + \ + '\ncl=' + str(nStep) + '\npw=' + str(pw) + '\nsi=' + str(dt) + \ + '\nsens=' + str(sens) + if resistance: # In case IR compensation is required + self.body2 = self.body + '\nmir=' + str(resistance) + \ + '\nircompon\nrun\nircompoff\nsave:' + self.fileName + \ + '\ntsave:' + self.fileName + else: + self.body2 = self.body + '\nrun\nsave:' + self.fileName + \ + '\ntsave:' + self.fileName + self.foot = '\n forcequit: yesiamsure\n' + self.text = self.head + self.body2 + self.foot + + self.validate(Eini, E1, E2, nStep, pw, dt, sens) + + + def validate(self, Eini, E1, E2, nStep, pw, dt, sens): + info = Info() + info.limits(Eini, info.E_min, info.E_max, 'Estep', 'V') + info.limits(E1, info.E_min, info.E_max, 'Estep', 'V') + info.limits(E2, info.E_min, info.E_max, 'Estep', 'V') + #info.limits(dt, info.dt_min, info.dt_max, 'dt', 's') + #info.limits(ttot, info.ttot_min, info.ttot_max, 'ttot', 's') + #info.limits(sens, info.sens_min, info.sens_max, 'sens', 'A/V') + + def bipot(self, E, sens): + # Validate bipot: + info = Info() + info.limits(E, info.E_min, info.E_max, 'E2', 'V') + #info.limits(sens, info.sens_min, info.sens_max, 'sens2', 'A/V') + self.body2 = self.body + \ + '\ne2=' + str(E) + '\nsens2=' + str(sens) + '\ni2on' + \ + '\nrun\nsave:' + self.fileName + '\ntsave:' + self.fileName + self.foot = '\n forcequit: yesiamsure\n' + self.text = self.head + self.body2 + self.foot class OCP: ''' @@ -301,6 +366,38 @@ def validate(self, ttot, dt): #info.limits(dt, info.dt_min, info.dt_max, 'dt', 's') #info.limits(ttot, info.ttot_min, info.ttot_max, 'ttot', 's') +class BE: + + def __init__(self, Estep, iratio, dt, preE, pret, folder, fileName, header, path_lib, **kwargs): + self.fileName = fileName + self.folder = folder + self.text = '' + + if 'qt' in kwargs: + qt = kwargs.get('qt') + else: + qt = 2 + if 'resistance' in kwargs: + resistance = kwargs.get('resistance') + else: + resistance = 0 + + self.head = 'C\x02\0\0\nfolder: ' + folder + '\nfileoverride\n' + \ + 'header: ' + header + '\n\n' + self.body = 'tech=be\nei=' + str(Estep) + '\niratio=' + str(iratio) + \ + '\nsi=' + str(dt) + '\nbepe=' + str(preE) + '\nbept=' + str(pret) + \ + '\nrun\nsave:' + self.fileName + '\ntsave:' + self.fileName + self.foot = '\nforcequit: yesiamsure\n' + self.text = self.head + self.body + self.foot + + self.validate(Estep) + + def validate(self, Estep): + info = Info() + info.limits(Estep, info.E_min, info.E_max, 'Estep', 'V') + #info.limits(ttot, info.ttot_min, info.ttot_max, 'ttot', 's') + + class EIS: ''' Pending: diff --git a/src/hardpotato/chi760f.py b/src/hardpotato/chi760f.py new file mode 100644 index 0000000..f69661f --- /dev/null +++ b/src/hardpotato/chi760f.py @@ -0,0 +1,330 @@ +class Test: + ''' + ''' + def __init__(self): + print('Test from chi760f translator') + +class Info: + ''' + Pending: + * Calculate dE, sr, dt, ttot, mins and max + ''' + def __init__(self): + self.tech = ['CV', 'CA', 'LSV', 'OCP', 'NPV', 'EIS'] + self.options = [ + 'Quiet time in s (qt)', + 'Resistance in ohms (resistance)' + ] + + self.E_min = -10 + self.E_max = 10 + self.sr_min = 0.000001 + self.sr_max = 10000 + #self.dE_min = + #self.sr_min = + #self.dt_min = + #self.dt_max = + #self.ttot_min = + #self.ttot_max = + self.freq_min = 0.00001 + self.freq_max = 1000000 + + def limits(self, val, low, high, label, units): + if val < low or val > high: + raise Exception(label + ' should be between ' + str(low) + ' ' +\ + units + ' and ' + str(high) + ' ' + units +\ + '. Received ' + str(val) + ' ' + units) + + def specifications(self): + print('Model: CH Instruments 760F (chi760f)') + print('Techiques available:', self.tech) + print('Options available:', self.options) + + +class CV: + ''' + **kwargs: + qt # s, quite time + resistance # ohms, solution resistance + ''' + def __init__(self, Eini, Ev1, Ev2, Efin, sr, dE, nSweeps, sens, + folder, fileName, header, path_lib, **kwargs): + self.fileName = fileName + self.folder = folder + self.text = '' + + if 'qt' in kwargs: + qt = kwargs.get('qt') + else: + qt = 2 + if 'resistance' in kwargs: + resistance = kwargs.get('resistance') + else: + resistance = 0 + + self.validate(Eini, Ev1, Ev2, Efin, sr, dE, nSweeps, sens) + + # correcting parameters: + Ei = Eini + if Ev1 > Ev2: + eh = Ev1 + el = Ev2 + pn = 'p' + else: + eh = Ev2 + el = Ev1 + pn = 'n' + nSweeps = nSweeps + 1 # final e from chi is enabled by default + + # building macro: + self.head = 'c\x02\0\0\nfolder: ' + folder + '\nfileoverride\n' + \ + 'header: ' + header + '\n\n' + self.body = 'tech=cv\nei=' + str(Ei) + '\neh=' + str(eh) + '\nel=' + \ + str(el) + '\npn=' + pn + '\ncl=' + str(nSweeps) + \ + '\nefon\nef=' + str(Efin) + '\nsi=' + str(dE) + \ + '\nqt=' + str(qt) + '\nv=' + str(sr) + '\nsens=' + str(sens) + if resistance: # In case IR compensation is required + self.body2 = self.body + '\nmir=' + str(resistance) + \ + '\nircompon\nrun\nircompoff\nsave:' + self.fileName + \ + '\ntsave:' + self.fileName + else: + self.body2 = self.body + '\nrun\nsave:' + self.fileName + \ + '\ntsave:' + self.fileName + self.foot = '\n forcequit: yesiamsure\n' + self.text = self.head + self.body2 + self.foot + + def bipot(self, E, sens): + # Validate bipot: + info = Info() + info.limits(E, info.E_min, info.E_max, 'E2', 'V') + #info.limits(sens, info.senC:\Users\oliverrz\Desktop\CHI\chi760es_min, info.sens_max, 'sens', 'A/V') + + self.body2 = self.body + \ + '\ne2=' + str(E) + '\nsens2=' + str(sens) + '\ni2on' + \ + '\nrun\nsave:' + self.fileName + '\ntsave:' + self.fileName + self.foot = '\n forcequit: yesiamsure\n' + self.text = self.head + self.body2 + self.foot + + def validate(self, Eini, Ev1, Ev2, Efin, sr, dE, nSweeps, sens): + info = Info() + info.limits(Eini, info.E_min, info.E_max, 'Eini', 'V') + info.limits(Ev1, info.E_min, info.E_max, 'Ev1', 'V') + info.limits(Ev2, info.E_min, info.E_max, 'Ev2', 'V') + info.limits(Efin, info.E_min, info.E_max, 'Efin', 'V') + info.limits(sr, info.sr_min, info.sr_max, 'sr', 'V/s') + #info.limits(dE, info.dE_min, info.dE_max, 'dE', 'V') + #info.limits(sens, info.sens_min, info.sens_max, 'sens', 'A/V') + + +class LSV: + ''' + **kwargs: + qt # s, quiet time + resistance # ohms, solution resistance + ''' + def __init__(self, Eini, Efin, sr, dE, sens, folder, fileName, header, + path_lib, **kwargs): + self.fileName = fileName + self.folder = folder + self.text = '' + + if 'qt' in kwargs: + qt = kwargs.get('qt') + else: + qt = 2 + if 'resistance' in kwargs: + resistance = kwargs.get('resistance') + else: + resistance = 0 + + self.validate(Eini, Efin, sr, dE, sens) + + self.head = 'C\x02\0\0\nfolder: ' + folder + '\nfileoverride\n' + \ + 'header: ' + header + '\n\n' + self.body = 'tech=lsv\nei=' + str(Eini) + '\nef=' + str(Efin) + \ + '\nv=' + str(sr) + '\nsi=' + str(dE) + \ + '\nqt=' + str(qt) + '\nsens=' + str(sens) + if resistance: # In case IR compensation is required + self.body2 = self.body + '\nmir=' + str(resistance) + \ + '\nircompon\nrun\nircompoff\nsave:' + self.fileName + \ + '\ntsave:' + self.fileName + else: + self.body2 = self.body + '\nrun\nsave:' + self.fileName + \ + '\ntsave:' + self.fileName + self.foot = '\n forcequit: yesiamsure\n' + self.text = self.head + self.body2 + self.foot + + def bipot(self, E, sens): + # Validate bipot: + info = Info() + info.limits(E, info.E_min, info.E_max, 'E2', 'V') + #info.limits(sens, info.sens_min, info.sens_max, 'sens', 'A/V') + + self.body2 = self.body + \ + '\ne2=' + str(E) + '\nsens2=' + str(sens) + '\ni2on' + \ + '\nrun\nsave:' + self.fileName + '\ntsave:' + self.fileName + self.foot = '\n forcequit: yesiamsure\n' + self.text = self.head + self.body2 + self.foot + + def validate(self, Eini, Efin, sr, dE, sens): + info = Info() + info.limits(Eini, info.E_min, info.E_max, 'Eini', 'V') + info.limits(Efin, info.E_min, info.E_max, 'Efin', 'V') + info.limits(sr, info.sr_min, info.sr_max, 'sr', 'V/s') + #info.limits(dE, info.dE_min, info.dE_max, 'dE', 'V') + #info.limits(sens, info.sens_min, info.sens_max, 'sens', 'A/V') + + + +class NPV(): + def __init__(self, Eini, Efin, dE, tsample, twidth, tperiod, sens, + path_lib, folder, fileName, header, **kwargs): + self.fileName = fileName + self.folder = folder + self.text = '' + + if 'qt' in kwargs: + qt = kwargs.get('qt') + else: + qt = 2 + + print('NPV technique still in development. Use with caution.') + + self.validate(Eini, Efin, dE, tsample, twidth, tperiod, sens) + + self.head = 'C\x02\0\0\nfolder: ' + folder + '\n' + fileOverride + \ + 'header: ' + header + '\n\n' + self.body = 'tech=NPV\nei=' + str(Eini) + '\nef=' + str(Efin) + \ + '\nincre=' + str(dE) + '\npw=' + str(tsample) + \ + '\nsw=' + str(twidth) + '\nprod=' + str(tperiod) + \ + '\nqt=' + str(qt) + '\nsens=' + str(sens) + self.body = self.body + \ + '\nrun\nsave:' + fileName + '\ntsave:' + fileName + self.foot = '\n forcequit: yesiamsure\n' + self.text = self.head + self.body + self.foot + + def validate(self, Eini, Efin, dE, tsample, twidth, tperiod, sens): + info = Info() + info.limits(Eini, info.E_min, info.E_max, 'Eini', 'V') + info.limits(Efin, info.E_min, info.E_max, 'Efin', 'V') + #info.limits(tsample, info.tsample) + #info.limits(dE, info.dE_min, info.dE_max, 'dE', 'V') + #info.limits(sens, info.sens_min, info.sens_max, 'sens', 'A/V') + + +class CA: + ''' + ''' + def __init__(self, Estep, dt, ttot, sens, folder, fileName, header, + path_lib, **kwargs): + self.fileName = fileName + self.folder = folder + self.text = '' + + if 'qt' in kwargs: + qt = kwargs.get('qt') + else: + qt = 2 + if 'resistance' in kwargs: + resistance = kwargs.get('resistance') + else: + resistance = 0 + + self.head = 'C\x02\0\0\nfolder: ' + folder + '\nfileoverride\n' + \ + 'header: ' + header + '\n\n' + self.body = 'tech=i-t\nei=' + str(Estep) + '\nst=' + str(ttot) + \ + '\nsi=' + str(dt) + '\nqt=' + str(qt) + \ + '\nsens=' + str(sens) + if resistance: # In case IR compensation is required + self.body2 = self.body + '\nmir=' + str(resistance) + \ + '\nircompon\nrun\nircompoff\nsave:' + self.fileName + \ + '\ntsave:' + self.fileName + else: + self.body2 = self.body + '\nrun\nsave:' + self.fileName + \ + '\ntsave:' + self.fileName + self.foot = '\n forcequit: yesiamsure\n' + self.text = self.head + self.body2 + self.foot + + self.validate(Estep, dt, ttot, sens) + + + def validate(self, Estep, dt, ttot, sens): + info = Info() + info.limits(Estep, info.E_min, info.E_max, 'Estep', 'V') + #info.limits(dt, info.dt_min, info.dt_max, 'dt', 's') + #info.limits(ttot, info.ttot_min, info.ttot_max, 'ttot', 's') + #info.limits(sens, info.sens_min, info.sens_max, 'sens', 'A/V') + + def bipot(self, E, sens): + # Validate bipot: + info = Info() + info.limits(E, info.E_min, info.E_max, 'E2', 'V') + #info.limits(sens, info.sens_min, info.sens_max, 'sens2', 'A/V') + self.body2 = self.body + \ + '\ne2=' + str(E) + '\nsens2=' + str(sens) + '\ni2on' + \ + '\nrun\nsave:' + self.fileName + '\ntsave:' + self.fileName + self.foot = '\n forcequit: yesiamsure\n' + self.text = self.head + self.body2 + self.foot + + + +class OCP: + ''' + Assumes OCP is between +- 10 V + ''' + def __init__(self, ttot, dt, folder, fileName, header, path_lib, **kwargs): + self.fileName = fileName + self.folder = folder + self.text = '' + + if 'qt' in kwargs: + qt = kwargs.get('qt') + else: + qt = 2 + if 'resistance' in kwargs: + resistance = kwargs.get('resistance') + else: + resistance = 0 + + self.head = 'C\x02\0\0\nfolder: ' + folder + '\nfileoverride\n' + \ + 'header: ' + header + '\n\n' + self.body = 'tech=ocpt\nst=' + str(ttot) + '\neh=10' + \ + '\nel=-10' + '\nsi=' + str(dt) + '\nqt=' + str(qt) +\ + '\nrun\nsave:' + self.fileName + '\ntsave:' + self.fileName + self.foot = '\nforcequit: yesiamsure\n' + self.text = self.head + self.body + self.foot + + self.validate(ttot, dt) + + def validate(self, ttot, dt): + info = Info() + #info.limits(dt, info.dt_min, info.dt_max, 'dt', 's') + #info.limits(ttot, info.ttot_min, info.ttot_max, 'ttot', 's') + +class EIS: + ''' + Pending: + * Validate parameters + ''' + def __init__(self, Eini, low_freq, high_freq, amplitude, sens, folder, + fileName, header, path_lib, **kwargs): + print('EIS technique is still in development. Use with caution.') + self.fileName = fileName + self.folder = folder + self.text = '' + + if 'qt' in kwargs: + qt = kwargs.get('qt') + else: + qt = 2 + + self.head = 'C\x02\0\0\nfolder: ' + folder + '\nfileoverride\n' + \ + 'header: ' + header + '\n\n' + self.body = 'tech=imp\nei=' + str(Eini) + '\nfl=' + str(low_freq) + \ + '\nfh=' + str(high_freq) + '\namp=' + str(amplitude) + \ + '\nsens=' + str(sens) + '\nqt=' + str(qt) + \ + '\nrun\nsave:' + self.fileName + '\ntsave:' + self.fileName + self.foot = '\nforcequit: yesiamsure\n' + self.text = self.head + self.body + self.foot + + diff --git a/src/hardpotato/load_data.py b/src/hardpotato/load_data.py index e57c8eb..4d8da00 100644 --- a/src/hardpotato/load_data.py +++ b/src/hardpotato/load_data.py @@ -114,3 +114,29 @@ def __init__(self, fileName='file', folder='.', model=0): if model[0:3] == 'chi': self.t = self.x self.E = self.y + +class PCA(Read): + ''' + ''' + def __init__(self, fileName='file', folder='.', model=0): + self.fileName = fileName + self.folder = folder + text = 'Time/sec,' + Read.__init__(self) + self.read(text, model) + if model[0:3] == 'chi': + self.t = self.x + self.E = self.y + +class BE(Read): + ''' + ''' + def __init__(self, fileName='file', folder='.', model=0): + self.fileName = fileName + self.folder = folder + text = 'Time/sec,' + Read.__init__(self) + self.read(text, model) + if model[0:3] == 'chi': + self.t = self.x + self.Q = self.y[:, 0] diff --git a/src/hardpotato/potentiostat.py b/src/hardpotato/potentiostat.py index 7507a50..21e0c2b 100644 --- a/src/hardpotato/potentiostat.py +++ b/src/hardpotato/potentiostat.py @@ -6,6 +6,7 @@ import hardpotato.load_data as load_data import hardpotato.save_data as save_data +import hardpotato.chi760f as chi760f import hardpotato.chi760e as chi760e import hardpotato.chi1205b as chi1205b import hardpotato.chi601e as chi601e @@ -17,7 +18,7 @@ import hardpotato.pico_serial as serial # Potentiostat models available: -models_available = ['chi1205b', 'chi1242b', 'chi601e', 'chi760e', 'emstatpico'] +models_available = ['chi1205b', 'chi1242b', 'chi601e', 'chi760f', 'chi760e', 'emstatpico'] # Global variables folder_save = '.' @@ -43,6 +44,8 @@ def __init__(self, model): self.info = chi1242b.Info() elif self.model == 'chi601e': self.info = chi601e.Info() + elif self.model == 'chi760f': + self.info = chi760f.Info() elif self.model == 'chi760e': self.info = chi760e.Info() elif self.model == 'emstatpico': @@ -144,6 +147,16 @@ def plot(self): sp.plotting.plot(ocp.t, ocp.E, show=False, fig=figNum, xlab='$t$ / s', ylab='$E$ / V', fileName=folder_save + '/' + self.fileName) + elif self.technique == 'PCA': + pca = load_data.PCA(self.fileName+'.txt', folder_save, model_pstat) + sp.plotting.plot(pca.t, pca.i, show=False, fig=figNum, + xlab='$t$ / s', ylab='$i$ / A', + fileName=folder_save + '/' + self.fileName) + elif self.technique == 'BE': + be = load_data.BE(self.fileName+'.txt', folder_save, model_pstat) + sp.plotting.plot(be.t, be.Q, show=False, fig=figNum, + xlab='$t$ / s', ylab='$Q$ / C', + fileName=folder_save + '/' + self.fileName) plt.close() @@ -158,6 +171,10 @@ def message(self, start=True): def bipot(self, E=-0.2, sens=1e-6): if self.technique != 'OCP' and self.technique != 'EIS': + if model_pstat == 'chi760f': + self.tech.bipot(E, sens) + self.text = self.tech.text + self.bpot = True if model_pstat == 'chi760e': self.tech.bipot(E, sens) self.text = self.tech.text @@ -186,13 +203,19 @@ def __init__(self, Eini=-0.2, Ev1=0.2, Ev2=-0.2, Efin=-0.2, sr=0.1, folder_save, fileName, header, path_lib, **kwargs) Technique.__init__(self, text=self.tech.text, fileName=fileName) - self.technique = 'CV' + self.technique = 'CV' if model_pstat == 'chi760e': self.tech = chi760e.CV(Eini, Ev1, Ev2, Efin, sr, dE, nSweeps, sens, folder_save, fileName, header, path_lib, **kwargs) Technique.__init__(self, text=self.tech.text, fileName=fileName) self.technique = 'CV' + elif model_pstat == 'chi760f': + self.tech = chi760f.CV(Eini, Ev1, Ev2, Efin, sr, dE, nSweeps, sens, + folder_save, fileName, header, path_lib, + **kwargs) + Technique.__init__(self, text=self.tech.text, fileName=fileName) + self.technique = 'CV' elif model_pstat == 'chi1205b': self.tech = chi1205b.CV(Eini, Ev1, Ev2, Efin, sr, dE, nSweeps, sens, folder_save, fileName, header, path_lib, @@ -231,7 +254,12 @@ def __init__(self, Eini=-0.2, Efin=0.2, sr=0.1, dE=0.001, sens=1e-6, self.tech = chi760e.LSV(Eini, Efin, sr, dE, sens, folder_save, fileName, header, path_lib, **kwargs) Technique.__init__(self, text=self.tech.text, fileName=fileName) - self.technique = 'LSV' + self.technique = 'LSV' + elif model_pstat == 'chi760f': + self.tech = chi760f.LSV(Eini, Efin, sr, dE, sens, folder_save, fileName, + header, path_lib, **kwargs) + Technique.__init__(self, text=self.tech.text, fileName=fileName) + self.technique = 'LSV' elif model_pstat == 'chi1205b': self.tech = chi1205b.LSV(Eini, Efin, sr, dE, sens, folder_save, fileName, header, path_lib, **kwargs) @@ -268,6 +296,11 @@ def __init__(self, Estep=0.2, dt=0.001, ttot=2, sens=1e-6, header, path_lib, **kwargs) Technique.__init__(self, text=self.tech.text, fileName=fileName) self.technique = 'CA' + elif model_pstat == 'chi760f': + self.tech = chi760f.CA(Estep, dt, ttot, sens, folder_save, fileName, + header, path_lib, **kwargs) + Technique.__init__(self, text=self.tech.text, fileName=fileName) + self.technique = 'CA' elif model_pstat == 'chi1205b': self.tech = chi1205b.CA(Estep, dt, ttot, sens, folder_save, fileName, header, path_lib, **kwargs) @@ -304,6 +337,11 @@ def __init__(self, ttot=2, dt=0.01, fileName='OCP', header='OCP', **kwargs): path_lib, **kwargs) Technique.__init__(self, text=self.tech.text, fileName=fileName) self.technique = 'OCP' + elif model_pstat == 'chi760f': + self.tech = chi760f.OCP(ttot, dt, folder_save, fileName, header, + path_lib, **kwargs) + Technique.__init__(self, text=self.tech.text, fileName=fileName) + self.technique = 'OCP' elif model_pstat == 'chi1205b': self.tech = chi1205b.OCP(ttot, dt, folder_save, fileName, header, path_lib, **kwargs) @@ -333,6 +371,11 @@ def __init__(self, Eini=0.5, Efin=-0.5, dE=0.01, tsample=0.1, twidth=0.05, folder_save, fileName, header, path_lib, **kwargs) Technique.__init__(self, text=self.tech.text, fileName=fileName) self.technique = 'NPV' + elif model_pstat == 'chi760f': + self.tech = chi760f.NPV(Eini, Efin, dE, tsample, twidth, tperiod, sens, + folder_save, fileName, header, path_lib, **kwargs) + Technique.__init__(self, text=self.tech.text, fileName=fileName) + self.technique = 'NPV' elif model_pstat == 'chi601e': self.tech = chi601e.NPV(Eini, Efin, dE, tsample, twidth, tperiod, sens, folder_save, fileName, header, path_lib, **kwargs) @@ -341,7 +384,31 @@ def __init__(self, Eini=0.5, Efin=-0.5, dE=0.01, tsample=0.1, twidth=0.05, else: print('Potentiostat model ' + model_pstat + ' does not have NPV.') +class PCA(Technique): + ''' + ''' + def __init__(self, Eini=0, E1=0, E2=0, nStep=1, pw=0.1, dt=0.1, sens=1e-6, fileName='PCA', header='PCA', **kwargs): + self.header = header + if model_pstat == 'chi760e': + self.tech = chi760e.EIS(Eini, E1, E2, nStep, pw, dt, sens, + folder_save, fileName, header, path_lib, + **kwargs) + Technique.__init__(self, text=self.tech.text, fileName=fileName) + self.technique = 'PCA' + else: + print('Potentiostat model ' + model_pstat + ' does not have PCA (Chronoamperometry).') +class BE(Technique): + ''' + ''' + def __init__(self, Estep=0, iratio=1, dt=1, preE=0, pret=0, fileName='BE', header='BE', **kwargs): + self.header = header + if model_pstat == 'chi760e': + self.tech = chi760e.BE(Estep, iratio, dt, preE, pret, folder_save, fileName, header, path_lib, **kwargs) + Technique.__init__(self, text=self.tech.text, fileName=fileName) + self.technique = 'BE' + else: + print('Potentiostat model ' + model_pstat + ' does not have BE.') class EIS(Technique): ''' @@ -355,6 +422,12 @@ def __init__(self, Eini=0, low_freq=1, high_freq=1000, amplitude=0.01, **kwargs) Technique.__init__(self, text=self.tech.text, fileName=fileName) self.technique = 'EIS' + elif model_pstat == 'chi760f': + self.tech = chi760f.EIS(Eini, low_freq, high_freq, amplitude, sens, qt, + folder_save, fileName, header, path_lib, + **kwargs) + Technique.__init__(self, text=self.tech.text, fileName=fileName) + self.technique = 'EIS' else: print('Potentiostat model ' + model_pstat + ' does not have EIS.') diff --git a/src/hardpotato/save_data.py b/src/hardpotato/save_data.py index 4938870..869fd48 100644 --- a/src/hardpotato/save_data.py +++ b/src/hardpotato/save_data.py @@ -19,12 +19,15 @@ def __init__(self, data, fileName, header, model, technique, bpot=0): if technique == 'CV' or technique == 'LSV': header = header + '\nt/s, E/V, i/A\n' self.data_array = CV(fileName, data, model, bpot).save() - elif technique == 'IT' or technique == 'CA': + elif technique == 'IT' or technique == 'CA' or technique == 'PCA': header = header + '\nt/s, E/V, i/A\n' self.data_array = IT(fileName, data, model, bpot).save() elif technique == 'OCP': header = header + '\nt/s, E/V\n' self.data_array = OCP(fileName, data, model).save() + elif technique == 'BE': + header = header + '\nt/s, Q/C, i/A\n' + self.data_array = BE(fileName, data, model, bpot).save() np.savetxt(fileName, self.data_array, delimiter=',', header=header) @@ -90,4 +93,23 @@ def save(self): #i = mscript.get_values_by_column(self.data,2) data_array = np.array([t,E]).T return data_array + +class BE: + ''' + ''' + def __init__(self, fileName, data, model): + self.fileName = fileName + self.data = data + self.model = model + data_array = 0 + def save(self): + if self.model == 'emstatpico': + t = mscript.get_values_by_column(self.data,0) + E = mscript.get_values_by_column(self.data,1) + i = mscript.get_values_by_column(self.data,2) + data_array = np.array([t,E,i]).T + if self.bpot: + i2 = mscript.get_values_by_column(self.data,3) + data_array = np.array([t,E,i,i2]).T + return data_array