104 lines
4.0 KiB
C#
104 lines
4.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace BaseCellSimulation.Enzyms.Cytosol.Ribosomen
|
|
{
|
|
public class Ribosome : InternalEnzym
|
|
{
|
|
private TranslationFactor initiation;
|
|
private TranslationFactor elongation;
|
|
private TranslationFactor termination;
|
|
|
|
private const double ProteinPermRNA = 20.0;
|
|
|
|
int ribosomenState = 0;
|
|
|
|
public Ribosome()
|
|
{
|
|
Km = 0.5; // fiktiv (abhängig von mRNA)
|
|
Vmax = 10.0; // z. B. 10 Aminosäuren pro Sekunde
|
|
initiation = new TranslationFactor(TranslationFactor.FactorType.Initiation);
|
|
elongation = new TranslationFactor(TranslationFactor.FactorType.Elongation);
|
|
termination = new TranslationFactor(TranslationFactor.FactorType.Termination);
|
|
}
|
|
|
|
private double availableAA = 0;
|
|
private double dProtein = 0;
|
|
|
|
public override void ApplyChanges(CellRessources res, double dt)
|
|
{
|
|
int safety = 0;
|
|
while (safety++ < 10)
|
|
{
|
|
switch (ribosomenState)
|
|
{
|
|
|
|
case 0:
|
|
availableAA = res.Res.Protein.AminoAcids;
|
|
dProtein = rate * dt;
|
|
// Translation start -> Initiationsfaktoren verbrauchen GTP
|
|
initiation.ApplyChanges(res, dt * 0.5);
|
|
if (initiation.TranslationSpeed > 0)
|
|
{
|
|
dProtein = Math.Min(initiation.TranslationSpeed, dProtein);
|
|
dProtein = Math.Min(dProtein, Math.Min(res.Res.Protein.mRNA, availableAA));
|
|
res.Res.Protein.AminoAcids -= dProtein;
|
|
res.Res.Protein.FunctionalProteins += dProtein;
|
|
ribosomenState = 1;
|
|
}
|
|
else return;
|
|
break;
|
|
case 1:
|
|
elongation.ApplyChanges(res, dt * dProtein * 0.1);
|
|
if (elongation.TranslationSpeed > 0)
|
|
{
|
|
dProtein = Math.Min(elongation.TranslationSpeed, dProtein);
|
|
// mRNA-Abnutzung: jede mRNA kann nur begrenzt oft benutzt werden
|
|
double used_mRNA = dProtein / ProteinPermRNA;
|
|
res.Res.Protein.mRNA -= used_mRNA;
|
|
|
|
// Abbauprodukte: ein Teil recycelt, ein Teil wird zu Waste
|
|
double degraded = used_mRNA * 0.8;
|
|
double lost = used_mRNA * 0.2;
|
|
res.Res.Protein.Nucleotides += degraded; // Rückgewinn von Basen
|
|
res.Res.Protein.Waste += lost; // Restliche RNA-Fragmente als Zellabfall
|
|
ribosomenState = 2;
|
|
}
|
|
|
|
else return;
|
|
break;
|
|
|
|
case 2:
|
|
termination.ApplyChanges(res, dt * 0.01 * dProtein);
|
|
if (termination.TranslationSpeed > 0)
|
|
{
|
|
res.ConsumeATP(dProtein * 4); // z. B. 4 ATP pro Peptidbindung -> ADP
|
|
ribosomenState = 0;
|
|
}
|
|
else return;
|
|
|
|
break;
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void ComputeRate(Resources res)
|
|
{
|
|
if (ribosomenState == 0) {
|
|
if (res.Protein.AminoAcids <= 0.0 || res.Protein.mRNA <= 0.0)
|
|
return;
|
|
|
|
double availablemRNA = res.Protein.mRNA;
|
|
Michaelis_Menten(availablemRNA);
|
|
initiation.ComputeRate(res);
|
|
elongation.ComputeRate(res);
|
|
termination.ComputeRate(res);
|
|
}
|
|
}
|
|
}
|
|
}
|