Compare commits

...

7 Commits

Author SHA1 Message Date
wendtalexander
396ebe0c52 [pyproject] updating to new version 2025-10-21 15:07:06 +02:00
wendtalexander
58b88b7e73 [stim] remove embed 2025-10-21 15:06:53 +02:00
wendtalexander
a8778f3596 [doc] adding doc for different comands 2025-10-21 15:06:40 +02:00
wendtalexander
d5499eb3e8 [formatting] 2025-10-21 15:06:19 +02:00
wendtalexander
307709834b [doc] adding algorithm 2025-10-21 15:06:01 +02:00
wendtalexander
a32a1f8cb4 [doc/quarto] adding algorithm 2025-10-21 15:05:50 +02:00
wendtalexander
56a430df26 [doc/assets] adding algorithm png 2025-10-21 15:05:34 +02:00
12 changed files with 134 additions and 91 deletions

View File

@@ -5,11 +5,9 @@ project:
format:
html:
# code-fold: true
# code-summary: "Show the code"
theme:
light: flatly
dark: darkly
light: flatly
css:
- api/_styles-quartodoc.css
- styles.css
@@ -37,7 +35,8 @@ website:
- text: "Usage"
href: "usage.qmd"
- text: "Sample Rates"
href: "samplerates.qmd"
- text: "Algorithm"
href: "algorithm.qmd"
- section: "Delays"
href: 'delays.qmd'
contents:

7
doc/algorithm.qmd Normal file
View File

@@ -0,0 +1,7 @@
---
title: Algorithm
---
### 1. Algorithm for automatic detection of repros with TTL pulses
![Algorithm](assets/algorithm.png)

BIN
doc/assets/algorithm.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

View File

@@ -19,23 +19,22 @@ Lets look at the calibration and the first trial of the recording.
```{python}
import pathlib
import rlxnix as rlx
import plotly.graph_objects as go
import numpy as np
import plotly.graph_objects as go
import rlxnix as rlx
import scipy.signal as signal
from plotly.subplots import make_subplots
from util import trial_plot, plot_line_comparision
from util import plot_line_comparision, trial_plot
dataset_path = pathlib.Path("../oephys2nix/test/AllStimuli/2025-10-20-aa-invivo-2-recording.nix")
relacs_path = pathlib.Path("../oephys2nix/test/AllStimuli/2025-10-20-aa-invivo-2_relacs/2025-10-20-aa-invivo-2_relacs.nix")
relacs_path = pathlib.Path(
"../oephys2nix/test/AllStimuli/2025-10-20-aa-invivo-2_relacs/2025-10-20-aa-invivo-2_relacs.nix"
)
dataset = rlx.Dataset(str(dataset_path))
relacs = rlx.Dataset(str(relacs_path))
#INFO: Select the first stimulus of the calibration repro
# INFO: Select the first stimulus of the calibration repro
repro_d = dataset.repro_runs("BaselineActivity")[0]
repro_r = relacs.repro_runs("BaselineActivity")[0]
@@ -57,7 +56,7 @@ ttl, t = repro_d.trace_data("ttl-line")
If you zoom in you can see a little delay between the different recording systems. It seems that open-ephys is before the relacs recording.
```{python}
#| echo: False
# | echo: False
# 2. Add traces to the FIRST subplot (row=1, col=1)
# Note: Plotly rows and columns are 1-indexed
fig = trial_plot(repro_d, repro_r, 1.0)
@@ -70,12 +69,13 @@ print(f"Duration of the dataset {repro_d.duration}")
print(f"Duration of the relacs {repro_r.duration}")
# Resample the open-ephys data
sinus_resampled = signal.resample(sinus, len(sinus_r))
```
```{python}
#| echo: False
fig= plot_line_comparision(t_r, t_r, sinus_r, sinus_resampled, ["sinus-relacs", "sinus-resampled-open-ephys"])
# | echo: False
fig = plot_line_comparision(
t_r, t_r, sinus_r, sinus_resampled, ["sinus-relacs", "sinus-resampled-open-ephys"]
)
fig.show()
```
We need to scale the two signals
@@ -85,23 +85,26 @@ oephys_lanes = [sinus, local_eod_oe, global_eod_oe, stimulus_oe]
relacs_lanes = [sinus_r, local_eod_re, global_eod_re, stimulus_re]
names_lanes = ["sinus", "local-eod", "global-eod", "stimulus"]
samples_20kHz = t[-1] * 20_000
print(samples_20kHz)
print(f"Total duration {t[-1]}")
print(repro_d.duration)
lags_lanes = []
for oephys_lane, relacs_lane, names_lane in zip(oephys_lanes, relacs_lanes, names_lanes, strict=True):
print(oephys_lane.shape)
print(relacs_lane.shape)
oephys_lane_resampled = signal.resample(oephys_lane, int(samples_20kHz))
correlation = signal.correlate(oephys_lane_resampled, relacs_lane, mode="full")
lags = signal.correlation_lags(oephys_lane_resampled.size, relacs_lane.size, mode="full")
lag = lags[np.argmax(correlation)]
lags_lanes.append(lag)
print(f"{names_lane} has a lag of {lag}")
for oephys_lane, relacs_lane, names_lane in zip(
oephys_lanes, relacs_lanes, names_lanes, strict=True
):
oephys_lane_resampled = signal.resample(oephys_lane, int(samples_20kHz))
correlation = signal.correlate(oephys_lane_resampled, relacs_lane, mode="full")
lags = signal.correlation_lags(oephys_lane_resampled.size, relacs_lane.size, mode="full")
lag = lags[np.argmax(correlation)]
lags_lanes.append(lag)
print(f"{names_lane} has a lag of {lag}")
```
```{python}
#| echo: False
fig = plot_line_comparision(t_r, t_r, np.roll(sinus_r, lags_lanes[0]), sinus_resampled, ["rolled sinus-relacs", "sinus-resampled-open-ephys"])
# | echo: False
fig = plot_line_comparision(
t_r,
t_r,
np.roll(sinus_r, lags_lanes[0]),
sinus_resampled,
["rolled sinus-relacs", "sinus-resampled-open-ephys"],
)
fig.show()
```

View File

@@ -58,7 +58,7 @@ If you zoom in you can see a little delay between the different recording system
```{python}
# | echo: False
fig = trial_plot(repro_d, repro_r)
fig = trial_plot(repro_d, repro_r, 0.41)
fig.show()
```
### Correlation between the Signals
@@ -85,8 +85,6 @@ lags_lanes = []
for oephys_lane, relacs_lane, names_lane in zip(
oephys_lanes, relacs_lanes, names_lanes, strict=True
):
print(oephys_lane.shape)
print(relacs_lane.shape)
oephys_lane_resampled = signal.resample(oephys_lane, len(relacs_lane))
correlation = signal.correlate(oephys_lane_resampled, relacs_lane, mode="full")
lags = signal.correlation_lags(oephys_lane_resampled.size, relacs_lane.size, mode="full")

View File

@@ -19,23 +19,22 @@ Lets look at the calibration and the first trial of the recording.
```{python}
import pathlib
import rlxnix as rlx
import plotly.graph_objects as go
import numpy as np
import plotly.graph_objects as go
import rlxnix as rlx
import scipy.signal as signal
from plotly.subplots import make_subplots
from util import trial_plot, plot_line_comparision
from util import plot_line_comparision, trial_plot
dataset_path = pathlib.Path("../oephys2nix/test/Test1/2025-10-08-aa-invivo-2-recording.nix")
relacs_path = pathlib.Path("../oephys2nix/test/Test1/2025-10-08-aa-invivo-2_relacs/2025-10-08-aa-invivo-2.nix")
relacs_path = pathlib.Path(
"../oephys2nix/test/Test1/2025-10-08-aa-invivo-2_relacs/2025-10-08-aa-invivo-2.nix"
)
dataset = rlx.Dataset(str(dataset_path))
relacs = rlx.Dataset(str(relacs_path))
#INFO: Select the first stimulus of the calibration repro
# INFO: Select the first stimulus of the calibration repro
repro_d = dataset.repro_runs("FICurve_1")[0].stimuli[2]
repro_r = relacs.repro_runs("FICurve_1")[0].stimuli[2]
@@ -57,10 +56,8 @@ ttl, t = repro_d.trace_data("ttl-line")
If you zoom in you can see a little delay between the different recording systems. It seems that open-ephys is before the relacs recording.
```{python}
#| echo: False
# 2. Add traces to the FIRST subplot (row=1, col=1)
# Note: Plotly rows and columns are 1-indexed
fig = trial_plot(repro_d, repro_r)
# | echo: False
fig = trial_plot(repro_d, repro_r, 0.41)
fig.show()
```
### Correlation between the Signals
@@ -70,12 +67,13 @@ print(f"Duration of the dataset {repro_d.duration}")
print(f"Duration of the relacs {repro_r.duration}")
# Resample the open-ephys data
sinus_resampled = signal.resample(sinus, len(sinus_r))
```
```{python}
#| echo: False
fig= plot_line_comparision(t_r, t_r, sinus_r, sinus_resampled, ["sinus-relacs", "sinus-resampled-open-ephys"])
# | echo: False
fig = plot_line_comparision(
t_r, t_r, sinus_r, sinus_resampled, ["sinus-relacs", "sinus-resampled-open-ephys"]
)
fig.show()
```
We need to scale the two signals
@@ -85,19 +83,25 @@ oephys_lanes = [sinus, local_eod_oe, global_eod_oe, stimulus_oe]
relacs_lanes = [sinus_r, local_eod_re, global_eod_re, stimulus_re]
names_lanes = ["sinus", "local-eod", "global-eod", "stimulus"]
lags_lanes = []
for oephys_lane, relacs_lane, names_lane in zip(oephys_lanes, relacs_lanes, names_lanes, strict=True):
print(oephys_lane.shape)
print(relacs_lane.shape)
oephys_lane_resampled = signal.resample(oephys_lane, len(relacs_lane))
correlation = signal.correlate(oephys_lane_resampled, relacs_lane, mode="full")
lags = signal.correlation_lags(oephys_lane_resampled.size, relacs_lane.size, mode="full")
lag = lags[np.argmax(correlation)]
lags_lanes.append(lag)
print(f"{names_lane} has a lag of {lag}")
for oephys_lane, relacs_lane, names_lane in zip(
oephys_lanes, relacs_lanes, names_lanes, strict=True
):
oephys_lane_resampled = signal.resample(oephys_lane, len(relacs_lane))
correlation = signal.correlate(oephys_lane_resampled, relacs_lane, mode="full")
lags = signal.correlation_lags(oephys_lane_resampled.size, relacs_lane.size, mode="full")
lag = lags[np.argmax(correlation)]
lags_lanes.append(lag)
print(f"{names_lane} has a lag of {lag}")
```
```{python}
#| echo: False
fig = plot_line_comparision(t_r, t_r, np.roll(sinus_r, lags_lanes[0]), sinus_resampled, ["rolled sinus-relacs", "sinus-resampled-open-ephys"])
# | echo: False
fig = plot_line_comparision(
t_r,
t_r,
np.roll(sinus_r, lags_lanes[0]),
sinus_resampled,
["rolled sinus-relacs", "sinus-resampled-open-ephys"],
)
fig.show()
```

View File

@@ -18,23 +18,22 @@ format:
```{python}
import pathlib
import rlxnix as rlx
import plotly.graph_objects as go
import numpy as np
import plotly.graph_objects as go
import rlxnix as rlx
import scipy.signal as signal
from plotly.subplots import make_subplots
from util import trial_plot, plot_line_comparision
from util import plot_line_comparision, trial_plot
dataset_path = pathlib.Path("../oephys2nix/test/Test1/2025-10-08-aa-invivo-2-recording.nix")
relacs_path = pathlib.Path("../oephys2nix/test/Test1/2025-10-08-aa-invivo-2_relacs/2025-10-08-aa-invivo-2.nix")
relacs_path = pathlib.Path(
"../oephys2nix/test/Test1/2025-10-08-aa-invivo-2_relacs/2025-10-08-aa-invivo-2.nix"
)
dataset = rlx.Dataset(str(dataset_path))
relacs = rlx.Dataset(str(relacs_path))
#INFO: Select the first stimulus of the calibration repro
# INFO: Select the first stimulus of the calibration repro
repro_d = dataset.repro_runs("FileStimulus_1")[0].stimuli[2]
repro_r = relacs.repro_runs("FileStimulus_1")[0].stimuli[2]
@@ -56,10 +55,10 @@ ttl, t = repro_d.trace_data("ttl-line")
If you zoom in you can see a little delay between the different recording systems. It seems that open-ephys is before the relacs recording.
```{python}
#| echo: False
# | echo: False
# 2. Add traces to the FIRST subplot (row=1, col=1)
# Note: Plotly rows and columns are 1-indexed
fig = trial_plot(repro_d, repro_r)
fig = trial_plot(repro_d, repro_r,1.01)
fig.show()
```
@@ -73,8 +72,10 @@ sinus_resampled = signal.resample(sinus, len(sinus_r))
```
```{python}
#| echo: False
fig= plot_line_comparision(t_r, t_r, sinus_r, sinus_resampled, ["sinus-relacs", "sinus-resampled-open-ephys"])
# | echo: False
fig = plot_line_comparision(
t_r, t_r, sinus_r, sinus_resampled, ["sinus-relacs", "sinus-resampled-open-ephys"]
)
fig.show()
```
We need to scale the two signals
@@ -84,21 +85,29 @@ oephys_lanes = [sinus, local_eod_oe, global_eod_oe, stimulus_oe]
relacs_lanes = [sinus_r, local_eod_re, global_eod_re, stimulus_re]
names_lanes = ["sinus", "local-eod", "global-eod", "stimulus"]
lags_lanes = []
for oephys_lane, relacs_lane, names_lane in zip(oephys_lanes, relacs_lanes, names_lanes, strict=True):
print(oephys_lane.shape)
print(relacs_lane.shape)
oephys_lane_resampled = signal.resample(oephys_lane, len(relacs_lane))
correlation = signal.correlate(oephys_lane_resampled, relacs_lane, mode="full")
lags = signal.correlation_lags(oephys_lane_resampled.size, relacs_lane.size, mode="full")
lag = lags[np.argmax(correlation)]
lags_lanes.append(lag)
print(f"{names_lane} has a lag of {lag}")
for oephys_lane, relacs_lane, names_lane in zip(
oephys_lanes, relacs_lanes, names_lanes, strict=True
):
print(oephys_lane.shape)
print(relacs_lane.shape)
oephys_lane_resampled = signal.resample(oephys_lane, len(relacs_lane))
correlation = signal.correlate(oephys_lane_resampled, relacs_lane, mode="full")
lags = signal.correlation_lags(oephys_lane_resampled.size, relacs_lane.size, mode="full")
lag = lags[np.argmax(correlation)]
lags_lanes.append(lag)
print(f"{names_lane} has a lag of {lag}")
```
```{python}
#| echo: False
fig = plot_line_comparision(t_r, t, np.roll(stimulus_re, lags_lanes[-1]), stimulus_oe-np.mean(stimulus_oe), ["rolled sinus-relacs", "sinus-resampled-open-ephys"])
# | echo: False
fig = plot_line_comparision(
t_r,
t,
np.roll(stimulus_re, lags_lanes[-1]),
stimulus_oe - np.mean(stimulus_oe),
["rolled sinus-relacs", "sinus-resampled-open-ephys"],
)
fig.show()
print(f"The lag of the whitenoise is {lags_lanes[-1] * (1/20_000) * 1000} milli seconds")
print(f"The lag of the whitenoise is {lags_lanes[-1] * (1 / 20_000) * 1000} milli seconds")
```

View File

@@ -86,8 +86,6 @@ lags_lanes = []
for oephys_lane, relacs_lane, names_lane in zip(
oephys_lanes, relacs_lanes, names_lanes, strict=True
):
print(oephys_lane.shape)
print(relacs_lane.shape)
oephys_lane_resampled = signal.resample(oephys_lane, len(relacs_lane))
correlation = signal.correlate(oephys_lane_resampled, relacs_lane, mode="full")
lags = signal.correlation_lags(oephys_lane_resampled.size, relacs_lane.size, mode="full")

View File

@@ -2,10 +2,38 @@
title: How to use it
---
### 1.Usage
If you have a folder or multiple folders with each containing two recordings one from `relacs` and one from `open-ephys` you can simply run the CLI like this:
```{python}
# leave out the ! at the beginning if you running this in your shell
!oephys2nix ../oephys2nix/test/Test1/
!oephys2nix convert ../oephys2nix/test/Test1/
```
which provides you with information about the transition of the stimuli into the new file.
### 1.2 Timeline plot
```sh
oephys2nix timeline ../oephys2nix/test/Test1/
```
```{python}
# | echo: False
from oephys2nix.main import timeline
path = "../oephys2nix/test/Test1/"
timeline(path)
```
### 1.3 plot
```sh
oephys2nix plot ../oephys2nix/test/Test1/
```
```{python}
# | echo: False
from oephys2nix.main import plot
path = "../oephys2nix/test/Test1/"
plot(path)
```

View File

@@ -349,9 +349,6 @@ class StimulusToNix:
if repro.duration < 0.05:
log.warning(f"Skipping repro {repro.name} because it is two short")
continue
embed()
exit()
if repro.stimuli:
log.debug("Processing MultiTag")
repetition = len(repro.stimuli)

View File

@@ -1,6 +1,6 @@
[project]
name = "oepyhs2nix"
version = "0.1.0"
version = "0.1.1"
description = "Converting ophen-ephys data to nix format"
readme = "README.md"
requires-python = ">=3.13"

2
uv.lock generated
View File

@@ -1322,7 +1322,7 @@ wheels = [
[[package]]
name = "oepyhs2nix"
version = "0.1.0"
version = "0.1.1"
source = { virtual = "." }
dependencies = [
{ name = "matplotlib" },