package affectors; import main.Node; import main.Globals; /** Txn4 takes two activators and one inhibitor which titrates away the *second* activator. Parameters include not just the half-life of the target and the K's and nu's for each regulator, but also the weights alpha and beta, which determine the relative effectiveness of each activator. All inputs may be either cytoplasmic or membrane-bound as long as they reside in the same cell as the target.

Formula
INHIBITION_LEVEL = ( 1 - (INHIBITOR^nu_INHIB / (K_INHIBITOR^nu_INHIB + INHIBITOR^nu_INHIB)) )
ACTIVATION1 = ACTIVATOR1^nu_ACT1 / (K_ACT1^nu_ACT1 + ACTIVATOR1^nu_ACT1)
ACTIVATION2 = (ACTIVATOR2 * INHIBITION_LEVEL)^nu_ACT2 / (K_ACT2^nu_ACT2 + (ACTIVATOR2 * INHIBITION_LEVEL)^nu_ACT2)
dnodex/dt = (1 / H_nodex) * (alpha * ACTIVATION1) + (beta * ACTIVATION2) / (1 + (alpha * ACTIVATION1) + (beta * ACTIVATION2))

Parameters
Inhibitor [INHIBITOR] The inhibitor Node
Activator1 [ACTIVATOR1] The first transcriptional activator Node
Activator2 [ACTIVATOR2] The second transcriptional activator Node, the target of the inhibitor
mRNA Half-life [H_nodex] The half life of the product mRNA
Half-max activation level for first activator [K_ACTIVATOR1nodex] The concentration of the first activator at which transcription proceeds at half its maximal rate
Activator 1 cooperativity [nu_ACTIVATOR1nodex] The non-linearity for the first activator. The higher the value, the sharper the curves in the S-shaped activation function
Saturability coefficient for Activator 1 [alpha_nodex] determines how completely the first activator can saturate the promoter
Half-max activation level for second activator [K_ACTIVATOR2nodex] The concentration of the second activator at which transcription proceeds at half its maximal rate
Activator 2 cooperativity [nu_ACTIVATOR2nodex] The non-linearity for the second activator. The higher the value, the sharper the curves in the S-shaped activation function
Saturability coefficient for Activator 2 [beta_nodex] determines how completely the second activator can saturate the promoter
Half-max inhibition level [K_INHIBITOR] The concentration of inhibitor at which transcription proceeds at half the rate it would have otherwise
Inhibition Cooperativity [nu_INHIBITOR] The non-linearity of the inhibiting function. The higher the value, the sharper the curves in the upside-down S-shaped inhibition function

Usage
&nodex

&Txn4Aff INHIBITOR ACTIVATOR1 ACTIVATOR2 H_nodex K_ACTIVATOR1nodex nu_ACTIVATOR1nodex alpha K_ACTIVATOR2nodex nu_ACTIVATOR2nodex beta K_INHIBITORnodex nu_INHIBITORnodex
&endnodex

NOTE - you can accomplish this same function using the meta-enhancers, and those are a more general framework for putting together transcription terms. */ public class Txn4Aff extends Affector { /** The half-life of the transcript. */ int halfLifeParam; /** The level of activator 1 at which transcription proceeds half-maximally. */ int kA1Param; /** The "cooperativity" exponent for activator 1. */ int nuA1Param; /** The weight for the first activation complex. */ int alphaParam; /** The level of activator 2 at which transcription proceeds half-maximally. */ int kA2Param; /** The "cooperativity" exponent for activator 2. */ int nuA2Param; /** The weight for the second activation complex. */ int betaParam; /** The level of inhibitor at which half the activator has been neutralized. */ int kLParam; /** The "cooperativity" exponent for inhibition. */ int nuLParam; static final String desc = "Transcription dependent on two activators, one competing with an inhibitor"; static final String [] nodeDescriptions = {"Inhibitor of activator 2", "Activator 1", "Activator 2"}; static final String [] paramDescriptions = {"Half-life of transcript produced", "Kappa activator 1: half-maximal level of activator 1", "nu1: cooperativity of activator 1", "alpha: weight for activation complex 1", "Kappa activator 2: half-maximal level of activator 2", "nu2: cooperativity of activator 2", "beta: weight for activation complex 2", "Kappa inhibitor: half-maximal level of inhibitor", "nu_I: cooperativity of inhibition"}; public Txn4Aff() {} protected void setLabelsAndTypes() { setDescriptions(this.desc, nodeDescriptions, paramDescriptions); this.Type[GUI_CAPABLE] = 1; this.Type[CERTIFICATION] = Affector.RETURNS_DERIV; this.Type[MATHTYPE] = Affector.FF; this.Type[TERMTYPE] = Affector.PRODUCTION; } public void setParameterNumbers(int [] param_nums) { halfLifeParam = param_nums[0]; kA1Param = param_nums[1]; nuA1Param = param_nums[2]; alphaParam = param_nums[3]; kA2Param = param_nums[4]; nuA2Param = param_nums[5]; betaParam = param_nums[6]; kLParam = param_nums[7]; nuLParam = param_nums[8]; } public float getValue(Node which_node) { float phi_A1=0, phi_A2=0, psi_I=0; psi_I = Psi(Nodes[0].getIntegrationValue(), params[kLParam], params[nuLParam]); phi_A1 = Phi(Nodes[1].getIntegrationValue(), params[kA1Param], params[nuA1Param]); phi_A2 = Phi((Nodes[2].getIntegrationValue() * psi_I), params[kA2Param], params[nuA2Param]); return ((Globals.characteristicTime / params[halfLifeParam]) * Phi((params[alphaParam]*phi_A1 + params[betaParam]*phi_A2), 1, 1)); } }