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*
from string import*
table = display.getWidget("Table").getTable()
table1 = display.getWidget("Table1").getTable()
c0 = 299792458.0
betaS = 0.041
geff = 0.067539767
#big letter because lambda seems to be predefined
Lambda = 3.724129913
Qout = []
numberout = []
Energyout = []
fieldout = []
def compute_field(s, A, phi, k, Vebit, Vebitmax, cavmaxreal, factor, betaS, 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/c0
tmp = pi * geff / (beta_average * Lambda)
T_average = sin(tmp)/tmp*sin(pi*betaS/(2*beta_average))
fieldreal = diffE*A/(27.98*k*float(s)*T_average*cos(phi))
condition_field = (
fieldreal > minimumf and fieldreal < maximumf and all(fieldreal < u for u in cavmaxreal) and Vebit < Vebitmax
)
if condition_field:
Qout.append(k)
fieldout.append(fieldreal)
numberout.append(s)
Energyout.append(E)
set_cells(table, len(Qout) - 1, k, Vebit, s, E)
#info_for_click = zip(Qout, fieldout, numberout, Energyout)
return Qout, fieldout, numberout, Energyout #info_for_click
def main():
Qcont, A1, Around, nameiso, abu, qdivbya, abu2, information = readcontaminationfile()
cavmaxCSS, cavmaxreal, factor = readcavmaxfile()
phi, Qin, A, E, diffE, minimumf, maximumf, Vebitmax, check2, check1, check3, check4, checks,\
number, numbers, diffqa0, cavlist, combo = getInputs(A1, Around, nameiso, Qcont, 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(Qcont, A1, nameiso, qdivbya, abu2, information, A, diffqa0, check3, check4, factor, \
phi, minimumf, maximumf, cavmaxreal, combo)
...
...
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 checks == [1, 0, 0, 1]:
compute_energy(number, A, phi, i, cavlist, Vebit, Vebitmax, cavmaxCSS, factor, betaS)
Qout, fieldout, numberout, Energyout = 0,0,0,0
# does not provide any information - not needed
elif checks == [1, 0, 1, 0]:
Qout, fieldout, numberout, Energyout = compute_field(number, A, phi, i, Vebit, Vebitmax, cavmaxreal, factor, betaS, minimumf, maximumf, diffE, E)
elif checks == [0, 1, 1, 0]:
# for some reason: after checks no for..
normann = 3
for j in numbers:
Qout, fieldout, numberout, Energyout = compute_field(j, A, phi, i, Vebit, Vebitmax, cavmaxreal, factor, betaS, minimumf, maximumf, diffE, E)
else:
refresh()
return Qout, fieldout, numberout, Energyout
def clickrow(Qcont, A1, nameiso, qdivbya, abu2, information, A, diffqa0, check3, check4, factor, \
phi, minimumf, maximumf, cavmaxreal, combo, Qout, fieldout, numberout, Energyout):
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])
if check4 == 0 and check3 == 1:
#diffE = Energy - 600
# cannot calculate the exact transit time factor (TTF), because too little information for equations: only average TTF
#E_average = (600 + Energy)/2
#v_averge = sqrt(2*E_average*1.602177*10**(-16)/1.6726*10**27)
#beta_average = v_averge/c0
#tmp = pi * geff / (beta_average * Lambda)
#T_average = sin(tmp)/tmp*sin(pi*betaS/(2*beta_average))
#fieldreal = diffE*A/(27.98*Qchosen*float(Number)*T_average*cos(phi))
info_for_click = zip(Qout, fieldout, numberout, Energyout)
for Qchosen, fieldreal, Number, Energy in info_for_click:
listfields = int(Number)*[fieldreal]
for i in range(1, int(Number) + 1,1):
display.getWidget("cav" + str(i)).setPropertyValue("visible",True)
display.getWidget("cav" + str(i) + "real").setPropertyValue("visible",True)
display.getWidget("cav" + str(i)+ "real").setValue(fieldreal)
for m in range(int(Number) + 1, 7, 1):
display.getWidget("cav" + str(m)).setPropertyValue("visible",False)
display.getWidget("cav" + str(m) + "real").setPropertyValue("visible",False)
for h in range(1, int(Number) + 1, 1):
x = listfields[h-1]*factor[h-1]
display.getWidget("cav" + str(h)).setValue(x)
beamqdivbya = Qchosen/float(A)
#Here either prints out all contamination or only stable contamination
TESTS = {
"all": lambda a,b,c,d,e: True,
"stable": lambda a,b,c,d,e: float(e)>0
}
test = TESTS[combo]
result = []
for a,b,c,d,e in zip(qdivbya,Qcont,nameiso, A1,abu2):
if test(a,b,c,d,e):
diffqa = abs(beamqdivbya - a )
if diffqa < diffqa0:
diffqaoverqa = float(diffqa)/float(Qchosen)* A
result.append(a)
set_cells(table1, len(result)-1, c, b, d, a, diffqaoverqa, e)
table.addSelectionChangedListener(SelectionListener())
if __name__ == '__main__': main()
Die clickrow-function soll mir je nachdem auf welche Zeile ich in der Tabelle geklickt habe, die Felder angeben. Diese Felder wurden aber fuer die gesamte Tabelle schon in der decision-function berechnet. deswegen waere es ja dumm und unnoetige rechenleistung die rechnung nochmals fuer die spezifische zeile durchzufuehren. ausserdem macht es alles noch unuebersichtlicher, da ich oben schon definiere wie die Felder berechnet werden sollen.
deshalb war meine idee die information aus der decision-function zu zippen und je nachdem auf welche tabellenzeile ich klicke(diese enthalten immer energie, Q und die anzahl der felder die angelegt werden(das bestimmt eindeutig was fuer ein feld angelegt wird.) wird das feld woanders angezeigt.. der haken: es funktioniert nicht. aber nur dieser part funktioniert nicht, denn wenn ich die felder einfach in der funktion berechne und dann eine zeile anklicke, funktioniert das programm tadellos. es aktualisiert ausserdem nicht, wenn ich eine zeile anklicke, es zeigt immer die gleichen felder an, die noch dazu falsch sind.... WIESO? irgendeine idee
vielen dank,
Peter