package affectors; import main.Globals; import main.Node; import main.Cell; /** This is the other half of a dimerization where the ligand and receptor can bind within the same membrane as well as across different faces. All Nodes, including the dimer, must be membrane-bound. Use this version in the dimer. Use the A version of this affector for the undimerized species. The node_scale (max) should be from the singleton that is most dis-similar to the dimer.

Formula
dDIMER/dt = - r * max * SINGLE_NODE1 * SINGLE_NODE2

Parameters
Membrane Node [SINGLE_NODE1] One undimerized Node
Cytoplasmic Node [SINGLE_NODE2] The other undimerized Node
Dimerization rate [r_DIMER] The rate of the dimerization reaction.
Maximum Cyto [max] The maximum relative concentration of the >other< undimerized Node.

Usage
&DIMER

&DimerizeAllMembrane_BAff SINGLE_NODE1 SINGLE_NODE2 r_DIMER max
&endDIMER */ public class DimerizeAllMembrane_BAff extends Affector { /** The rate of the dimerization reaction. */ int kParam; /** The scaling factor of the other undimerized node in this reaction (i.e. max for second input node). */ int nodeScaleParam; static final String desc = "Dimerize membrane-bound nodes; version B for dimer"; static final String [] nodeDescriptions = {"Receptor node", "Ligand node"}; static final String [] paramDescriptions = {"Second-order rate constant", "Scale factor (max value) for ligand"}; static final int [] whichSides = {-1, -1, 1}; public DimerizeAllMembrane_BAff() {} 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.FF; this.Type[TERMTYPE] = Affector.CONVERSION; } public void setParameterNumbers(int [] param_nums) { kParam = param_nums[0]; nodeScaleParam = param_nums[1]; } /** Overridden because this affector uses the same node in two places. */ public void fixNodes(Cell cell, String [] node_names) throws Exception { String [] new_node_names = new String[3]; new_node_names[0] = node_names[0]; new_node_names[1] = new_node_names[2] = node_names[1]; sides = new int[3]; sides[0] = sides[1] = -1; sides[2] = side; super.fixNodes(cell, new_node_names); } public float getValue(Node which_node) { return Globals.characteristicTime * params[kParam] * params[nodeScaleParam] * Nodes[0].getIntegrationValue(side) * (Nodes[1].getIntegrationValue(side) + Nodes[2].getIntegrationValue(otherSide)); } }