Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
81 changes: 81 additions & 0 deletions EasyReflectometryApp/Backends/Mock/Plotting.qml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,22 @@ QtObject {

property int modelCount: 1

// Plot mode properties
property bool plotRQ4: false
property string yMainAxisTitle: 'R(q)'
property bool xAxisLog: false
property string xAxisType: 'linear'
property bool sldXDataReversed: false
property bool scaleShown: false
property bool bkgShown: false

// Signals for plot mode changes
signal plotModeChanged()
signal axisTypeChanged()
signal sldAxisReversedChanged()
signal referenceLineVisibilityChanged()
signal samplePageDataChanged()
signal samplePageResetAxes()

function setQtChartsSerieRef(value1, value2, value3) {
console.debug(`setQtChartsSerieRef ${value1}, ${value2}, ${value3}`)
Expand Down Expand Up @@ -52,4 +67,70 @@ QtObject {
return '#0000FF'
}

// Plot mode toggle functions
function togglePlotRQ4() {
plotRQ4 = !plotRQ4
yMainAxisTitle = plotRQ4 ? 'R(q)×q⁴' : 'R(q)'
plotModeChanged()
}

function toggleXAxisType() {
xAxisLog = !xAxisLog
xAxisType = xAxisLog ? 'log' : 'linear'
axisTypeChanged()
}

function reverseSldXData() {
sldXDataReversed = !sldXDataReversed
sldAxisReversedChanged()
}

function flipScaleShown() {
scaleShown = !scaleShown
referenceLineVisibilityChanged()
}

function flipBkgShown() {
bkgShown = !bkgShown
referenceLineVisibilityChanged()
}

// Reference line data accessors (mock implementation)
function getBackgroundData() {
if (!bkgShown) return []
// Return mock horizontal line at background level
return [
{ 'x': 0.01, 'y': -7.0 },
{ 'x': 0.30, 'y': -7.0 }
]
}

function getScaleData() {
if (!scaleShown) return []
// Return mock horizontal line at scale level (log10(1.0) = 0)
return [
{ 'x': 0.01, 'y': 0.0 },
{ 'x': 0.30, 'y': 0.0 }
]
}

// Analysis-specific reference line data accessors (use sample/calculated x-range)
function getBackgroundDataForAnalysis() {
if (!bkgShown) return []
// Return mock horizontal line at background level using sample x-range
return [
{ 'x': sampleMinX, 'y': -7.0 },
{ 'x': sampleMaxX, 'y': -7.0 }
]
}

function getScaleDataForAnalysis() {
if (!scaleShown) return []
// Return mock horizontal line at scale level using sample x-range
return [
{ 'x': sampleMinX, 'y': 0.0 },
{ 'x': sampleMaxX, 'y': 0.0 }
]
}

}
4 changes: 3 additions & 1 deletion EasyReflectometryApp/Backends/Py/analysis.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from .logic.fitting import Fitting as FittingLogic
from .logic.minimizers import Minimizers as MinimizersLogic
from .logic.parameters import Parameters as ParametersLogic
from .logic.helpers import get_original_name
from .workers import FitterWorker


Expand Down Expand Up @@ -292,7 +293,8 @@ def modelNamesForExperiment(self) -> list:
mapped_models = []
experiments = self._experiments_logic._project_lib._experiments
for ind in experiments:
mapped_models.append(experiments[ind].model.name)
name = get_original_name(experiments[ind].model)
mapped_models.append(name)
return mapped_models

@Property('QVariantList', notify=experimentsChanged)
Expand Down
11 changes: 11 additions & 0 deletions EasyReflectometryApp/Backends/Py/logic/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,14 @@ def formatMsg(type, *args):
msg = ' ▌ '.join(msgs)
msg = f'{mark} {msg}'
return msg


def get_original_name(obj) -> str:
"""Get original name from user_data, with defensive fallback to obj.name.

Safely handles cases where user_data is None or not a dict.
"""
user_data = getattr(obj, 'user_data', None)
if isinstance(user_data, dict):
return user_data.get('original_name', obj.name)
return obj.name
6 changes: 4 additions & 2 deletions EasyReflectometryApp/Backends/Py/logic/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
from easyreflectometry.model import ModelCollection
from easyreflectometry.model.resolution_functions import PercentageFwhm

from .helpers import get_original_name


class Models:
def __init__(self, project_lib: ProjectLib):
Expand All @@ -21,7 +23,7 @@ def index(self, new_value: Union[int, str]) -> None:

@property
def name_at_current_index(self) -> str:
return self._models[self.index].name
return get_original_name(self._models[self.index])

@property
def scaling_at_current_index(self) -> float:
Expand Down Expand Up @@ -128,7 +130,7 @@ def _from_models_collection_to_list_of_dicts(models_collection: ModelCollection)
for model in models_collection:
models_list.append(
{
'label': model.name,
'label': get_original_name(model),
'color': str(model.color),
}
)
Expand Down
4 changes: 3 additions & 1 deletion EasyReflectometryApp/Backends/Py/logic/parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
from easyscience import global_object
from easyscience.variable import Parameter

from .helpers import get_original_name

RESERVED_ALIAS_NAMES = {'np', 'numpy', 'math', 'pi', 'e'}


Expand Down Expand Up @@ -226,7 +228,7 @@ def _is_layer_parameter(param: Parameter) -> bool:
# Process parameters for each model
for model_idx, model in enumerate(models):
model_unique_name = model.unique_name
model_prefix = f'M{model_idx + 1}'
model_prefix = get_original_name(model)

for parameter in parameters:
# Skip parameters not in this model's path
Expand Down
5 changes: 5 additions & 0 deletions EasyReflectometryApp/Backends/Py/logic/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,11 @@ def add_sample_from_orso(self, sample) -> None:
new_model_index = len(self._project_lib.models) - 1
self._update_enablement_of_fixed_layers_for_model(new_model_index)

def replace_models_from_orso(self, sample) -> None:
"""Replace all existing models with a single model built from the loaded sample."""
self._project_lib.replace_models_from_orso(sample)
self._update_enablement_of_fixed_layers_for_model(0)

def reset(self) -> None:
self._project_lib.reset()
self._project_lib.default_model()
Loading