--- license: cc-by-4.0 library_name: pytorch tags: - neuroscience - electrophysiology - neuropixels - spatial-encoding - international-brain-lab --- # Ephys Atlas spatial encoder (2026_W26) Predicts the **electrophysiological feature vector expected at a channel's position** -- from that position plus anatomical context and the recorded features of nearby channels on other insertions. Trained by the [International Brain Laboratory](https://www.internationalbrainlab.com/) on the Ephys Atlas feature release `2026_W26`. > **The input is a position, not features.** This is the inverse of the region classifier: that > model takes features and returns a region; this one takes a channel's `x, y, z` (Allen frame, > metres) and returns the 41 ephys features it would expect there. Feeding it the > feature columns instead of coordinates is the most common mistake -- `predict` raises and names > the coordinates it needs. ## What ships in this repo, and why all of it is needed A published encoder is not the weights alone. `predict` cannot run without every one of: - `spatial_encoder.pt` -- the trained network. - the context PCA volumes (`agea_vol_pca.npy`, `merfish_vol_pca.npy`) -- the anatomical context it samples at each position. - `neighbor_bank.npz` -- the **neighbour bank**: the position, standardised feature vector and insertion id of every training channel. At inference the model gathers the nearest recorded channels from this bank and attends to them, so the bank *is* part of the model, the way the stored points are part of a k-nearest-neighbours model. It cannot be reconstructed from the weights, which is why it is shipped here rather than recomputed on your machine. > **First run downloads the Allen volume.** Building the context sampler constructs an > `AllenAtlas`, which fetches the Allen CCF volume from `download.alleninstitute.org` (public, no > account, a few hundred MB) the first time it runs on a machine, then caches it. ## Quickstart ```python import pandas as pd from ephysatlas import load_pretrained model = load_pretrained("int-brain-lab/ea-encoder-channel", revision="2026_W26") df = pd.read_parquet("example/features_sample.parquet") # channel positions (x, y, z) out = model.predict(df) # one pred_ column each print(out.head()) ``` `load_pretrained` is the entry point for every ephysatlas model, whatever its family -- it reads `ephysatlas_model.json` and returns the right wrapper. Use it rather than importing a concrete class, so your code keeps working as the package evolves. `predict` returns one row per input channel, indexed identically to the input, with a `pred_` column per entry in `outputs.columns`. The `pred_` prefix keeps `df.join(out)` from colliding with the ground-truth feature columns of the same names. ## Inputs - Indexed by `(pid, channel)`, one row per recording channel. - The coordinate columns `x, y, z` named in `ephysatlas_model.json` under `inputs.columns`, in the Allen atlas frame, **in metres**. The feature columns are *not* read -- they are the output. ## Neighbourhood selection For each query position the model attends to recorded channels within **500.0 µm**, taking the **nearest 8** (`selection: nearest`). This is deterministic: two calls on the same input return identical predictions. > Training used a *random* subset of the in-radius neighbours; this published `predict` takes the > nearest instead. The two agree exactly whenever a position has at most 8 neighbours in > radius, and differ only in dense regions where the training-time subset would itself have varied > run to run. Deterministic output is the right contract for a published model. ## Limitations - Trained on IBL Neuropixels 1.0 recordings in mouse. Transfer to NP2, other species or other rigs is untested. - Coverage follows IBL brain-wide-map targeting; predictions far from any recorded channel fall back on anatomical context alone and are correspondingly weaker. ## Reproducibility **Pin the revision.** `revision="2026_W26"` is an immutable tag. Omitting `revision` resolves to `main`, which tracks whichever model is currently recommended and *will* change when a new feature vintage is published -- fine for a first look, not for anything you publish or re-run. `ephysatlas_model.json` records the training-time `environment` and `random_seed`. Verify your install reproduces the shipped output: ```python model.selftest() ``` ## Citation Please cite the International Brain Laboratory Ephys Atlas. Model id `ea-encoder-channel`, feature vintage `2026_W26`.