Tags: sciencecorp/synapse-python
Tags
Record real electrode ids in broadband HDF5 output (#193) * Record real electrode ids in broadband HDF5 output detect_stream_parameters reported channels as range(len(frame_data)) and the writer copied that straight into general/extracellular_ephys/electrodes/id, so every row was labeled by its position in the frame. A recording therefore carried no way to tell which electrode a row came from, and any configuration whose electrodes aren't 0..N-1 in ascending order — a sparse selection, or one deliberately ordered by the user — was silently mislabeled all the way through analysis. The new synapse.utils.electrode_ids reconstructs that identity. Frames describe their own layout in channel_ranges (a type, a count, and the logical channel ids in frame order), and the logical -> physical electrode mapping lives in the applied device configuration, which build_channel_to_electrode_map reads out of DeviceInfo. derive_electrode_row_ids combines the two into one id per frame_data entry, re-keying GPIO rows into a high namespace so ids stay unique within the table. Identity degrades explicitly rather than quietly: the electrode map is applied only when every electrode row resolves, so a dataset never mixes the two id spaces, and frames with no usable channel_ranges fall back to the old positional scheme with a warning printed to the console. Which of the three happened is recorded as the electrodes group's id_source attribute, and the logical channel id and channel type are written alongside id as equal-length datasets so downstream analysis can reconstruct the full mapping. The live plotter picks up the same ids, so its channel labels now name real electrodes. The offline plotter labeled its DataFrame columns positionally while selecting them by channel id, so --channels picked the wrong traces for any recording whose ids aren't 0..N-1; it now labels columns by channel id and reports id_source alongside the channel count. This mirrors deriveElectrodeRowIds in nexus-desktop, which writes the same layout from the desktop recording path. * bump version --------- Co-authored-by: calvinleng-science <[email protected]>
Unify impedance CSV output across streaming and non-streaming paths (#… …187) * Unify impedance CSV output across streaming and non-streaming paths Both synapsectl query and synapsectl query --stream now write identical impedance CSVs via a shared synapse.cli.impedance_csv module: Peripheral: <name> Electrode ID,Magnitude (Ohms),Phase (degrees),Status <electrode_id>,<magnitude>,<phase>,<status> Changes: - Add a 'Peripheral: <name>' metadata header line, resolved from the device's peripheral list (preferring the query's peripheral_id, else the broadband recording source). - Fix streaming CSV discrepancies: it previously wrote a different header ('Electrode ID,Magnitude,Phase'), omitted units, and had no Status column. It now matches the non-streaming format. - Streaming now also writes failed measurements with Status=0 (success=1); previously failed measurements were dropped from the CSV entirely. * Write impedance CSV peripheral metadata as a CSV row Use 'Peripheral,<name>' (a valid 2-column CSV row) instead of the colon-separated 'Peripheral: <name>' line, so standard CSV parsers handle the metadata line gracefully. * Bump version to 2.7.6 * Fix impedance display table unit label (Ohms, not kΩ) * Resolve impedance peripheral name before query (consistent with streaming)
fix(release): skip-existing on testpypi and longer wait before valida… …te (#181) testpypi publish failed with a 400 when the version was already present on testpypi, blocking the downstream validate and pypi publish jobs. skip-existing makes the upload idempotent, and the wait before validating is bumped 60s -> 180s to give testpypi more time to index the new release.
feat: peripheral SDK (#176) * feat: synapsectl peripherals build/deploy subcommands Mirrors apps build/deploy for peripheral plugin packages: synapsectl peripherals build . — cross-compiles a plugin .so against scifi-peripheral-sdk inside the example repo's Dockerfile, then packages it (plus the bundled libscifi-peripheral-sdk.so* extracted from the builder image) into a .deb with Section=synapse-peripherals. synapsectl peripherals deploy . — gRPC-streams the .deb via the existing DeployApp method. scifi-server's app_updater.cpp install gate now accepts either synapse-apps or synapse-peripherals. No new RPCs. No SFTP. No systemd service wrapping (plugins live at /usr/lib/scifi/plugins/ and are dlopen'd by scifi-server's PluginRegistry at startup). Also pins the synapse-api submodule to current main HEAD. * repinned back to head of main, generalize settings pin is outside the scope of this PR * bump version to 2.7.0
PreviousNext