001package org.biopax.paxtools.model.level3;
002
003import java.util.Set;
004
005/**
006 * <b>Definition</b>: A physical entity whose structure is comprised of other physical entities bound to each other
007 * non-covalently, at least one of which is a macromolecule (e.g. protein, DNA, or RNA). Complexes must be stable enough
008 * to function as a biological unit; in general, the temporary association of an enzyme with its substrate(s) should not
009 * be considered or represented as a complex. A complex is the physical product of an interaction (complexAssembly) and
010 * is not itself considered an interaction.
011 *
012 * <b>Comment</b>: In general, complexes should not be defined recursively so that smaller complexes exist within larger
013 * complexes, i.e. a complex should not be a COMPONENT of another complex (see comments on the COMPONENT property). The
014 * boundaries on the size of complexes described by this class are not defined here, although elements of the cell as
015 * large and dynamic as, e.g., a mitochondrion would typically not be described using this class (later versions of this
016 * ontology may include a cellularComponent class to represent these). The strength of binding and the topology of the
017 * components cannot be described currently, but may be included in future versions of the ontology, depending on
018 * community need.
019 *
020 * <b>Examples</b>: Ribosome, RNA polymerase II. Other examples of this class include complexes of multiple protein
021 * monomers and complexes of proteins and small molecules.
022 */
023
024public interface Complex extends PhysicalEntity {
025
026
027    /**
028     * Defines the PhysicalEntity subunits of this complex. This property should not contain other complexes, i.e. it
029     * should always be a flat representation of the complex. For example, if two protein complexes join to form a
030     * single larger complex via a complex assembly interaction, the component of the new complex should be the
031     * individual proteins of the smaller complexes, not the two smaller complexes themselves. Exceptions are black-box
032     * complexes (i.e. complexes in which the component property is empty), which may be used as component of other
033     * complexes because their constituent parts are unknown / unspecified. The reason for keeping complexes flat is to
034     * signify that there is no information stored in the way complexes are nested, such as assembly order. Otherwise,
035     * the complex assembly order may be implicitly encoded and interpreted by some users, while others created
036     * hierarchical complexes randomly, which could lead to data loss. Additionally, the physicalEntityParticipants used
037     * in the component property are in the context of the complex, thus should not be reused between complexes.  For
038     * instance, a protein may participate in two different complexes, but have different conformation in each.
039     *
040     * @return components of this complex
041     */
042    Set<PhysicalEntity> getComponent();
043
044    /**
045     * Defines the PhysicalEntity subunits of this complex. This property should not contain other complexes, i.e. it
046     * should always be a flat representation of the complex. For example, if two protein complexes join to form a
047     * single larger complex via a complex assembly interaction, the component of the new complex should be the
048     * individual proteins of the smaller complexes, not the two smaller complexes themselves. Exceptions are black-box
049     * complexes (i.e. complexes in which the component property is empty), which may be used as component of other
050     * complexes because their constituent parts are unknown / unspecified. The reason for keeping complexes flat is to
051     * signify that there is no information stored in the way complexes are nested, such as assembly order. Otherwise,
052     * the complex assembly order may be implicitly encoded and interpreted by some users, while others created
053     * hierarchical complexes randomly, which could lead to data loss. Additionally, the physicalEntityParticipants used
054     * in the component property are in the context of the complex, thus should not be reused between complexes.  For
055     * instance, a protein may participate in two different complexes, but have different conformation in each.
056     *
057     * @param component to be added as a new member
058     */
059    void addComponent(PhysicalEntity component);
060
061    /**
062     * Defines the PhysicalEntity subunits of this complex. This property should not contain other complexes, i.e. it
063     * should always be a flat representation of the complex. For example, if two protein complexes join to form a
064     * single larger complex via a complex assembly interaction, the component of the new complex should be the
065     * individual proteins of the smaller complexes, not the two smaller complexes themselves. Exceptions are black-box
066     * complexes (i.e. complexes in which the component property is empty), which may be used as component of other
067     * complexes because their constituent parts are unknown / unspecified. The reason for keeping complexes flat is to
068     * signify that there is no information stored in the way complexes are nested, such as assembly order. Otherwise,
069     * the complex assembly order may be implicitly encoded and interpreted by some users, while others created
070     * hierarchical complexes randomly, which could lead to data loss. Additionally, the physicalEntityParticipants used
071     * in the component property are in the context of the complex, thus should not be reused between complexes.  For
072     * instance, a protein may participate in two different complexes, but have different conformation in each.
073     * @param component to be removed from members.
074     */
075    void removeComponent(PhysicalEntity component);
076
077    /**
078     * The stoichiometry of components in a complex.
079     *
080     * @return the stoichiometry of components in a complex.
081     */
082    Set<Stoichiometry> getComponentStoichiometry();
083
084    /**
085     * The stoichiometry of components in a complex.
086     *
087     * @param stoichiometry add a stoichiometry for the member.
088     */
089    void addComponentStoichiometry(Stoichiometry stoichiometry);
090
091      /**
092     * The stoichiometry of components in a complex.
093     *
094     * @param stoichiometry remove a stoichiometry for the member.
095     */
096    void removeComponentStoichiometry(Stoichiometry stoichiometry);
097
098
099    /**
100     * Gets the member physical entities which are not complex. When the complex is nested, members of inner complexes
101     * are added to the returned set recursively.
102     *
103     * @return non-complex member physical entities
104     */
105    Set<SimplePhysicalEntity> getSimpleMembers();
106
107    /**
108     * Gets the <code>EntityReference</code>s of the member simple physical entities. When the complex is nested,
109     * contents of the member complexes are retrieved recursively.
110     *
111     * @return non-complex members' entity references
112     */
113    Set<EntityReference> getMemberReferences();
114
115}