Search in sources :

Example 16 with MolecularComponentPattern

use of org.vcell.model.rbm.MolecularComponentPattern 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 17 with MolecularComponentPattern

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

the class SpeciesContext method checkComponentStateConsistency.

public void checkComponentStateConsistency(IssueContext issueContext, List<Issue> issueList, MolecularTypePattern mtpThis) {
    issueContext = issueContext.newChildContext(ContextType.SpeciesContext, this);
    MolecularType mtThat = mtpThis.getMolecularType();
    for (MolecularComponentPattern mcpThis : mtpThis.getComponentPatternList()) {
        ComponentStatePattern cspThis = mcpThis.getComponentStatePattern();
        String mcNameThis = mcpThis.getMolecularComponent().getName();
        MolecularComponent[] mcThatList = mtThat.getMolecularComponents(mcNameThis);
        if (mcThatList.length == 0) {
            System.out.println("we already fired an issue about component missing");
            // nothing to do here, we already fired an issue about component missing
            continue;
        } else if (mcThatList.length > 1) {
            String msg = "Multiple " + MolecularComponent.typeName + "s with the same name are not yet supported.";
            issueList.add(new Issue(this, issueContext, IssueCategory.Identifiers, msg, Issue.SEVERITY_ERROR));
        } else {
            // found exactly 1 component
            MolecularComponent mcThat = mcThatList[0];
            List<ComponentStateDefinition> csdListThat = mcThat.getComponentStateDefinitions();
            if (csdListThat.size() == 0) {
                // component has no states, we check if mcpThis has any states... it shouldn't
                if (cspThis == null) {
                    // all is well
                    continue;
                }
                if (!cspThis.isAny() || (cspThis.getComponentStateDefinition() != null)) {
                    String msg = MolecularComponentPattern.typeName + " " + mcNameThis + " is in an invalid State.";
                    issueList.add(new Issue(this, mcpThis, issueContext, IssueCategory.Identifiers, msg, null, Issue.SEVERITY_WARNING));
                }
            } else {
                // we check if mcpThis has any of these states... it should!
                if ((cspThis == null) || cspThis.isAny() || (cspThis.getComponentStateDefinition() == null)) {
                    String msg = MolecularComponentPattern.typeName + " " + mcNameThis + " must be in an explicit State.";
                    issueList.add(new Issue(this, mcpThis, issueContext, IssueCategory.Identifiers, msg, null, Issue.Severity.ERROR));
                } else {
                    String csdNameThis = cspThis.getComponentStateDefinition().getName();
                    if (csdNameThis.isEmpty() || (mcThat.getComponentStateDefinition(csdNameThis) == null)) {
                        String msg = "Invalid State " + csdNameThis + " for " + MolecularComponentPattern.typeName + " " + mcNameThis;
                        issueList.add(new Issue(this, mcpThis, issueContext, IssueCategory.Identifiers, msg, null, Issue.SEVERITY_WARNING));
                    }
                }
            }
        }
    }
}
Also used : MolecularType(org.vcell.model.rbm.MolecularType) Issue(org.vcell.util.Issue) MolecularComponentPattern(org.vcell.model.rbm.MolecularComponentPattern) MolecularComponent(org.vcell.model.rbm.MolecularComponent) ComponentStatePattern(org.vcell.model.rbm.ComponentStatePattern) List(java.util.List)

Example 18 with MolecularComponentPattern

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

the class SpeciesContext method deleteComponentFromPatterns.

public boolean deleteComponentFromPatterns(MolecularType mt, MolecularComponent mc) {
    if (!hasSpeciesPattern()) {
        return true;
    }
    SpeciesPattern sp = getSpeciesPattern();
    for (MolecularTypePattern mtp : sp.getMolecularTypePatterns()) {
        if (mtp.getMolecularType() == mt) {
            List<MolecularComponentPattern> componentPatterns = mtp.getComponentPatternList();
            for (Iterator<MolecularComponentPattern> iterator = componentPatterns.iterator(); iterator.hasNext(); ) {
                MolecularComponentPattern mcp = iterator.next();
                if (mcp.getMolecularComponent() == mc) {
                    iterator.remove();
                }
            }
        }
    }
    sp.resolveBonds();
    return true;
}
Also used : MolecularComponentPattern(org.vcell.model.rbm.MolecularComponentPattern) MolecularTypePattern(org.vcell.model.rbm.MolecularTypePattern) SpeciesPattern(org.vcell.model.rbm.SpeciesPattern)

Example 19 with MolecularComponentPattern

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

the class SpeciesContext method gatherIssues.

public void gatherIssues(IssueContext issueContext, List<Issue> issueList) {
    issueContext = issueContext.newChildContext(ContextType.SpeciesContext, this);
    if (species == null) {
        issueList.add(new Issue(this, issueContext, IssueCategory.Identifiers, "Species is null", Issue.SEVERITY_WARNING));
    } else {
        if (speciesPattern != null) {
            checkBondsSufficiency(issueContext, issueList, speciesPattern);
            speciesPattern.checkSpeciesPattern(issueContext, issueList);
            speciesPattern.gatherIssues(issueContext, issueList);
            for (MolecularType mtThat : model.getRbmModelContainer().getMolecularTypeList()) {
                for (MolecularTypePattern mtpThis : speciesPattern.getMolecularTypePatterns()) {
                    if (mtThat.getName().equals(mtpThis.getMolecularType().getName())) {
                        // this should never fire issues!!!
                        checkMolecularTypeConsistency(issueContext, issueList, mtThat, mtpThis);
                        if (!mtThat.compareEqual(mtpThis.getMolecularType())) {
                            String msg = MolecularType.typeName + "s " + mtThat.getName() + " and " + mtpThis.getMolecularType().getName() + " do not compare equal.";
                            issueList.add(new Issue(this, issueContext, IssueCategory.Identifiers, msg, Issue.SEVERITY_WARNING));
                        } else {
                        // TODO: components cannot be missing, see if this test is really needed
                        // TODO: the isImplied test is wrong here
                        // String msg = "All components in the " + mtThat.getDisplayType() + " definition must be present. Missing:";
                        // boolean isInvalid = false;
                        // for(int i=0; i< mtpThis.getComponentPatternList().size(); i++) {
                        // MolecularComponentPattern mcp = mtpThis.getComponentPatternList().get(i);
                        // if(mcp.isImplied()) {
                        // if(isInvalid) {
                        // msg += ",";
                        // }
                        // isInvalid = true;
                        // msg += " " + mcp.getMolecularComponent().getName();
                        // }
                        // }
                        // if(isInvalid) {
                        // msg += ".";
                        // issueList.add(new Issue(this, issueContext, IssueCategory.Identifiers, msg, Issue.Severity.ERROR));
                        // }
                        }
                    }
                }
            }
            // if the component has states, the component pattern must have ONE of those states
            for (MolecularTypePattern mtpThis : speciesPattern.getMolecularTypePatterns()) {
                checkComponentStateConsistency(issueContext, issueList, mtpThis);
            }
            // the bond must not be ambiguous - seed species must be either unbound or specified (explicit) bond
            for (MolecularTypePattern mtpThis : speciesPattern.getMolecularTypePatterns()) {
                for (MolecularComponentPattern mcpThis : mtpThis.getComponentPatternList()) {
                    if (mcpThis.getBondType() == BondType.Possible || mcpThis.getBondType() == BondType.Exists) {
                        String msg = "The Bond of " + mcpThis.getMolecularComponent().getDisplayName() + " must be 'Unbound' or explicit.";
                        issueList.add(new Issue(this, mcpThis, issueContext, IssueCategory.Identifiers, msg, null, Issue.Severity.ERROR));
                    }
                }
            }
            // the structure must be in the list of anchors, if anchors are being used
            for (MolecularTypePattern mtp : speciesPattern.getMolecularTypePatterns()) {
                MolecularType mt = mtp.getMolecularType();
                if (mt.isAnchorAll()) {
                    // no restrictions for this molecular type
                    continue;
                }
                if (!mt.getAnchors().contains(structure)) {
                    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));
                }
            }
            // check for reserved name 'trash'
            for (MolecularTypePattern mtp : speciesPattern.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 seed species.";
                    issueList.add(new Issue(this, issueContext, IssueCategory.Identifiers, message, Issue.Severity.WARNING));
                }
            }
        }
    }
}
Also used : MolecularType(org.vcell.model.rbm.MolecularType) Issue(org.vcell.util.Issue) MolecularComponentPattern(org.vcell.model.rbm.MolecularComponentPattern) MolecularTypePattern(org.vcell.model.rbm.MolecularTypePattern)

Example 20 with MolecularComponentPattern

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

the class RbmReactionParticipantTreeCellRenderer method getTreeCellRendererComponent.

@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
    super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
    setBorder(null);
    if (value instanceof BioModelNode) {
        BioModelNode node = (BioModelNode) value;
        Object userObject = node.getUserObject();
        obj = userObject;
        String text = null;
        Icon icon = null;
        String toolTip = null;
        if (userObject instanceof ReactionRule) {
            ReactionRule rr = (ReactionRule) userObject;
            text = toHtml(rr);
            toolTip = toHtmlWithTip(rr);
            icon = rr.isReversible() ? VCellIcons.rbmReactRuleReversIcon : VCellIcons.rbmReactRuleDirectIcon;
        } else if (userObject instanceof ReactionRuleParticipantLocal) {
            ReactionRuleParticipantLocal rrp = (ReactionRuleParticipantLocal) userObject;
            text = toHtml(rrp, true);
            toolTip = toHtmlWithTip(rrp, true);
            icon = rrp.type == ReactionRuleParticipantType.Reactant ? VCellIcons.rbmReactantIcon : VCellIcons.rbmProductIcon;
        } else if (userObject instanceof MolecularTypePattern) {
            MolecularTypePattern molecularTypePattern = (MolecularTypePattern) userObject;
            text = toHtml(molecularTypePattern, true);
            toolTip = toHtmlWithTip(molecularTypePattern, true);
            if (owner == null) {
                icon = VCellIcons.rbmMolecularTypeSimpleIcon;
                ;
            } else {
                Graphics gc = owner.getGraphics();
                icon = new MolecularTypeSmallShape(1, 5, molecularTypePattern.getMolecularType(), null, gc, molecularTypePattern.getMolecularType(), null, issueManager);
            }
        } else if (userObject instanceof MolecularComponentPattern) {
            MolecularComponentPattern mcp = (MolecularComponentPattern) userObject;
            text = toHtml(mcp, true);
            toolTip = toHtmlWithTip(mcp, true);
            icon = VCellIcons.rbmComponentGrayIcon;
            if (mcp.getMolecularComponent().getComponentStateDefinitions().size() > 0) {
                icon = VCellIcons.rbmComponentGrayStateIcon;
            }
            if (mcp.isbVisible()) {
                icon = VCellIcons.rbmComponentGreenIcon;
                if (mcp.getMolecularComponent().getComponentStateDefinitions().size() > 0) {
                    icon = VCellIcons.rbmComponentGreenStateIcon;
                }
            }
            ComponentStatePattern csp = mcp.getComponentStatePattern();
            if (csp != null && !csp.isAny()) {
                icon = VCellIcons.rbmComponentGreenIcon;
                if (mcp.getMolecularComponent().getComponentStateDefinitions().size() > 0) {
                    icon = VCellIcons.rbmComponentGreenStateIcon;
                }
            }
            BioModelNode parent = (BioModelNode) ((BioModelNode) value).getParent().getParent().getParent();
            if (parent == null) {
                icon = VCellIcons.rbmComponentErrorIcon;
                return this;
            }
        } else if (userObject instanceof StateLocal) {
            StateLocal sl = (StateLocal) userObject;
            text = toHtml(sl, true);
            toolTip = toHtmlWithTip(sl, true);
            icon = VCellIcons.rbmComponentStateIcon;
        } else if (userObject instanceof BondLocal) {
            BondLocal bl = (BondLocal) userObject;
            text = toHtml(bl, sel);
            toolTip = toHtmlWithTip(bl, true);
            icon = VCellIcons.rbmBondIcon;
        } else if (userObject instanceof ParticipantMatchLabelLocal) {
            ParticipantMatchLabelLocal pmll = (ParticipantMatchLabelLocal) userObject;
            text = toHtml(pmll, sel);
            toolTip = toHtmlWithTip(pmll, true);
            icon = VCellIcons.rbmBondIcon;
        } else {
            if (userObject != null) {
                System.out.println(userObject.toString());
                text = userObject.toString();
            } else {
                text = "null user object";
            }
        }
        setText(text);
        setIcon(icon);
        setToolTipText(toolTip == null ? text : toolTip);
    }
    return this;
}
Also used : ReactionRule(cbit.vcell.model.ReactionRule) MolecularComponentPattern(org.vcell.model.rbm.MolecularComponentPattern) ComponentStatePattern(org.vcell.model.rbm.ComponentStatePattern) StateLocal(cbit.vcell.client.desktop.biomodel.RbmDefaultTreeModel.StateLocal) ParticipantMatchLabelLocal(cbit.vcell.client.desktop.biomodel.RbmDefaultTreeModel.ParticipantMatchLabelLocal) BioModelNode(cbit.vcell.desktop.BioModelNode) Graphics(java.awt.Graphics) MolecularTypeSmallShape(cbit.vcell.graph.MolecularTypeSmallShape) BondLocal(cbit.vcell.client.desktop.biomodel.RbmDefaultTreeModel.BondLocal) ReactionRuleParticipantLocal(cbit.vcell.client.desktop.biomodel.RbmDefaultTreeModel.ReactionRuleParticipantLocal) Icon(javax.swing.Icon) MolecularTypePattern(org.vcell.model.rbm.MolecularTypePattern)

Aggregations

MolecularComponentPattern (org.vcell.model.rbm.MolecularComponentPattern)62 MolecularTypePattern (org.vcell.model.rbm.MolecularTypePattern)49 SpeciesPattern (org.vcell.model.rbm.SpeciesPattern)30 ComponentStatePattern (org.vcell.model.rbm.ComponentStatePattern)25 Graphics (java.awt.Graphics)16 MolecularComponent (org.vcell.model.rbm.MolecularComponent)14 Point (java.awt.Point)13 MolecularType (org.vcell.model.rbm.MolecularType)12 ComponentStateDefinition (org.vcell.model.rbm.ComponentStateDefinition)10 Icon (javax.swing.Icon)9 BondType (org.vcell.model.rbm.MolecularComponentPattern.BondType)9 Bond (org.vcell.model.rbm.SpeciesPattern.Bond)8 List (java.util.List)7 BioModelNode (cbit.vcell.desktop.BioModelNode)6 MolecularTypeLargeShape (cbit.vcell.graph.MolecularTypeLargeShape)6 MolecularTypeSmallShape (cbit.vcell.graph.MolecularTypeSmallShape)6 RuleAnalysisChanged (cbit.vcell.graph.ReactionCartoon.RuleAnalysisChanged)6 SpeciesPatternLargeShape (cbit.vcell.graph.SpeciesPatternLargeShape)6 SpeciesPatternSmallShape (cbit.vcell.graph.SpeciesPatternSmallShape)6 ZoomShapeIcon (cbit.vcell.graph.gui.ZoomShapeIcon)6