Search in sources :

Example 26 with SpeciesPattern

use of org.vcell.model.rbm.SpeciesPattern in project vcell by virtualcell.

the class ReactionRule method clone.

public static ReactionRule clone(Model newModel, ReactionRule oldRule, Structure newStructure, Map<Structure, String> structuresMap, ReactionSpeciesCopy rsCopy) throws ExpressionBindingException {
    boolean reversible = oldRule.isReversible();
    String newName = oldRule.getName();
    while (true) {
        if (Model.isNameUnused(newName, newModel)) {
            break;
        }
        newName = org.vcell.util.TokenMangler.getNextEnumeratedToken(newName);
        if (rsCopy.getReactionRuleArr() != null) {
            for (ReactionRule from : rsCopy.getReactionRuleArr()) {
                if (from.getName().equalsIgnoreCase(newName)) {
                    // make another new name if current new name is used elsewhere
                    newName = org.vcell.util.TokenMangler.getNextEnumeratedToken(newName);
                    break;
                }
            }
        }
        if (rsCopy.getReactStepArr() != null) {
            for (ReactionStep from : rsCopy.getReactStepArr()) {
                if (from.getName().equalsIgnoreCase(newName)) {
                    newName = org.vcell.util.TokenMangler.getNextEnumeratedToken(newName);
                    break;
                }
            }
        }
        if (rsCopy.getSpeciesContextArr() != null) {
            for (SpeciesContext from : rsCopy.getSpeciesContextArr()) {
                if (from.getName().equalsIgnoreCase(newName)) {
                    newName = org.vcell.util.TokenMangler.getNextEnumeratedToken(newName);
                    break;
                }
            }
        }
    }
    ReactionRule newRule = new ReactionRule(newModel, newName, newStructure, reversible);
    for (ReactantPattern oldrp : oldRule.getReactantPatterns()) {
        SpeciesPattern newsp = new SpeciesPattern(newModel, oldrp.getSpeciesPattern());
        Structure os = oldrp.getStructure();
        Structure ns = newModel.getStructure(structuresMap.get(os));
        ReactantPattern newrp = new ReactantPattern(newsp, ns);
        // don't try to resolve matches or bonds, we want to mirror whatever is in the old rule
        newRule.addReactant(newrp, false, false);
    }
    for (ProductPattern oldpp : oldRule.getProductPatterns()) {
        SpeciesPattern newsp = new SpeciesPattern(newModel, oldpp.getSpeciesPattern());
        Structure os = oldpp.getStructure();
        Structure ns = newModel.getStructure(structuresMap.get(os));
        ProductPattern newpp = new ProductPattern(newsp, ns);
        newRule.addProduct(newpp, false, false);
    }
    RateLawType rateLawType = oldRule.getKineticLaw().getRateLawType();
    if (rateLawType != RateLawType.MassAction) {
        throw new RuntimeException("Only Mass Action Kinetics supported at this time, " + ReactionRule.typeName + " \"" + oldRule.getName() + "\" uses kinetic law type \"" + rateLawType.toString() + "\"");
    }
    RbmKineticLaw newKineticLaw = new RbmKineticLaw(newRule, rateLawType);
    // RbmKineticLaw.duplicate(kineticLaw, oldRule);
    RbmKineticLaw.clone(newKineticLaw, oldRule, newRule);
    newRule.setKineticLaw(newKineticLaw);
    newKineticLaw.bind(newRule);
    return newRule;
}
Also used : SpeciesPattern(org.vcell.model.rbm.SpeciesPattern) RateLawType(cbit.vcell.model.RbmKineticLaw.RateLawType)

Example 27 with SpeciesPattern

use of org.vcell.model.rbm.SpeciesPattern in project vcell by virtualcell.

the class ReactionRule method deriveDirectRule.

public static ReactionRule deriveDirectRule(ReactionRule oldRule) throws ExpressionBindingException, PropertyVetoException {
    Model m = oldRule.getModel();
    Structure s = oldRule.getStructure();
    boolean bR = false;
    String newName = oldRule.getDisplayName() + DirectHalf;
    ReactionRule newRule = new ReactionRule(m, newName, s, bR);
    RbmKineticLaw oldLaw = oldRule.getKineticLaw();
    RateLawType rateLawType = oldLaw.getRateLawType();
    if (rateLawType != RateLawType.MassAction) {
        throw new RuntimeException("Only Mass Action Kinetics supported at this time, " + ReactionRule.typeName + " \"" + oldRule.getName() + "\" uses kinetic law type \"" + rateLawType.toString() + "\"");
    }
    RbmKineticLaw newLaw = new RbmKineticLaw(newRule, rateLawType);
    newRule.setKineticLaw(newLaw);
    LocalParameter oldfr = oldLaw.getLocalParameter(RbmKineticLawParameterType.MassActionForwardRate);
    Expression exp = new Expression(oldfr.getExpression());
    newLaw.setLocalParameterValue(RbmKineticLawParameterType.MassActionForwardRate, exp);
    for (ReactantPattern oldrp : oldRule.getReactantPatterns()) {
        SpeciesPattern newsp = new SpeciesPattern(m, oldrp.getSpeciesPattern());
        ReactantPattern newrp = new ReactantPattern(newsp, oldrp.getStructure());
        // don't try to resolve matches or bonds, we want to mirror whatever is in the old rule
        newRule.addReactant(newrp, false, false);
    }
    for (ProductPattern oldpp : oldRule.getProductPatterns()) {
        SpeciesPattern newsp = new SpeciesPattern(m, oldpp.getSpeciesPattern());
        ProductPattern newpp = new ProductPattern(newsp, oldpp.getStructure());
        newRule.addProduct(newpp, false, false);
    }
    newLaw.bind(newRule);
    return newRule;
}
Also used : SpeciesPattern(org.vcell.model.rbm.SpeciesPattern) LocalParameter(cbit.vcell.mapping.ParameterContext.LocalParameter) Expression(cbit.vcell.parser.Expression) RateLawType(cbit.vcell.model.RbmKineticLaw.RateLawType)

Example 28 with SpeciesPattern

use of org.vcell.model.rbm.SpeciesPattern in project vcell by virtualcell.

the class ReactionRule method gatherIssues.

// -----------------------------------------------------------------------------------------------------
// 
public void gatherIssues(IssueContext issueContext, List<Issue> issueList) {
    issueContext = issueContext.newChildContext(ContextType.ReactionRule, this);
    if (name == null || name.isEmpty()) {
        issueList.add(new Issue(this, issueContext, IssueCategory.Identifiers, "Label is missing", Issue.Severity.ERROR));
    }
    if (name != null && name.startsWith("_reverse_")) {
        String msg = "The prefix '_reverse_' is a BioNetGen reserved keyword. Please rename the " + typeName + ".";
        issueList.add(new Issue(this, issueContext, IssueCategory.Identifiers, msg, Issue.Severity.ERROR));
    }
    for (MolecularType mt : model.getRbmModelContainer().getMolecularTypeList()) {
        if (mt.getName().equals(name)) {
            String msg = "Name '" + name + "' name already used for " + mt.getDisplayType() + " '" + mt.getName() + "'.";
            issueList.add(new Issue(this, issueContext, IssueCategory.Identifiers, msg, Issue.Severity.WARNING));
            // no need to look further, we won't find another match since Molecule names are unique
            break;
        }
    }
    if (reactantPatterns == null) {
        issueList.add(new Issue(this, issueContext, IssueCategory.Identifiers, "Reactant Pattern is null", Issue.Severity.ERROR));
    } else if (reactantPatterns.isEmpty()) {
        String msg = typeName + " " + name + " does not have any Reactants.\n";
        issueList.add(new Issue(this, issueContext, IssueCategory.Identifiers, msg, Issue.Severity.ERROR));
    } else {
        checkReactantPatterns(issueContext, issueList);
        for (ReactantPattern rp : reactantPatterns) {
            issueContext = issueContext.newChildContext(ContextType.ReactionRule, this);
            rp.getSpeciesPattern().gatherIssues(issueContext, issueList);
        }
    }
    if (productPatterns == null) {
        issueList.add(new Issue(this, issueContext, IssueCategory.Identifiers, "Product Pattern is null", Issue.Severity.ERROR));
    } else if (productPatterns.isEmpty()) {
        String msg = typeName + " " + name + " does not have any Products.\n";
        issueList.add(new Issue(this, issueContext, IssueCategory.Identifiers, msg, Issue.Severity.ERROR));
    } else {
        checkProductPatterns(issueContext, issueList);
        for (ProductPattern pp : productPatterns) {
            issueContext = issueContext.newChildContext(ContextType.ReactionRule, this);
            pp.getSpeciesPattern().gatherIssues(issueContext, issueList);
        }
    }
    kineticLaw.gatherIssues(issueContext, issueList);
    if (molecularTypeMappings == null) {
        issueList.add(new Issue(this, issueContext, IssueCategory.KineticsExpressionMissing, MolecularType.typeName + " Mapping is null", Issue.Severity.WARNING));
    }
    // the structure must be in the list of anchors, if anchors are being used -------------------------------
    for (ReactantPattern rp : reactantPatterns) {
        SpeciesPattern sp = rp.getSpeciesPattern();
        for (MolecularTypePattern mtp : sp.getMolecularTypePatterns()) {
            MolecularType mt = mtp.getMolecularType();
            if (mt.isAnchorAll()) {
                // no restrictions for this molecular type
                continue;
            }
            if (!mt.getAnchors().contains(rp.getStructure())) {
                String message = "The Structure " + structure.getName() + " is not allowed for the Molecule " + mt.getDisplayName();
                issueList.add(new Issue(this, issueContext, IssueCategory.Identifiers, message, Issue.Severity.ERROR));
            }
        }
    }
    for (ProductPattern pp : productPatterns) {
        SpeciesPattern sp = pp.getSpeciesPattern();
        for (MolecularTypePattern mtp : sp.getMolecularTypePatterns()) {
            MolecularType mt = mtp.getMolecularType();
            if (mt.isAnchorAll()) {
                // no restrictions for this molecular type
                continue;
            }
            if (!mt.getAnchors().contains(pp.getStructure())) {
                String message = "The Structure " + structure.getName() + " is not allowed for the Molecule " + mt.getDisplayName();
                issueList.add(new Issue(this, issueContext, IssueCategory.Identifiers, message, Issue.Severity.ERROR));
            }
        }
    }
    for (ReactantPattern rp : reactantPatterns) {
        SpeciesPattern sp = rp.getSpeciesPattern();
        for (MolecularTypePattern mtp : sp.getMolecularTypePatterns()) {
            String name = mtp.getMolecularType().getDisplayName().toLowerCase();
            if (name.equals("trash")) {
                String message = "'Trash' is a reserved NFSim keyword and it cannot be used as a reactant.";
                issueList.add(new Issue(this, issueContext, IssueCategory.Identifiers, message, Issue.Severity.WARNING));
            }
        }
    }
    if (bReversible) {
        for (ProductPattern pp : productPatterns) {
            SpeciesPattern sp = pp.getSpeciesPattern();
            for (MolecularTypePattern mtp : sp.getMolecularTypePatterns()) {
                String name = mtp.getMolecularType().getDisplayName().toLowerCase();
                if (name.equals("trash")) {
                    String message = "'Trash' is a reserved NFSim keyword and it cannot be used as a reactant.";
                    issueList.add(new Issue(this, issueContext, IssueCategory.Identifiers, message, Issue.Severity.WARNING));
                }
            }
        }
    }
    // match management
    issueContext = issueContext.newChildContext(ContextType.ReactionRule, this);
    Map<String, Integer> matchedReactants = new LinkedHashMap<String, Integer>();
    Map<String, Integer> unmatchedReactants = new LinkedHashMap<String, Integer>();
    Map<String, MolecularTypePattern> rMatches = new LinkedHashMap<String, MolecularTypePattern>();
    for (ReactantPattern rp : reactantPatterns) {
        SpeciesPattern sp = rp.getSpeciesPattern();
        for (MolecularTypePattern mtp : sp.getMolecularTypePatterns()) {
            String thisName = mtp.getMolecularType().getDisplayName();
            if (!mtp.hasExplicitParticipantMatch()) {
                if (unmatchedReactants.containsKey(thisName)) {
                    int newCounter = unmatchedReactants.get(thisName) + 1;
                    unmatchedReactants.put(thisName, newCounter);
                } else {
                    unmatchedReactants.put(thisName, 1);
                }
                continue;
            }
            // the value doesn't matter, it's important to be there
            matchedReactants.put(thisName, 99);
            String key = mtp.getParticipantMatchLabel();
            if (rMatches.containsKey(key)) {
                // no duplicates in reactants allowed
                String message = "Multiple Reactants with the same match id " + key + " are not allowed.";
                issueList.add(new Issue(this, issueContext, IssueCategory.Identifiers, message, Issue.Severity.WARNING));
            } else {
                rMatches.put(key, mtp);
            }
        }
    }
    Map<String, Integer> matchedProducts = new LinkedHashMap<String, Integer>();
    Map<String, Integer> unmatchedProducts = new LinkedHashMap<String, Integer>();
    Map<String, MolecularTypePattern> pMatches = new LinkedHashMap<String, MolecularTypePattern>();
    for (ProductPattern pp : productPatterns) {
        SpeciesPattern sp = pp.getSpeciesPattern();
        for (MolecularTypePattern mtp : sp.getMolecularTypePatterns()) {
            String thisName = mtp.getMolecularType().getDisplayName();
            if (!mtp.hasExplicitParticipantMatch()) {
                if (unmatchedProducts.containsKey(thisName)) {
                    int newCounter = unmatchedProducts.get(thisName) + 1;
                    unmatchedProducts.put(thisName, newCounter);
                } else {
                    unmatchedProducts.put(thisName, 1);
                }
                continue;
            }
            matchedProducts.put(thisName, 100);
            String key = mtp.getParticipantMatchLabel();
            if (pMatches.containsKey(key)) {
                // no duplicates in products allowed
                String message = "Multiple Products with the same match id " + key + " are not allowed.";
                issueList.add(new Issue(this, issueContext, IssueCategory.Identifiers, message, Issue.Severity.WARNING));
            } else {
                pMatches.put(key, mtp);
            }
        }
    }
    // 2+ unmatched reactants and 1+ unmatched products of same molecule mean error (or vice-versa: 1+ && 2+)
    for (String key : unmatchedReactants.keySet()) {
        if (unmatchedProducts.containsKey(key)) {
            // both maps have the same unmatched molecule, anything larger than 1 and 1 means matching error
            int rCounter = unmatchedReactants.get(key);
            int pCounter = unmatchedProducts.get(key);
            if ((rCounter > 1 && pCounter > 1) || (rCounter > 0 && pCounter > 1)) {
                String message = "Matching missing for Molecule " + key;
                issueList.add(new Issue(this, issueContext, IssueCategory.Identifiers, message, Issue.Severity.ERROR));
            }
        }
    }
    // must look also for combination with matches and unmatches for the same molecule like pA rA matched AND also pA and rA unmatched - one of each unmatched
    for (String key : unmatchedReactants.keySet()) {
        if (unmatchedProducts.containsKey(key) && matchedProducts.containsKey(key) && matchedReactants.containsKey(key)) {
            int rCounter = matchedReactants.get(key);
            int pCounter = matchedProducts.get(key);
            if (rCounter == 1 && pCounter == 1) {
                // the cases when either is >1 was addressed above, don't need duplicates
                String message = "Matching missing for Molecule " + key;
                issueList.add(new Issue(this, issueContext, IssueCategory.Identifiers, message, Issue.Severity.ERROR));
            }
        }
    }
    // unmatched products must be unambiguous (bond can't be 'possible' and state can't be 'any')
    for (ProductPattern pp : productPatterns) {
        SpeciesPattern sp = pp.getSpeciesPattern();
        for (MolecularTypePattern mtp : sp.getMolecularTypePatterns()) {
            MolecularTypePattern match = getMatchingReactantMolecule(mtp);
            if (match == null) {
                // this product has no reactant to match
                for (MolecularComponentPattern mcp : mtp.getComponentPatternList()) {
                    if (mcp.isAmbiguousBond()) {
                        String message = "Ambiguous bond '" + mcp.getBondType().name() + "' in site '" + mcp.getMolecularComponent().getDisplayName() + "' in unmatched product molecule '" + mtp.getMolecularType().getDisplayName() + "'";
                        issueList.add(new Issue(this, mcp, issueContext, IssueCategory.Identifiers, message, message, Issue.Severity.ERROR));
                    }
                    if (mcp.isAmbiguousState()) {
                        String message = "Ambiguous state 'any' in site '" + mcp.getMolecularComponent().getDisplayName() + "' in unmatched product molecule '" + mtp.getMolecularType().getDisplayName() + "'";
                        issueList.add(new Issue(this, mcp, issueContext, IssueCategory.Identifiers, message, message, Issue.Severity.ERROR));
                    }
                }
            }
        }
    }
    if (bReversible) {
        // same as above for reactants if the rule is reversible
        for (ReactantPattern rp : reactantPatterns) {
            SpeciesPattern sp = rp.getSpeciesPattern();
            for (MolecularTypePattern mtp : sp.getMolecularTypePatterns()) {
                MolecularTypePattern match = getMatchingProductMolecule(mtp);
                if (match == null) {
                    for (MolecularComponentPattern mcp : mtp.getComponentPatternList()) {
                        if (mcp.isAmbiguousBond()) {
                            String message = "Ambiguous bond '" + mcp.getBondType().name() + "' in site '" + mcp.getMolecularComponent().getDisplayName() + "' in unmatched reactant molecule '" + mtp.getMolecularType().getDisplayName() + "'";
                            issueList.add(new Issue(this, mcp, issueContext, IssueCategory.Identifiers, message, message, Issue.Severity.ERROR));
                        }
                        if (mcp.isAmbiguousState()) {
                            String message = "Ambiguous state 'any' in site '" + mcp.getMolecularComponent().getDisplayName() + "' in unmatched reactant molecule '" + mtp.getMolecularType().getDisplayName() + "'";
                            issueList.add(new Issue(this, mcp, issueContext, IssueCategory.Identifiers, message, message, Issue.Severity.ERROR));
                        }
                    }
                }
            }
        }
    }
    // invalid combinations of bonds / states for corresponding reactant/product component pairs
    for (ReactantPattern rp : reactantPatterns) {
        SpeciesPattern sp = rp.getSpeciesPattern();
        for (MolecularTypePattern mtpReactant : sp.getMolecularTypePatterns()) {
            MolecularTypePattern mtpProduct = getMatchingProductMolecule(mtpReactant);
            // mtpProduct may be null (perhaps we don't have yet any explicit or implicit match for this reactant)
            if (mtpProduct == null) {
                continue;
            }
            for (MolecularComponentPattern mcpReactant : mtpReactant.getComponentPatternList()) {
                // search for a match of the component in this product molecule
                MolecularComponentPattern mcpProduct = ReactionRule.getMatchingComponent(mtpProduct, mcpReactant);
                if (mcpProduct == null) {
                    throw new RuntimeException("Reactant Site " + mcpReactant.getDisplayName() + " is missing its matching Product Site.");
                }
                boolean incompatibleBonds = false;
                switch(mcpReactant.getBondType()) {
                    case Exists:
                        switch(mcpProduct.getBondType()) {
                            case Exists:
                                break;
                            case None:
                                incompatibleBonds = true;
                                break;
                            case Possible:
                                incompatibleBonds = true;
                                break;
                            case Specified:
                                incompatibleBonds = true;
                                break;
                        }
                        break;
                    case None:
                        switch(mcpProduct.getBondType()) {
                            case Exists:
                                incompatibleBonds = true;
                                break;
                            case None:
                                break;
                            case Possible:
                                incompatibleBonds = true;
                                break;
                            case Specified:
                                break;
                        }
                        break;
                    case Possible:
                        switch(mcpProduct.getBondType()) {
                            case Exists:
                                incompatibleBonds = true;
                                break;
                            case None:
                                incompatibleBonds = true;
                                break;
                            case Possible:
                                break;
                            case Specified:
                                incompatibleBonds = true;
                                break;
                        }
                        break;
                    case Specified:
                        switch(mcpProduct.getBondType()) {
                            case Exists:
                                incompatibleBonds = true;
                                break;
                            case None:
                                break;
                            case Possible:
                                incompatibleBonds = true;
                                break;
                            case Specified:
                                break;
                        }
                        break;
                }
                // ----- end of bonds switch
                if (incompatibleBonds) {
                    String message = "Reactant " + MolecularComponentPattern.typeName + " " + mcpReactant.getDisplayName();
                    message += " and its matching Product " + MolecularComponentPattern.typeName + " " + mcpProduct.getDisplayName() + " have incompatible Bond Types.";
                    issueList.add(new Issue(this, mcpProduct, issueContext, IssueCategory.Identifiers, message, message, Issue.Severity.ERROR));
                }
                boolean incompatibleStates = true;
                if (mcpReactant.getMolecularComponent().getComponentStateDefinitions().isEmpty()) {
                // nothing to do if there are no States defined
                } else {
                    ComponentStatePattern cspReactant = mcpReactant.getComponentStatePattern();
                    ComponentStatePattern cspProduct = mcpProduct.getComponentStatePattern();
                    if (cspReactant == null) {
                        String message = "Required " + ComponentStatePattern.typeName + " missing for " + MolecularComponentPattern.typeName + " " + mcpReactant.getDisplayName();
                        issueList.add(new Issue(this, mcpReactant, issueContext, IssueCategory.Identifiers, message, message, Issue.Severity.ERROR));
                    }
                    if (cspProduct == null) {
                        String message = "Required " + ComponentStatePattern.typeName + " missing for " + MolecularComponentPattern.typeName + " " + mcpProduct.getDisplayName();
                        issueList.add(new Issue(this, mcpProduct, issueContext, IssueCategory.Identifiers, message, message, Issue.Severity.ERROR));
                    }
                    if (cspReactant.isAny() && cspProduct.isAny()) {
                        incompatibleStates = false;
                    } else if (!cspReactant.isAny() && !cspProduct.isAny()) {
                        incompatibleStates = false;
                    }
                    if (incompatibleStates) {
                        String message = "Reactant " + MolecularComponentPattern.typeName + " " + mcpReactant.getDisplayName();
                        message += " and its matching Product " + MolecularComponentPattern.typeName + " " + mcpProduct.getDisplayName() + " have incompatible States";
                        issueList.add(new Issue(this, mcpProduct, issueContext, IssueCategory.Identifiers, message, message, Issue.Severity.ERROR));
                    }
                }
            }
        }
    }
}
Also used : Issue(org.vcell.util.Issue) MolecularComponentPattern(org.vcell.model.rbm.MolecularComponentPattern) ComponentStatePattern(org.vcell.model.rbm.ComponentStatePattern) SpeciesPattern(org.vcell.model.rbm.SpeciesPattern) LinkedHashMap(java.util.LinkedHashMap) MolecularType(org.vcell.model.rbm.MolecularType) MolecularTypePattern(org.vcell.model.rbm.MolecularTypePattern)

Example 29 with SpeciesPattern

use of org.vcell.model.rbm.SpeciesPattern in project vcell by virtualcell.

the class SpeciesContext method duplicate.

public static SpeciesContext duplicate(SpeciesContext oldSpecies, Structure s, Model m) throws ExpressionBindingException, PropertyVetoException {
    String newName = SpeciesContext.deriveSpeciesName(oldSpecies, m);
    Species newSpecies = new Species(newName, null);
    SpeciesContext newSpeciesContext = new SpeciesContext(null, newName, newSpecies, s);
    SpeciesPattern newsp = new SpeciesPattern(m, oldSpecies.getSpeciesPattern());
    newSpeciesContext.setSpeciesPattern(newsp);
    m.addSpecies(newSpecies);
    m.addSpeciesContext(newSpeciesContext);
    return newSpeciesContext;
}
Also used : SpeciesPattern(org.vcell.model.rbm.SpeciesPattern)

Example 30 with SpeciesPattern

use of org.vcell.model.rbm.SpeciesPattern in project vcell by virtualcell.

the class SpeciesContext method setSpeciesPattern.

public void setSpeciesPattern(SpeciesPattern newValue) {
    if (this.speciesPattern == null && newValue == null) {
        return;
    }
    SpeciesPattern oldValue = speciesPattern;
    this.speciesPattern = newValue;
    if (newValue != null) {
        this.speciesPattern.resolveBonds();
    } else {
        // can happen when you delete the last molecular type pattern of a species pattern (in the species pattern tree property of a species context)
        System.out.println("Species pattern is null.");
    }
    firePropertyChange(PROPERTY_NAME_SPECIES_PATTERN, oldValue, newValue);
}
Also used : SpeciesPattern(org.vcell.model.rbm.SpeciesPattern)

Aggregations

SpeciesPattern (org.vcell.model.rbm.SpeciesPattern)93 MolecularTypePattern (org.vcell.model.rbm.MolecularTypePattern)39 MolecularComponentPattern (org.vcell.model.rbm.MolecularComponentPattern)30 MolecularType (org.vcell.model.rbm.MolecularType)25 RbmObservable (cbit.vcell.model.RbmObservable)22 SpeciesContext (cbit.vcell.model.SpeciesContext)22 Structure (cbit.vcell.model.Structure)22 Point (java.awt.Point)18 ReactionRule (cbit.vcell.model.ReactionRule)16 ArrayList (java.util.ArrayList)16 ComponentStatePattern (org.vcell.model.rbm.ComponentStatePattern)16 Graphics (java.awt.Graphics)13 PropertyVetoException (java.beans.PropertyVetoException)13 SpeciesPatternLargeShape (cbit.vcell.graph.SpeciesPatternLargeShape)12 ProductPattern (cbit.vcell.model.ProductPattern)12 ReactantPattern (cbit.vcell.model.ReactantPattern)12 Dimension (java.awt.Dimension)12 ComponentStateDefinition (org.vcell.model.rbm.ComponentStateDefinition)12 Model (cbit.vcell.model.Model)11 ModelException (cbit.vcell.model.ModelException)11