Search in sources :

Example 1 with MembraneMetricComponent

use of cbit.vcell.math.ComputeMembraneMetricEquation.MembraneMetricComponent in project vcell by virtualcell.

the class CompartmentSubDomain method parse.

@Override
protected void parse(MathDescription mathDesc, String token, CommentStringTokenizer tokens) throws MathException, ExpressionException {
    if (token.equalsIgnoreCase(VCML.Handle)) {
        // 
        // throw away "handle information" deprecated
        // 
        token = tokens.nextToken();
        // handle = Integer.valueOf(token).intValue();
        return;
    }
    if (token.equalsIgnoreCase(VCML.Priority)) {
        // legacy support; just ignore this token
        token = tokens.nextToken();
        return;
    }
    if (token.equalsIgnoreCase(VCML.BoundaryXm)) {
        String type = tokens.nextToken();
        boundaryConditionTypeXm = new BoundaryConditionType(type);
        return;
    }
    if (token.equalsIgnoreCase(VCML.BoundaryXp)) {
        String type = tokens.nextToken();
        boundaryConditionTypeXp = new BoundaryConditionType(type);
        return;
    }
    if (token.equalsIgnoreCase(VCML.BoundaryYm)) {
        String type = tokens.nextToken();
        boundaryConditionTypeYm = new BoundaryConditionType(type);
        return;
    }
    if (token.equalsIgnoreCase(VCML.BoundaryYp)) {
        String type = tokens.nextToken();
        boundaryConditionTypeYp = new BoundaryConditionType(type);
        return;
    }
    if (token.equalsIgnoreCase(VCML.BoundaryZm)) {
        String type = tokens.nextToken();
        boundaryConditionTypeZm = new BoundaryConditionType(type);
        return;
    }
    if (token.equalsIgnoreCase(VCML.BoundaryZp)) {
        String type = tokens.nextToken();
        boundaryConditionTypeZp = new BoundaryConditionType(type);
        return;
    }
    if (token.equalsIgnoreCase(VCML.BoundaryConditionSpec)) {
        String name = tokens.nextToken();
        String type = tokens.nextToken();
        BoundaryConditionSpec bcs = new BoundaryConditionSpec(name, new BoundaryConditionType(type));
        addBoundaryConditionSpec(bcs);
        return;
    }
    if (token.equalsIgnoreCase(VCML.PdeEquation)) {
        token = tokens.nextToken();
        boolean bSteady = false;
        if (token.equals(VCML.Steady)) {
            bSteady = true;
            token = tokens.nextToken();
        }
        Variable var = mathDesc.getVariable(token);
        if (var == null) {
            throw new MathFormatException("variable " + token + " not defined");
        }
        if (!(var instanceof VolVariable)) {
            throw new MathFormatException("variable " + token + " not a VolumeVariable");
        }
        PdeEquation pde = new PdeEquation((VolVariable) var, bSteady);
        pde.read(tokens, mathDesc);
        addEquation(pde);
        return;
    }
    if (token.equalsIgnoreCase(VCML.OdeEquation)) {
        token = tokens.nextToken();
        Variable var = mathDesc.getVariable(token);
        if (var == null) {
            throw new MathFormatException("variable " + token + " not defined");
        }
        if (!(var instanceof VolVariable)) {
            throw new MathFormatException("variable " + token + " not a VolumeVariable");
        }
        OdeEquation ode = new OdeEquation((VolVariable) var, null, null);
        ode.read(tokens, mathDesc);
        addEquation(ode);
        return;
    }
    if (token.equalsIgnoreCase(VCML.VolumeRegionEquation)) {
        token = tokens.nextToken();
        Variable var = mathDesc.getVariable(token);
        if (var == null) {
            throw new MathFormatException("variable " + token + " not defined");
        }
        if (!(var instanceof VolumeRegionVariable)) {
            throw new MathFormatException("variable " + token + " not a VolumeRegionVariable");
        }
        VolumeRegionEquation vre = new VolumeRegionEquation((VolumeRegionVariable) var, null);
        vre.read(tokens, mathDesc);
        addEquation(vre);
        return;
    }
    if (token.equalsIgnoreCase(VCML.ComputeCentroidX) || token.equalsIgnoreCase(VCML.ComputeCentroidY) || token.equalsIgnoreCase(VCML.ComputeCentroidZ)) {
        CentroidComponent component = null;
        if (token.equalsIgnoreCase(VCML.ComputeCentroidX)) {
            component = CentroidComponent.X;
        } else if (token.equalsIgnoreCase(VCML.ComputeCentroidY)) {
            component = CentroidComponent.Y;
        } else if (token.equalsIgnoreCase(VCML.ComputeCentroidZ)) {
            component = CentroidComponent.Z;
        }
        token = tokens.nextToken();
        Variable var = mathDesc.getVariable(token);
        if (var == null) {
            throw new MathFormatException("variable " + token + " not defined");
        }
        if (!(var instanceof VolumeRegionVariable)) {
            throw new MathFormatException("variable " + token + " not a VolumeRegionVariable");
        }
        ComputeCentroidComponentEquation computeCentroidEq = new ComputeCentroidComponentEquation((VolumeRegionVariable) var, component);
        computeCentroidEq.read(tokens, mathDesc);
        addEquation(computeCentroidEq);
        return;
    }
    if (token.equalsIgnoreCase(VCML.ComputeDistanceToMembrane) || token.equalsIgnoreCase(VCML.ComputeDirectionToMembraneX) || token.equalsIgnoreCase(VCML.ComputeDirectionToMembraneY) || token.equalsIgnoreCase(VCML.ComputeDirectionToMembraneZ)) {
        MembraneMetricComponent component = null;
        if (token.equalsIgnoreCase(VCML.ComputeDistanceToMembrane)) {
            component = MembraneMetricComponent.distanceToMembrane;
        } else if (token.equalsIgnoreCase(VCML.ComputeDirectionToMembraneX)) {
            component = MembraneMetricComponent.directionToMembraneX;
        } else if (token.equalsIgnoreCase(VCML.ComputeDirectionToMembraneY)) {
            component = MembraneMetricComponent.directionToMembraneY;
        } else if (token.equalsIgnoreCase(VCML.ComputeDirectionToMembraneZ)) {
            component = MembraneMetricComponent.directionToMembraneZ;
        }
        token = tokens.nextToken();
        Variable var = mathDesc.getVariable(token);
        if (var == null) {
            throw new MathFormatException("variable " + token + " not defined");
        }
        if (!(var instanceof VolVariable)) {
            throw new MathFormatException("variable " + token + " not a VolumeVariable");
        }
        ComputeMembraneMetricEquation computeMembraneMetricEq = new ComputeMembraneMetricEquation((VolVariable) var, component);
        computeMembraneMetricEq.read(tokens, mathDesc);
        addEquation(computeMembraneMetricEq);
        return;
    }
    /**
     * ParticleJumpProcess name A B {
     *    MacroscopicRateConstant dkdkdk;
     *    Action destroy A
     *    Action destroy B
     *    Action create C
     * }
     */
    if (token.equalsIgnoreCase(VCML.ParticleJumpProcess)) {
        ParticleJumpProcess particleJumpProcess = ParticleJumpProcess.fromVCML(mathDesc, tokens);
        addParticleJumpProcess(particleJumpProcess);
        return;
    }
    if (token.equalsIgnoreCase(VCML.ParticleProperties)) {
        ParticleProperties pp = new ParticleProperties(mathDesc, tokens);
        if (pp.getVariable().getDomain().getName().equals(this.getName())) {
            addParticleProperties(pp);
        } else {
            throw new MathException("Variable (" + pp.getVariable().getName() + ") is defined in domain " + pp.getVariable().getDomain().getName() + ". \nHowever the variable particle properties of " + pp.getVariable().getName() + " is defined in domain " + this.getName() + ". \nPlease check your model.");
        }
        return;
    }
    if (token.equalsIgnoreCase(VCML.FastSystem)) {
        FastSystem fs = new FastSystem(mathDesc);
        fs.read(tokens, mathDesc);
        setFastSystem(fs);
        return;
    }
    // Variable initial conditions as count
    if (token.equalsIgnoreCase(VCML.VarIniCount_Old) || token.equalsIgnoreCase(VCML.VarIniCount)) {
        token = tokens.nextToken();
        Variable var = mathDesc.getVariable(token);
        if (var == null) {
            throw new MathFormatException("variable " + token + " not defined");
        }
        if (!(var instanceof StochVolVariable)) {
            throw new MathFormatException("variable " + token + " not a Stochastic Volume Variable");
        }
        Expression varIniExp = parseAndBind(mathDesc, tokens);
        VarIniCount vic = new VarIniCount(var, varIniExp);
        addVarIniCondition(vic);
        return;
    }
    // Variable inital conditions as concentration
    if (token.equalsIgnoreCase(VCML.VarIniPoissonExpectedCount)) {
        token = tokens.nextToken();
        Variable var = mathDesc.getVariable(token);
        if (var == null) {
            throw new MathFormatException("variable " + token + " not defined");
        }
        if (!(var instanceof StochVolVariable)) {
            throw new MathFormatException("variable " + token + " not a Stochastic Volume Variable");
        }
        Expression varIniExp = parseAndBind(mathDesc, tokens);
        VarIniPoissonExpectedCount vic = new VarIniPoissonExpectedCount(var, varIniExp);
        addVarIniCondition(vic);
        return;
    }
    // Jump processes
    if (token.equalsIgnoreCase(VCML.JumpProcess)) {
        JumpProcess jump = null;
        token = tokens.nextToken();
        String name = token;
        token = tokens.nextToken();
        if (!token.equalsIgnoreCase(VCML.BeginBlock))
            throw new MathFormatException("unexpected token " + token + " expecting " + VCML.BeginBlock);
        token = tokens.nextToken();
        if (token.equalsIgnoreCase(VCML.ProbabilityRate)) {
            Expression probExp = MathFunctionDefinitions.fixFunctionSyntax(tokens);
            // check if probability functions contain "t", which is not allowed.
            Expression extProb = MathUtilities.substituteFunctions(probExp, mathDesc).flatten();
            String[] symbols = extProb.getSymbols();
            if (symbols != null) {
                for (int i = 0; i < symbols.length; i++) {
                    if (symbols[i].equals("t")) {
                        throw new MathFormatException("Unexpected symbol \'t\'  in probability rate of jump process " + name + ". Probability rate should not be a function of t.");
                    }
                }
            }
            probExp.bindExpression(mathDesc);
            jump = new JumpProcess(name, probExp);
            addJumpProcess(jump);
        } else {
            throw new MathFormatException("unexpected identifier " + token);
        }
        if (jump != null) {
            while (tokens.hasMoreTokens()) {
                token = tokens.nextToken();
                if (token.equalsIgnoreCase(VCML.EndBlock)) {
                    break;
                }
                if (token.equalsIgnoreCase(VCML.Action)) {
                    token = tokens.nextToken();
                    Variable var = mathDesc.getVariable(token);
                    if (var == null) {
                        throw new MathFormatException("variable " + token + " not defined");
                    }
                    if (!(var instanceof StochVolVariable)) {
                        throw new MathFormatException("variable " + token + " not a Stochastic Volume Variable");
                    }
                    String opera = tokens.nextToken();
                    if (!opera.equals(Action.ACTION_INC)) {
                        throw new MathFormatException("expected 'INC' for action, found " + opera);
                    }
                    Expression exp = parseAndBind(mathDesc, tokens);
                    Action action = Action.createIncrementAction(var, exp);
                    jump.addAction(action);
                } else
                    throw new MathFormatException("unexpected identifier " + token);
            }
        }
        return;
    }
    throw new MathFormatException("unexpected identifier " + token);
}
Also used : CentroidComponent(cbit.vcell.math.ComputeCentroidComponentEquation.CentroidComponent) MembraneMetricComponent(cbit.vcell.math.ComputeMembraneMetricEquation.MembraneMetricComponent) Expression(cbit.vcell.parser.Expression)

Example 2 with MembraneMetricComponent

use of cbit.vcell.math.ComputeMembraneMetricEquation.MembraneMetricComponent in project vcell by virtualcell.

the class XmlReader method getComputeMembraneMetric.

private ComputeMembraneMetricEquation getComputeMembraneMetric(Element param, MathDescription mathDesc) throws XmlParseException {
    // get attributes
    String varname = unMangle(param.getAttributeValue(XMLTags.NameAttrTag));
    // find reference in the dictionnary
    // try a MembraneRegionVariable
    VolVariable varref = (VolVariable) mathDesc.getVariable(varname);
    if (varref == null) {
        throw new XmlParseException("The reference to the Volume variable " + varname + " could not be resolved!");
    }
    MembraneMetricComponent normalComponent = null;
    String normalComponentString = param.getAttributeValue(XMLTags.ComputeMembraneMetricComponentAttrTag);
    if (normalComponentString.equals(XMLTags.ComputeMembraneMetricComponentAttrTagValue_directionX)) {
        normalComponent = MembraneMetricComponent.directionToMembraneX;
    } else if (normalComponentString.equals(XMLTags.ComputeMembraneMetricComponentAttrTagValue_directionY)) {
        normalComponent = MembraneMetricComponent.directionToMembraneY;
    } else if (normalComponentString.equals(XMLTags.ComputeMembraneMetricComponentAttrTagValue_directionZ)) {
        normalComponent = MembraneMetricComponent.directionToMembraneZ;
    } else if (normalComponentString.equals(XMLTags.ComputeMembraneMetricComponentAttrTagValue_distance)) {
        normalComponent = MembraneMetricComponent.distanceToMembrane;
    }
    ComputeMembraneMetricEquation computeMembraneMetric = new ComputeMembraneMetricEquation(varref, normalComponent);
    String membraneName = param.getAttributeValue(XMLTags.ComputeMembraneMetricTargetMembraneAttrTag);
    computeMembraneMetric.setTargetMembraneName(membraneName);
    return computeMembraneMetric;
}
Also used : StochVolVariable(cbit.vcell.math.StochVolVariable) VolVariable(cbit.vcell.math.VolVariable) ComputeMembraneMetricEquation(cbit.vcell.math.ComputeMembraneMetricEquation) MembraneMetricComponent(cbit.vcell.math.ComputeMembraneMetricEquation.MembraneMetricComponent)

Aggregations

MembraneMetricComponent (cbit.vcell.math.ComputeMembraneMetricEquation.MembraneMetricComponent)2 CentroidComponent (cbit.vcell.math.ComputeCentroidComponentEquation.CentroidComponent)1 ComputeMembraneMetricEquation (cbit.vcell.math.ComputeMembraneMetricEquation)1 StochVolVariable (cbit.vcell.math.StochVolVariable)1 VolVariable (cbit.vcell.math.VolVariable)1 Expression (cbit.vcell.parser.Expression)1