Als glatte Enden (Blunt ends) werden Enden eines doppelsträngigen DNA-Moleküls bezeichnet an dem keine ungepaarte Baase eines Stranges über den anderen hinausreicht. Es gibt Restriktionsendonucleasen, die DNA-Moleküle so schneiden, dass zwei glatte Enden entstehen.
Durchgänge DNA-Sequenz die aus überlappenden Fragmenten ermittelt wurde. Dies geschieht bei größeren Sequenzierungsprojekten rechnergestützt.
DNA-Einzelstränge die komplementär zueinander sind, neigen zur spontanen Ausbildung eines Doppelstrang-Moleküls unter Bildung von Wasserstoffbrückenbindungen. Dieser Vorgang wird auch als DNA-Hybridisierung bezeichnet und ist temperaturabhängig.
DNA-Marker sind Orte in einem Genom die in einer Population eine gewisse Varianz aufweisen. Dazu gehören RFLPs, VNTRs, STRs, SNPs und CNVs. Dies kann zur Erstellung von Genkarten oder zur Gendiagnose genutzt werden.
DNA-Sonden sind einzelsträngige DNA-Moleküle mit bekannter Sequenz die radioaktiv (z.B. mit 32P) oder enzymatisch markiert sind. Aufgrund ihrer Fähigkeit mit komplementären DNA-Sequenzen zu hybridisieren, kann eine Sequenz auf einem DNA-Molekül mithilfe einer DNA-Sonde identifiziert werden. Anwendungsbeispiele:
Sind Enden einer DNA-Sequenz die aus einer einzigen Art von Nukleotiden aufgebaut sind. Beispiel dafür ist der Poly(A)-Schwanz der in eukaryotischen Zellen im Zuge der posttranslationalen Modifikation an das 3’-Ender der prä-mRNA synthetisiert wird. In-vitro können Homopolymerschwänze an DNA-Doppelstränge mit glatten Enden angefügt werden was zur Bildung von klebrigen enden führ.
Ermöglicht die Lokalisierung von DNA-Sequenzen auf Chromosomen. Die Chromosomale DNA wird denaturiert so dass die komplementären Stränge aufschmelzen. Dies ermöglicht einer DNA-Sonde an komplementären Sequenzen zu hybridisieren und diese so nachhaltig zu markieren. Die Lokalisierung ist dann anhand der Fluoreszenzeigenschaften der Sonde möglich.
Auf dem Lamda-Phagen basierende Vektoren können in Substitutions- und Insertionsvektoren unterteilt werden. Insertionsvektoren ermöglichen das einbringen von zusätzlicher fremd-DNA an einer einzigen Schnittstelle. So können allerdings nur geringe mengen an DNA in den Vektro eingebaut werden (bis 5 kb). Substitutionsvektoren besitzen zwei Schnittstellen für Restriktionsenzyme, die ein für die Replikation unwichtiges Stück herausschneiden. Dieses entfernte Stück kann durch eine wesentlich größere Menge an DNA (bis zu 24 kb) ersetzt bzw. substituiert werden.
Kilobase ist eine Einheit für die Länge von DNA Sequenzen. Sie gibt an aus wie vielen Basen ein DNA-Molekül besteht. Eine Kilobase (kb) entspricht dabei 1000 Nukleotiden/Basen.
Als klebrige Enden (engl.: sticky ends) bezeichnet man einsträngige Fortsätze am Ende eines doppelsträngigen DNA-Moleküls. Zwei komplementäre Enden (wie sie beispielsweise bei der Behandlung mit Restriktionsendonukleasen entstehen können) neigen dazu zu hybridisieren und somit einen durchgehenden Doppelstrang zu bilden, daher sticky ends. Es wird allerdings noch eine Ligase benötigt um die enden der Einzelstränge kovalent zu verknüpfen.
Als Klonierung bezeichnet man den Vorgang, bei dem eine beliebige DNA-Sequenz in einen Vektor (z.B. Plasmid, Phage) eingebracht wird. Dies geschieht meist um mit Hilfe des erstellten Vektors ein Transgen in einen Organismus einzuschleusen.
Enzymatische Verknüpfung des 3’-Hydroxy-Endes eines Nukleotids mit dem 5’-Phospat-Ende eines anderen Nukleotids. Nach der Hybridisierung von klebrigen Enden eines Vektor-Moleküls mit einem zu klonierenden Gen wird beispielsweise Ligase benötigt um die beiden entstandenen Lücken kovalent zu schließen (Ligation).
Linker sind DNA Fragmente, die an einen DNA-Doppelstrang mit glatten Enden angefügt werden können um so klebrige Enden zu erzeugen. Sie bestehen aus kurzen bekannten Sequenzen mit glatten Enden sowie einer Schnittstelle für ein Restriktionsenzym. Nach dem anfügen der Linker und der Behandlung mit dem entsprechenden Restriktionsenzym ergeben sie klebrig Enden.
Adapter sind kurze DNA-Fragmente mit bekannter Sequenz, die ein klebriges und ein glattes Ende besitzen. Sie werden an DNA-Sequenzen ligiert um sie mit definierten klebrigen Enden auszustatten. Durch die Modifikation der klebrigen enden der Adapter kann verhindert werden, dass sie nach einer dimerisierung durch Ligase verknüpft werden. Dies verhindert das erneute entstehen von glatten Enden durch dimerisierte Adapter.
Kurze, nicht-codierende DNA-Sequenzen die sich oft in dem Genom eines Organismus wiederholen. Sie können Ursache für Restriktionslängen Polymorphismen (RFLP) sein.
Plasmide sind kleine, zirkuläre DNA-Moleküle die sich unabhängig von Genom einer Bakterienzelle replizieren können. Sie kommen meist in mehreren Kopien vor und eignen sich daher als Vektoren für die Klonierung.
Kurze DNA oder RNA-Oligonukleotide mit bekannter Sequenz. Sie werden benötigt um nach einer Hybridisierung mit einem DNA-Fragment als Replikationsursprung für den DNA-Polymerase-Komplex zu dienen. Die Polymerase-Kettenreaktion (PCR) ist z.B. auf das Vorhandensein von komplementären Primern zur Amplifizierung von DNA angewiesen.
Repetetive DNA Elemente sind nicht-codierende Sequenzen die sich im Genom mehrfach hintereinander wiederholen. Zu repetetiven Elementen gehören variable number tandem repeats (VNTR) und short tandem repeats (STR). Sie können als DNA-Marker funktionieren oder zur Erstellung eines genetischen Fingerabdrucks verwendet werden.
Der Replikationsstartpunkt oder origin of replication (ori) ist eine Sequenz in einem Genom, die als Startpunkt für die Replikation eines DNA-Moleküls dient. Vektoren wie z.B. Plasmide oder Phagen verfügen über einen ori um Ihre Replikation in der Wirtszelle sicher zu stellen.
Der Verdau von DNA-Sequenzen mit einem oder mehreren unterschiedlichen Restriktionsenzymen resultiert in einem charakteristischen Gemisch von DNA-Fragmenten unterschiedlicher Länge. Durch Mutationen, die Restriktionsstellen verschieben oder Erkennungssequenzen für Restriktionsenzyme verändern kann dieses Fragment-Gemisch von einer Vergleichsprobe abweichen. Dies kann zur Erstellung von genetischen Fingerabdrücken oder zur Aufklärung von Verwandtschaftsbeziehungen genutzt werden.
Southern Blot ist ein Verfahren zum Nachweis von DNA-Sequenzen in einem Gemisch von DNA.
Ablauf:
Um schnell und sicher die Eingabe eines TEdit Feldes auszuwerten kann man folgende Methoden zentral ablegen und global verwenden. Es wird dafür gesorgt, dass nur gültige Integer bzw. Float Werte akzeptiert werden. Die Methoden liefern True zurück, wenn die Eingabe gültig ist. In Value wird das Ergebnis geschrieben, falls die Umwandlung erfolgreich war. Falls ein Fehler auftritt wird eine Warnung angezeigt und der Rückgabe Wert ist False.
function ReadFloatFromEdit( var value : double; Edit : TEdit ) : boolean;
begin
Result := True;
try
value := StrToFloat( Edit.Text );
except
Result := False;
MessageDlg( '"' + Edit.Text + '" ist keine gültige Eingabe.', mtWarning, [ mbOK ], 0 );
end;
end;
function ReadIntFromEdit( var value : integer; Edit : TEdit ) : boolean;
begin
Result := True;
try
value := StrToInt( Edit.Text );
except
Result := False;
MessageDlg( '"' + Edit.Text + '" ist keine gültige Eingabe.', mtWarning, [ mbOK ], 0 );
end;
end;
Ein Beispiel Aufruf könnte folgendermaßen aussehen:
...
var
tolerance : double;
begin
if not ReadFloatFromEdit( tolerance, Edit1 ) then Exit;
...
Hier der Scilab Code zum plotten von Exponentiellen Wachstums- bzw. Zerfallsprozessen [y=x0*e^(x*a)] mit der dazugehörigen Trajektorie.
clf;
// Anfangsparameter
x0 = -4;
a = -0.05;
// Beschriftung
labelStr = "(a=" + string(a) + " x0=" + string(x0) + ")";
// x(t)
y=x0*%e^(x*a);
// x'(t)
ydot = x0*a*%e^(x*a);
// oberer graph, x(t) gegen t
subplot(2,1,1);
plot(x, y );
set( gca(),"grid",[1 1]);
xtitle( "Zeitverlauf " + labelStr, "t", "x(t)");
// unterer graph, x(t) gegen x'(t)
subplot(2,1,2);
plot(y, ydot );
set( gca(),"grid",[1 1]);
xtitle( "Trajektorie " + labelStr, "x(t)", "x''(t)" );
Vorweg: JavaScript ist sicherlich nicht die erste Wahl für die Implementierung von genetischen Algorithmen ;- )
Aufgabe: Bestimmen Sie die Nullstelle der Funktion f(x) = e^x − tan(x) im Intervall [0, 1.5] mit dem Mutations-Selektions-Verfahren mit Zufallszahlen in [0, 10000] und einer maximalen Änderung des Arguments um 0.05. Berechnen Sie 5 Iterationen.
>> Skript startenGenetischer Algorithmus der per Mutation und Crossing over die Parameter für eine Funktion findet (f(x1,x2,x3,x4,...)=|x1-x2| + |x2-x3| + |x3-x4| + ...; Fitnessfunktion: F(x1,x2,x3,x4,..) = 0
>> Skript startenGenetischer Algorithmus der per Mutation und Crossing Over diskrete Stützstellen an eine Funktion anpasst: (f(x) = e^x - tan(x); Fitnessfunktion: F(x1,x2,..) = (e^x1-tan(x1))^2 + (e^x2-tan(x2))^2 + ... ) = 0
>> Skript startenInfo: An den Quelltext gelangt man jeweils per rechts klick.
Vortrag über "The K+ channel gene, Kcnb1: genomic structure and characterization of its 5‘-regulatory region as part of an overlapping gene group", Autoren: Karim Roder and Gideon Koren.
Ein Vortrag über SBML (System Biology Markup Language) für das Fach Gsim (Graphische Simulation)
Die TStringGrid Komponente stellt keine Möglichkeit zur Verfügung um Spalten oder Zeilen mitten im Grid zu löschen. Folgende Methode ermöglicht das löschen von Spalten:
function DeleteCol( Grid : TStringGrid; Col : Integer ) : boolean;
var
I, j : Integer;
begin
Result := False;
if ( Col < 0 ) or ( Col >= Grid.ColCount ) then Exit;
for I := Col to Grid.ColCount - 2 do
for J := 0 to Grid.RowCount - 1 do
Grid.Cells[ I, J ] := Grid.Cells[ I + 1, J ];
Grid.ColCount := Grid.ColCount - 1;
Result := True;
end;
Eine Mögliche Anwendung wäre zum Beispiel das Löschen aller markierten Spalten in einem StringGrid:
procedure TForm1.Spaltelschen1Click(Sender: TObject);
var
I, left, right: integer;
begin
left := StringGrid.Selection.left;
right := StringGrid.Selection.right;
for I := 0 to right - left do
DeleteCol( StringGrid, left );
end;
Um eine neue leere Spalte in ein StringGrid einzufügen hilft folgende Funktion weiter:
function InsertCol( Grid : TStringGrid; Col : Integer ) : boolean;
var
I, j : Integer;
begin
Result := False;
if ( Col < 0 ) or ( Col >= Grid.ColCount ) then Exit;
Grid.ColCount := Grid.ColCount + 1;
for I := Grid.ColCount - 1 downto Col + 1 do
for J := 0 to Grid.RowCount - 1 do
if I <> Col + 1 then
Grid.Cells[ I, J ] := Grid.Cells[ I - 1, J ]
else
Grid.Cells[ I, J ] := '';
Result := True;
end;
Wenn man eine intelligente Methode schreiben möchte um den Inhalt einer TStringgrid Komponente zu aktuallisieren hilft einem diese Komponente nicht viel weiter. Eine Nütliche Funktion ist zum Beispeil das Auffinden einer leeren Spalte um in diese dann neuen Inhalt zu schreiben. Folgende Funktion ermittelt die erste auffindbare leere Spalte in einem StringGrid. Wenn keine leere Spalte gefunden werden kann gibt sie -1 zurück.
function FindEmptyCol( Grid : TStringGrid ) : integer;
var
I, J: Integer;
begin
Result := - 1;
for I := 0 to Grid.ColCount - 1 do
for J := 0 to Grid.RowCount - 1 do
begin
if Grid.Cells[ I, J ] <> '' then break;
if J = Grid.RowCount - 1 then
begin
Result := I;
Exit;
end;
end;
end;
Aufgabe:
Zeichnen Sie ein Petri-Netz, das folgende Aufgabenstellung modelliert:
In einer Fabrikhalle steht ein vollautomatisch arbeitender Aufzug für Paletten. Die Paletten werden vom Erdgeschoss in den ersten Stock befördert. Im Erdgeschoss befindet sich ein Förderband, das jeweils 1 Palette in den Aufzug hinein befördern kann. Ebenso befindet sich dort ein Roboter, der eine neue Palette auf dieses Förderband setzt, sofern es nicht (mehr) mit einer Palette belegt ist. Die Fördereinrichtungen des ersten Stocks brauchen Sie nicht zu modellieren.
Der Roboter hat die folgende Zustände: abgabebereit, Abgabe findet statt, Palette ist abgegeben. Das Förderband ist entweder ein- oder ausgeschaltet. Der Aufzug befindet sich entweder oben oder unten, oder er ist von unten nach oben bzw. von oben nach unten unterwegs.
Ihr Petri-Netz soll so einfach wie möglich sein (unnötig komplizierte Lösungen geben Punktabzug) und trotzdem mindestens die genannten Zustände enthalten. Die Parallelität darf nicht unnötig eingeschränkt werden! Beispielsweise kann der Roboter bereits eine neue Palette aufsetzen, während der Aufzug nach oben fährt. Achten Sie darauf, dass kein Crash passieren kann. Beispielsweise darf das Förderband nur laufen, wenn sich der Aufzug unten befindet. Der Aufzug darf nur in bestimmten Fällen starten, und so weiter. Sind eventuell weitere Zustände notwendig? Zeichnen Sie die Anfangsmarkierung so ein, dass sie einer Situation entspricht, in der sich noch keine Palette im System befindet.
Lösung:
Petrinetz zum öffnen und schließen eines Fensters
Petrinetz für das Aufschließen einer Tür
Verschiedene Beispiele für Nomenklaturen des Hexans, Hexens und Hexins
Unter der URL Maxanim.com findet man eine vielzahl an Animationen zu Themen rund um die Biologie.
Wer also in Farbe und Ton erzählt bekommen möchte, wie genau man cDNA macht und warum überhaupt oder wie exakt eine PCR oder RFLP abläuft findet hier die passenden Animationen.
Es gibt generell zwei Möglichkeiten eine Gleitkommazahl in eine ganze Zahl umzuwandeln. Man kann entweder runden oder einfach die Nachkommastellen abschneiden, also casten.
Wenn man in Delphi einen Double Wert in einen Integer Wert casten möchte könnte man auf die Idee kommen das folgendermaßen zu tun:
...
var
int : Integer;
dbl : Double;
begin
int := Integer( dbl );
...
Das wird der Compiler aber nicht durchgehen lassen, stattdessen funktioniert folgender Code
...
var
int : Integer;
dbl : Double;
begin
int := Trunc( dbl ); // Trunc(1.9) results in 1
...
Möchte man aus einem Double Wert einen Integer machen und die Nachkommastellen dabei runden, geht dies wie folgt:
...
var
int : Integer;
dbl : Double;
begin
int := Round( dbl ); // Round(1.9) results in 2
...
Weitere Möglichkeiten für die Typumwandlung von Double in Integer sind zwei Methoden, die in der Unit Math zu finden sind: Ceil und Floor. Floor gibt den größten Integer Wert zurück der kleiner als der Übergebene Double Parameter ist und Ceil erledigt das Gegenteil. Hier ein paar Beispiele:
Floor(-2.8); // = -3
Floor(2,8); // = 2
Floor(-1,0); // = -1
Ceil(-2.8); // = -2
Ceil(2,8); // = 3
Ceil(-1,0); // = -1
In den standard Bibliotheken von Delphi sucht man vergeblich nach Methoden zur komfortablen Stringverarbeitung. Man muss sich mit Pos, PosEx und Copy selber zusammenbauen was man braucht. Die häufigste Anwendung ist sicher, das spliten eines Strings aufgrund eines Trenners. Folgende Methode erledigt dies zuverlässig und schreibt jeden Teilstring in eine Zeile einer TStringList Instanz:
function SplitItWell( str, split : String ) : TStringList;
var
offset, last : integer;
begin
offset := 1;
last := 1;
Result := TStringList.Create;
if str = '' then Exit;
if length( str ) <= length( split ) then
begin
Result.Add( str );
Exit;
end;
repeat
offset := PosEx( split, str, offset );
if offset = 0 then
Result.Add( Copy( str, last, length( str ) ) )
else
begin
Result.Add( Copy( str, last, offset - last ) );
offset := offset + length( split );
last := offset;
end;
until offset = 0;
end;
SplitItWell erstellt eine Instanz von TStringList und zerlegt str in seine Einzelteile überall da wo split vorkommt.
Um die Stringliste wieder in einen String zu verwandeln genügt folgende Methode:
function AssembleItWell( stringList : TStringList; sep : String ) : String;
var
I : Integer;
begin
Result := '';
for I := 0 to stringList.Count - 1 do
if I = stringList.Count - 1 then
Result := Result + stringList[ i ]
else
Result := Result + stringList[ i ] + sep
end;
Als Anwendungsbeispiel sortiert folgender Code die Elemente in einem String alphanumerisch.
function SortStringBySeperator( str, sep : String ) : String;
var
SplitList : TStringList;
begin
SplitList := SplitItWell( str, sep );
SplitList.Sorted := True;
Result := AssembleItWell( SplitList, sep );
FreeAndNil( SplitList );
end;
Benötigte Units: StrUtils;
Wenn man Anwendungen entwickeln möchte die nicht nur die nicht nur für den eigenen Rechner gedacht sind, sollte man dafür sorgen, dass man einen konstanten Dezimalseperator verwendet. Ansonsten ist man abhängig von der Ländereinstellung des aktuellen Computers. Das führt dazu, dass Funktionen die Gleitkommazahlen in Strings (z.B. FormatFloat( '0.0', 1.5 )) umwandeln, verschiedene Ausgaben produzieren: 1.5 oder 1,5.
Die Probleme die auftreten, wenn man die Strings wieder in eine Gleitkommazahl umwandeln will sind offensichtlich. Um den Dezimalseperator unabhängig von den Ländereinstellungen zu halten reicht folgender Code:
procedure TMainForm.FormCreate(Sender: TObject);
begin
SysUtils.DecimalSeparator := '.';
SysUtils.ThousandSeparator := ',';
end;
Da die Umwandlung eines Strings in eine Zahl immer ein kritischer Codeabschnitt ist empfiehlt es sich, Methoden die Gleitkommazahlen umwandeln, nochmal zu kapseln. So hat man einen einzigen kritischen Abschnitt und nicht dutzende über mehrere Units verteilt. Außerdem kann man so eigene Exceptions werfen und garantieren, dass der Seperator stimmt.
function PStrToDouble( Str : String ) : Double;
begin
SysUtils.DecimalSeparator := '.';
try
Result := SysUtils.StrToFloat( Str );
Except
Result := 0;
if Str = '' then
RAISE EParsingException.Create( Str, 'Fehler beim Versuch, einen leeren String in eine Gleitpunktzahl umzuwandeln.' )
else
RAISE EParsingException.Create( Str, 'Fehler beim Versuch, einen String in eine Gleitpunktzahl umzuwandeln.' );
end;
end;
function PDoubleToStr( Format : String; value : double ) : String;
begin
SysUtils.DecimalSeparator := '.';
Result := FormatFloat( Format, Value );
end;
EParsingException ist hier eine von Exception abgeleitete Klasse die eine komfortabel Möglichkeit bietet um Fehler, die beim Parsen auftreten können zu behandeln.
An der folgenden Deklaration kann man die Funktionalität ablesen:
type
EParsingException = class( Exception )
public
ErrorMessage : String;
Constructor Create( Source : String ); overload;
Constructor Create( Source : String; AdditionalMessage : String ); overload;
end;
Folgende Methode gibt an, wie viel Arbeitsspeicher ein Programm belegt. Der Rückgabewert ist in Bytes. Es empfiehlt sich also noch eine Umrechnung in KBytes oder MBytes.
function ProcessMemory : double;
var
pmc: PPROCESS_MEMORY_COUNTERS;
cb: Integer;
MemStat: tMemoryStatus;
begin
Result := 0;
MemStat.dwLength := SizeOf(MemStat);
GlobalMemoryStatus(MemStat);
cb := SizeOf(TProcessMemoryCounters);
GetMem(pmc, cb);
pmc^.cb := cb;
if GetProcessMemoryInfo(GetCurrentProcess(), pmc, cb) then
Result := Longint(pmc^.WorkingSetSize);
FreeMem(pmc);
end;
Ein Beispielaufruf wäre:
Showmessage( FormatFloat( '0.00', ProcessMemory / 1024 / 1024 ) + ' MByte belegt' );
Benötigte Units: PsAPI;