%%html
<script src="https://bits.csb.pitt.edu/preamble.js"></script>
COBB2035: Modern Methods for Structure Based Drug Discovery¶
The course explores how biomolecular structure and dynamics inform the rational design of therapeutics and how machine learning can be harnessed to improve drug discovery. Topics include molecular interactions, statistical mechanics and thermodynamics, generative modeling, molecular simulations, coarse-grained and enhanced sampling techniques, free energy calculations, protein structure prediction, protein design, molecular docking, de novo design, and virtual screening.
Life is basically atoms interacting with one another, so we're going to study that.¶
Instructor¶
David Koesdkoes@pitt.edu
Office: Fifth and Halket 10188
Office Hours: After class Monday and by appointment
TA¶
Marios Gavrielatosmag1037@pitt.edu
Office Hours: TBD
%%html
<div id="dogpref" style="width: 500px"></div>
<script>
var divid = '#dogpref';
jQuery(divid).asker({
id: divid,
question: "How to you feel about dogs?",
answers: ["Love them","Like them",'Neutral',"Want to avoid"],
server: "https://bits.csb.pitt.edu/asker.js/example/asker.cgi",
charter: chartmaker})
$(".jp-InputArea .o:contains(html)").closest('.jp-InputArea').hide();
</script>
Logistics¶
Lectures 12:00-1:20pm on Monday and Wednesday in 10105 Fifth & Halket.
Building Access Should
Recitations After class on Wednesday. Average recitation length should be ~1 hour but will stick around until 3:30pm.
Course material will be posted to class website: https://compstruct.org/
Slack will be used for group discussions, announcements, and contacting staff. https://compstruct.slack.com/
Panopto All classes are automatically recorded and are available on Panopto as linked from the class website. Recordings are provided as a study aid, not a replacement for attending class.
Zoom is available as a fallback when in-person attendance is not possible (must request link).
%%html
<div id="labpref" style="width: 500px"></div>
<script>
var divid = '#labpref';
jQuery(divid).asker({
id: divid,
question: "What is the most convenient time for you?",
answers: ["10am","11am",'Noon',"1pm", "2pm"],
server: "https://bits.csb.pitt.edu/asker.js/example/asker.cgi",
charter: chartmaker})
$(".jp-InputArea .o:contains(html)").closest('.jp-InputArea').hide();
</script>
Assignments¶
- Seven assignments and a project
- A mix of programming (Python) and free response.
- Students work individually on assignments
- Do discuss general concepts, strategies for debugging, and the particulars of a specific software package.
- Do not show your code to fellow classmates.
- Do not have ChatGPT do your assignment for you. It is your responsibility to manage your learning - use AI as a research and debugging tool that helps you learn, not as a crutch.
Lateness¶
- One automatic late day per assignment
- Late assignments have maximum score of 95%
- Additional late day requests require substantial justification and may be significantly penalized
Books¶
No required books, but several are available for reference (bookshelf outside my office).
- LIFE: Kuriyan, Konforti, Wemmer. The Molecules of Life
- Z: Zuckerman. Statistical Physics of Biomolecules (Library)
- BJD: Bahar, Jernigan, Dill. Protein Actions: Principles & Modeling
- DILL: Dill, Bromberg. Molecular Driving Forces: Statistical Thermodynamics in Biology, Chemistry, Physics, and Nanoscience
- KB: Kessel, Ben-tal. Introduction to Proteins: Structure, Function, and Motion
- ML: Deprez, Robinson. Machine Learning for Biomedical Applications with Scikit-Learn and PyTorch
- DL: Ramsundar, Eastman, Walters, Pande. Deep Learning for the Life Sciences: Applying Deep Learning to Genomics, Microscopy, Drug Discovery, and More (Library)
Any questions on course mechanics?¶
What is a drug?¶
Section 201(g) of the FD&C Act (21 USC 321(g)) provides that the term "drug" means:
(A) articles recognized in the official United States Pharmacopoeia, official Homoeopathic Pharmacopoeia of the United States, or official National Formulary, or any supplement to any of them; and (B) articles intended for use in the diagnosis, cure, mitigation, treatment, or prevention of disease in man or other animals; and (C) articles (other than food) intended to affect the structure or any function of the body of man or other animals; and (D) articles intended for use as a component of any articles specified in clause (A), (B), or (C).
Annual numbers of new molecular entities (NMEs) and biologics license applications (BLAs) approved by the FDA’s Center for Drug Evaluation and Research (CDER). Does not include products approved by the Center for Biologics Evaluation and Research (CBER) (vaccines, gene and cell therapies).
Mullard A. 2025 FDA approvals. Nat. Rev. Drug Discov. 2026 Jan 2.
Drug Discovery¶
Kinds of Virtual Screening¶
- ADMET
- Ligand Based
- similarity
- QSAR
- pharmacophore
- Structure Based
- molecular docking
- simulation
Ligand Based Drug Discovery¶
Not the focus of this course (obviously). Requires you already have data (hits) for your target.
- QSAR Quantitative Structure-Activity Relationship. A model of compound activity.
- QSPR Quantitative Structure-Property Relationship. A model of some other property of the compound (e.g. solubility, toxicity).
An assumption of QSAR modeling is that similar compounds have similar activities/properties.
Activity cliffs are pairs of similar compounds that have large differences in activity.
Cheminformatics¶
Cheminformatics (also known as chemoinformatics, chemioinformatics and chemical informatics) is the use of computer and informational techniques applied to a range of problems in the field of chemistry. --Wikipedia
Open Source Cheminformatic Toolkits¶
rdkit http://www.rdkit.org
- BSD License
- Relatively new, very nicely architected C++ backend
- Actively developed
- Native Python interface
OpenBabel http://openbabel.org
- GNU License
- Older (forked from OpenEye in 2001), a bit crufty and complicated
- Lots of functionality (e.g., support for more than 100 file formats)
- Python interface is through SWIG (auto-generated) bindings to C/C++
- Includes standalone programs: babel, obabel, etc.
Pybel
- A native, user-friendly python interface to OpenBabel
- Limited functionality (but can always fallback to OpenBabel)
- Simplest to use
Simplified Molecular Input Line Entry System (SMILES)¶
CN(C)[C@@H]3C(\O)=C(\C(N)=O)C(=O)[C@@]4(O)C(/O)=C2/C(=O)c1c(cccc1O)[C@H](C)[C@H]2[C@H](O)[C@@H]34
Atoms¶
Specified by their atomic symbols inside brackets: [Au], [Fe], [Zn], etc
No brackets needed for organic subset: B, C, N, O, P, S, F, Cl, Br, and I
Aromatic atoms are lower case: c1ccccc1
Bonds¶
- Single -
- Double =
- Triple #
- Aromatic :
Single and aromatic can be omitted.
%%html
<div id="mmchem1" style="width: 500px"></div>
<script>
var divid = '#mmchem1';
jQuery(divid).asker({
id: divid,
question: "What is a SMILES string for ethane?",
answers: ['c-c','CC','C=C','C#C','[Ca]-[Ca]'],
server: "https://bits.csb.pitt.edu/asker.js/example/asker.cgi",
charter: chartmaker})
$(".jp-InputArea .o:contains(html)").closest('.jp-InputArea').hide();
</script>
%%html
<div id="mmchem3" style="width: 500px"></div>
<script>
var divid = '#mmchem3';
jQuery(divid).asker({
id: divid,
question: "What is a SMILES expression for benzene?",
answers: ['c1cccc1','cccccc1','c2ccccc2','1cccccc1','c1ccccc1c'],
server: "https://bits.csb.pitt.edu/asker.js/example/asker.cgi",
charter: chartmaker})
$(".jp-InputArea .o:contains(html)").closest('.jp-InputArea').hide();
</script>
Drawing¶
All but the simplest smiles can be challenging to interpret (especially if chirality is included). Fortunately, you can use pybel (or molecular viewers like MarvinView) to convert them to their 2D representation.
Example: CC(NC1=CC=C(O)C=C1)=O
from openbabel import pybel
pybel.readstring('smi','CC(NC1=CC=C(O)C=C1)=O')
RDKit Example¶
from rdkit import Chem
Chem.MolFromSmiles('CC(NC1=CC=C(O)C=C1)=O')
Lipinski's Rule of Five¶
In 1997 Christopher Lipinski analyzed existing drugs and came up with a set of molecular property rules for classifying a small molecule as drug-like and having good oral bioavailability.
- No more than 5 hydrogen bond donors
- No more than 10 hydrogen bond acceptors
- Molecular weight less than 500 daltons
- Partition coefficient logP less than 5
- There is no fifth rule, but it is okay if at most one rule is violated
mol = pybel.readstring('smi','CC(=O)Nc1ccc(O)cc1')
desc = mol.calcdesc()
desc['MW'], desc['HBA1'], desc['HBD'], desc['logP']
(151.16256, 3.0, 2.0, 1.4236)
from rdkit.Chem import Descriptors
mol = Chem.MolFromSmiles('CC(=O)Nc1ccc(O)cc1') # e.g. Paracetamol
# Ro5 descriptors
MW = Descriptors.MolWt(mol)
HBA = Descriptors.NOCount(mol)
HBD = Descriptors.NHOHCount(mol)
LogP = Descriptors.MolLogP(mol)
conditions = [MW <= 500, HBA <= 10, HBD <= 5, LogP <= 5]
pass_ro5 = conditions.count(True) >= 3
MW,HBA,HBD,LogP,pass_ro5
(151.165, 3, 2, 1.3505999999999998, True)
logP¶
Fingerprints¶
A molecular fingerprint reduces the chemical features of a molecule into a bit vector. The features of the fingerprint correspond to a bit in the vector. This bit is set if the compound has that feature.
The most common type of fingerprint is a Daylight style fingerprint where all the paths (up to a given length) are enumerated and hashed to their bit positions.
%%html
<div id="mmfinger" style="width: 500px"></div>
<script>
$('head').append('<link rel="stylesheet" href="https://bits.csb.pitt.edu/asker.js/themes/asker.default.css" />');
var divid = '#mmfinger';
jQuery(divid).asker({
id: divid,
question: "If I know a specific bit is set in a fingerprint, do I know what functional group that corresponds to?",
answers: ['Yes','No'],
server: "https://bits.csb.pitt.edu/asker.js/example/asker.cgi",
charter: chartmaker})
$(".jp-InputArea .o:contains(html)").closest('.jp-InputArea').hide();
</script>
This provides a fixed length vector representation of a chemical structure.¶
%%html
<div id="mmqsar" style="width: 500px"></div>
<script>
$('head').append('<link rel="stylesheet" href="https://bits.csb.pitt.edu/asker.js/themes/asker.default.css" />');
var divid = '#mmqsar';
jQuery(divid).asker({
id: divid,
question: "The previous slide had what kind of model on it?",
answers: ['QSAR','QSPR','Generative','Activity cliff'],
server: "https://bits.csb.pitt.edu/asker.js/example/asker.cgi",
charter: chartmaker})
$(".jp-InputArea .o:contains(html)").closest('.jp-InputArea').hide();
</script>
Fingerprints¶
Bit vectors can easily be compared, most commonly with the Tanimoto coefficient: $$\frac{|A \cap B|}{|A \cup B|}$$
This provides a quantitative measure of chemical similarity.
Similarity search is a surprisingly effective mechanism of virtual screening (given enough data).
%%html
<div id="mmchemsim" style="width: 500px"></div>
<script>
$('head').append('<link rel="stylesheet" href="https://bits.csb.pitt.edu/asker.js/themes/asker.default.css" />');
var divid = '#mmchemsim';
jQuery(divid).asker({
id: divid,
question: "What is the Tanimoto coefficient of the bitstrings 1001 and 0011?",
answers: ['0','0.25','0.33','0.5','0.66','0.75','1.0'],
server: "https://bits.csb.pitt.edu/asker.js/example/asker.cgi",
charter: chartmaker})
$(".jp-InputArea .o:contains(html)").closest('.jp-InputArea').hide();
</script>
%%html
<div id="mmchemsim2" style="width: 500px"></div>
<script>
$('head').append('<link rel="stylesheet" href="https://bits.csb.pitt.edu/asker.js/themes/asker.default.css" />');
var divid = '#mmchemsim2';
jQuery(divid).asker({
id: divid,
question: "Do you think Tanimoto similarity of the molecular fingerprints of proteins would be useful?",
answers: ['Yes','No'],
server: "https://bits.csb.pitt.edu/asker.js/example/asker.cgi",
charter: chartmaker})
$(".jp-InputArea .o:contains(html)").closest('.jp-InputArea').hide();
</script>
Central Dogma¶
DNA Sequence $\rightarrow$ RNA $\rightarrow$ Protein $\rightarrow$ Structure (Dynamics) $\rightarrow$ Function
import py3Dmol
Molecular Representations¶
Cartoons trace molecule and show key features.
v = py3Dmol.view('4c64',style='cartoon'); v.show()
3Dmol.js failed to load for some reason. Please check your browser console for error messages.
DNA Structure¶
Where is major/minor groove?
v = py3Dmol.view('4c64',style='cartoon'); v.show()
3Dmol.js failed to load for some reason. Please check your browser console for error messages.
Molecular Representations¶
Spheres (space-filling) highlights individual atoms (usually color coded by element).
v = py3Dmol.view('4c64',style='sphere'); v.show()
3Dmol.js failed to load for some reason. Please check your browser console for error messages.
Molecular Representations¶
Sticks (licorice) highlights bonds. Often used for small molecules.
v = py3Dmol.view('4c64',style='stick'); v.show()
3Dmol.js failed to load for some reason. Please check your browser console for error messages.
Note that sticks and cartoon won't show nonbonded atoms...
v = py3Dmol.view('4c64',style='stick')
v.setStyle({'bonds':0},{'sphere':{'radius':0.5}}); v.show()
3Dmol.js failed to load for some reason. Please check your browser console for error messages.
%%html
<div id="whatdots" style="width: 500px"></div>
<script>
var divid = '#whatdots';
jQuery(divid).asker({
id: divid,
question: "What are the red dots?",
answers: ["Water","Ions","Cofactors","Phosphates"],
server: "https://bits.csb.pitt.edu/asker.js/example/asker.cgi",
charter: chartmaker})
$(".jp-InputArea .o:contains(html)").closest('.jp-InputArea').hide();
</script>
Molecular Representations¶
Surfaces show the overall shape.
v = py3Dmol.view('4c64',style='stick')
v.addSurface().show()
3Dmol.js failed to load for some reason. Please check your browser console for error messages.
Molecular Surfaces¶

From Introduction to Proteins: Structure, Function, and Motion. Amit Kessel & Nir Ben-Tal
Molecular Surfaces¶
v = py3Dmol.view('4c64',width=770,viewergrid=(1,3))
v.addSurface('VDW',viewer=(0,0)); v.addSurface('MS',viewer=(0,1)); v.addSurface('SAS',viewer=(0,2)); v.show()
3Dmol.js failed to load for some reason. Please check your browser console for error messages.
RNA Can Have Interesting Structure¶
S-adenosylmethionine (SAM) / S-adenosylhomocysteine (SAH) riboswitch - regulates transcription of SAM-biosynthetic enzymes.
v = py3Dmol.view(query='6HAG',style='cartoon',height=400)
v.setStyle({'resn':'SAH'},'sphere').show()
3Dmol.js failed to load for some reason. Please check your browser console for error messages.
RNA Can Have Interesting Structure¶
Transfer RNA
py3Dmol.view(query='4tna',style='stick').show()
3Dmol.js failed to load for some reason. Please check your browser console for error messages.
...But We're Going To Focus on Proteins¶

Key Concepts¶
- clinical trial phases
- hits, leads
- biologics vs. small molecules
- cheminformatics
- QSAR, QSPR, activity cliffs
- molecular fingerprints, Tanimoto similarity
- stick/cartoon/surface representations