diff options
Diffstat (limited to 'epostunit.pas')
-rw-r--r-- | epostunit.pas | 128 |
1 files changed, 88 insertions, 40 deletions
diff --git a/epostunit.pas b/epostunit.pas index eba3ee1..a4e797b 100644 --- a/epostunit.pas +++ b/epostunit.pas @@ -3944,9 +3944,9 @@ end; function tWerte.faktorisiere(sT: boolean; f: tMyStringList): boolean; var bekannteBefehle: tMyStringList; - Zeit,tmpE: extended; + Zeit,tmpE,nullteSpektrometerordnung: extended; anzahl,i,j: longint; - s,aDatei,iDatei: string; + s,aDatei,iDatei,tDatei: string; pDatei: textFile; lineOut,tmpEA: tExtendedArray; maxima,maxima2: tLongintArray; @@ -3959,22 +3959,43 @@ begin gibAus('faktorisiere ...',3); bekannteBefehle:=tMyStringList.create; Zeit:=now; - anzahl:=1; + anzahl:=-1; aDatei:=''; iDatei:=''; + tDatei:=''; residuenBerechnen:=false; auszenHorizontal:=false; + nullteSpektrometerordnung:=nan; repeat if not f.metaReadln(s,true) then begin gibAus('Unerwartetes Dateiende!',3); exit; end; bekannteBefehle.clear; - if istDasBefehl('Ende',s,bekannteBefehle,false) then break; + if istDasBefehl('Ende',s,bekannteBefehle,false) then + break; if istDasBefehl('Anzahl:',s,bekannteBefehle,true) then begin anzahl:=round(exprToFloat(sT,s)); continue; end; + if istDasBefehl('nullte Spektrometerordnung:',s,bekannteBefehle,true) then begin + if not isNaN(nullteSpektrometerordnung) then begin + gibAus('Habe bereits eine nullte Spektrometerordnung beim Faktorisieren!',3); + bekannteBefehle.free; + exit; + end; + nullteSpektrometerordnung:=exprToFloat(sT,s); + continue; + end; + if istDasBefehl('Topf-Datei:',s,bekannteBefehle,true) then begin + if tDatei<>'' then begin + gibAus('Habe bereits eine Datei mit den Töpfen beim Faktorisieren!',3); + bekannteBefehle.free; + exit; + end; + tDatei:=s; + continue; + end; if istDasBefehl('Residuen berechnen',s,bekannteBefehle,false) then begin residuenBerechnen:=true; continue; @@ -4021,6 +4042,11 @@ begin exit; end; + if (anzahl=-1) and (tDatei='') then begin + gibAus('Keine Anzahl und keine Datei mit Töpfen beim Faktorisieren!',3); + exit; + end; + if sT then begin result:=true; exit; @@ -4035,43 +4061,65 @@ begin lineOut:=eWerte.integriereZuLineOut(not auszenHorizontal,true); end{of case}; - setLength(maxima,0); - i:=0; - for j:=0 to length(lineOut)-1 do - if ((j=0) or (lineOut[j]>lineOut[j-1])) and - ((j=length(lineOut)-1) or (lineOut[j]>lineOut[j+1])) then begin - if length(maxima)<=i then - setLength(maxima,i+128); - maxima[i]:=j; - inc(i); + if anzahl<>-1 then begin + setLength(maxima,0); + i:=0; + for j:=0 to length(lineOut)-1 do + if ((j=0) or (lineOut[j]>lineOut[j-1])) and + ((j=length(lineOut)-1) or (lineOut[j]>lineOut[j+1])) then begin + if length(maxima)<=i then + setLength(maxima,i+128); + maxima[i]:=j; + inc(i); + end; + setLength(maxima,i); + + sortiereNachDominanz(maxima,lineOut,nullteSpektrometerordnung); + setLength(maxima,anzahl); + + setLength(maxima2,anzahl); + setLength(tmpEA,anzahl); + for i:=0 to length(tmpEA)-1 do begin + tmpEA[i]:=maxima[i]; + maxima2[i]:=maxima[i]; + maxima[i]:=i; + end; + sortiereNachWert(maxima,tmpEA,false); + setLength(tmpEA,0); + setLength(toepfe,anzahl); + for i:=0 to length(toepfe)-1 do begin + if i>0 then + toepfe[length(toepfe)-1-i]['y']:=(maxima2[maxima[i-1]]+maxima2[maxima[i]]) div 2 + else if auszenHorizontal then + toepfe[length(toepfe)-1-i]['y']:=_xSteps-1 + else + toepfe[length(toepfe)-1-i]['y']:=_tSiz-1; + if i<length(toepfe)-1 then + toepfe[length(toepfe)-1-i]['x']:=(maxima2[maxima[i]]+maxima2[maxima[i+1]]) div 2 + 1 + else + toepfe[length(toepfe)-1-i]['x']:=0; + end; + if tDatei<>'' then begin + assignFile(pDatei,tDatei); + rewrite(pDatei); + writeln(pDatei,length(toepfe)); + for i:=0 to length(toepfe)-1 do + writeln(pDatei,tIntPointToStr(toepfe[i])); + closeFile(pDatei); + end; + end + else + if tDatei<>'' then begin + assignFile(pDatei,tDatei); + reset(pDatei); + readln(pDatei,i); + setLength(toepfe,i); + for i:=0 to length(toepfe)-1 do begin + readln(pDatei,s); + toepfe[i]:=strToTIntPoint(s); + end; + closeFile(pDatei); end; - setLength(maxima,i); - - sortiereNachDominanz(maxima,lineOut); - setLength(maxima,anzahl); - - setLength(maxima2,anzahl); - setLength(tmpEA,anzahl); - for i:=0 to length(tmpEA)-1 do begin - tmpEA[i]:=maxima[i]; - maxima2[i]:=maxima[i]; - maxima[i]:=i; - end; - sortiereNachWert(maxima,tmpEA,false); - setLength(tmpEA,0); - setLength(toepfe,anzahl); - for i:=0 to length(toepfe)-1 do begin - if i>0 then - toepfe[length(toepfe)-1-i]['y']:=(maxima2[maxima[i-1]]+maxima2[maxima[i]]) div 2 - else if auszenHorizontal then - toepfe[length(toepfe)-1-i]['y']:=_xSteps-1 - else - toepfe[length(toepfe)-1-i]['y']:=_tSiz-1; - if i<length(toepfe)-1 then - toepfe[length(toepfe)-1-i]['x']:=(maxima2[maxima[i]]+maxima2[maxima[i+1]]) div 2 + 1 - else - toepfe[length(toepfe)-1-i]['x']:=0; - end; case genauigkeit of gSingle: |