/*
 * This code is generated by BioUML FrameWork 
 * for BIOMD0000000075.xml diagram  at 2008.03.20 15:07:56
 */
import biouml.plugins.simulation.ae.NewtonSolver;
import biouml.plugins.simulation.java.JavaBaseModel;
import ru.biosoft.math.MathRoutines;

public class BIOMD0000000075 extends JavaBaseModel
{

/*
 * Write rules to calculate equation parameters
 */
    private void __internalVarInitFunc_0(double time, double[] x)
    {
        Ratebasal_PIPsyn = 0.581*PIPsynbasal_Stimulation*kBasalSynPIP*(-1.0 + Math.exp((PIP_basal + (-x[6]))*(1/PIP_basal)));
        Rate_PIP2SynStim = kStimSynPIP2*Math.exp(-((time + (-tauPIP2syn))*(1/PIP2syndecay)))*PIP2synstim_Stimulation;
        kr_IP3PH = kf_IP3PH*KdIP3PH;
        Ratestim_PIPsyn = kStimSynPIP*Math.exp(-((time + (-tauPIPsyn))*(1/PIPsyndecay)))*PIPsynstim_Stimulation;
        signal = Signal_Stimulation*Math.exp(-((time + (-tau0))*(1/stimdecay)));
        kr_PIP2PH = kf_PIP2PH*KdPIP2PH;
        Rate_PIP2Synbasal = 0.581*PIP2synbasal_Stimulation*kBasalSynPIP2*(-1.0 + Math.exp((PIP2_basal + (-x[5]))*(1/PIP2_basal)));
    }


/*
 * Write rules to calculate equation parameters excluding internal variables.
 */
    public void __internalRateVarInitFunc_0(double time, double[] x)
    {
        rate_IP3_PHGFP = _PM_Cytosol_*(x[2]*kf_IP3PH*x[0] + (-(kr_IP3PH*x[1])));
        rate_IP3_uncaging = _PM_Cytosol_*IP3_uncaging_intensity*_PM_Cytosol_IP3X_Cytosol_*_PM_Cytosol_hv_Cytosol_;
        rate_IP3deg = _PM_Cytosol_*IP3deg_kIP3deg*(x[0] + (-IP3deg_IP3_basal));
        rate_PIP2Syn = PM*(Rate_PIP2Synbasal + Rate_PIP2SynStim)*x[6];
        rate_PIP2_PH = PM*(x[5]*kf_PIP2PH*x[2] + (-(kr_PIP2PH*x[4])));
        rate_PIP2_PH_hyd = PM*PIP2_PH_hyd_k_PIP2PHhyd*x[9]*x[4];
        rate_PIP2_hyd = PM*k_PIP2hyd*x[5]*x[9];
        rate_PIPSyn = PM*(Ratebasal_PIPsyn + Ratestim_PIPsyn)*x[7];
        rate_PLCact = PM*(PLCact_KfPLCact*x[8]*signal + (-(PLCact_krPLCact*x[9])));
    }

    public void Init()
    {
        initialValues = getInitialValues();
/*
 * Initialize variables
 */
        _PM_Cytosol_ = 1.0; // initial value of $"PM.Cytosol"
        PM = 1.0; // initial value of $PM
        IP3_uncaging_intensity = 100000.0; // initial value of IP3_uncaging_intensity
        IP3deg_IP3_basal = 0.16; // initial value of IP3deg_IP3_basal
        IP3deg_kIP3deg = 0.08; // initial value of IP3deg_kIP3deg
        KdIP3PH = 0.1; // initial value of KdIP3PH
        KdPIP2PH = 2.0; // initial value of KdPIP2PH
        PIP2_basal = 4000.0; // initial value of PIP2_basal
        PIP2syndecay = 1.0; // initial value of PIP2syndecay
        PIP_basal = 2857.0; // initial value of PIP_basal
        PIPsyndecay = 1.0; // initial value of PIPsyndecay
        PLCact_KfPLCact = 5.0E-4; // initial value of PLCact_KfPLCact
        PLCact_krPLCact = 0.1; // initial value of PLCact_krPLCact
        kBasalSynPIP = 0.0055; // initial value of kBasalSynPIP
        kBasalSynPIP2 = 0.048; // initial value of kBasalSynPIP2
        kStimSynPIP = 0.019; // initial value of kStimSynPIP
        kStimSynPIP2 = 0.92; // initial value of kStimSynPIP2
        k_PIP2hyd = 2.4; // initial value of k_PIP2hyd
        kf_IP3PH = 10.0; // initial value of kf_IP3PH
        kf_PIP2PH = 0.12; // initial value of kf_PIP2PH
        stimdecay = 1.0; // initial value of stimdecay
        tau0 = 0.05; // initial value of tau0
        tauPIP2syn = 0.05; // initial value of tauPIP2syn
        tauPIPsyn = 0.05; // initial value of tauPIPsyn
    }

    /*
     * Model variables initial values
     */
    protected double _PM_Cytosol_;
    protected double _PM_Cytosol_IP3X_Cytosol_;
    protected double _PM_Cytosol_hv_Cytosol_;
    protected double rate_IP3_PHGFP;
    protected double rate_IP3_uncaging;
    protected double rate_IP3deg;
    protected double rate_PIP2Syn;
    protected double rate_PIP2_PH;
    protected double rate_PIP2_PH_hyd;
    protected double rate_PIP2_hyd;
    protected double rate_PIPSyn;
    protected double rate_PLCact;
    protected double PM;
    protected double IP3_uncaging_intensity;
    protected double IP3deg_IP3_basal;
    protected double IP3deg_kIP3deg;
    protected double KdIP3PH;
    protected double KdPIP2PH;
    protected double PIP2_PH_hyd_k_PIP2PHhyd;
    protected double PIP2_basal;
    protected double PIP2synbasal_Stimulation;
    protected double PIP2syndecay;
    protected double PIP2synstim_Stimulation;
    protected double PIP_basal;
    protected double PIPsynbasal_Stimulation;
    protected double PIPsyndecay;
    protected double PIPsynstim_Stimulation;
    protected double PLCact_KfPLCact;
    protected double PLCact_krPLCact;
    protected double Rate_PIP2SynStim;
    protected double Rate_PIP2Synbasal;
    protected double Ratebasal_PIPsyn;
    protected double Ratestim_PIPsyn;
    protected double Signal_Stimulation;
    protected double kBasalSynPIP;
    protected double kBasalSynPIP2;
    protected double kStimSynPIP;
    protected double kStimSynPIP2;
    protected double k_PIP2hyd;
    protected double kf_IP3PH;
    protected double kf_PIP2PH;
    protected double kr_IP3PH;
    protected double kr_PIP2PH;
    protected double signal;
    protected double stimdecay;
    protected double tau0;
    protected double tauPIP2syn;
    protected double tauPIPsyn;
    protected double time;

    public double[] extendResult(double time,double [] x)
    {
        this.time = time;

        __internalVarInitFunc_0(time, x);

        double[] y = new double[22];
        y[0] = x[0];
        y[1] = x[1];
        y[2] = x[2];
        y[3] = x[3];
        y[4] = x[4];
        y[5] = x[5];
        y[6] = x[6];
        y[7] = x[7];
        y[8] = x[8];
        y[9] = x[9];
        y[10] = PIP2synbasal_Stimulation;
        y[11] = PIP2synstim_Stimulation;
        y[12] = PIPsynbasal_Stimulation;
        y[13] = PIPsynstim_Stimulation;
        y[14] = Rate_PIP2SynStim;
        y[15] = Rate_PIP2Synbasal;
        y[16] = Ratebasal_PIPsyn;
        y[17] = Ratestim_PIPsyn;
        y[18] = Signal_Stimulation;
        y[19] = kr_IP3PH;
        y[20] = kr_PIP2PH;
        y[21] = signal;
        return y;
    }
    public double[] getInitialValues()
    {
        double [] x = new double[10];
        this.time = 0.0;
        x[0] = 0.16; // - $"PM.Cytosol.IP3_Cyt"
        x[1] = 0.0; // - $"PM.Cytosol.IP3_PHGFP_Cyt"
        x[2] = 0.0; // - $"PM.Cytosol.PH_GFP_Cyt"
        x[3] = 2000.0; // - $"PM.DAG_PM"
        x[4] = 0.0; // - $"PM.PIP2_PHGFP_PM"
        x[5] = 4000.0; // - $"PM.PIP2_PM"
        x[6] = 2857.0; // - $"PM.PIP_PM"
        x[7] = 142857.0; // - $"PM.PI_PM"
        x[8] = 100.0; // - $"PM.PLC_PM"
        x[9] = 0.0; // - $"PM.PLC_act_PM"

        __internalVarInitFunc_0(time, x);
        __internalRateVarInitFunc_0(time, x);

        return x;
    }

/*
 * code for algebraic rules calculations
 */

/*
 * end of code for algebraic rules calculations
 */

    protected void calculateRates(double time, double[] x)
    {

        __internalVarInitFunc_0(time, x);
        __internalRateVarInitFunc_0(time, x);

    }

        /*
         * calculate dy/dt for 'BIOMD0000000075.xml' model
         */
    public void __internalDyDt_0(double time, double [] x, double[] result)
    {
        result[0] = -rate_IP3_PHGFP+rate_IP3_uncaging-rate_IP3deg+rate_PIP2_PH_hyd*9.224E-4+rate_PIP2_hyd*9.224E-4;
        result[1] = +rate_IP3_PHGFP;
        result[2] = -rate_IP3_PHGFP-rate_PIP2_PH+rate_PIP2_PH_hyd*9.224E-4;
        result[3] = +rate_PIP2_PH_hyd+rate_PIP2_hyd;
        result[4] = +rate_PIP2_PH-rate_PIP2_PH_hyd;
        result[5] = +rate_PIP2Syn-rate_PIP2_PH-rate_PIP2_hyd;
        result[6] = -rate_PIP2Syn+rate_PIPSyn;
        result[7] = -rate_PIPSyn;
        result[8] = -rate_PLCact;
        result[9] = +rate_PLCact;
    }
    protected double [] calculateResult(double time, double[] x)
    {
        double[] result = new double[10];
        __internalDyDt_0(time, x, result);
        return result;
    }
    public double[] dy_dt(double time, double[] x)
    {
        this.time = time;
        calculateRates( time,x );

        return calculateResult( time,x );
    }

    public double[] checkEvent(double time, double[] x)
    {
        this.time = time;

        __internalVarInitFunc_0(time, x);
        __internalRateVarInitFunc_0(time, x);

        double [] flags = new double[5];
        flags[0] = (x[6] < PIP_basal) ? +1 : -1; //event_0000001
        flags[1] = (time > tauPIPsyn) ? +1 : -1; //event_0000002
        flags[2] = (x[5] < PIP2_basal) ? +1 : -1; //event_0000003
        flags[3] = (time > tauPIP2syn) ? +1 : -1; //event_0000004
        flags[4] = (time > tau0) ? +1 : -1; //event_0000005
        return flags;
    }

    public void processEvent(int __internalVar12060040765150, double time, double[] x)
    {
        this.time = time;
        if ( __internalVar12060040765150 == 0) //event_0000001
        {
            PIPsynbasal_Stimulation = 1;
        } else if ( __internalVar12060040765150 == 1) //event_0000002
        {
            PIPsynstim_Stimulation = 1;
        } else if ( __internalVar12060040765150 == 2) //event_0000003
        {
            PIP2synbasal_Stimulation = 1;
        } else if ( __internalVar12060040765150 == 3) //event_0000004
        {
            PIP2synstim_Stimulation = 1;
        } else if ( __internalVar12060040765150 == 4) //event_0000005
        {
            Signal_Stimulation = 1;
        }
    }

} // class ...