#!/usr/bin/perl -w use strict; #use CGI qw(:standard); #use CGI::Carp qw(fatalsToBrowser); #my $query = new CGI; print "Content-type: text/html"."\n\n"; print "\n\nMasse Isotopen-Muster\n\n"; print "\n\n

"; my $qs = $ENV{'QUERY_STRING'}; my @conditions = split("&",$qs); my $anzeigen_ab = 1/100; # Anzeigen ab ..% my $Laenge_max = 600; # Pixellaenge des groessten Peak my $scale_faktor = 100; #auf insg. 100% scalieren my $maximal = 5000000; #maximale Kombinationen my $var; # Variable my $val; # Value my $Null_erreicht; my $j;#Zaehler my $i;#Zaehler my $temp; my $temp2; my $temp3; my $temp5; my $temp25; my $temp125; my $temp625; my $temp3125; my $temp15625; my $Kombinationen; my $Berechnungen; my @max; #-Zahl der Isotope Element[Position] my @Kombi; #aktuelle Isotop-Nr [Position] my %Element_Name; my %Element_n; #Anzahl der Isotope my %Element_W; #%-Satz der Isotope z.B. 0.15;0.80;0.05 my %Element_M; #Differenz-Masse zum haefigsten Isotop z.B. -2;0;1 my @Wahrscheinlichkeit; # Wahrscheinlichkeit fuer bestimmte Masse my @Data; my @temp; my @temp2; my @Position_OZ; my %Element_Werte; my $Masse; # aktuelle Masse my $Masse_exakt; my $Wahrscheinlichkeit; # aktuelle Wahrscheinlichktei my $nAtome; # Anzahl aller Atome my $Kontrolle; #Kontrollsumme. Alle Wahrscheinlichkeiten addiert müssen ja 1 ergeben my $max; # findet den hoechsten Peak my $max_M; # Massen-Plus des hoechsten Peaks my $faktor; # Skalierungs-Faktor fuer Grafik my $Laenge; # Laenge des aktuellen Peak my $Hoehe; # Peak-Linien-Breite my $scale = 0; my $letzte_Masse; my $k; my $Formel; my @SF_Formel; my @SF_fertig_Element; my @SF_fertig_n; my @SF_Klammer; my @SF_Klammer_n; my @SF_keys_Elemente; my $SF_Laenge_Formel; my $SF_i; my $SF_j; my $SF_imax; my $SF_Klammernzaehler; my $SF_Element; my $SF_Anzahl; my $SF_Klammer_aktuell; my $SF_Klammer_Nr; my %SF_Element_M; ####### Auswerung: ############ #$SF_Formel = &SF_Auswertung($SF_Formel); my $SF_Formel; #Formel my $SF_Masse; # exakte Masse my $SF_Summenformel; # Summenformel my %SF_Element_n; #Zahl der Elemente foreach (@conditions){ ($var,$val)=split("=",$_); ## Umwandlung von %2F in Leerzeichen u.s.w. $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; if ($var eq "scale"){ $var =~ s/,/\./g; $scale = $val; } if ($var eq "Formel"){ $Formel = $val; } } @conditions=(); print "\nEingabe: $Formel"; SF_Massen(); $SF_Formel = $Formel; $SF_Formel = &SF_Auswertung($SF_Formel); print "\n
Auswertung: $SF_Formel"; print "\n
Summenformel: $SF_Summenformel"; print "\n
Masse: $SF_Masse"; %SF_Element_M=(); @SF_Formel=(); @SF_fertig_Element=(); @SF_fertig_n=(); @SF_Klammer=(); @SF_Klammer_n=(); foreach(@SF_keys_Elemente){ #print "\n
$_ $SF_Element_n{$_}"; $temp=$SF_Element_n{$_}; $temp5=$_."5"; $temp25=$_."25"; $temp125=$_."125"; $temp625=$_."625"; $temp3125=$_."3125"; $temp15625=$_."15625"; if ($temp >= 5 && $temp < 25){ $SF_Element_n{$_}=$temp%5; $SF_Element_n{$temp5}=int($temp/5); } elsif ($temp >= 25 && $temp < 125){ $SF_Element_n{$_}=$temp %5; $SF_Element_n{$temp5}=int($temp/5)-int($temp/25)*5; $SF_Element_n{$temp25}=int($temp/25); } elsif ($temp >= 125 && $temp < 625){ $SF_Element_n{$_}=$temp %5; $SF_Element_n{$temp5}=int($temp/5)-int($temp/25)*5; $SF_Element_n{$temp25}=int($temp/25)-int($temp/125)*5; $SF_Element_n{$temp125}=int($temp/125); } elsif ($temp >= 625 && $temp < 3125){ $SF_Element_n{$_}=$temp %5; $SF_Element_n{$temp5}=int($temp/5)-int($temp/25)*5; $SF_Element_n{$temp25}=int($temp/25)-int($temp/125)*5; $SF_Element_n{$temp125}=int($temp/125)-int($temp/625)*5; $SF_Element_n{$temp625}=int($temp/625); } elsif ($temp >= 3125 && $temp < 15625){ $SF_Element_n{$_}=$temp %5; $SF_Element_n{$temp5}=int($temp/5)-int($temp/25)*5; $SF_Element_n{$temp25}=int($temp/25)-int($temp/125)*5; $SF_Element_n{$temp125}=int($temp/125)-int($temp/625)*5; $SF_Element_n{$temp625}=int($temp/625)-int($temp/3125)*5; $SF_Element_n{$temp3125}=int($temp/3125); } elsif ($temp >= 15625 && $temp < 78125){ $SF_Element_n{$_}=$temp %5; $SF_Element_n{$temp5}=int($temp/5)-int($temp/25)*5; $SF_Element_n{$temp25}=int($temp/25)-int($temp/125)*5; $SF_Element_n{$temp125}=int($temp/125)-int($temp/625)*5; $SF_Element_n{$temp625}=int($temp/625)-int($temp/3125)*5; $SF_Element_n{$temp3125}=int($temp/3125)-int($temp/15625)*5; $SF_Element_n{$temp15625}=int($temp/15625); } else{exit(0);} } @SF_keys_Elemente=keys(%SF_Element_n); open (DATA, "<../massen/isotopen3.txt") or die "Kann Datendatei nicht oeffnen! $!"; @Data =; close DATA; chomp(@Data); for ($i = 0; $i < @Data; $i+=5){ $Element_Name{$Data[$i]}= $Data[$i]; $Element_n{$Data[$i]}= $Data[$i+1]-1; $Element_W{$Data[$i]} = $Data[$i+2]; $Element_M{$Data[$i]}= $Data[$i+3]; } @Data=(); foreach (@SF_keys_Elemente){ if ($SF_Element_n{$_} > 0){ if ($Element_Name{$_} eq ""){ print "\n
$_: Isotopen-Muster noch nicht in Datenbank"; print "\n
Wendet Euch an mich, dass ich $_ ergänzen kann!
"; exit(0); } elsif ($Element_n{$_} == 0){ print "\n
$_ x $SF_Element_n{$_}, kein oder kein nennenswertes Isotopenmuster";} else{ $temp = $Element_n{$_}+1; print "\n
$_ x $SF_Element_n{$_}, $temp Isotope"; for ($j = 1; $j <= $SF_Element_n{$_}; $j++){ push (@max,$Element_n{$_}); push (@Position_OZ,$_); @temp = split (/;/,$Element_W{$_}); foreach (@temp){$_=$_/100;} @temp2 = split (/;/,$Element_M{$_}); for ($k = 0; $k <= $Element_n{$_}; $k++){ $temp = "Z".$_."W".$k; $Element_Werte{$temp} =$temp[$k]; $temp =~ s/W/M/g; $Element_Werte{$temp} =$temp2[$k]; } } } } } %SF_Element_n=(); %Element_Name=(); %Element_n=(); %Element_W=(); %Element_M=(); @temp=(); @temp2=(); $nAtome = @max; $nAtome--; if ($nAtome < 1){ push (@max,0); push (@Position_OZ,"nix"); $Element_Werte{ZnixW0}=1; $Element_Werte{ZnixM0}=0; } $nAtome = @max; $nAtome--; $Kombinationen = 1; foreach (@max){$Kombinationen = $Kombinationen*($_+1);} print "\n
$Kombinationen Kombinationen"; $Berechnungen = $Kombinationen*($nAtome+1); print ", $Berechnungen Rechenschritte"; print "\n
Muster: "; foreach(@max){ $temp=$_+1; print "$temp.";} #for ($i=0;$i<@max;$i++){print "$Position_OZ[$i]:$max[$i] ";} if ($Kombinationen > $maximal){ print "\n

Der Server ist für mehr als $maximal Kombinationen zu langsam:-(!

\n\n\n"; exit(0);} @Kombi = @max; $Kombi[0]++; for($k=1;$k<=$Kombinationen;$k++){ $Kombi[0]--; if($Kombi[0]<0){ $Kombi[0]=$max[0]; $Kombi[1]--; for($i=1;$i<$nAtome;$i++){ if($Kombi[$i]<0){ $Kombi[$i]=$max[$i]; $Kombi[$i+1]--; } } } $Wahrscheinlichkeit=1; $Masse=0; for($j=0;$j<=$nAtome;$j++){ $temp="Z".$Position_OZ[$j]."W".$Kombi[$j]; $Wahrscheinlichkeit=$Wahrscheinlichkeit*$Element_Werte{$temp}; $temp=~s/W/M/g; $Masse=$Masse+$Element_Werte{$temp}; } $Masse=$Masse+100; if($Masse<0){$Masse=0;} $Wahrscheinlichkeit[$Masse]=$Wahrscheinlichkeit[$Masse]+$Wahrscheinlichkeit; } ################ Ausgabe: ################## print "\n - "; print @Kombi; print " ist erreicht

\n
";#\n

Ergebnis:

\n


$Kontrolle = -1; $max = 0.000000001; $letzte_Masse = 0; for ($i = 0; $i < @Wahrscheinlichkeit; $i++){ $Kontrolle = $Kontrolle +$Wahrscheinlichkeit[$i]; if ($Wahrscheinlichkeit[$i] > $max){ $max=$Wahrscheinlichkeit[$i]; $max_M=$i; } } $faktor = $Laenge_max/$max; if ($scale != 0){$scale_faktor = $scale/$max;} $Masse = int($SF_Masse*10+0.5)/10; print "\n"; print "\n"; print "\n"; $max_M=$max_M-100; if ($max_M != 0){ $Masse=$Masse+$max_M; print "\n"; } print "\n\n\n\n\n"; for ($i = 0; $i < @Wahrscheinlichkeit; $i++){ if ($Wahrscheinlichkeit[$i] > $anzeigen_ab || $i == 100){ $temp = $i-100; if ($temp <0){$temp = "$temp";} else{$temp = "+".$temp;} $temp2 = int($Wahrscheinlichkeit[$i]*$scale_faktor*10+0.5)/10; $Laenge = int($Wahrscheinlichkeit[$i]*$faktor+1); if ($letzte_Masse > 0 && ($i-$letzte_Masse) > 1){ for ($j = $letzte_Masse+1; $j < $i; $j++){ print "\n\n\n\n\n"; } } print "\n"; print "\n"; print "\n"; $letzte_Masse = $i; } } $Kontrolle = int($Kontrolle*10000+0.5)/100; print "\n\n\n\n\n"; print "\n"; print "\n
$Formel = $SF_Summenformel
M+0 = $Masse ($SF_Masse)
M-max = M+$max_M = $Masse
   
  |
"; if ($Laenge >= ($Laenge_max*0.99) || $i == 100){print "";} print "\nM$temp: $temp2"; if ($scale == 0 || $scale == 100){print "%";} print ""; print "\n "; $Hoehe = 2; if ($Laenge >= ($Laenge_max*0.99) || $i == 100){$Hoehe = 4;} print "\n|"; print "\n
   
Ges.-Abweichung: $Kontrolle%
"; print "\n
"; print "\n

www.pfeilsticker.net

"; print "\n\n\n"; exit(0); ################################################ ################################################ sub SF_Auswertung{ $_[0] =~ s/\[/\(/g; $_[0] =~ s/\{/\(/g; $_[0] =~ s/\]/\)/g; $_[0] =~ s/\}/\)/g; $_[0] =~ s/Ph/\(C6H5\)/g; $_[0] =~ s/Cp/\(C5H5\)/g; $_[0] =~ s/Met?/\(CH3\)/g; $_[0] =~ s/Et/\(C2H5\)/g; $_[0] =~ s/ac/\(COCH3\)/g; $_[0] =~ s/t-?But/\(C\(CH3\)3\)/g; $_[0] =~ s/Piv/\(COOC\(CH3\)3\)/g; @SF_Klammer_n=(); @SF_Klammer=(); @SF_fertig_Element=(); @SF_fertig_n=(); #@SF_Element_n=(); %SF_Element_n=(); $SF_Summenformel=""; $SF_Klammer_Nr=1; $SF_Masse=0; $SF_Klammer_n[0]=1; $SF_Klammer[0]=$_[0]; $SF_Klammer_n[1]=1; $SF_Klammer[1]=""; for($SF_Klammer_aktuell=0;$SF_Klammer_aktuell<@SF_Klammer_n;$SF_Klammer_aktuell++){ $SF_Laenge_Formel = length($SF_Klammer[$SF_Klammer_aktuell]); @SF_Formel=(); for($SF_i=0; $SF_i<$SF_Laenge_Formel; $SF_i++){ $SF_Formel[$SF_i] = substr($SF_Klammer[$SF_Klammer_aktuell],$SF_i,1);} $SF_Klammernzaehler=0; $SF_imax = @SF_Formel-1; push(@SF_Formel,"+"); push(@SF_Formel,"+"); push(@SF_Formel,"+"); for($SF_i=0; $SF_i<=$SF_imax; $SF_i++){ ######### Klammer behandeln #################### if ($SF_Formel[$SF_i] eq "("){$SF_Klammernzaehler++;} if ($SF_Formel[$SF_i] eq ")"){ $SF_Klammernzaehler--; if($SF_Klammernzaehler <= 0){ $SF_Klammer_n[$SF_Klammer_Nr]=1; if ($SF_Formel[$SF_i+1] =~ /\d/){ $SF_Klammer_n[$SF_Klammer_Nr]=""; do{$SF_i++; $SF_Klammer_n[$SF_Klammer_Nr]=$SF_Klammer_n[$SF_Klammer_Nr].$SF_Formel[$SF_i]; }until($SF_Formel[$SF_i+1] =~ /\D/); } $SF_Klammer_n[$SF_Klammer_Nr]=$SF_Klammer_n[$SF_Klammer_Nr]* $SF_Klammer_n[$SF_Klammer_aktuell]; $SF_Klammer_Nr++; } if ($SF_Klammernzaehler < 0){ print "\n

Abbruch-Fehler: mehr Klammern geschlossen als geöffnet!

\n\n\n"; exit(0);} } if ($SF_Klammernzaehler > 0){ if($SF_Klammernzaehler > 1 || $SF_Formel[$SF_i] ne "("){$SF_Klammer[$SF_Klammer_Nr]=$SF_Klammer[$SF_Klammer_Nr].$SF_Formel[$SF_i];} } ########### nicht in Klammer behandeln ################### if ($SF_Klammernzaehler == 0 && $SF_Formel[$SF_i] =~ /[A-Z]/){ $SF_Element=$SF_Formel[$SF_i]; if($SF_Formel[$SF_i+1] =~ /[a-z]/){ $SF_Element=$SF_Element.$SF_Formel[$SF_i+1]; $SF_i++; } if($SF_Formel[$SF_i+1] =~ /[a-z]/){ $SF_Element=$SF_Element.$SF_Formel[$SF_i+1]; $SF_i++; } push(@SF_fertig_Element,$SF_Element); $SF_Anzahl=1; if ($SF_Formel[$SF_i+1] =~ /\d/){ $SF_Anzahl=""; do{$SF_i++; $SF_Anzahl=$SF_Anzahl.$SF_Formel[$SF_i]; }until($SF_Formel[$SF_i+1] =~ /\D/); } $SF_Anzahl=$SF_Anzahl*$SF_Klammer_n[$SF_Klammer_aktuell]; push(@SF_fertig_n,$SF_Anzahl); } } $SF_Klammer_n[$SF_Klammer_aktuell]=0; $SF_Klammer[$SF_Klammer_aktuell]=""; } for($SF_j=0;$SF_j<@SF_fertig_Element;$SF_j++){ $SF_Element_n{$SF_fertig_Element[$SF_j]}=$SF_Element_n{$SF_fertig_Element[$SF_j]}+$SF_fertig_n[$SF_j]; } @SF_keys_Elemente = keys(%SF_Element_n); foreach(@SF_keys_Elemente){ if($SF_Element_M{$_}<=0){ print"\n

Element $_ nicht in Datenbank!

"; exit(0); } $SF_Masse=$SF_Masse+$SF_Element_n{$_}* $SF_Element_M{$_}; $SF_Summenformel=$SF_Summenformel.$_."".$SF_Element_n{$_}." "; } return $_[0];} ###################### sub SF_Massen{ $SF_Element_M{H}=1.007825037; $SF_Element_M{He}=4.00260325; $SF_Element_M{Li}=7.0160045; $SF_Element_M{Be}=9.0121825; $SF_Element_M{B}=11.0093053; $SF_Element_M{C}=12; $SF_Element_M{N}=14.003074008; $SF_Element_M{O}=15.99491464; $SF_Element_M{F}=18.99840325; $SF_Element_M{Ne}=19.9924391; $SF_Element_M{Na}=22.9897697; $SF_Element_M{Mg}=23.985045; $SF_Element_M{Al}=26.9815413; $SF_Element_M{Si}=27.9769284; $SF_Element_M{P}=30.9737634; $SF_Element_M{S}=31.9720718; $SF_Element_M{Cl}=34.968852729; $SF_Element_M{Ar}=39.9623831; $SF_Element_M{K}=38.9637079; $SF_Element_M{Ca}=39.9625907; $SF_Element_M{Sc}=44.9559136; $SF_Element_M{Ti}=47.9479467; $SF_Element_M{V}=50.9439625; $SF_Element_M{Cr}=51.9405097; $SF_Element_M{Mn}=54.9380463; $SF_Element_M{Fe}=55.9349393; $SF_Element_M{Co}=58.9331978; $SF_Element_M{Ni}=57.9353471; $SF_Element_M{Cu}=62.9295992; $SF_Element_M{Zn}=63.9291454; $SF_Element_M{Ga}=68.9255809; $SF_Element_M{Ge}=73.9211788; $SF_Element_M{As}=74.9215955; $SF_Element_M{Se}=79.9165205; $SF_Element_M{Br}=78.9183361; $SF_Element_M{Kr}=83.9115064; $SF_Element_M{Rb}=84.9117996; $SF_Element_M{Sr}=87.9056249; $SF_Element_M{Y}=88.905856; $SF_Element_M{Zr}=89.904708; $SF_Element_M{Nb}=92.906378; $SF_Element_M{Mo}=97.905405; $SF_Element_M{Tc}=96.90637; $SF_Element_M{Ru}=101.9043475; $SF_Element_M{Rh}=102.905503; $SF_Element_M{Pd}=105.903475; $SF_Element_M{Ag}=106.905095; $SF_Element_M{Cd}=113.9033607; $SF_Element_M{In}=114.903875; $SF_Element_M{Sn}=119.902199; $SF_Element_M{Sb}=120.9038237; $SF_Element_M{Te}=129.906229; $SF_Element_M{I}=126.904477; $SF_Element_M{Xe}=131.904148; $SF_Element_M{Cs}=132.905433; $SF_Element_M{Ba}=137.905236; $SF_Element_M{La}=138.906355; $SF_Element_M{Ce}=139.905442; $SF_Element_M{Pr}=140.907657; $SF_Element_M{Nd}=141.907731; $SF_Element_M{Pm}=145; $SF_Element_M{Sm}=151.919741; $SF_Element_M{Eu}=152.921243; $SF_Element_M{Gd}=157.924111; $SF_Element_M{Tb}=158.92535; $SF_Element_M{Dy}=163.929183; $SF_Element_M{Ho}=164.930332; $SF_Element_M{Er}=165.930305; $SF_Element_M{Tm}=168.934225; $SF_Element_M{Yb}=173.938873; $SF_Element_M{Lu}=174.940785; $SF_Element_M{Hf}=179.946561; $SF_Element_M{Ta}=180.948014; $SF_Element_M{W}=183.950953; $SF_Element_M{Re}=186.955765; $SF_Element_M{Os}=191.961487; $SF_Element_M{Ir}=192.962942; $SF_Element_M{Pt}=194.964785; $SF_Element_M{Au}=196.96656; $SF_Element_M{Hg}=201.970632; $SF_Element_M{Tl}=204.97441; $SF_Element_M{Pb}=207.976641; $SF_Element_M{Bi}=208.980388; $SF_Element_M{Po}=209; $SF_Element_M{At}=210; $SF_Element_M{Rn}=222; $SF_Element_M{Fr}=223; $SF_Element_M{Ra}=226; $SF_Element_M{Ac}=227; $SF_Element_M{Th}=232.03805381; $SF_Element_M{Pa}=231; $SF_Element_M{U}=238.05078578; $SF_Element_M{Np}=237.0482; $SF_Element_M{Pu}=244; $SF_Element_M{Am}=243; $SF_Element_M{Cm}=247; $SF_Element_M{Bk}=247; $SF_Element_M{Cf}=251; $SF_Element_M{Es}=252; $SF_Element_M{Fm}=257; $SF_Element_M{Md}=258; $SF_Element_M{No}=259; $SF_Element_M{Lr}=260; $SF_Element_M{Rf}=0; $SF_Element_M{Ha}=0; $SF_Element_M{Unh}=0; $SF_Element_M{Uns}=0; $SF_Element_M{Uno}=0; $SF_Element_M{Une}=0; return;} #######################