Skip to content

Commit 69760ab

Browse files
a-faclaude
andcommitted
Fix TraceFile(*reader) unpacking bug in docs and sampling_freq lookup
Replace broken `TraceFile(*reader)` pattern across 7 doc locations with correct `metadata, current, voltage = Reader(...)` unpacking. Fix `sampling_freq` initialization in datatypes.py to use dict `.get()` instead of `getattr`, enabling automatic fallback to metadata keys. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 87dbbce commit 69760ab

8 files changed

Lines changed: 23 additions & 14 deletions

File tree

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ from ionique.parsers import AutoSquareParser
1818
from ionique.utils import Filter, Trimmer, extract_features
1919

2020
# Load and preprocess
21-
trace = TraceFile(*EDHReader("experiment.edh", voltage_compress=True))
21+
metadata, current, voltage = EDHReader("experiment.edh", voltage_compress=True)
22+
trace = TraceFile(current, voltage=voltage, metadata=metadata)
2223
Filter(cutoff_frequency=5000, filter_type="lowpass",
2324
sampling_frequency=trace.sampling_freq)(trace.current)
2425
Trimmer(samples_to_remove=500)(trace)

docs/_build/doc_example_fixes.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,11 @@ Fixes for incorrect API usages found in documentation code examples.
99
| `docs/parsers_guide.rst` | 128 | `parser.to_json("my_parser.json")` | `parser.to_json(filename="my_parser.json")` | `to_json()` takes `filename` as keyword arg, not positional. |
1010
| `docs/parsers_guide.rst` | 132 | `restored = Parser.from_json(json_str)` | Removed; added note that `from_json` is not yet implemented | `from_json` returns `None` (stub). Showing it as working is misleading. |
1111
| `docs/parsers/other_parsers.rst` | 202 | `IVCurveParser(voltage=voltage_array)` | `IVCurveParser(voltage_array)` | `voltage` is a positional argument in the constructor. |
12+
| `src/ionique/datatypes.py` | 183 | `getattr(self.unique_features,"sampling_freq",...)` | `self.unique_features.get("sampling_freq", self.metadata.get(...))` | `getattr` doesn't find dict keys; use `.get()` for dict fallback chain. |
13+
| `README.md` | 21 | `TraceFile(*EDHReader(...))` | Unpack reader, pass named params | `*reader` unpacks `(metadata, current, voltage)` into wrong positional args. |
14+
| `docs/index.rst` | 19–20 | `reader = ...; trace = TraceFile(*reader)` | Unpack reader, pass named params | Same `*reader` unpacking bug. |
15+
| `docs/getting_started.rst` | 24–25 | `reader = ...; trace = TraceFile(*reader)` | Unpack reader, pass named params | Same `*reader` unpacking bug. |
16+
| `docs/data_input.rst` | 117–120 | `TraceFile(*reader)` + misleading shorthand | Single correct `TraceFile(current, voltage=voltage, ...)` call | Removed broken pattern and misleading "shorthand" comment. |
17+
| `docs/tutorial.rst` | 27 | `trace = TraceFile(*reader)` | Unpack reader, pass named params | Same `*reader` unpacking bug. |
18+
| `docs/tutorial.rst` | 222 | `TraceFile(*EDHReader(...))` | Unpack reader, pass named params | Same `*reader` unpacking bug. |
19+
| `docs/signal_analysis.rst` | 131 | `trace = TraceFile(*reader)` | Unpack reader, pass named params | Same `*reader` unpacking bug. |

docs/data_input.rst

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,6 @@ Creating a TraceFile
114114
115115
from ionique.datatypes import TraceFile
116116
117-
trace = TraceFile(*reader)
118-
119-
# Shorthand: unpack reader directly
120117
trace = TraceFile(current, voltage=voltage, metadata=metadata)
121118
122119
When ``voltage`` contains step boundaries (from ``voltage_compress=True``),

docs/getting_started.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ Minimal workflow
2121
from ionique.utils import Filter, Trimmer, extract_features
2222
2323
# 1. Load an EDH file with voltage-step splitting
24-
reader = EDHReader("experiment.edh", voltage_compress=True)
25-
trace = TraceFile(*reader)
24+
metadata, current, voltage = EDHReader("experiment.edh", voltage_compress=True)
25+
trace = TraceFile(current, voltage=voltage, metadata=metadata)
2626
2727
# 2. Filter high-frequency noise
2828
filt = Filter(

docs/index.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ around a flexible tree-based segment hierarchy.
1616
from ionique.utils import Filter, extract_features
1717
1818
# Load a nanopore recording
19-
reader = EDHReader("experiment.edh", voltage_compress=True)
20-
trace = TraceFile(*reader)
19+
metadata, current, voltage = EDHReader("experiment.edh", voltage_compress=True)
20+
trace = TraceFile(current, voltage=voltage, metadata=metadata)
2121
2222
# Filter noise
2323
filt = Filter(cutoff_frequency=5000, filter_type="lowpass", sampling_frequency=100000)

docs/signal_analysis.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,8 @@ Combining features from multiple files
127127
128128
all_dfs = []
129129
for filename in edh_files:
130-
reader = EDHReader(filename, voltage_compress=True)
131-
trace = TraceFile(*reader)
130+
metadata, current, voltage = EDHReader(filename, voltage_compress=True)
131+
trace = TraceFile(current, voltage=voltage, metadata=metadata)
132132
# ... filter, trim, parse ...
133133
df = extract_features(
134134
trace, "event", ["mean", "std", "duration"],

docs/tutorial.rst

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ metadata, current, and voltage arrays. Wrap them in a ``TraceFile``.
2323
from ionique.io import EDHReader
2424
from ionique.datatypes import TraceFile
2525
26-
reader = EDHReader("experiment.edh", voltage_compress=True, downsample=1)
27-
trace = TraceFile(*reader)
26+
metadata, current, voltage = EDHReader("experiment.edh", voltage_compress=True, downsample=1)
27+
trace = TraceFile(current, voltage=voltage, metadata=metadata)
2828
2929
print(f"Samples: {trace.n}")
3030
print(f"Sampling freq: {trace.sampling_freq} Hz")
@@ -219,7 +219,8 @@ The complete pipeline:
219219
from ionique.utils import Filter, Trimmer, extract_features
220220
221221
# Load
222-
trace = TraceFile(*EDHReader("experiment.edh", voltage_compress=True))
222+
metadata, current, voltage = EDHReader("experiment.edh", voltage_compress=True)
223+
trace = TraceFile(current, voltage=voltage, metadata=metadata)
223224
224225
# Preprocess
225226
Filter(cutoff_frequency=5000, filter_type="lowpass",

src/ionique/datatypes.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,9 @@ def __init__(self, current: np.ndarray, voltage=None, rank="file", parent=None,
180180
self.end = len(self.current)
181181
self.metadata = metadata
182182
self.uuid = None
183-
self.sampling_freq = getattr(self.unique_features,"sampling_freq",getattr(self.metadata,"eff_sampling_freq",getattr(self.metadata,"Sampling Frequency (SR)",None)))
183+
self.sampling_freq = self.unique_features.get("sampling_freq",
184+
self.metadata.get("eff_sampling_freq",
185+
self.metadata.get("Sampling Frequency (SR)", None)))
184186
self.time = np.arange(self.start, self.end) / self.sampling_freq
185187

186188
# If voltage data exists, create MetaSegment instance for each voltage step

0 commit comments

Comments
 (0)