Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
04a156b
add data smoothing feature
mfiaudrin-epsyl Jul 8, 2026
ab1f21d
allow the user to restore data once smoothed
mfiaudrin-epsyl Jul 8, 2026
34055b1
add unary operations
mfiaudrin-epsyl Jul 8, 2026
74fef2a
update only the selected plot for smoothing and operations
mfiaudrin-epsyl Jul 8, 2026
22fa913
save in configuration smoothing and data operations
mfiaudrin-epsyl Jul 9, 2026
52285ad
preserve the selected smoothing when restoring data operations, and v…
mfiaudrin-epsyl Jul 9, 2026
1b7093b
display the human readable name for operations
mfiaudrin-epsyl Jul 9, 2026
0231b61
Preserve transposition after using data manipulation features
mfiaudrin-epsyl Jul 20, 2026
9beb57d
Merge branch 'develop' into feature/data_operations
mfiaudrin-epsyl Jul 21, 2026
d9627fc
Fix tabs scroll area width in hover buttons
mfiaudrin-epsyl Jul 21, 2026
58f875f
Merge branch 'develop' into feature/data_operations
olivhoenen Jul 30, 2026
bd2e791
Update frontend/src/renderer/components/grid/HoverButtons.tsx
olivhoenen Jul 30, 2026
e9a814d
Merge branch 'iterorganization:develop' into feature/data_operations
mfiaudrin-epsyl Aug 3, 2026
1b1ed20
Merge unary and signal operations into a single "Data operations" panel
mfiaudrin-epsyl Aug 4, 2026
c3e4701
improvement: Prevent invalid sigma values in the gaussian smoothing f…
mfiaudrin-epsyl Aug 4, 2026
c3cf2a2
fix: Keep the selected metadata tab when the grid is in edit mode
mfiaudrin-epsyl Aug 6, 2026
13e7fd7
Fix: Display the unit produced by a signal operation on a second Y axis
mfiaudrin-epsyl Aug 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 22 additions & 4 deletions docs/source/users_manual/features/customization.rst
Original file line number Diff line number Diff line change
Expand Up @@ -55,15 +55,33 @@ Applies a smoothing method to reduce noise while preserving the overall shape of
:alt: Data smoothing section of the customization
:align: center

Unary operations
Data operations
--------------------

Applies an ordered list of scalar operations to every data point of the plot:
Applies an ordered list of operations to every data point of the plot. Each row
has a **kind**, which decides what the plot is combined with:

.. image:: images/customization_unary_operations.png
:alt: Unary operations section of the customization
* **Constant**: a scalar value that you type in. Available operations are addition,
subtraction, multiplication, division, exponentiation and nth root.
* **Signal**: another plot of the same graph, combined point by point. Available
operations are addition, subtraction, multiplication and division. This kind
requires at least two plots in the graph, otherwise it stays disabled.

.. image:: images/customization_data_operations.png
:alt: Data operations section of the customization
:align: center

A few things to keep in mind when combining two signals:

* All constant operations are applied before all signal operations, whatever the
order of the rows.
* Both signals must share the same shape and the same coordinates. When they do
not, either select an interpolation method in the *Interpolation* section or
the server reports which of the two has to be interpolated.
* An addition or a subtraction requires both signals to share the same unit,
while a multiplication or a division combines them (for example ``m`` and
``s`` become ``m/s``).

Visual customization
----------------------------

Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
12 changes: 7 additions & 5 deletions frontend/src/renderer/components/grid/HoverButtons.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import {
IconTrash,
IconTarget,
} from '@tabler/icons-react';
import { useHover } from '@mantine/hooks';
import { useElementSize, useHover, useMergedRef } from '@mantine/hooks';
import {
Configuration,
CustomizedGridType,
Expand Down Expand Up @@ -55,6 +55,8 @@ export const HoverButtons = React.memo(
}: HoverButtonsProps) => {
const { active, updatedConfiguration } = useIbexStore();
const { hovered, ref: hoverRef } = useHover();
const { ref: sizeRef, width: containerWidth } = useElementSize();
const containerRef = useMergedRef(hoverRef, sizeRef);
const previousValueDisplayErrorBands = useRef<boolean | undefined>(
undefined,
);
Expand Down Expand Up @@ -196,7 +198,7 @@ export const HoverButtons = React.memo(
};

return (
<div ref={hoverRef} className={classes.containerButton}>
<div ref={containerRef} className={classes.containerButton}>
<Group justify="space-between" h={'100%'}>
{is3DView || !data.coordinates.length || shouldDisplayMetadata ? (
<Tabs
Expand All @@ -209,10 +211,10 @@ export const HoverButtons = React.memo(
scrollbarSize={6}
offsetScrollbars
maw={
hoverRef?.current?.offsetWidth
containerWidth
? !data.coordinates.length || shouldDisplayMetadata
? hoverRef.current.offsetWidth - 110
: hoverRef.current.offsetWidth - 230
? containerWidth - 110
: containerWidth - 280
: '100%'
}
>
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/renderer/components/plot/SimplePlotly.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ export const SimplePlotly = ({
title: { text: title },
}));

if (!itemDataGrid.isEditing) {
if (!itemDataGrid.isEditing || title === itemDataGrid.title) {
return;
}

Expand Down
8 changes: 8 additions & 0 deletions frontend/src/renderer/layout/MainLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { PreferenceModal } from '../components/preferences/PreferenceModal';
import {
updateIbexConfig,
formatConfigBeforeLoadingURIs,
formatSignalOperandsToSave,
plotNodeUriLoaded,
updateCustomDataTree,
readIbexConfig,
Expand Down Expand Up @@ -144,6 +145,13 @@ export function MainLayout() {
line: plot?.line || {},
customPreferences: plot?.customPreferences || {},
mode: plot?.mode || 'line',
smoothing: plot?.smoothing,
// Signal operands are stored the same way as nodeUri, so that they
// are remapped onto the selected data entries when reloading
operations: formatSignalOperandsToSave(
plot?.operations,
dataGrid.plot,
),
};
}),
}),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ import {
CustomizeDataRange,
CustomizeSynchronization,
CustomizeInterpolation,
CustomizeSmoothing,
CustomizeDataOperations,
CustomizeGeometry,
} from './customizableElements';
import { IconGeometry, IconLink } from '@tabler/icons-react';
Expand Down Expand Up @@ -60,6 +62,9 @@ export const DataplotCustomization = () => {
downsampled_method: customizedDataGrid?.downsampled_method,
interpolated_method: customizedDataGrid.interpolated_method,
plot: customizedDataGrid?.plot,
// A data operation can change a unit and move a plot to the second axis
yAxisData: customizedDataGrid?.yAxisData,
y2AxisData: customizedDataGrid?.y2AxisData,
} as DataGridPlot;
setDataGridLayout(updatedDataGridLayout);
setSelectedPlot(
Expand Down Expand Up @@ -481,6 +486,26 @@ const Customization = ({
/>
),
},
{
value: 'Data smoothing',
component: (
<CustomizeSmoothing
customizedDataGrid={customizedDataGrid}
selectedPlot={selectedPlot}
setCustomizedDataGrid={setCustomizedDataGrid}
/>
),
},
{
value: 'Data operations',
component: (
<CustomizeDataOperations
customizedDataGrid={customizedDataGrid}
selectedPlot={selectedPlot}
setCustomizedDataGrid={setCustomizedDataGrid}
/>
),
},
];

const items = (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -265,10 +265,11 @@ export const VisualizationMetaData = () => {
);
if (data) {
setDataGridLayout(data);
setTabsValue(data.plot[0]?.name || null);
const findPlot = data.plot.find(
(item) => item.name === data.plot[0]?.name,
);
const selectedName = data.plot.some((item) => item.name === tabsValue)
? tabsValue
: data.plot[0]?.name || null;
setTabsValue(selectedName);
const findPlot = data.plot.find((item) => item.name === selectedName);
if (findPlot) {
setItemDataGrid({
...data,
Expand Down
Loading
Loading