SOLARIS_Analysis/Cleopatra/PySimHelper.py

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())