package affectors; import main.Node; import main.Globals; import main.Cell; /** A variant of Txn1Aff that integrates an external influence from a neighboring cell (e.g. a signalling protein) and activates transcription as a function of the total activator presented on all cell faces. Use this if you want to skip the signal transduction cascade between a ligand on neighboring cells and transcription. Everything else is the same as Txn1Aff.

Formula
dnodex/dt = (1 / H_nodex) * ACTIVATOR(neighbors)^nu / (K^nu + ACTIVATOR(neighbors)^nu)

Parameters
Activator [ACTIVATOR] The transcriptional activator Node
Half-max activation level [K_ACTIVATORnodex] The concentration of activator at which transcription proceeds at half its maximal rate
Cooperativity [nu_ACTIVATORnodex] The non-linearity of the activating function. The higher the value, the sharper the curves in the S-shaped activation function
mRNA Half-life [H_nodex] The half life of the product mRNA

Usage
&nodex

&Txn1ECAff ACTIVATOR K_ACTIVATORnodex nu ACTIVATORnodex H_nodex
&endnodex */ public class Txn1ECAff extends Affector { /** The level of activator at which transcription proceeds half-maximally. */ int kParam; /** The "cooperativity" exponent for activation. */ int nuParam; /** The half-life of the transcript. */ int halfLifeParam; static final String desc = "Transcription dependent on an extrinsic activator"; static final String [] nodeDescriptions = {"Activator"}; static final String [] paramDescriptions = {"Kappa: half-maximal level of activator", "nu: cooperativity of activation", "Half-life of transcript produced"}; public Txn1ECAff() { } 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) { kParam = param_nums[0]; nuParam = param_nums[1]; halfLifeParam = param_nums[2]; } public float getValue(Node which_node) { float total_activator = 0; // total_activator sums contributions from all six neighbors, thus integrating sided input into non-sided form for(int i = 0; i< Globals.cellNumSides; i++) { total_activator += Nodes[i].getIntegrationValue(getOtherSide(i)); } return ((Globals.characteristicTime / params[halfLifeParam]) * Phi(total_activator,params[kParam],params[nuParam])); } // Affector::fixNodes over-ridden to fill Nodes[] with activator concentrations from all six neighbors; thus this non-sided affector uses a sided node public void fixNodes(Cell cell, String [] node_names) throws Exception { if(notFixed) { Nodes = new Node[Globals.cellNumSides]; for(int i = 0; i < Globals.cellNumSides; i++) { Nodes[i] = cell.getNeighborNode(i,node_names[0]); } notFixed = false; } } }