diff --git a/doc/calibration.qmd b/doc/calibration.qmd index 81cbc36..77de963 100644 --- a/doc/calibration.qmd +++ b/doc/calibration.qmd @@ -1,36 +1,45 @@ --- title: Calibration +format: + html: + toc: true + toc-title: Contents + code-block-bg: true + code-block-border-left: "#31BAE9" + code-line-numbers: true + highlight-style: atom-one + link-external-icon: true + link-external-newwindow: true + eqn-number: true --- ### Calibration of the Amplitude +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 scipy.signal as signal from plotly.subplots import make_subplots -dataset = rlx.Dataset("../oephys2nix/test/Test1/2025-10-08-aa-invivo-2-recording.nix") -relacs = rlx.Dataset("../oephys2nix/test/Test1/2025-10-08-aa-invivo-2_relacs/2025-10-08-aa-invivo-2.nix") -repro_d = dataset.repro_runs("CalibEfield_1")[0] -repro_r = relacs.repro_runs("CalibEfield_1")[0] +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") -fig = make_subplots( -rows=4, -cols=1, -shared_xaxes=True, -subplot_titles=( - "Stimulus Comparison", - "Local EOD Comparison", - "Global EOD Comparison", - "Sinus Comparison", -),) +dataset = rlx.Dataset(str(dataset_path)) +relacs = rlx.Dataset(str(relacs_path)) +#INFO: Select the first stimulus of the calibration repro +repro_d = dataset.repro_runs("CalibEfield_1")[0].stimuli[2] +repro_r = relacs.repro_runs("CalibEfield_1")[0].stimuli[2] sinus, t = repro_d.trace_data("sinus") sinus_r, t_r = repro_r.trace_data("V-1") - stimulus_oe, t = repro_d.trace_data("stimulus") stimulus_re, t_r = repro_r.trace_data("GlobalEFieldStimulus") @@ -41,11 +50,27 @@ global_eod_oe, t = repro_d.trace_data("global-eod") global_eod_re, t_r = repro_r.trace_data("EOD") ttl, t = repro_d.trace_data("ttl-line") +``` +### Plotting the First trial +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 = make_subplots( rows=5, cols=1, shared_xaxes=True, subplot_titles=("TTL-Line", + "Stimulus Comparison", "Local EOD Comparison", "Global EOD Comparison", + "Sinus Comparison")) + +fig.add_trace( + go.Scatter(x=t, y=ttl, name="ttl-line", line_color="magenta"), + row=1, + col=1, +) + fig.add_trace( go.Scatter(x=t_r, y=stimulus_re, name="stimulus (relacs)", line_color="blue"), - row=1, + row=2, col=1, ) fig.add_trace( @@ -55,12 +80,7 @@ fig.add_trace( name="stimulus (open-ephys)", line_color="red", ), - row=1, - col=1, -) -fig.add_trace( - go.Scatter(x=t, y=ttl, name="ttl-line", line_color="black"), - row=1, + row=2, col=1, ) @@ -68,12 +88,12 @@ fig.add_trace( # 3. Add traces to the SECOND subplot (row=2, col=1) fig.add_trace( go.Scatter(x=t_r, y=local_eod_re, name="local EOD (relacs)", line_color="blue"), - row=2, + row=3, col=1, ) fig.add_trace( go.Scatter(x=t, y=local_eod_oe, name="local EOD (open-ephys)", line_color="red"), - row=2, + row=3, col=1, ) @@ -81,42 +101,112 @@ fig.add_trace( # 4. Add traces to the THIRD subplot (row=3, col=1) fig.add_trace( go.Scatter(x=t_r, y=global_eod_re, name="global EOD (relacs)", line_color="blue"), - row=3, + row=4, col=1, ) fig.add_trace( go.Scatter( x=t, y=global_eod_oe, name="global EOD (open-ephys)", line_color="red" ), - row=3, + row=4, col=1, ) - # 5. Add traces to the FOURTH subplot (row=4, col=1) fig.add_trace( go.Scatter(x=t_r, y=sinus_r, name="sinus (relacs)", line_color="blue"), - row=4, + row=5, col=1, ) fig.add_trace( go.Scatter(x=t, y=sinus, name="sinus (open-ephys)", line_color="red"), - row=4, + row=5, col=1, ) - # 6. Update the layout for a cleaner look fig.update_layout( - title_text="Relacs vs. Open Ephys Data Alignment", + template="plotly_dark", height=800, # Set the figure height in pixels # Control the legend - legend=dict(orientation="h", yanchor="bottom", y=1.02, xanchor="right", x=1), + #legend=dict(orientation="h", yanchor="bottom", y=1.02, xanchor="right", x=1), + legend=dict( + bgcolor="rgba(0,0,0,0)", # transparent dark (or use "#1f2630" to match bg) + bordercolor="#444", + borderwidth=0, + font=dict(color="#e5ecf6") # matches plotly_dark foreground + ) ) # Add a label to the shared x-axis (targeting the last subplot) fig.update_xaxes(title_text="Time (s)", row=4, col=1) - # 7. Show the figure fig.show() ``` +### Correlation between the Signals + +```{python} +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 = go.Figure() +fig.add_trace( go.Scatter(x=t_r, y=sinus_r, name="sinus (relacs)", line_color="blue", mode="lines+markers")) +fig.add_trace( go.Scatter(x=t_r, y=sinus_resampled, name="sinus-resampled (open-ephys)", line_color="red", mode="lines+markers")) +fig.update_layout( + template="plotly_dark", + height=500, # Set the figure height in pixels + # Control the legend + #legend=dict(orientation="h", yanchor="bottom", y=1.02, xanchor="right", x=1), + legend=dict( + bgcolor="rgba(0,0,0,0)", # transparent dark (or use "#1f2630" to match bg) + bordercolor="#444", + borderwidth=0, + font=dict(color="#e5ecf6") # matches plotly_dark foreground + ) +) +fig.update_xaxes(range=[0, 0.01]) +``` +We need to scale the two signals + +```{python} +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}") +``` + +```{python} +#| echo: False +fig = go.Figure() +fig.add_trace( go.Scatter(x=t_r, y=sinus_r, name="sinus (relacs)", line_color="blue", mode="lines+markers")) +fig.add_trace( go.Scatter(x=t_r, y=np.roll(sinus_resampled, -lags_lanes[0]), name="sinus-resampled (open-ephys)", line_color="red", mode="lines+markers")) +fig.update_layout( + title="Sinus", + template="plotly_dark", + height=500, # Set the figure height in pixels + # Control the legend + #legend=dict(orientation="h", yanchor="bottom", y=1.02, xanchor="right", x=1), + legend=dict( + bgcolor="rgba(0,0,0,0)", # transparent dark (or use "#1f2630" to match bg) + bordercolor="#444", + borderwidth=0, + font=dict(color="#e5ecf6") # matches plotly_dark foreground + ) +) +fig.update_xaxes(range=[0, 0.01]) +```