package affectors; import main.Node; import main.Globals; /** Txn5 takes two activators and one inhibitor that suppresses both activators equally. Parameters include not only the half-life of the target and the K's and nu's for each regulator, but also two weights, alpha and beta, which determine the relative effectiveness of each activator complex. Each regulator may be either cytoplasmic or membrane-bound as long as they all 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^nu_ACT2 / (K_ACT2^nu_ACT2 + ACTIVATOR2^nu_ACT2)
dnodex/dt = (1 / H_nodex) * INHIBITION_LEVEL * ((alpha * ACTIVATION1) + (beta * ACTIVATION2)) / (1 + (INHIBITION_LEVEL * (alpha * ACTIVATION1) + (beta * ACTIVATION2)))

Parameters
Inhibitor [INHIBITOR] The inhibitor Node
Activator1 [ACTIVATOR1] The first transcriptional activator Node
Activator2 [ACTIVATOR2] The second transcriptional activator Node
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

&Txn5Aff 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 Txn5Aff 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 it has halfway neutralized the activators. */ int kLParam; /** The "cooperativity" exponent for inhibition. */ int nuLParam; static final String desc = "Transcription dependent on two activators, both squelched by an inhibitor"; static final String [] nodeDescriptions = {"Inhibitor", "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 Txn5Aff() { } 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(), params[kA2Param], params[nuA2Param]); return ((Globals.characteristicTime / params[halfLifeParam]) * Phi((psi_I * (params[alphaParam]*phi_A1 + params[betaParam]*phi_A2)), 1, 1)); } }