added experimental Simulation Helper using Python

This commit is contained in:
Ryan Tang 2024-02-21 16:24:40 -05:00
parent 11248d361d
commit 016ba85389
3 changed files with 153 additions and 21 deletions

132
Cleopatra/SimHelper.py Executable file
View File

@ -0,0 +1,132 @@
#!/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())

View File

@ -287,32 +287,32 @@ MyMainFrame::MyMainFrame(const TGWindow *p,UInt_t w,UInt_t h) {
} }
{//====================== Nuclear data API // {//====================== Nuclear data API
TGGroupFrame * dataFrame = new TGGroupFrame(hframe1, "Nuclear Data", kVerticalFrame); // TGGroupFrame * dataFrame = new TGGroupFrame(hframe1, "Nuclear Data", kVerticalFrame);
hframe1->AddFrame(dataFrame, new TGLayoutHints(kLHintsCenterX, 5,5,3,4)); // hframe1->AddFrame(dataFrame, new TGLayoutHints(kLHintsCenterX, 5,5,3,4));
TGHorizontalFrame * hfData = new TGHorizontalFrame(dataFrame); dataFrame->AddFrame(hfData, new TGLayoutHints(kLHintsNormal, 0, 0, 5, 0)); // TGHorizontalFrame * hfData = new TGHorizontalFrame(dataFrame); dataFrame->AddFrame(hfData, new TGLayoutHints(kLHintsNormal, 0, 0, 5, 0));
TGVerticalFrame * vfLabel = new TGVerticalFrame(hfData, 200); hfData->AddFrame(vfLabel ); // TGVerticalFrame * vfLabel = new TGVerticalFrame(hfData, 200); hfData->AddFrame(vfLabel );
TGVerticalFrame * vfTxt = new TGVerticalFrame(hfData); hfData->AddFrame(vfTxt); // TGVerticalFrame * vfTxt = new TGVerticalFrame(hfData); hfData->AddFrame(vfTxt);
TGLayoutHints * haha = new TGLayoutHints(kLHintsRight | kLHintsCenterY, 5,5,5,2); // TGLayoutHints * haha = new TGLayoutHints(kLHintsRight | kLHintsCenterY, 5,5,5,2);
TGLayoutHints * kaka = new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 5,5,0,0); // TGLayoutHints * kaka = new TGLayoutHints(kLHintsLeft | kLHintsCenterY, 5,5,0,0);
TGLabel * lb1 = new TGLabel(vfLabel, "Nuclear Name :"); vfLabel->AddFrame(lb1, haha); // TGLabel * lb1 = new TGLabel(vfLabel, "Nuclear Name :"); vfLabel->AddFrame(lb1, haha);
TGLabel * lb2 = new TGLabel(vfLabel, "Max Ex [MeV] :"); vfLabel->AddFrame(lb2, haha); // TGLabel * lb2 = new TGLabel(vfLabel, "Max Ex [MeV] :"); vfLabel->AddFrame(lb2, haha);
txtName = new TGTextEntry(vfTxt, "25F"); vfTxt->AddFrame(txtName, kaka); txtName->Resize(50, 20); // txtName = new TGTextEntry(vfTxt, "25F"); vfTxt->AddFrame(txtName, kaka); txtName->Resize(50, 20);
txtEx = new TGTextEntry(vfTxt, "0"); vfTxt->AddFrame(txtEx, kaka); txtEx->Resize(50, 20); // txtEx = new TGTextEntry(vfTxt, "0"); vfTxt->AddFrame(txtEx, kaka); txtEx->Resize(50, 20);
TGTextButton *GetData = new TGTextButton(dataFrame, "Get Data"); // TGTextButton *GetData = new TGTextButton(dataFrame, "Get Data");
GetData->SetWidth(150); // GetData->SetWidth(150);
GetData->SetHeight(40); // GetData->SetHeight(40);
GetData->ChangeOptions( GetData->GetOptions() | kFixedSize ); // GetData->ChangeOptions( GetData->GetOptions() | kFixedSize );
GetData->Connect("Clicked()","MyMainFrame",this,"GetData()"); // GetData->Connect("Clicked()","MyMainFrame",this,"GetData()");
dataFrame->AddFrame(GetData,new TGLayoutHints(kLHintsRight, 5,5,3,4)); // dataFrame->AddFrame(GetData,new TGLayoutHints(kLHintsRight, 5,5,3,4));
} // }
TGTextButton *exit = new TGTextButton(hframe1,"Exit", "gApplication->Terminate(0)"); TGTextButton *exit = new TGTextButton(hframe1,"Exit", "gApplication->Terminate(0)");
exit->SetWidth(150); exit->SetWidth(150);

View File

@ -45,7 +45,7 @@ def FindSym(Z):
return 'na' return 'na'
def Mass(A, Z): def Mass(A, Z):
try : try :
BEA = float(haha['binding'][haha['z']==Z][haha['n']==(A-Z)])/1000 BEA = float(haha['binding'][haha['z']==Z][haha['n']==(A-Z)].iloc[0])/1000
return (A-Z)*mn + Z*mp - A * BEA return (A-Z)*mn + Z*mp - A * BEA
except : except :
return -404 return -404
@ -87,7 +87,7 @@ def Info(AZ):
try : try :
Z = temp['z'][0] Z = temp['z'][0]
N = temp['n'][0] N = temp['n'][0]
mass = Z*mp + N*mn - (Z+N)*temp['binding']/1000 mass = float(Z*mp + N*mn - (Z+N)*temp['binding'].iloc[0]/1000)
halfLife = temp['half_life_sec'][0] halfLife = temp['half_life_sec'][0]
print(" A : %3d, Z : %3d, N : %3d, Mass : %.4f MeV" % (Z+N, Z, N, mass)) print(" A : %3d, Z : %3d, N : %3d, Mass : %.4f MeV" % (Z+N, Z, N, mass))
print("Jpi : %3s, half-live : %s sec" % (temp['jp'][0], halfLife)) print("Jpi : %3s, half-live : %s sec" % (temp['jp'][0], halfLife))