|
| 1 | +# NDR-python Port Status |
| 2 | + |
| 3 | +Status of the MATLAB → Python port of [NDR-matlab](https://github.com/VH-Lab/NDR-matlab). |
| 4 | + |
| 5 | +## Naming Convention |
| 6 | + |
| 7 | +Python class names are a mechanical mapping of the fully-qualified MATLAB class name, |
| 8 | +applying the **Mirror Rule**: |
| 9 | + |
| 10 | +1. Periods (`.`) are replaced with single underscores (`_`). |
| 11 | +2. Existing underscores (`_`) in the MATLAB name are replaced with double underscores (`__`). |
| 12 | + |
| 13 | +| MATLAB qualified name | Python module | Python class | |
| 14 | +|---|---|---| |
| 15 | +| `ndr.reader` | `ndr.reader_wrapper` | `ndr_reader` | |
| 16 | +| `ndr.reader.base` | `ndr.reader.base` | `ndr_reader_base` | |
| 17 | +| `ndr.reader.intan_rhd` | `ndr.reader.intan_rhd` | `ndr_reader_intan__rhd` | |
| 18 | +| `ndr.reader.ced_smr` | `ndr.reader.ced_smr` | `ndr_reader_ced__smr` | |
| 19 | +| `ndr.reader.axon_abf` | `ndr.reader.axon_abf` | `ndr_reader_axon__abf` | |
| 20 | +| `ndr.reader.neo` | `ndr.reader.neo` | `ndr_reader_neo` | |
| 21 | +| `ndr.reader.spikegadgets_rec` | `ndr.reader.spikegadgets_rec` | `ndr_reader_spikegadgets__rec` | |
| 22 | +| `ndr.reader.tdt_sev` | `ndr.reader.tdt_sev` | `ndr_reader_tdt__sev` | |
| 23 | +| `ndr.reader.bjg` | `ndr.reader.bjg` | `ndr_reader_bjg` | |
| 24 | +| `ndr.reader.dabrowska` | `ndr.reader.dabrowska` | `ndr_reader_dabrowska` | |
| 25 | +| `ndr.reader.whitematter` | `ndr.reader.whitematter` | `ndr_reader_whitematter` | |
| 26 | +| `ndr.reader.somecompany_someformat` | `ndr.reader.somecompany_someformat` | `ndr_reader_somecompany__someformat` | |
| 27 | + |
| 28 | +## Reader Status |
| 29 | + |
| 30 | +| Reader | getchannelsepoch | t0\_t1 | samplerate | readchannels\_epochsamples | readevents\_epochsamples\_native | read | Tests | |
| 31 | +|---|---|---|---|---|---|---|---| |
| 32 | +| **ndr\_reader\_intan\_\_rhd** | Yes | Yes | Yes | Yes (single-file) | Stub (empty) | Yes | 6 pass | |
| 33 | +| **ndr\_reader\_ced\_\_smr** | Yes | Yes | Yes | Yes | Yes | Yes (via base) | 14 pass | |
| 34 | +| **ndr\_reader\_axon\_\_abf** | Yes | Yes | Yes | Yes | Stub (empty) | Yes (via base) | 6 pass | |
| 35 | +| **ndr\_reader\_neo** | Stub (empty) | Stub | Stub | NotImplementedError | Stub (empty) | No | 24 xfail | |
| 36 | +| **ndr\_reader\_spikegadgets\_\_rec** | Stub (empty) | Stub | Stub | NotImplementedError | Stub (empty) | No | xfail | |
| 37 | +| **ndr\_reader\_tdt\_\_sev** | Stub (empty) | Stub | Stub | NotImplementedError | Stub (empty) | No | skipped | |
| 38 | +| **ndr\_reader\_bjg** | Stub (empty) | Stub | Stub | NotImplementedError | Stub (empty) | No | skipped | |
| 39 | +| **ndr\_reader\_dabrowska** | Stub (empty) | Stub | Stub | NotImplementedError | Stub (empty) | No | skipped | |
| 40 | +| **ndr\_reader\_whitematter** | Stub (empty) | Stub | Stub | NotImplementedError | Stub (empty) | No | skipped | |
| 41 | + |
| 42 | +**Legend:** |
| 43 | +- **Yes** — Fully implemented and tested with example data |
| 44 | +- **Stub (empty)** — Returns empty arrays / default values; no errors raised |
| 45 | +- **NotImplementedError** — Raises an exception; not yet implemented |
| 46 | +- **Stub** — Inherits base class default (empty list, `[[nan,nan]]`, etc.) |
| 47 | + |
| 48 | +## Format Parsers |
| 49 | + |
| 50 | +Low-level format parsers (under `ndr.format.*`) that read binary files: |
| 51 | + |
| 52 | +| Format | Module | Status | |
| 53 | +|---|---|---| |
| 54 | +| Intan RHD | `ndr.format.intan` | Implemented (header + single-file data reader) | |
| 55 | +| CED SMR/SON | `ndr.format.ced` | Implemented (via `neo` library) | |
| 56 | +| Axon ABF | `ndr.format.axon` | Implemented (via `pyabf` library) | |
| 57 | +| SpikeGadgets REC | `ndr.format.spikegadgets` | Implemented (config, analog, digital, trode) | |
| 58 | +| TDT SEV | `ndr.format.tdt` | Implemented (header + channel reader) | |
| 59 | +| BJG | `ndr.format.bjg` | Implemented (header + data reader) | |
| 60 | +| Dabrowska | `ndr.format.dabrowska` | Implemented (header + data reader) | |
| 61 | +| WhiteMatter | `ndr.format.whitematter` | Implemented (header + data reader) | |
| 62 | +| Neo / Blackrock | `ndr.format.neo` | Implemented (utilities) | |
| 63 | +| Binary Matrix | `ndr.format.binarymatrix` | Implemented | |
| 64 | +| Text Signal | `ndr.format.textSignal` | Implemented | |
| 65 | + |
| 66 | +Note: For SpikeGadgets, TDT, BJG, Dabrowska, and WhiteMatter, the format parsers are implemented but the reader classes have not yet been wired up to use them. |
| 67 | + |
| 68 | +## Reader Wrapper |
| 69 | + |
| 70 | +The top-level `ndr_reader` class (`reader_wrapper.py`) wraps any format-specific reader and adds: |
| 71 | + |
| 72 | +| Feature | Status | |
| 73 | +|---|---| |
| 74 | +| `read()` convenience method | Implemented | |
| 75 | +| `readevents_epochsamples()` with derived events (dep, den, dimp, dimn) | Implemented | |
| 76 | +| Delegation to underlying reader | Implemented | |
| 77 | + |
| 78 | +## External Dependencies |
| 79 | + |
| 80 | +| Dependency | Used by | Purpose | |
| 81 | +|---|---|---| |
| 82 | +| `neo` | ndr\_reader\_ced\_\_smr, ndr\_reader\_neo | Read CED SMR/SON and Blackrock files | |
| 83 | +| `pyabf` | ndr\_reader\_axon\_\_abf | Read Axon Binary Format files | |
| 84 | +| `numpy` | All readers | Array operations | |
| 85 | + |
| 86 | +## Test Summary |
| 87 | + |
| 88 | +``` |
| 89 | +38 passed, 28 xfailed, 13 skipped, 2 failed (pre-existing spikegadgets format test issues) |
| 90 | +``` |
| 91 | + |
| 92 | +Example data files are included in `src/ndr/example_data/` for Intan (.rhd), CED (.smr), Axon (.abf), SpikeGadgets (.rec), and Blackrock (.nev, .ns2). |
0 commit comments