Molecules are derived from chem2.Molecule and represent collections of sites. Sites are derived from chem2.Site and represent functional substructures of a molecule. A molecule may be related to multiple sites, but a site may be related only to one molecule. Both molecules and sites may be subclassed from their base classes indefinitely many times.
The Molecule object has a site attribute that holds the list of sites. Below is a summary of Molecule attributes and methods.
| Attribute | Setter | Getter | Unsetter | 
|---|---|---|---|
id | 
set_id(id) | 
get_id() | 
|
sites | 
add_sites(*sites) | 
get_sites(**kwargs) | 
remove_sites(*sites) | 
The Site object has a molecule attribute that points to a single molecule. Below is a summary of Site attributes and methods relevant for this section.
| Attribute | Setter | Getter | Unsetter | 
|---|---|---|---|
id | 
set_id(id) | 
get_id() | 
|
molecule | 
set_molecule(molecule) | 
get_molecule() | 
unset_molecule() | 
add_sites() and set_molecule() have the same functionality of setting up relations between sites and molecules. Similarly, remove_sites() and unset_molecule() have the same functionality of removing relations between sites and molecules.
get_sites() can be filtered on attribute and site type.
Site has the allowed_molecule_types class attribute that restricts which molecule types are allowed to have a particular type of site. This can be set when subclassing Site.
| Class Attribute | Default | Description | 
|---|---|---|
allowed_molecule_types | 
None | Tuple of allowed Molecule classes | 
In [1]:
    
from wc_rules.chem2 import Molecule,Site
    
Below we create the molecule type hierarchy Molecule -> Receptor -> EGFR
In [2]:
    
class Receptor(Molecule):pass
class EGFR(Receptor):pass
    
Similarly, from Site, we create 2 different types of sites.
In [3]:
    
class LigandBinding(Site):pass
class Dimerize(Site):pass
    
We create one instance of EGFR molecule, one instance of LigandBinding site and one instance of Dimerize site.
In [4]:
    
Rec = EGFR().set_id('Rec')
L = LigandBinding().set_id('L')
D = Dimerize().set_id('D')
[Rec.get_id(), L.get_id(), D.get_id()]
    
    Out[4]:
The molecule instance named Rec can be type-checked against the EGFR class, the Receptor class and the Molecule class.
In [5]:
    
isinstance(Rec,EGFR) and isinstance(Rec,Receptor) and isinstance(Rec,Molecule)
    
    Out[5]:
| Function | Molecule method | 
Site method | 
|---|---|---|
| Attach sites to a molecule | add_sites(*sites) | 
set_molecule(molecule) | 
| Detach sites from a molecule | remove_sites(*sites) | 
unset_molecule(molecule) | 
| Get/Filter the attached sites | get_sites(**kwargs) | 
|
| Get the attached molecule | get_molecule() | 
In [6]:
    
# Adding sites with add_sites()
Rec.add_sites(L,D)
# Getting sites
Rec.get_sites()
    
    Out[6]:
In [7]:
    
# Filter sites by id
Rec.get_sites(id='L')
    
    Out[7]:
In [8]:
    
# Filter sites by site type
Rec.get_sites(site_type=LigandBinding)
    
    Out[8]:
In [9]:
    
# Removing sites with remove_sites()
Rec.remove_sites(L,D)
Rec.get_sites()
    
    Out[9]:
In [10]:
    
# Adding sites with set_molecule()
L.set_molecule(Rec)
D.set_molecule(Rec)
Rec.get_sites()
    
    Out[10]:
In [11]:
    
# Getting attached molecule
L.get_molecule()
    
    Out[11]:
In [12]:
    
# Removing sites with unset_molecule()
L.unset_molecule()
D.unset_molecule()
Rec.get_sites()
    
    Out[12]:
In [13]:
    
# Creating molecule/site instances and setting relations at the same time
Rec = EGFR(id='Rec').add_sites(
    LigandBinding(id='L'),
    Dimerize(id='D'),
)
Rec.get_sites()
    
    Out[13]:
In [14]:
    
# Defining site types that can only be attached to EGFR
class EGFRSite(Site):
    allowed_molecule_types = (EGFR,) 
    
class IGFR(Molecule):pass
x1 = EGFRSite().set_molecule( IGFR() )
x2 = EGFRSite().set_molecule( EGFR() )
for x in [x1,x2]:
    try:
        x.verify_allowed_molecule_type()
        print('Allowed')
    except:
        print('Not allowed')