sorry, aber es funktioniert immer noch nicht. es nimmt contaminations immer noch als ein argument und gibt
zurück.
Code: Alles auswählen
from org.csstudio.opibuilder.scriptUtil import PVUtil
from org.csstudio.opibuilder.scriptUtil import FileUtil
from org.csstudio.swt.widgets.natives.SpreadSheetTable import ITableSelectionChangedListener
from java.util import Arrays
from org.csstudio.opibuilder.scriptUtil import ColorFontUtil
RED = ColorFontUtil.getColorFromRGB(255,0,0)
# import math for later calculations in imported data
import os
from math import cos, pi as PI, sin, sqrt
from string import*
table_calc = display.getWidget("Table").getTable()
table_cont = display.getWidget("Table1").getTable()
C_0 = 299792458.0
BETA_S = 0.041
G_EFF = 0.067539767
#big letter because LAMDA seems to be predefined
LAMDA = 3.724129913
Qout = []
numberout = []
Energyout = []
fieldout = []
cavmaxFilename = FileUtil.workspacePathToSysPath("/CSS/cavmax_CSS_real.txt")
#QAFilename = FileUtil.workspacePathToSysPath("/CSS/Q_A_Sym_ME_A_abu.txt")
def compute_energy(number, A, phi, k, cavlist, Vebit, Vebitmax, cavmaxCSS, factor, BETA_S):
condition_energy = (
all(t < u for t, u in zip(cavlist, cavmaxCSS))
)
E0 = 600
for s in range(1,number + 1):
# 10**(-16), because keV
beta = sqrt(2 * E0 * 1.602177 * 10**(-16) / 1.6726 * 10**27) /C_0
tmp = PI * G_EFF / (beta * LAMDA)
T = sin(tmp) / tmp * sin(PI * BETA_S / (2 * beta))
E0 = E0 + (k*27.98*cavlist[s-1]/factor[s-1])/A*T*cos(phi)
if condition_energy:
Qout.append(k)
set_cells(table_calc, len(Qout) - 1, k, Vebit, number, E0)
else:
refresh()
def compute_field(number_chosen, A, phi, Q_calc, Vebit, Vebitmax, cavmaxreal, factor, BETA_S, minimumf, maximumf, diffE, E):
E_average = (600 + E)/2
v_averge = sqrt(2*E_average*1.602177*10**(-16)/1.6726*10**27)
beta_average = v_averge/C_0
tmp = PI * G_EFF / (beta_average * LAMDA)
T_average = sin(tmp)/tmp*sin(PI*BETA_S/(2*beta_average))
fieldreal = diffE*A/(27.98*Q_calc*float(number_chosen)*T_average*cos(phi))
condition_field = (
fieldreal > minimumf and fieldreal < maximumf and all(fieldreal < u for u in cavmaxreal)
)
if condition_field:
Qout.append(Q_calc)
fieldout.append(fieldreal)
numberout.append(number_chosen)
Energyout.append(E)
set_cells(table_calc, len(Qout) - 1, k, Vebit, s, E)
field_computation = zip(Qout, fieldreal, number_chosen, E)
#yield field_computation
#info_for_click = zip(Qout, fieldout, numberout, Energyout)
return Qout, fieldout, numberout, Energyout #info_for_click
class ContaminationEntry(object):
def __init__(self, qcont, around, nameiso, unknown, a1, abu):
self.qcont = int(qcont)
self.around = int(around)
self.nameiso = nameiso
self.a1 = float(a1)
self.abu = float(abu)
@property
def qdivbya(self):
return self.qcont/self.a1
def calc_diffqa(self):
class SelectionListener(ITableSelectionChangedListener):
def selectionChanged(self, selection):
text=""
for row in selection:
i=0
for s in row:
text += s;
if i != (len(row)-1):
text += " "
i+=1
text1 = text.split()
qchosen = float(text1[0])
number = float(text1[2])
energy = float(text1[3])
beamqdivbya = qchosen/A
for a, b in self.qcont, self.a1:
diffqa = abs(beamqdivbya - a/b)
return diffqa, qchosen
def readcontamination(filename):
infile = open(filename)
return [ContaminationEntry(*column.split()) for column in infile]
def main():
contaminations = {}
for cproperty in ("stable","all"):
contaminations[cproperty] = readcontamination(r"C:\Python27\Q_A_Sym_ME_A_abu_%s.txt"%cproperty)
cavmaxCSS, cavmaxreal, factor = readcavmaxfile()
phi, Qin, A, E, diffE, minimumf, maximumf, Vebitmax, check2, check1, check3, check4, checks,\
number, numbers, diffqa0, cavlist, combo = getInputs(ContaminationEntry, factor)
alarm(cavlist, cavmaxCSS, number)
Qout, fieldout, numberout, Energyout = decision(phi, Qin, A, E, diffE, minimumf, maximumf, Vebitmax, checks, \
number, numbers, cavlist, factor, cavmaxCSS, cavmaxreal)
clickrow(combo, contaminations, diffqa0, qchosen, A)
def readcavmaxfile():
infile = open(cavmaxFilename,'r')
info = (column.strip().split() for column in infile)
x = zip(*info)
cavmaxCSS = map(float,x[0])
cavmaxreal = map(float,x[1])
factor = [b/m for b,m in zip(cavmaxCSS, cavmaxreal)]
return cavmaxCSS, cavmaxreal, factor
#define function that writes values in cells
def set_cells(table_cont, row, *args):
for i, value in enumerate(args):
table_cont.setCellText(row, i, str(value))
# define function that refreshes output
def refresh():
table_calc.setContent([[" ", " ", " ", " "]])
table_cont.setContent([[" ", " ", " ", " ", " ", " "]])
def getInputs(ContaminationEntry, factor):
Element = str(display.getWidget("Element").getValue())
Aput = float(display.getWidget("A").getValue())
for ContaminationEntry.around, ContaminationEntry.nameiso, ContainationEntry.qcont, ContaminationEntry.a1 in ContaminationEntry:
if A_ == Aput and b == Element:
A = d
display.getWidget("Qin").getPV().setValue(c)
Qin = c
E = float(display.getWidget("E").getValue())
diffE = E -600
minimumf = float(display.getWidget("minimumf").getValue())
maximumf = float(display.getWidget("maximumf").getValue())
Vebitmax = float(display.getWidget("Vebitmax").getValue())
phase = float(display.getWidget("phase").getValue())
phi = - phase *PI/180
check2 = display.getWidget("check2").getValue()
check1 = display.getWidget("check1").getValue()
check3 = display.getWidget("check3").getValue()
check4 = display.getWidget("check4").getValue()
checks = [check1, check2, check3, check4]
number = float(display.getWidget("number").getValue())
minnumber = float(display.getWidget("minnumber").getValue())
maxnumber = float(display.getWidget("maxnumber").getValue())
numbers = range(minnumber, maxnumber + 1)
cav1 = float(display.getWidget("cav1").getValue())
cav2 = float(display.getWidget("cav2").getValue())
cav3 = float(display.getWidget("cav3").getValue())
cav4 = float(display.getWidget("cav4").getValue())
cav5 = float(display.getWidget("cav5").getValue())
cav6 = float(display.getWidget("cav6").getValue())
cavlist = [cav1, cav2, cav3, cav4, cav5, cav6]
resolve = float(display.getWidget("resolve").getValue())
diffqa0 = 1/resolve
combo = str(display.getWidget("Combo").getValue())
# give back real fields of cavities
for i in range(1,7):
x = cavlist[i-1]/factor[i-1]
display.getWidget("cav" + str(i) + "real").setValue(x)
return phi, Qin, A, E, diffE, minimumf, maximumf, Vebitmax, check2, check1, check3, check4, checks,\
number, numbers, diffqa0, cavlist, combo
def alarm(cavlist, cavmaxCSS, number):
for i in range(1, number + 1):
if number >= i and cavlist[i-1] > cavmaxCSS[i-1]:
display.getWidget("cav" + str(i)).setPropertyValue("foreground_color",RED)
def decision(phi, Qin, A, E, diffE, minimumf, maximumf, Vebitmax, checks, \
number, numbers, cavlist, factor, cavmaxCSS, cavmaxreal):
Q = range(1 , Qin + 1, 1)
for i in Q:
Vebit = 12*A/i
# Ist possibility: fixed number, compute Energy
if Vebit < Vebitmax and checks == [1, 0, 0, 1]:
compute_energy(number, A, phi, i, cavlist, Vebit, Vebitmax, cavmaxCSS, factor, BETA_S)
Qout, fieldout, numberout, Energyout = 0,0,0,0
# does not provide any information - not needed
elif Vebit < Vebitmax and checks == [1, 0, 1, 0]:
Qout, fieldout, numberout, Energyout = compute_field(number, A, phi, i, Vebit, Vebitmax, cavmaxreal, factor, BETA_S, minimumf, maximumf, diffE, E)
elif Vebit < Vebitmax and checks == [0, 1, 1, 0]:
for j in numbers:
Qout, fieldout, numberout, Energyout = compute_field(j, A, phi, i, Vebit, Vebitmax, cavmaxreal, factor, BETA_S, minimumf, maximumf, diffE, E)
else:
refresh()
return Qout, fieldout, numberout, Energyout
def filter_contamination(contamintions, bea, diffqa0):
"filters all contamination entries with diffqa < diffqa0"
for contaminations_entry in ContaminationEntry:
diffqa = ContaminationEntry.calc_diffqa
if diffqa < diffqa0:
yield diffqa, ContaminationEntry
def clickrow(ContaminationEntry, diffqa0, qchosen, A):
filtered = filter_contamination(ContaminationEntry, diffqa0)
for index, (diffqa, ContaminationEntry) in enumerate(filtered):
diffqaoverqa = float(diffqa)/float(qchosen) * A
set_cells(table_cont, index,
ContaminationEntry.nameiso,
ContaminationEntry.qcont,
ContaminationEntry.a1,
ContaminationEntry.qdivbya,
diffqaoverqa,
contaminationEntry.abu
)
if __name__ == '__main__': main()