Skip to content

Commit e5cfda3

Browse files
committed
#21 Add QCDict
1 parent c7d8879 commit e5cfda3

File tree

3 files changed

+79
-42
lines changed

3 files changed

+79
-42
lines changed

pcpostprocess/hergQC.py

+61-23
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,67 @@
88
import scipy.stats
99

1010

11-
class hERGQC(object):
11+
class QCDict(object):
12+
13+
labels = [
14+
"qc1.rseal",
15+
"qc1.cm",
16+
"qc1.rseries",
17+
"qc2.raw",
18+
"qc2.subtracted",
19+
"qc3.raw",
20+
"qc3.E4031",
21+
"qc3.subtracted",
22+
"qc4.rseal",
23+
"qc4.cm",
24+
"qc4.rseries",
25+
"qc5.staircase",
26+
"qc5.1.staircase",
27+
"qc6.subtracted",
28+
"qc6.1.subtracted",
29+
"qc6.2.subtracted",
30+
]
31+
32+
def __init__(self):
33+
self._dict = OrderedDict([(label, [(False, None)]) for label in QCDict.labels])
34+
35+
def __str__(self):
36+
return self._dict.__str__()
37+
38+
def __repr__(self):
39+
return self._dict.__repr__()
40+
41+
def __getitem__(self, key):
42+
return self._dict.__getitem__(key)
43+
44+
def __setitem__(self, key, value):
45+
if key not in QCDict.labels:
46+
raise KeyError(f"Invalid QC key: {key}")
47+
self._dict.__setitem__(key, value)
48+
49+
def keys(self):
50+
return self._dict.keys()
51+
52+
def items(self):
53+
return self._dict.items()
54+
55+
def values(self):
56+
return self._dict.values()
57+
58+
def qc_passed(self, label):
59+
"""Return whether a single QC passed."""
60+
return all([x for x, _ in self._dict[label]])
61+
62+
def passed_list(self):
63+
"""Return a list of booleans indicating whether each QC passed."""
64+
return [self.qc_passed(label) for label in QCDict.labels]
65+
66+
def all_passed(self):
67+
"""Return whether all QC passed."""
68+
return all(self.passed_list())
1269

13-
QCnames = ['qc1.rseal', 'qc1.cm', 'qc1.rseries',
14-
'qc2.raw', 'qc2.subtracted',
15-
'qc3.raw', 'qc3.E4031', 'qc3.subtracted',
16-
'qc4.rseal', 'qc4.cm', 'qc4.rseries',
17-
'qc5.staircase', 'qc5.1.staircase',
18-
'qc6.subtracted', 'qc6.1.subtracted', 'qc6.2.subtracted']
1970

20-
no_QC = len(QCnames)
71+
class hERGQC(object):
2172

2273
def __init__(self, sampling_rate=5, plot_dir=None, voltage=np.array([]),
2374
n_sweeps=None, removal_time=5):
@@ -82,16 +133,6 @@ def __init__(self, sampling_rate=5, plot_dir=None, voltage=np.array([]),
82133

83134
self._debug = True
84135

85-
self.qc_labels = ['qc1.rseal', 'qc1.cm', 'qc1.rseries', 'qc2.raw',
86-
'qc2.subtracted', 'qc3.raw', 'qc3.E4031',
87-
'qc3.subtracted', 'qc4.rseal', 'qc4.cm',
88-
'qc4.rseries', 'qc5.staircase', 'qc5.1.staircase',
89-
'qc6.subtracted', 'qc6.1.subtracted',
90-
'qc6.2.subtracted']
91-
92-
def get_qc_names(self):
93-
return self.QCnames
94-
95136
def set_trace(self, before, after, qc_vals_before,
96137
qc_vals_after, n_sweeps):
97138
self._before = before
@@ -125,7 +166,7 @@ def run_qc(self, voltage_steps, times,
125166
before = self.filter_capacitive_spikes(before, times, voltage_steps)
126167
after = self.filter_capacitive_spikes(after, times, voltage_steps)
127168

128-
QC = OrderedDict([(label, [(False, None)]) for label in self.qc_labels])
169+
QC = QCDict()
129170

130171
if len(before) == 0 or len(after) == 0:
131172
return QC
@@ -223,10 +264,7 @@ def run_qc(self, voltage_steps, times,
223264
fig.savefig(os.path.join(self.plot_dir, 'qc_debug.png'))
224265
plt.close(fig)
225266

226-
# Check if all QC criteria passed
227-
passed = all([x for qc in QC.values() for x, _ in qc])
228-
229-
return passed, QC
267+
return QC
230268

231269
def qc1(self, rseal, cm, rseries):
232270
# Check R_seal, C_m, R_series within desired range

pcpostprocess/scripts/run_herg_qc.py

+9-10
Original file line numberDiff line numberDiff line change
@@ -922,16 +922,15 @@ def run_qc_for_protocol(readname, savename, time_strs, args):
922922
voltage_protocol.get_all_sections() if vend == vstart]
923923

924924
# Run QC with raw currents
925-
_, QC = hergqc.run_qc(voltage_steps, times,
926-
before_currents_corrected,
927-
after_currents_corrected,
928-
np.array(qc_before[well])[0, :],
929-
np.array(qc_after[well])[0, :], nsweeps)
930-
931-
passed_qc = [all([x for x, _ in qc]) for qc in QC.values()]
932-
df_rows.append([well] + passed_qc)
933-
934-
selected = np.all(QC) and not no_cell
925+
QC = hergqc.run_qc(voltage_steps, times,
926+
before_currents_corrected,
927+
after_currents_corrected,
928+
np.array(qc_before[well])[0, :],
929+
np.array(qc_after[well])[0, :], nsweeps)
930+
931+
df_rows.append([well] + QC.passed_list())
932+
933+
selected = QC.all_passed() and not no_cell
935934
if selected:
936935
selected_wells.append(well)
937936

tests/test_herg_qc.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -148,15 +148,15 @@ def test_run_qc(self):
148148
for tstart, tend, vstart, vend in
149149
voltage_protocol.get_all_sections() if vend == vstart]
150150

151-
passed, qcs = hergqc.run_qc(voltage_steps,
152-
self.times, before_well, after_well,
153-
qc_vals_before_well,
154-
qc_vals_after_well, n_sweeps=2)
151+
QC = hergqc.run_qc(voltage_steps,
152+
self.times, before_well, after_well,
153+
qc_vals_before_well,
154+
qc_vals_after_well, n_sweeps=2)
155155

156-
logging.debug(well, passed)
156+
logging.debug(well, QC.all_passed())
157157

158158
trace = ""
159-
for label, results in qcs.items():
160-
if any([x == False for x, _ in results]):
161-
trace += f"{label}: {results}\n"
162-
self.assertTrue(passed, trace)
159+
for label, result in QC.items():
160+
if not QC.qc_passed(label):
161+
trace += f"{label}: {result}\n"
162+
self.assertTrue(QC.all_passed(), trace)

0 commit comments

Comments
 (0)