andere Reaktion, obwohl scheinbar gleich

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
peter99
User
Beiträge: 84
Registriert: Samstag 3. August 2013, 21:32

Der code liefert mir keine Errormeldung also aufgepasst. Vielen Dank im Vorraus fuers Helfen, muss bis morgen fertig werden.

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
lunar

@peter99 Erwartest Du tatsächlich, dass sich das jemand antut? Wir können den Quelltext in Ermangelung der Software und aufgrund der Kürzungen ja nicht einmal ausführen...
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Ideen warum etwas falsch läuft, habe ich viele:
- die Listen, die in globalen Variablen stecken werden irgendwo überschrieben
- globale und lokale Variablen mit selbem Namen werden durchmischt
- wegen fehlender Trennung von Berechnung- und Anzeigefunktionen weißt Du nicht, ob das Angezeigte auch zum Berechneten passt.
- Funktionen haben zu viele Aufgaben und hängen von zu vielen Bedingungen ab
- …
Antworten