132 lines
3.8 KiB
Python
Executable File
132 lines
3.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
#============== experimental Simulation Helper using PyROOT and PyQT
|
|
#
|
|
# need pip install PyQt6
|
|
# need to make at Cleopatra
|
|
#
|
|
#=====================================================
|
|
|
|
import sys
|
|
from PyQt6.QtCore import Qt
|
|
from PyQt6.QtWidgets import QApplication, QWidget, QMainWindow, QLabel, QPushButton, QVBoxLayout, QPlainTextEdit, QGroupBox, QGridLayout
|
|
import subprocess
|
|
import ROOT
|
|
import webbrowser
|
|
|
|
def SaveTxtFromEditor():
|
|
if presentFileName != "" :
|
|
with open(presentFileName, "w") as f:
|
|
f.write(editor.toPlainText())
|
|
|
|
def LoadTxtToEditor(txtFileName):
|
|
global presentFileName
|
|
SaveTxtFromEditor()
|
|
|
|
presentFileName = txtFileName
|
|
with open(txtFileName) as f:
|
|
text = f.read()
|
|
editor.setPlainText(text)
|
|
|
|
def RunSimulation():
|
|
SaveTxtFromEditor()
|
|
bash_command = "../Cleopatra/SimTransfer reactionConfig.txt detectorGeo.txt 0 '' transfer.root"
|
|
process = subprocess.Popen(bash_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
output, error = process.communicate()
|
|
if process.returncode != 0:
|
|
print("Error:", error.decode())
|
|
else:
|
|
print("Output:", output.decode())
|
|
|
|
|
|
def OpenHttpServer():
|
|
global ser, file, tree
|
|
file = ROOT.TFile("transfer.root", "read")
|
|
tree = file.Get("tree")
|
|
|
|
hEZ = ROOT.TH2F("hEZ", "E - Z; z[mm]; e[MeV]", 400, -600, 0, 400, 0, 10)
|
|
hXY = ROOT.TH2F("hXY", "Array; X[mm]; Y[MeV]", 200, -20, 20, 200, -20, 20)
|
|
hRecoilXY = ROOT.TH2F("hRecoilXY", "Recoil; X[mm]; Y[MeV]", 400, -60, 60, 400, -60, 60)
|
|
hThetaCMZ = ROOT.TH2F("hThetaCMZ", "TheatCM - Z; X[mm]; thetaCM [deg]", 400, -600, 0, 400, 0, 60)
|
|
hExCal = ROOT.TH1F("hExCal", "ExCal; MeV", 400, -1, 5)
|
|
|
|
|
|
for event in tree:
|
|
if( event.hit != 1 or event.thetaCM < 10 or event.loop != 1) : continue
|
|
|
|
hEZ.Fill(event.array_hit_z, event.energy_light) # x, y
|
|
hXY.Fill(event.xArray, event.yArray)
|
|
hRecoilXY.Fill(event.xRecoil, event.yRecoil)
|
|
hThetaCMZ.Fill(event.array_hit_z, event.thetaCM)
|
|
hExCal.Fill(event.ExCal)
|
|
|
|
|
|
ser = ROOT.THttpServer("http:9876")
|
|
# ser.SetJSROOT("https://root.cern.ch/js/latest/")
|
|
|
|
ser.Register("/", hEZ)
|
|
ser.Register("/", hXY)
|
|
ser.Register("/", hRecoilXY)
|
|
ser.Register("/", hThetaCMZ)
|
|
ser.Register("/", hExCal)
|
|
|
|
ser.SetItemField("/","_layout","grid4x4")
|
|
ser.SetItemField("/","_drawitem","[hEZ, hRecoilXY, hExCal, hThetaCM]")
|
|
|
|
webbrowser.open("http://localhost:9876/")
|
|
|
|
|
|
########################################################
|
|
if __name__ == "__main__":
|
|
|
|
app = QApplication(sys.argv)
|
|
editor = QPlainTextEdit()
|
|
|
|
presentFileName = ""
|
|
|
|
ser = None
|
|
file = None
|
|
tree = None
|
|
|
|
window = QMainWindow()
|
|
window.setWindowTitle("Simulation Helper")
|
|
window.setFixedSize(800, 1000)
|
|
|
|
mainWidget = QWidget()
|
|
window.setCentralWidget(mainWidget)
|
|
|
|
layout = QGridLayout()
|
|
mainWidget.setLayout(layout)
|
|
|
|
reactionGroup = QGroupBox("Reaction", window)
|
|
layout.addWidget(reactionGroup, 0, 0)
|
|
reactionLayout = QVBoxLayout(reactionGroup)
|
|
|
|
bDetGeo = QPushButton("Detector Geo", reactionGroup)
|
|
reactionLayout.addWidget(bDetGeo)
|
|
bDetGeo.clicked.connect(lambda : LoadTxtToEditor("detectorGeo.txt"))
|
|
|
|
bReactionConfig = QPushButton("Reaction Config", reactionGroup)
|
|
reactionLayout.addWidget(bReactionConfig)
|
|
bReactionConfig.clicked.connect(lambda : LoadTxtToEditor("reactionConfig.txt"))
|
|
|
|
bSim = QPushButton("Simulation", reactionGroup)
|
|
reactionLayout.addWidget(bSim)
|
|
bSim.clicked.connect(RunSimulation)
|
|
|
|
bTest = QPushButton("Open Browser", reactionGroup)
|
|
reactionLayout.addWidget(bTest)
|
|
bTest.clicked.connect(OpenHttpServer)
|
|
|
|
layout.addWidget(editor, 0, 1, 5, 5)
|
|
LoadTxtToEditor("detectorGeo.txt")
|
|
|
|
# # Create PyQtGraph plot
|
|
# plot = PlotWidget()
|
|
# plot_item = plot.getPlotItem()
|
|
# plot_item.plot(x=[1, 2, 3], y=[4, 6, 2])
|
|
# layout.addWidget(plot)
|
|
|
|
# Show the window and start the event loop
|
|
window.show()
|
|
sys.exit(app.exec()) |