package affectors; import main.Node; import main.Globals; /** Translation of an mRNA into protein. Put this affector in the protein, not the mRNA, as it is changing the concentration of the protein. This affector works for both cytoplasmic and membrane proteins. If the protein will be membrane-bound, this affector divides the translation rate by the number of sides that the protein node has so each side gets 1 / num_sides of the total translation. Note that there is no translation rate because this has been "non-dimensionalized" out of the equations.

Formula
dNODEX/dt = nodex

Parameters
Messenger [nodex] The mRNA Node
Half-life [H_NODEX] The half-life of the protein Node.

Usage
&NODEX

&TlnAff nodex H_NODEX
&endNODEX */ public class TlnRegUpAff extends Affector { /** Half-life of the protein product; don't ask why. */ int halfLifeParam, kReg, nuReg; static final String desc = "Regulated translation"; static final String [] nodeDescriptions = {"Messenger RNA", "Regulator"}; static final String [] paramDescriptions = {"Half-life of protein product", "half-max regulator", "cooperativity of regulator"}; static final int [] whichSides = {-1, -1}; public TlnRegUpAff() {} protected void setLabelsAndTypes() { setDescriptions(this.desc, nodeDescriptions, paramDescriptions); setSided(true, whichSides); this.Type[GUI_CAPABLE] = 1; this.Type[CERTIFICATION] = Affector.RETURNS_DERIV; this.Type[MATHTYPE] = Affector.KK; this.Type[TERMTYPE] = Affector.PRODUCTION; } public void setParameterNumbers(int [] param_nums) { halfLifeParam = param_nums[0]; kReg = param_nums[1]; nuReg = param_nums[2]; } public float getValue(Node which_node) { float trans = ((Globals.characteristicTime / params[halfLifeParam]) / which_node.numSides) * Nodes[0].getIntegrationValue(0); trans *= Phi(Nodes[1].getIntegrationValue(0), params[kReg], params[nuReg]); return trans; } }