Use MatPlotLib to plot DWBA, Plotly for Ex levels

This commit is contained in:
Ryan Tang 2024-11-05 10:30:35 -05:00
parent 0b2e0ee0cd
commit f58c988128
2 changed files with 153 additions and 48 deletions

View File

@ -0,0 +1,107 @@
#!/usr/bin/python3
from PyQt6.QtWidgets import (
QGridLayout, QWidget, QCheckBox
)
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qtagg import NavigationToolbar2QT as NavigationToolbar
from matplotlib import get_backend
# Set backend to a Qt-compatible one
plt.switch_backend('QtAgg') # Or use 'Qt5Agg' if there are still issues
class MatPlotLibWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("DWBA Plot")
self.setGeometry(100, 100, 800, 600)
self.x = []
self.data = []
self.headers = []
self.figure, self.ax = plt.subplots()
self.canvas = FigureCanvas(self.figure)
self.toolbar = NavigationToolbar(self.canvas, self)
self.log_scale_checkbox = QCheckBox("Use Log Scale for Y-Axis")
self.log_scale_checkbox.setChecked(True)
self.log_scale_checkbox.stateChanged.connect(self.plot_matplotlib_graph)
self.gridline_checkbox = QCheckBox("Show Gridlines")
self.gridline_checkbox.stateChanged.connect(self.plot_matplotlib_graph)
self.showMarker_checkBox = QCheckBox("Show Markers")
self.showMarker_checkBox.setChecked(True)
self.showMarker_checkBox.stateChanged.connect(self.plot_matplotlib_graph)
layout = QGridLayout(self)
layout.addWidget(self.toolbar, 0, 0, 1, 3)
layout.addWidget(self.showMarker_checkBox, 1, 0)
layout.addWidget(self.log_scale_checkbox, 1, 1)
layout.addWidget(self.gridline_checkbox, 1, 2)
layout.addWidget(self.canvas, 2, 0, 5, 3)
def read_data(self,file_path):
self.x = [] # List for the first column
self.data = [] # 2D list for other columns
self.headers = [] # List to store headers
with open(file_path, 'r') as file:
header_found = False # Flag to indicate if the header has been found
for line in file:
# Skip lines that start with '#' and empty lines
if line.startswith('#') or not line.strip():
continue
if not header_found:
self.headers = line.split() # Use the split parts as headers
header_found = True # Set the flag to True to skip this block in future iterations
# print(f"ELab parts found: {elab_parts}") # Print or process this as needed
continue
# Split the line by whitespace
parts = line.split()
if len(parts) > 0: # Make sure there is at least one column
self.x.append(float(parts[0])) # First column
# Append the rest of the columns to data
if len(self.data) == 0:
# Initialize the data array with the right number of sublists
self.data = [[] for _ in range(len(parts) - 1)]
for i in range(len(parts) - 1):
self.data[i].append(float(parts[i + 1])) # Rest of the columns
# print(self.headers)
def plot_matplotlib_graph(self):
self.ax.clear()
plotStyle = '-' if not self.showMarker_checkBox.isChecked() else '-o'
for i, y in enumerate(self.data):
self.ax.plot(self.x, y, plotStyle, label=self.headers[i + 1])
self.ax.set_xlabel("Angle_CM [Deg]")
self.ax.set_ylabel("Xsec [mb/sr]")
self.ax.legend(loc='upper right', frameon=True)
# Apply log scale for y-axis if selected
if self.log_scale_checkbox.isChecked():
self.ax.set_yscale('log')
else:
self.ax.set_yscale('linear')
# Toggle gridlines
if self.gridline_checkbox.isChecked():
self.ax.grid(True, which='both', linestyle='--', linewidth=0.5, color='gray')
else:
self.ax.grid(False)
self.ax.autoscale(enable=True, axis='x', tight=True)
self.figure.tight_layout()
self.canvas.draw_idle()

View File

@ -15,6 +15,7 @@ from PyQt6.QtGui import QFont
from ExtractXsecPy import extract_xsec from ExtractXsecPy import extract_xsec
from PlotWindow import PlotWindow from PlotWindow import PlotWindow
from ExWindow import ExWindow from ExWindow import ExWindow
from MatPlotLibWindow import MatPlotLibWindow
################################################## MainWindow ################################################## MainWindow
class MyWindow(QMainWindow): class MyWindow(QMainWindow):
@ -27,8 +28,8 @@ class MyWindow(QMainWindow):
self.DWBAFileName = "DWBA" self.DWBAFileName = "DWBA"
self.bashResult = "" self.bashResult = ""
self.plot_window = None self.plot_window = MatPlotLibWindow()
self.Ex_window = None self.Ex_window = ExWindow()
# Set up Group Box for DWBA Control # Set up Group Box for DWBA Control
self.gbDWBA = QGroupBox("DWBA") self.gbDWBA = QGroupBox("DWBA")
@ -104,35 +105,35 @@ class MyWindow(QMainWindow):
group_layout.addWidget(self.bnCalDWBA, 12, 0, 1, 2) group_layout.addWidget(self.bnCalDWBA, 12, 0, 1, 2)
# Ex Group # Ex Group
# self.gbEx = QGroupBox("Ex") self.gbEx = QGroupBox("Ex")
# Ex_layout = QGridLayout() Ex_layout = QGridLayout()
# Ex_layout.setAlignment(Qt.AlignmentFlag.AlignTop) Ex_layout.setAlignment(Qt.AlignmentFlag.AlignTop)
# self.gbEx.setLayout(Ex_layout) self.gbEx.setLayout(Ex_layout)
# lbName = QLabel("Isotop :") lbName = QLabel("Isotop :")
# lbName.setAlignment(Qt.AlignmentFlag.AlignRight) lbName.setAlignment(Qt.AlignmentFlag.AlignRight)
# self.leName = QLineEdit() self.leName = QLineEdit()
# self.leName.setText("12C") self.leName.setText("12C")
# lbMaxEx = QLabel("Max Ex [MeV]:") lbMaxEx = QLabel("Max Ex [MeV]:")
# lbMaxEx.setAlignment(Qt.AlignmentFlag.AlignRight) lbMaxEx.setAlignment(Qt.AlignmentFlag.AlignRight)
# self.sbMaXEx = QDoubleSpinBox() self.sbMaXEx = QDoubleSpinBox()
# self.sbMaXEx.setMinimum(0) self.sbMaXEx.setMinimum(0)
# self.sbMaXEx.setMaximum(20) self.sbMaXEx.setMaximum(20)
# self.sbMaXEx.setDecimals(1) self.sbMaXEx.setDecimals(1)
# self.sbMaXEx.setValue(10) self.sbMaXEx.setValue(10)
# buEx = QPushButton("Get & Plot Ex") buEx = QPushButton("Get & Plot Ex")
# buEx.setFixedHeight(40) buEx.setFixedHeight(40)
# buEx.clicked.connect(self.open_Ex_window) buEx.clicked.connect(self.open_Ex_window)
# Ex_layout.addWidget(lbName, 0, 0) Ex_layout.addWidget(lbName, 0, 0)
# Ex_layout.addWidget(self.leName, 0, 1) Ex_layout.addWidget(self.leName, 0, 1)
# Ex_layout.addWidget(lbMaxEx, 1, 0) Ex_layout.addWidget(lbMaxEx, 1, 0)
# Ex_layout.addWidget(self.sbMaXEx, 1, 1) Ex_layout.addWidget(self.sbMaXEx, 1, 1)
# Ex_layout.addWidget(buEx, 2, 0, 1, 2) Ex_layout.addWidget(buEx, 2, 0, 1, 2)
# Set up the Right Side # Set up the Right Side
@ -158,9 +159,9 @@ class MyWindow(QMainWindow):
# Set up the layout # Set up the layout
layout = QGridLayout() layout = QGridLayout()
layout.addWidget(self.gbDWBA, 0, 0, 7, 1) # layout.addWidget(self.gbDWBA, 0, 0, 7, 1)
# layout.addWidget(self.gbDWBA, 0, 0, 5, 1) layout.addWidget(self.gbDWBA, 0, 0, 5, 1)
# layout.addWidget(self.gbEx, 5, 0, 2, 1) layout.addWidget(self.gbEx, 5, 0, 2, 1)
layout.addWidget(self.bnOpenDWBASource, 0, 1) layout.addWidget(self.bnOpenDWBASource, 0, 1)
layout.addWidget(self.leFileName, 0, 2, 1, 3) layout.addWidget(self.leFileName, 0, 2, 1, 3)
@ -256,33 +257,30 @@ class MyWindow(QMainWindow):
if self.chkPlot.isChecked() and self.file_exists(self.DWBAFileName + ".Xsec.txt") : if self.chkPlot.isChecked() and self.file_exists(self.DWBAFileName + ".Xsec.txt") :
self.open_plot_window() self.open_plot_window()
# def open_plot_window(self):
# if self.plot_window is None :
# self.plot_window = PlotWindow(self.DWBAFileName + ".Xsec.txt")
# self.plot_window.show()
# # self.plot_window.setAttribute(Qt.WA_DeleteOnClose) # Optional: Automatically delete when closed
# else:
# self.plot_window.read_data(self.DWBAFileName + ".Xsec.txt")
# self.plot_window.plot_plotly_graph()
# self.plot_window.show()
def open_plot_window(self): def open_plot_window(self):
if self.plot_window is None : self.plot_window.read_data(self.DWBAFileName + ".Xsec.txt")
self.plot_window = PlotWindow(self.DWBAFileName + ".Xsec.txt") self.plot_window.plot_matplotlib_graph()
self.plot_window.show() self.plot_window.show()
# self.plot_window.setAttribute(Qt.WA_DeleteOnClose) # Optional: Automatically delete when closed
else:
self.plot_window.read_data(self.DWBAFileName + ".Xsec.txt")
self.plot_window.plot_plotly_graph()
self.plot_window.show()
# def open_Ex_window(self): def open_Ex_window(self):
# if self.plot_window: self.Ex_window.GetEx(self.leName.text(), self.sbMaXEx.value())
# self.plot_window.close() self.Ex_window.plot_Ex_graph()
# self.plot_window.__del__() self.Ex_window.show()
# if self.Ex_window is None :
# self.Ex_window = ExWindow()
# self.Ex_window.GetEx(self.leName.text(), self.sbMaXEx.value())
# self.Ex_window.plot_Ex_graph()
# self.Ex_window.show()
def closeEvent(self, event): def closeEvent(self, event):
if self.plot_window: if self.plot_window:
self.plot_window.close() # Close the PlotWindow when MainWindow closes self.plot_window.close() # Close the PlotWindow when MainWindow closes
self.plot_window.__del__()
if self.Ex_window: if self.Ex_window:
self.Ex_window.close() # Close the PlotWindow when MainWindow closes self.Ex_window.close() # Close the PlotWindow when MainWindow closes
self.Ex_window.__del__() self.Ex_window.__del__()