Search in sources :

Example 16 with Issue

use of org.vcell.util.Issue in project vcell by virtualcell.

the class Model method gatherIssues.

/**
 * Insert the method's description here.
 * Creation date: (5/12/2004 10:38:12 PM)
 * @param issueList java.util.Vector
 */
public void gatherIssues(IssueContext issueContext, List<Issue> issueList) {
    issueContext = issueContext.newChildContext(ContextType.Model, this);
    // 
    try {
        for (ModelParameter modelParameter : fieldModelParameters) {
            Expression exp = modelParameter.getExpression();
            String[] symbols = exp.getSymbols();
            if (symbols != null) {
                String issueMsgPrefix = "Global parameter '" + modelParameter.getName() + "' ";
                for (int j = 0; j < symbols.length; j++) {
                    SymbolTableEntry ste = exp.getSymbolBinding(symbols[j]);
                    if (ste == null) {
                        issueList.add(new Issue(modelParameter, issueContext, IssueCategory.ModelParameterExpressionError, issueMsgPrefix + "references undefined symbol '" + symbols[j] + "'", Issue.SEVERITY_ERROR));
                    } else if (ste instanceof SpeciesContext) {
                        if (!contains((SpeciesContext) ste)) {
                            issueList.add(new Issue(modelParameter, issueContext, IssueCategory.ModelParameterExpressionError, issueMsgPrefix + "references undefined species '" + symbols[j] + "'", Issue.SEVERITY_ERROR));
                        }
                    } else if (ste instanceof ModelParameter) {
                        if (!contains((ModelParameter) ste)) {
                            issueList.add(new Issue(modelParameter, issueContext, IssueCategory.ModelParameterExpressionError, issueMsgPrefix + "references undefined global parameter '" + symbols[j] + "'", Issue.SEVERITY_ERROR));
                        }
                    }
                }
            }
        }
        // 
        for (int i = 0; i < fieldModelParameters.length; i++) {
            try {
                VCUnitEvaluator unitEvaluator = new VCUnitEvaluator(getUnitSystem());
                VCUnitDefinition paramUnitDef = fieldModelParameters[i].getUnitDefinition();
                VCUnitDefinition expUnitDef = unitEvaluator.getUnitDefinition(fieldModelParameters[i].getExpression());
                if (paramUnitDef == null) {
                    issueList.add(new Issue(fieldModelParameters[i], issueContext, IssueCategory.Units, "defined unit is null", Issue.SEVERITY_WARNING));
                } else if (expUnitDef == null) {
                    issueList.add(new Issue(fieldModelParameters[i], issueContext, IssueCategory.Units, "computed unit is null", Issue.SEVERITY_WARNING));
                } else if (paramUnitDef.isTBD()) {
                    issueList.add(new Issue(fieldModelParameters[i], issueContext, IssueCategory.Units, "unit is undefined (" + unitSystem.getInstance_TBD().getSymbol() + ")", Issue.SEVERITY_WARNING));
                } else if (!paramUnitDef.isEquivalent(expUnitDef) && !expUnitDef.isTBD()) {
                    issueList.add(new Issue(fieldModelParameters[i], issueContext, IssueCategory.Units, "unit mismatch, computed = [" + expUnitDef.getSymbol() + "]", Issue.SEVERITY_WARNING));
                }
            } catch (VCUnitException e) {
                issueList.add(new Issue(fieldModelParameters[i], issueContext, IssueCategory.Units, "units inconsistent: " + e.getMessage(), Issue.SEVERITY_WARNING));
            } catch (ExpressionException e) {
                issueList.add(new Issue(fieldModelParameters[i], issueContext, IssueCategory.Units, "units inconsistent: " + e.getMessage(), Issue.SEVERITY_WARNING));
            }
        }
    } catch (Throwable e) {
        e.printStackTrace(System.out);
        issueList.add(new Issue(this, issueContext, IssueCategory.Units, "unexpected exception: " + e.getMessage(), Issue.SEVERITY_WARNING));
    }
    // 
    for (Structure struct : fieldStructures) {
        struct.gatherIssues(issueContext, issueList);
    }
    // 
    for (int i = 0; i < fieldReactionSteps.length; i++) {
        fieldReactionSteps[i].gatherIssues(issueContext, issueList);
    }
    // 
    // get issues from species contexts (species patterns)
    // 
    int seedSpeciesCount = 0;
    for (int i = 0; i < fieldSpeciesContexts.length; i++) {
        if (fieldSpeciesContexts[i].hasSpeciesPattern()) {
            seedSpeciesCount++;
        }
        fieldSpeciesContexts[i].gatherIssues(issueContext, issueList);
    }
    if (seedSpeciesCount == 0 && !rbmModelContainer.getReactionRuleList().isEmpty()) {
        String msg = "At least one seed species is required.";
        issueList.add(new Issue(this, issueContext, IssueCategory.Identifiers, msg, Issue.Severity.WARNING));
    }
    // 
    // get issues for symbol name clashes (specifically structures with same voltage names or structure names)
    // 
    HashSet<SymbolTableEntry> steHashSet = new HashSet<SymbolTableEntry>();
    gatherLocalEntries(steHashSet);
    Iterator<SymbolTableEntry> iter = steHashSet.iterator();
    Hashtable<String, SymbolTableEntry> symbolHashtable = new Hashtable<String, SymbolTableEntry>();
    while (iter.hasNext()) {
        SymbolTableEntry ste = iter.next();
        SymbolTableEntry existingSTE = symbolHashtable.get(ste.getName());
        if (existingSTE != null) {
            issueList.add(new Issue(this, issueContext, IssueCategory.Identifiers, "model symbol \"" + ste.getName() + "\" is used within \"" + ste.getNameScope().getName() + "\" and \"" + existingSTE.getNameScope().getName() + "\"", Issue.SEVERITY_ERROR));
        } else {
            symbolHashtable.put(ste.getName(), ste);
        }
    }
    // 
    // gather issues for electrical topology (unspecified +ve or -ve features, or +ve feature == -ve feature
    // 
    getElectricalTopology().gatherIssues(issueContext, issueList);
    // 
    if (rbmModelContainer == null) {
        issueList.add(new Issue(this, issueContext, IssueCategory.InternalError, "Rbm Model Container is null", Issue.SEVERITY_WARNING));
    } else {
        rbmModelContainer.gatherIssues(issueContext, issueList);
    }
}
Also used : Issue(org.vcell.util.Issue) Hashtable(java.util.Hashtable) ExpressionException(cbit.vcell.parser.ExpressionException) VCUnitException(cbit.vcell.units.VCUnitException) VCUnitEvaluator(cbit.vcell.parser.VCUnitEvaluator) SymbolTableEntry(cbit.vcell.parser.SymbolTableEntry) VCUnitDefinition(cbit.vcell.units.VCUnitDefinition) Expression(cbit.vcell.parser.Expression) HashSet(java.util.HashSet)

Example 17 with Issue

use of org.vcell.util.Issue in project vcell by virtualcell.

the class MathDescription method gatherIssues.

/**
 * This method was created in VisualAge.
 * @return boolean
 */
public void gatherIssues(IssueContext issueContext, List<Issue> issueList) {
    issueContext = issueContext.newChildContext(ContextType.MathDescription, this);
    setWarning(null);
    if (geometry == null) {
        Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_NoGeometry, VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_1, Issue.SEVERITY_ERROR);
        issueList.add(issue);
    }
    if (isSpatialStoch() && geometry.getDimension() != 3) {
        Issue issue = new Issue(geometry, issueContext, IssueCategory.Smoldyn_Geometry_3DWarning, "VCell spatial stochastic models only support 3D geometry.", Issue.SEVERITY_ERROR);
        issueList.add(issue);
    }
    // check Constant are really constants
    for (int i = 0; i < variableList.size(); i++) {
        Variable var = variableList.get(i);
        if (var instanceof Constant) {
            try {
                ((Constant) var).getExpression().evaluateConstant();
            } catch (Exception ex) {
                ex.printStackTrace(System.out);
                Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_Constant_NotANumber, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_CONSTANT, var.getExpression().infix()), Issue.SEVERITY_ERROR);
                issueList.add(issue);
            }
        }
    }
    // 
    // count number of variables of each type
    // 
    int volVarCount = 0;
    int memVarCount = 0;
    int filVarCount = 0;
    int volRegionVarCount = 0;
    int memRegionVarCount = 0;
    int filRegionVarCount = 0;
    int stochVarCount = 0;
    int pointVarCount = 0;
    for (int i = 0; i < variableList.size(); i++) {
        Variable var = variableList.get(i);
        if (var instanceof VolVariable) {
            volVarCount++;
        } else if (var instanceof MemVariable) {
            memVarCount++;
        } else if (var instanceof FilamentVariable) {
            filVarCount++;
        } else if (var instanceof VolumeRegionVariable) {
            volRegionVarCount++;
        } else if (var instanceof MembraneRegionVariable) {
            memRegionVarCount++;
        } else if (var instanceof FilamentRegionVariable) {
            filRegionVarCount++;
        } else if (var instanceof StochVolVariable) {
            stochVarCount++;
        } else if (var instanceof PointVariable) {
            pointVarCount++;
        }
    }
    // 
    for (int i = 0; i < subDomainList.size(); i++) {
        try {
            SubDomain subDomain = subDomainList.get(i);
            Enumeration<Equation> equEnum = subDomain.getEquations();
            while (equEnum.hasMoreElements()) {
                Equation equ = equEnum.nextElement();
                equ.checkValid(this, subDomain);
                equ.bind(this);
            }
            FastSystem fastSystem = subDomain.getFastSystem();
            if (fastSystem != null) {
                Enumeration<FastRate> frEnum = fastSystem.getFastRates();
                while (frEnum.hasMoreElements()) {
                    FastRate fr = frEnum.nextElement();
                    fr.bind(this);
                }
                Enumeration<FastInvariant> fiEnum = fastSystem.getFastInvariants();
                while (fiEnum.hasMoreElements()) {
                    FastInvariant fi = fiEnum.nextElement();
                    fi.bind(this);
                }
            }
            for (ParticleProperties pp : subDomain.getParticleProperties()) {
                pp.bind(this);
            }
            for (ParticleJumpProcess pjp : subDomain.getParticleJumpProcesses()) {
                pjp.bind(this);
                Expression rateDefinition = null;
                JumpProcessRateDefinition jprd = pjp.getParticleRateDefinition();
                if (jprd instanceof MacroscopicRateConstant) {
                    rateDefinition = MathUtilities.substituteFunctions(((MacroscopicRateConstant) jprd).getExpression(), this);
                } else if (jprd instanceof InteractionRadius) {
                    rateDefinition = MathUtilities.substituteFunctions(((InteractionRadius) jprd).getExpression(), this);
                } else {
                    new RuntimeException("The jump process rate definition is not supported");
                }
                String[] symbols = rateDefinition.getSymbols();
                if (symbols != null) {
                    for (String symbol : symbols) {
                        // throw exception for particle variables, particle variable cannot be referenced
                        Variable var = getVariable(symbol);
                        if (var instanceof ParticleVariable) {
                            throw new MathException("Stochastic variables can not be referenced in functions and equations.");
                        }
                        if (subDomain instanceof CompartmentSubDomain) {
                            if ((var instanceof MembraneRegionVariable || var instanceof MemVariable)) {
                                throw new MathException("Volume reaction: " + pjp.getName() + " cannot reference membrane variable: " + var.getName() + ".");
                            }
                        }
                    }
                }
            }
        } catch (ExpressionBindingException e) {
            Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_ExpressionBindingException, e.getMessage(), Issue.SEVERITY_ERROR);
            issueList.add(issue);
        } catch (ExpressionException e) {
            Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_ExpressionException, e.getMessage(), Issue.SEVERITY_ERROR);
            issueList.add(issue);
        } catch (MathException e) {
            Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_MathException, e.getMessage(), Issue.SEVERITY_ERROR);
            issueList.add(issue);
        }
    }
    // 
    if (geometry.getDimension() == 0) {
        // 
        if (subDomainList.size() != 1) {
            Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_1, Issue.SEVERITY_ERROR);
            issueList.add(issue);
        } else if (subDomainList.size() == 1) {
            if (!(subDomainList.get(0) instanceof CompartmentSubDomain)) {
                Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_2, Issue.SEVERITY_ERROR);
                issueList.add(issue);
            }
            CompartmentSubDomain subDomain = (CompartmentSubDomain) subDomainList.get(0);
            // distinguish ODE model and stochastic model
            if (isNonSpatialStoch()) {
                if (stochVarCount == 0) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_StochasticModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_STOCHASTIC_MODEL_1, Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                if (subDomain.getJumpProcesses().size() == 0) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_StochasticModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_STOCHASTIC_MODEL_2, Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                // check variable initial condition
                for (VarIniCondition varIniCondition : subDomain.getVarIniConditions()) {
                    Expression iniExp = varIniCondition.getIniVal();
                    try {
                        iniExp.bindExpression(this);
                    } catch (Exception ex) {
                        ex.printStackTrace(System.out);
                        setWarning(ex.getMessage());
                    }
                }
                // check probability rate
                for (JumpProcess jumpProcess : subDomain.getJumpProcesses()) {
                    Expression probExp = jumpProcess.getProbabilityRate();
                    try {
                        probExp.bindExpression(this);
                    } catch (Exception ex) {
                        ex.printStackTrace(System.out);
                        setWarning(ex.getMessage());
                    }
                }
            } else if (isRuleBased()) {
            } else {
                // ODE model
                // 
                // Check that all equations are ODEs
                // 
                int odeCount = 0;
                Enumeration<Equation> enum_equ = subDomain.getEquations();
                while (enum_equ.hasMoreElements()) {
                    Equation equ = enum_equ.nextElement();
                    if (equ instanceof OdeEquation) {
                        odeCount++;
                    } else {
                        Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_3, Issue.SEVERITY_ERROR);
                        issueList.add(issue);
                    }
                }
                if (odeCount == 0) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_4, Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                if (volVarCount != odeCount) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_5, Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                if (memVarCount > 0) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_6, VCML.MembraneVariable), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                if (filVarCount > 0) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_6, VCML.FilamentVariable), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                if (volRegionVarCount > 0) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_6, VCML.VolumeRegionVariable), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                if (memRegionVarCount > 0) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_6, VCML.MembraneRegionVariable), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                if (filRegionVarCount > 0) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_CompartmentalModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_COMPARTMENT_MODEL_6, VCML.FilamentRegionVariable), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
            }
        }
    // 
    // spatial (PDE and ODE)
    // 
    } else {
        // 
        // Check that the number of CompartmentSubdomains equals the number of VolumeSubVolumes in the Geometry
        // Check that the number of FilamentSubdomains equals the number of Filaments in the Geometry
        // 
        int compartmentCount = 0;
        int membraneCount = 0;
        int filamentCount = 0;
        int pointCount = 0;
        for (int i = 0; i < subDomainList.size(); i++) {
            SubDomain subDomain = (SubDomain) subDomainList.get(i);
            if (subDomain instanceof CompartmentSubDomain) {
                if (geometry.getGeometrySpec().getSubVolume(subDomain.getName()) == null) {
                    Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_1, subDomain.getName()), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                compartmentCount++;
            } else if (subDomain instanceof MembraneSubDomain) {
                membraneCount++;
            } else if (subDomain instanceof FilamentSubDomain) {
                filamentCount++;
            } else if (subDomain instanceof PointSubDomain) {
                pointCount++;
            } else {
                Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_2, subDomain.getName()), Issue.SEVERITY_ERROR);
                issueList.add(issue);
            }
        }
        if (geometry.getGeometrySpec().getNumSubVolumes() != compartmentCount) {
            Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_3, geometry.getGeometrySpec().getNumSubVolumes(), compartmentCount), Issue.SEVERITY_ERROR);
            issueList.add(issue);
        }
        if (geometry.getGeometrySpec().getFilamentGroup().getFilamentCount() != filamentCount) {
        // setWarning("Spatial model, there are "+geometry.getGeometrySpec().getFilamentGroup().getFilamentCount()+" filaments in geometry, but "+filamentCount+" "+VCML.FilamentSubDomain+"'s, must be equal");
        // return false;
        }
        if (filamentCount == 0 && (filVarCount > 0 || filRegionVarCount > 0)) {
            Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_4, Issue.SEVERITY_ERROR);
            issueList.add(issue);
        }
        if (membraneCount == 0 && (memVarCount > 0 || memRegionVarCount > 0)) {
            Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_5, Issue.SEVERITY_ERROR);
            issueList.add(issue);
        }
        // 
        for (int i = 0; i < subDomainList.size(); i++) {
            SubDomain subDomain1 = (SubDomain) subDomainList.get(i);
            for (int j = 0; j < subDomainList.size(); j++) {
                if (i != j) {
                    SubDomain subDomain2 = (SubDomain) subDomainList.get(j);
                    if (subDomain1.getName().equals(subDomain2.getName())) {
                        Issue issue = new Issue(subDomain1, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_6, subDomain1.getName(), subDomain2.getName()), Issue.SEVERITY_ERROR);
                        issueList.add(issue);
                    }
                    if (subDomain1 instanceof MembraneSubDomain && subDomain2 instanceof MembraneSubDomain) {
                        MembraneSubDomain memSubDomain1 = (MembraneSubDomain) subDomain1;
                        MembraneSubDomain memSubDomain2 = (MembraneSubDomain) subDomain2;
                        if ((memSubDomain1.getInsideCompartment() == memSubDomain2.getInsideCompartment() && memSubDomain1.getOutsideCompartment() == memSubDomain2.getOutsideCompartment()) || (memSubDomain1.getInsideCompartment() == memSubDomain2.getOutsideCompartment() && memSubDomain1.getOutsideCompartment() == memSubDomain2.getInsideCompartment())) {
                            Issue issue = new Issue(subDomain1, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_7, memSubDomain1.getInsideCompartment().getName(), memSubDomain1.getOutsideCompartment().getName()), Issue.SEVERITY_ERROR);
                            issueList.add(issue);
                        }
                    }
                }
            }
        }
        // check periodic boundary conditons
        for (int i = 0; i < subDomainList.size(); i++) {
            SubDomain subDomain = (SubDomain) subDomainList.get(i);
            if (subDomain instanceof CompartmentSubDomain) {
                CompartmentSubDomain compartmentSubDomain = (CompartmentSubDomain) subDomain;
                BoundaryConditionType bctM = compartmentSubDomain.getBoundaryConditionXm();
                BoundaryConditionType bctP = compartmentSubDomain.getBoundaryConditionXp();
                if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
                    Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Xm", "Xp", subDomain.getName()), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                bctM = compartmentSubDomain.getBoundaryConditionYm();
                bctP = compartmentSubDomain.getBoundaryConditionYp();
                if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
                    Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Ym", "Yp", subDomain.getName()), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                bctM = compartmentSubDomain.getBoundaryConditionZm();
                bctP = compartmentSubDomain.getBoundaryConditionZp();
                if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
                    Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Zm", "Zp", subDomain.getName()), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
            } else if (subDomain instanceof MembraneSubDomain) {
                MembraneSubDomain membraneSubDomain = (MembraneSubDomain) subDomain;
                BoundaryConditionType bctM = membraneSubDomain.getBoundaryConditionXm();
                BoundaryConditionType bctP = membraneSubDomain.getBoundaryConditionXp();
                if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
                    Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Xm", "Xp", subDomain.getName()), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                bctM = membraneSubDomain.getBoundaryConditionYm();
                bctP = membraneSubDomain.getBoundaryConditionYp();
                if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
                    Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Ym", "Yp", subDomain.getName()), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                bctM = membraneSubDomain.getBoundaryConditionZm();
                bctP = membraneSubDomain.getBoundaryConditionZp();
                if (bctM.isPERIODIC() && !bctP.isPERIODIC() || !bctM.isPERIODIC() && bctP.isPERIODIC()) {
                    Issue issue = new Issue(subDomain, issueContext, IssueCategory.MathDescription_SpatialModel_Subdomain, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_9, "Zm", "Zp", subDomain.getName()), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
            }
        }
        try {
            if (geometry.getGeometrySpec().getDimension() > 0) {
                // 
                // Check that there is a MembraneSubdomain for each unique subVolume-subVolume interface in Geometry
                // each ResolvedSurfaceLocation is an instance of a subVolume-subVolume interface (one-to-one with region boundaries).
                // 
                GeometricRegion[] regions = geometry.getGeometrySurfaceDescription().getGeometricRegions();
                // }
                if (regions == null) {
                    Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_2, Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                } else {
                    for (int i = 0; i < regions.length; i++) {
                        if (regions[i] instanceof SurfaceGeometricRegion) {
                            SurfaceGeometricRegion surfaceRegion = (SurfaceGeometricRegion) regions[i];
                            SubVolume subVolume1 = ((VolumeGeometricRegion) surfaceRegion.getAdjacentGeometricRegions()[0]).getSubVolume();
                            CompartmentSubDomain compartment1 = getCompartmentSubDomain(subVolume1.getName());
                            if (compartment1 == null) {
                                Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_3, getGeometry().getName(), subVolume1.getName()), Issue.SEVERITY_ERROR);
                                issueList.add(issue);
                            }
                            SubVolume subVolume2 = ((VolumeGeometricRegion) surfaceRegion.getAdjacentGeometricRegions()[1]).getSubVolume();
                            CompartmentSubDomain compartment2 = getCompartmentSubDomain(subVolume2.getName());
                            if (compartment2 == null) {
                                Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_3, getGeometry().getName(), subVolume2.getName()), Issue.SEVERITY_ERROR);
                                issueList.add(issue);
                            }
                            MembraneSubDomain membraneSubDomain = getMembraneSubDomain(compartment1, compartment2);
                            if (compartment2 != null && compartment1 != null && membraneSubDomain == null) {
                                Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_4, compartment1.getName(), compartment2.getName()), Issue.SEVERITY_ERROR);
                                issueList.add(issue);
                            }
                        }
                    }
                    // 
                    for (int i = 0; i < subDomainList.size(); i++) {
                        if (subDomainList.get(i) instanceof MembraneSubDomain) {
                            MembraneSubDomain membraneSubDomain = (MembraneSubDomain) subDomainList.get(i);
                            boolean bFoundSurfaceInGeometry = false;
                            for (int j = 0; j < regions.length; j++) {
                                if (regions[j] instanceof SurfaceGeometricRegion) {
                                    SurfaceGeometricRegion surfaceRegion = (SurfaceGeometricRegion) regions[j];
                                    VolumeGeometricRegion volumeRegion1 = (VolumeGeometricRegion) surfaceRegion.getAdjacentGeometricRegions()[0];
                                    VolumeGeometricRegion volumeRegion2 = (VolumeGeometricRegion) surfaceRegion.getAdjacentGeometricRegions()[1];
                                    String memInsideName = membraneSubDomain.getInsideCompartment().getName();
                                    String memOutsideName = membraneSubDomain.getOutsideCompartment().getName();
                                    if ((memInsideName.equals(volumeRegion1.getSubVolume().getName()) && memOutsideName.equals(volumeRegion2.getSubVolume().getName())) || (memInsideName.equals(volumeRegion2.getSubVolume().getName()) && memOutsideName.equals(volumeRegion1.getSubVolume().getName()))) {
                                        bFoundSurfaceInGeometry = true;
                                        break;
                                    }
                                }
                            }
                            if (!bFoundSurfaceInGeometry) {
                                Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_GEOMETRY_5, membraneSubDomain.getInsideCompartment().getName(), membraneSubDomain.getOutsideCompartment().getName()), Issue.SEVERITY_ERROR);
                                issueList.add(issue);
                            }
                        }
                    }
                }
            }
        // }catch (GeometryException e){
        // e.printStackTrace(System.out);
        // setWarning("error validating MathDescription: "+e.getMessage());
        // return false;
        // }catch (ImageException e){
        // e.printStackTrace(System.out);
        // setWarning("error validating MathDescription: "+e.getMessage());
        // return false;
        // }catch (ExpressionException e){
        // e.printStackTrace(System.out);
        // setWarning("error validating MathDescription: "+e.getMessage());
        // return false;
        } catch (Exception e) {
            e.printStackTrace(System.out);
            Issue issue = new Issue(geometry, issueContext, IssueCategory.MathDescription_SpatialModel_Geometry, e.getMessage(), Issue.SEVERITY_ERROR);
            issueList.add(issue);
        }
        // 
        for (int i = 0; i < variableList.size(); i++) {
            Variable var = variableList.get(i);
            String varName = var.getName();
            if (var instanceof VolVariable) {
                VolVariable volVar = (VolVariable) var;
                int pdeRefCount = 0;
                int odeRefCount = 0;
                int steadyPdeCount = 0;
                int measureCount = 0;
                for (int j = 0; j < subDomainList.size(); j++) {
                    SubDomain subDomain = subDomainList.get(j);
                    Equation equ = subDomain.getEquation(volVar);
                    if (equ instanceof PdeEquation) {
                        if (((PdeEquation) equ).isSteady()) {
                            steadyPdeCount++;
                        } else {
                            pdeRefCount++;
                        }
                        // 
                        for (int k = 0; k < subDomainList.size(); k++) {
                            SubDomain subDomain2 = subDomainList.get(k);
                            if (subDomain2 instanceof MembraneSubDomain) {
                                MembraneSubDomain membraneSubDomain = (MembraneSubDomain) subDomain2;
                                if (membraneSubDomain.getInsideCompartment() == subDomain || membraneSubDomain.getOutsideCompartment() == subDomain) {
                                    JumpCondition jumpCondition = membraneSubDomain.getJumpCondition(volVar);
                                    BoundaryConditionValue boundaryValue = ((PdeEquation) equ).getBoundaryConditionValue(membraneSubDomain.getName());
                                    // if PDE variable does not have jump condition OR boundaryValue (neither or both are not allowed), its an error.
                                    if ((jumpCondition == null && boundaryValue == null) || (jumpCondition != null && boundaryValue != null)) {
                                        Issue issue = new Issue(equ, issueContext, IssueCategory.MathDescription_SpatialModel_Equation, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_10, varName, subDomain.getName(), membraneSubDomain.getName()), Issue.SEVERITY_ERROR);
                                        issueList.add(issue);
                                    }
                                    if (boundaryValue != null && (subDomain.getBoundaryConditionSpec(membraneSubDomain.getName()) == null)) {
                                        Issue issue = new Issue(equ, issueContext, IssueCategory.MathDescription_SpatialModel_Equation, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_10A, varName, subDomain.getName(), membraneSubDomain.getName(), membraneSubDomain.getName(), subDomain.getName()), Issue.SEVERITY_ERROR);
                                        issueList.add(issue);
                                    }
                                }
                            }
                        }
                    } else if (equ instanceof OdeEquation) {
                        odeRefCount++;
                    } else if (equ instanceof MeasureEquation) {
                        measureCount++;
                    }
                    // 
                    if (subDomain instanceof MembraneSubDomain) {
                        MembraneSubDomain memSubDomain = (MembraneSubDomain) subDomain;
                        JumpCondition jumpCondition = memSubDomain.getJumpCondition(volVar);
                        if (jumpCondition != null) {
                            boolean bInsidePresent = (memSubDomain.getInsideCompartment().getEquation(volVar) instanceof PdeEquation);
                            boolean bOutsidePresent = (memSubDomain.getOutsideCompartment().getEquation(volVar) instanceof PdeEquation);
                            if (!bInsidePresent && !bOutsidePresent) {
                                Issue issue = new Issue(equ, issueContext, IssueCategory.MathDescription_SpatialModel_Equation, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_11, varName, memSubDomain.getName(), memSubDomain.getInsideCompartment().getName(), memSubDomain.getOutsideCompartment().getName()), Issue.SEVERITY_ERROR);
                                issueList.add(issue);
                            }
                            // 
                            if (!bInsidePresent && !jumpCondition.getInFluxExpression().isZero()) {
                                Issue issue = new Issue(equ, issueContext, IssueCategory.MathDescription_SpatialModel_Equation, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_12, varName, memSubDomain.getName(), memSubDomain.getInsideCompartment().getName()), Issue.SEVERITY_ERROR);
                                issueList.add(issue);
                            }
                            if (!bOutsidePresent && !jumpCondition.getOutFluxExpression().isZero()) {
                                Issue issue = new Issue(equ, issueContext, IssueCategory.MathDescription_SpatialModel_Equation, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_13, varName, memSubDomain.getName(), memSubDomain.getOutsideCompartment().getName()), Issue.SEVERITY_ERROR);
                                issueList.add(issue);
                            }
                        }
                    }
                }
                if (odeRefCount > 0 && pdeRefCount > 0) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_14, varName), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                if (steadyPdeCount > 0 && pdeRefCount > 0) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_15, varName), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                if (odeRefCount == 0 && pdeRefCount == 0 && steadyPdeCount == 0 && measureCount == 0) {
                    Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_16, varName), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
            } else // 
            if (var instanceof MemVariable) {
                int pdeRefCount = 0;
                int odeRefCount = 0;
                int steadyPdeCount = 0;
                for (int j = 0; j < subDomainList.size(); j++) {
                    SubDomain subDomain = subDomainList.get(j);
                    Equation equ = subDomain.getEquation(var);
                    if (equ instanceof PdeEquation) {
                        if (((PdeEquation) equ).isSteady()) {
                            steadyPdeCount++;
                        } else {
                            pdeRefCount++;
                        }
                    } else if (equ instanceof OdeEquation) {
                        odeRefCount++;
                    }
                }
                if (odeRefCount > 0 && pdeRefCount > 0) {
                    Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_14, varName), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                if (steadyPdeCount > 0 && pdeRefCount > 0) {
                    Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_15, varName), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
                if (odeRefCount == 0 && pdeRefCount == 0 && steadyPdeCount == 0) {
                    Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_16, varName), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
            } else // 
            if (var instanceof FilamentVariable) {
                for (int j = 0; j < subDomainList.size(); j++) {
                    SubDomain subDomain = subDomainList.get(j);
                    if (subDomain instanceof FilamentSubDomain) {
                        Equation equ = subDomain.getEquation(var);
                        if (!(equ instanceof OdeEquation)) {
                            Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_21, varName, subDomain.getName()), Issue.SEVERITY_ERROR);
                            issueList.add(issue);
                        }
                    }
                }
            } else // 
            if (var instanceof VolumeRegionVariable) {
                VolumeRegionVariable volRegionVar = (VolumeRegionVariable) var;
                int count = 0;
                for (int j = 0; j < subDomainList.size(); j++) {
                    SubDomain subDomain = subDomainList.get(j);
                    if (subDomain instanceof CompartmentSubDomain) {
                        Equation equ = subDomain.getEquation(volRegionVar);
                        if (equ instanceof VolumeRegionEquation) {
                            count++;
                            // 
                            for (int k = 0; k < subDomainList.size(); k++) {
                                SubDomain subDomain2 = subDomainList.get(k);
                                if (subDomain2 instanceof MembraneSubDomain) {
                                    MembraneSubDomain membraneSubDomain = (MembraneSubDomain) subDomain2;
                                    if (membraneSubDomain.getInsideCompartment() == subDomain || membraneSubDomain.getOutsideCompartment() == subDomain) {
                                        if (membraneSubDomain.getJumpCondition(volRegionVar) == null) {
                                            Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_17, varName, subDomain.getName(), membraneSubDomain.getName()), Issue.SEVERITY_ERROR);
                                            issueList.add(issue);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                if (count == 0) {
                    Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_18, varName), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
            } else // 
            if (var instanceof MembraneRegionVariable) {
                int count = 0;
                for (int j = 0; j < subDomainList.size(); j++) {
                    SubDomain subDomain = subDomainList.get(j);
                    if (subDomain instanceof MembraneSubDomain) {
                        Equation equ = subDomain.getEquation(var);
                        if (equ instanceof MembraneRegionEquation) {
                            count++;
                        }
                    }
                }
                if (count == 0) {
                    Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_19, varName), Issue.SEVERITY_ERROR);
                    issueList.add(issue);
                }
            } else // 
            if (var instanceof FilamentRegionVariable) {
                for (int j = 0; j < subDomainList.size(); j++) {
                    SubDomain subDomain = subDomainList.get(j);
                    if (subDomain instanceof FilamentSubDomain) {
                        Equation equ = subDomain.getEquation(var);
                        if (!(equ instanceof FilamentRegionEquation)) {
                            Issue issue = new Issue(var, issueContext, IssueCategory.MathDescription_SpatialModel_Variable, VCellErrorMessages.getErrorMessage(VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_20, varName, subDomain.getName()), Issue.SEVERITY_ERROR);
                            issueList.add(issue);
                        }
                    }
                }
            }
        }
    }
    if (eventList.size() > 0 && isSpatial()) {
        Issue issue = new Issue(this, issueContext, IssueCategory.MathDescription_SpatialModel, VCellErrorMessages.MATH_DESCRIPTION_SPATIAL_MODEL_22, Issue.SEVERITY_ERROR);
        issueList.add(issue);
    }
    for (Event event : eventList) {
        try {
            event.bind(this);
        } catch (ExpressionBindingException e) {
            Issue issue = new Issue(event, issueContext, IssueCategory.MathDescription_SpatialModel_Event, e.getMessage(), Issue.SEVERITY_ERROR);
            issueList.add(issue);
        }
    }
    for (DataGenerator dataGenerator : postProcessingBlock.getDataGeneratorList()) {
        try {
            dataGenerator.bind(this);
        } catch (ExpressionBindingException e) {
            Issue issue = new Issue(dataGenerator, issueContext, IssueCategory.MathDescription_SpatialModel_PostProcessingBlock, e.getMessage(), Issue.SEVERITY_ERROR);
            issueList.add(issue);
        }
    }
}
Also used : Issue(org.vcell.util.Issue) ExpressionException(cbit.vcell.parser.ExpressionException) SubVolume(cbit.vcell.geometry.SubVolume) VolumeGeometricRegion(cbit.vcell.geometry.surface.VolumeGeometricRegion) VolumeGeometricRegion(cbit.vcell.geometry.surface.VolumeGeometricRegion) SurfaceGeometricRegion(cbit.vcell.geometry.surface.SurfaceGeometricRegion) GeometricRegion(cbit.vcell.geometry.surface.GeometricRegion) SurfaceGeometricRegion(cbit.vcell.geometry.surface.SurfaceGeometricRegion) ExpressionBindingException(cbit.vcell.parser.ExpressionBindingException) ExpressionBindingException(cbit.vcell.parser.ExpressionBindingException) NoSuchElementException(java.util.NoSuchElementException) ExpressionException(cbit.vcell.parser.ExpressionException) BoundaryConditionValue(cbit.vcell.math.PdeEquation.BoundaryConditionValue) Expression(cbit.vcell.parser.Expression) ChangeEvent(javax.swing.event.ChangeEvent)

Example 18 with Issue

use of org.vcell.util.Issue in project vcell by virtualcell.

the class MathDescription method isValid.

public boolean isValid() {
    IssueContext issueContext = new IssueContext(ContextType.MathDescription, this, null);
    ArrayList<Issue> issueList = new ArrayList<Issue>();
    gatherIssues(issueContext, issueList);
    if (issueList.size() > 0) {
        setWarning(issueList.get(0).getMessage());
    }
    return issueList.size() == 0;
}
Also used : Issue(org.vcell.util.Issue) ArrayList(java.util.ArrayList) IssueContext(org.vcell.util.IssueContext)

Example 19 with Issue

use of org.vcell.util.Issue in project vcell by virtualcell.

the class ScopedExpressionTableCellRenderer method getTableCellRendererComponent.

/**
 *  This method is sent to the renderer by the drawing table to
 *  configure the renderer appropriately before drawing.  Return
 *  the Component used for drawing.
 *
 * @param	table		the JTable that is asking the renderer to draw.
 *				This parameter can be null.
 * @param	value		the value of the cell to be rendered.  It is
 *				up to the specific renderer to interpret
 *				and draw the value.  eg. if value is the
 *				String "true", it could be rendered as a
 *				string or it could be rendered as a check
 *				box that is checked.  null is a valid value.
 * @param	isSelected	true is the cell is to be renderer with
 *				selection highlighting
 * @param	row	        the row index of the cell being drawn.  When
 *				drawing the header the rowIndex is -1.
 * @param	column	        the column index of the cell being drawn
 */
public java.awt.Component getTableCellRendererComponent(javax.swing.JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    try {
        TableModel tableModel = table.getModel();
        if (value == null) {
            templateJLabel.setIcon(null);
            templateJLabel.setText(null);
            templateJLabel.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            if (tableModel instanceof VCellSortTableModel) {
                if (row < ((VCellSortTableModel<?>) tableModel).getRowCount()) {
                    Object rowObject = ((VCellSortTableModel<?>) tableModel).getValueAt(row);
                    if (rowObject instanceof SpeciesContextSpecParameter) {
                        templateJLabel.setText(((SpeciesContextSpecParameter) rowObject).getNullExpressionDescription());
                    }
                }
            }
            return templateJLabel;
        }
        if (!(value instanceof ScopedExpression)) {
            return stringRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        }
        imageRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        JLabel renderer = imageRenderer;
        ScopedExpression scopedExpression = (ScopedExpression) value;
        String scopedExpressInfix = scopedExpression.infix();
        ReusableExpressionIcon rei = scopedExpressionImageIconHash.get(scopedExpressInfix);
        if (rei != null && rei.background.equals(imageRenderer.getBackground()) && rei.foreground.equals(imageRenderer.getForeground())) {
            // Re-use existing ImageIcon is it exists and is same state
            imageRenderer.setIcon(rei.imageIcon);
        } else {
            // Create new ImageIcon
            try {
                ExpressionPrintFormatter epf = new ExpressionPrintFormatter(scopedExpression.getRenamedExpression());
                // 
                // Use graphicsContextProvider BufferedImage to get started because
                // theTable may have a null GC and epf needs a non-null GC
                // 
                java.awt.Graphics2D tempG2D = (java.awt.Graphics2D) graphicsContextProvider.getGraphics();
                // Must set here before epf.getSize is called
                tempG2D.setFont(italicFont);
                // Determine how big the expression image will be
                java.awt.Dimension dim = epf.getSize(tempG2D);
                // Create and render the expression image
                java.awt.image.BufferedImage bi = new java.awt.image.BufferedImage(dim.width, dim.height, java.awt.image.BufferedImage.TYPE_INT_RGB);
                java.awt.Graphics2D g2d = bi.createGraphics();
                // epf.paint needs a non-null clipBounds
                g2d.setClip(0, 0, dim.width, dim.height);
                // set the SAME font used in epf.getSize
                g2d.setFont(italicFont);
                if (table != null && imageRenderer != null) {
                    g2d.setBackground(imageRenderer.getBackground());
                    g2d.setColor(imageRenderer.getForeground());
                }
                // paint background
                g2d.clearRect(0, 0, dim.width, dim.height);
                // paint expression into image
                epf.paint(g2d);
                // Limit cacheing in case a large number of DIFFERENT expressions are being serviced by this TableCellRenderer.
                if ((scopedExpressionCacheSize + (dim.width * dim.height)) >= CACHE_SIZE_LIMIT) {
                    scopedExpressionImageIconHash.clear();
                    scopedExpressionCacheSize = 0;
                }
                javax.swing.ImageIcon newImageIcon = new javax.swing.ImageIcon(bi);
                rei = new ReusableExpressionIcon(newImageIcon, imageRenderer.getBackground(), imageRenderer.getForeground());
                if (scopedExpressionImageIconHash.put(scopedExpressInfix, rei) == null) {
                    scopedExpressionCacheSize += dim.width * dim.height;
                }
                imageRenderer.setIcon(newImageIcon);
            } catch (Exception e) {
                // Fallback to String
                e.printStackTrace();
                templateJLabel.setText(scopedExpression.infix());
                renderer = templateJLabel;
            }
        }
        ExpressionBindingException expressionBindingException = scopedExpression.getExpressionBindingException();
        if (expressionBindingException != null) {
            renderer.setBorder(BorderFactory.createLineBorder(Color.red));
            renderer.setToolTipText(expressionBindingException.getMessage());
        } else {
            renderer.setBorder(BorderFactory.createEmptyBorder());
            renderer.setToolTipText(null);
        }
        if (tableModel instanceof VCellSortTableModel) {
            List<Issue> issueList = ((VCellSortTableModel<?>) tableModel).getIssues(row, column, Issue.SEVERITY_ERROR);
            if (issueList.size() > 0) {
                renderer.setToolTipText(Issue.getHtmlIssueMessage(issueList));
                if (column == 0) {
                    renderer.setBorder(new MatteBorder(1, 1, 1, 0, Color.red));
                } else if (column == table.getColumnCount() - 1) {
                    renderer.setBorder(new MatteBorder(1, 0, 1, 1, Color.red));
                } else {
                    renderer.setBorder(new MatteBorder(1, 0, 1, 0, Color.red));
                }
            } else {
                renderer.setBorder(BORDER);
            }
        }
        return renderer;
    } catch (Exception e) {
        e.printStackTrace();
        templateJLabel.setText("ScopedExpressionTableCellRenderer Error - " + e.getMessage() + " " + value);
        return templateJLabel;
    }
}
Also used : ImageIcon(javax.swing.ImageIcon) Issue(org.vcell.util.Issue) MatteBorder(javax.swing.border.MatteBorder) ExpressionPrintFormatter(cbit.vcell.parser.ExpressionPrintFormatter) VCellSortTableModel(cbit.vcell.client.desktop.biomodel.VCellSortTableModel) ImageIcon(javax.swing.ImageIcon) SpeciesContextSpecParameter(cbit.vcell.mapping.SpeciesContextSpec.SpeciesContextSpecParameter) JLabel(javax.swing.JLabel) ExpressionBindingException(cbit.vcell.parser.ExpressionBindingException) ExpressionBindingException(cbit.vcell.parser.ExpressionBindingException) Dimension(java.awt.Dimension) ScopedExpression(cbit.gui.ScopedExpression) VCellSortTableModel(cbit.vcell.client.desktop.biomodel.VCellSortTableModel) TableModel(javax.swing.table.TableModel)

Example 20 with Issue

use of org.vcell.util.Issue in project vcell by virtualcell.

the class IssueManager method updateIssues0.

/**
 * @param immediate update now, skip check of {@link #LAST_DIRTY_MILLISECONDS}
 */
private void updateIssues0(boolean immediate) {
    if (vcDocument == null) {
        return;
    }
    if (!immediate) {
        if (dirtyTimestamp == 0) {
            return;
        }
        long elapsedTime = System.currentTimeMillis() - dirtyTimestamp;
        if (elapsedTime < LAST_DIRTY_MILLISECONDS) {
            return;
        }
    }
    try {
        VCDocumentDecorator decorator = VCDocumentDecorator.getDecorator(vcDocument);
        numErrors = 0;
        numWarnings = 0;
        ArrayList<Issue> oldIssueList = new ArrayList<Issue>(issueList);
        ArrayList<Issue> tempIssueList = new ArrayList<Issue>();
        IssueContext issueContext = new ManagerContext();
        decorator.gatherIssues(issueContext, tempIssueList);
        // vcDocument.gatherIssues(issueContext,tempIssueList);
        issueList = new ArrayList<Issue>();
        for (Issue issue : tempIssueList) {
            if (issue instanceof SimpleBoundsIssue) {
                continue;
            }
            issueList.add(issue);
            Severity severity = issue.getSeverity();
            if (severity == Issue.Severity.ERROR) {
                numErrors++;
            } else if (severity == Issue.Severity.WARNING) {
                numWarnings++;
            }
        }
        fireIssueEventListener(new IssueEvent(vcDocument, oldIssueList, issueList));
    // System.out.println("\n................... update performed .................." + System.currentTimeMillis());
    } finally {
        dirtyTimestamp = 0;
        if (bMoreTime) {
            setDirty();
            bMoreTime = false;
        }
    }
}
Also used : SimpleBoundsIssue(cbit.vcell.model.SimpleBoundsIssue) Issue(org.vcell.util.Issue) VCDocumentDecorator(cbit.vcell.client.desktop.VCDocumentDecorator) SimpleBoundsIssue(cbit.vcell.model.SimpleBoundsIssue) ArrayList(java.util.ArrayList) IssueContext(org.vcell.util.IssueContext) Severity(org.vcell.util.Issue.Severity)

Aggregations

Issue (org.vcell.util.Issue)88 ArrayList (java.util.ArrayList)18 IssueContext (org.vcell.util.IssueContext)14 Expression (cbit.vcell.parser.Expression)13 ExpressionException (cbit.vcell.parser.ExpressionException)13 PropertyVetoException (java.beans.PropertyVetoException)9 MolecularType (org.vcell.model.rbm.MolecularType)9 Structure (cbit.vcell.model.Structure)8 VCUnitDefinition (cbit.vcell.units.VCUnitDefinition)8 SymbolTableEntry (cbit.vcell.parser.SymbolTableEntry)7 MolecularComponentPattern (org.vcell.model.rbm.MolecularComponentPattern)7 Model (cbit.vcell.model.Model)6 ModelParameter (cbit.vcell.model.Model.ModelParameter)6 ExpressionBindingException (cbit.vcell.parser.ExpressionBindingException)6 BioModel (cbit.vcell.biomodel.BioModel)5 ModelException (cbit.vcell.model.ModelException)5 Product (cbit.vcell.model.Product)5 Reactant (cbit.vcell.model.Reactant)5 ReactionParticipant (cbit.vcell.model.ReactionParticipant)5 InteriorPoint (org.sbml.jsbml.ext.spatial.InteriorPoint)5