Skip to content

Commit b1f1b0a

Browse files
committed
alpha beta plots
1 parent e6610ee commit b1f1b0a

File tree

6 files changed

+58
-8
lines changed

6 files changed

+58
-8
lines changed

omc3_gui/plotting/latex_to_html.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
# Dictionary to map Greek LaTeX symbols to HTML
44
LATEX_TO_HTML_SYMBOLS = {
5+
# Greek ---
56
r'\alpha': 'α',
67
r'\beta': 'β',
78
r'\gamma': 'γ',
@@ -25,8 +26,32 @@
2526
r'\chi': 'χ',
2627
r'\psi': 'ψ',
2728
r'\omega': 'ω',
29+
r'\Alpha': 'Α',
30+
r'\Beta': 'Β',
31+
r'\Gamma': 'Γ',
32+
r'\Delta': 'Δ',
33+
r'\Epsilon': 'Ε',
34+
r'\Zeta': 'Ζ',
35+
r'\Eta': 'Η',
36+
r'\Theta': 'Θ',
37+
r'\Iota': 'Ι',
38+
r'\Kappa': 'Κ',
39+
r'\Lambda': 'Λ',
40+
r'\Mu': 'Μ',
41+
r'\Nu': 'Ν',
42+
r'\Xi': 'Ξ',
43+
r'\Pi': 'Π',
44+
r'\Rho': 'Ρ',
45+
r'\Sigma': 'Σ',
46+
r'\Tau': 'Τ',
47+
r'\Upsilon': 'Υ',
48+
r'\Phi': 'Φ',
49+
r'\Chi': 'Χ',
50+
r'\Psi': 'Ψ',
51+
r'\Omega': 'Ω',
52+
# Spacing ---
2853
r'\quad': ' ',
29-
# You can add more Greek letters as needed
54+
r'\;': ' ',
3055
}
3156

3257
def latex_to_html_converter(latex_str):

omc3_gui/segment_by_segment/main_controller.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ def connect_signals(self):
6666
""" Connect the signals from the GUI components (view) to the slots (controller). """
6767
view: SbSWindow = self._view # for shorthand and type hinting
6868

69+
# Tabs -----------------------------------------------------------------
70+
view.sig_tab_changed.connect(self.plot)
71+
6972
# Menu Bar -------------------------------------------------------------
7073
view.sig_menu_settings.connect(self.show_settings)
7174

omc3_gui/segment_by_segment/main_view.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import logging
1313
from collections.abc import Sequence
1414

15-
from omc3.definitions.optics import PHASE_COLUMN, ColumnsAndLabels
15+
from omc3.definitions.optics import PHASE_COLUMN, BETA_COLUMN, ALPHA_COLUMN, ColumnsAndLabels
1616
from qtpy import QtGui, QtWidgets
1717
from qtpy.QtCore import QItemSelectionModel, QModelIndex, Qt, Signal, Slot
1818

@@ -41,6 +41,8 @@
4141

4242
class Tabs(IterClass):
4343
PHASE: ColumnsAndLabels = PHASE_COLUMN
44+
BETA: ColumnsAndLabels = BETA_COLUMN
45+
ALPHA: ColumnsAndLabels = ALPHA_COLUMN
4446

4547

4648
class SbSWindow(View):
@@ -51,6 +53,7 @@ class SbSWindow(View):
5153
sig_list_measurements_selected = Signal(tuple) # Tuple[OpticsMeasurement]
5254
sig_table_segments_selected = Signal(tuple)
5355
sig_thread_spinner_double_clicked = Signal()
56+
sig_tab_changed = Signal()
5457

5558
# Menu Signals ---
5659
sig_menu_settings = Signal()
@@ -97,6 +100,7 @@ def _connect_signals(self):
97100
# Optics Measurements ---
98101
self._list_view_measurements.doubleClicked.connect(self._handle_list_measurements_double_clicked)
99102
self._list_view_measurements.selectionModel().selectionChanged.connect(self._handle_list_measurements_selected)
103+
self._tabs_widget.currentChanged.connect(self._handle_tab_changed)
100104

101105
# Slots --------------------------------------------------------------------
102106
@Slot(QModelIndex)
@@ -115,6 +119,11 @@ def _handle_table_segments_selected(self):
115119
LOGGER.debug("Segment Table selection changed.")
116120
selected_segments = self.get_selected_segments()
117121
self.sig_table_segments_selected.emit(selected_segments)
122+
123+
@Slot()
124+
def _handle_tab_changed(self):
125+
LOGGER.debug("Tab changed.")
126+
self.sig_tab_changed.emit()
118127

119128
# GUI-Elements -------------------------------------------------------------
120129
def _add_menus(self):

omc3_gui/segment_by_segment/plotting.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,13 @@
88

99
import logging
1010

11-
from omc3.definitions.optics import S_COLUMN, ColumnsAndLabels
12-
from omc3.segment_by_segment.definitions import PropagableColumns
11+
from omc3.definitions.optics import (
12+
S_COLUMN,
13+
S_MODEL_COLUMN,
14+
ColumnsAndLabels,
15+
)
16+
from omc3.optics_measurements.constants import ALPHA_NAME, BETA_NAME, PHASE_NAME
17+
from omc3.segment_by_segment.propagables import PropagableColumns
1318
from qtpy.QtCore import Qt
1419

1520
from omc3_gui.plotting.classes import DualPlot
@@ -23,6 +28,11 @@
2328

2429
PenStyle = Qt.PenStyle
2530

31+
NAME_TO_FILE_MAP = {
32+
"alpha": ALPHA_NAME,
33+
"beta": BETA_NAME,
34+
"phase": PHASE_NAME,
35+
}
2636

2737

2838
def plot_segment_data(widget: DualPlot, definition: ColumnsAndLabels, segments: list[SegmentDataModel], settings: PlotSettings):
@@ -32,6 +42,8 @@ def plot_segment_data(widget: DualPlot, definition: ColumnsAndLabels, segments:
3242
Assumes all segments have been run. Please check beforehand.
3343
"""
3444
s_column = S_COLUMN
45+
if settings.model_s:
46+
s_column = S_MODEL_COLUMN
3547

3648
# use the segment name as label, if there is more than one segment from the same measurement
3749
use_segment_label = len(set(s.measurement.display() for s in segments)) != len(segments)
@@ -42,7 +54,7 @@ def get_label(segment: SegmentDataModel) -> str:
4254

4355

4456
for plane, plot in zip("xy", [widget.top, widget.bottom]):
45-
data_name = f"{definition.text_label}_{plane}" # coincides with the name in TfsCollection
57+
data_name = f"{NAME_TO_FILE_MAP[definition.text_label]}{plane}"
4658

4759
dataframes = {
4860
get_label(segment): segment.data[data_name]
@@ -81,7 +93,7 @@ def get_label(segment: SegmentDataModel) -> str:
8193
ycolumn=getattr(column_def, column_name),
8294
yerrcolumn=getattr(column_def, f"error_{column_name}"),
8395
xlabel=s_column.label,
84-
ylabel=latex_to_html_converter(plane_def.label),
96+
ylabel=latex_to_html_converter(plane_def.delta_label),
8597
legend=settings.show_legend,
8698
marker=marker,
8799
markersize=settings.marker_size,

omc3_gui/segment_by_segment/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class PlotSettings:
2929
connect_y: bool = metafield("Connect Y", "Connect Y axes of the two plots.", default=False)
3030
reset_zoom: bool = metafield("Reset Zoom", "Reset zoom when changing segments.", default=True)
3131
same_start: bool = metafield("Same Segment Start", "Plot only if the selected segments all have the same starting BPM.", default=True)
32+
model_s: bool = metafield("Model Location", "Use the model longitudinal location instead of the segment location.", default=False)
3233

3334

3435
@dataclass(slots=True)

omc3_gui/utils/iteration_classes.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class IterableAttributeNames(type):
1515
""" Makes the class itself iterable over its attribute names. """
1616

1717
def __iter__(self) -> Iterator[str]:
18-
for attr in dir(self):
18+
for attr in self.__dict__.keys():
1919
if not attr.startswith("__") and attr != EXCLUDED_NAME and attr not in getattr(self, EXCLUDED_NAME, []):
2020
yield attr
2121

@@ -56,4 +56,4 @@ def values(cls) -> Iterator[Any]:
5656
@classmethod
5757
def items(cls) -> Iterator[tuple[str, Any]]:
5858
for attr in cls:
59-
yield attr, getattr(cls, attr)
59+
yield attr, getattr(cls, attr)

0 commit comments

Comments
 (0)