Introduction to Structural Biology
Structural biology is a branch of molecular biology, biochemistry, and biophysics concerned with the molecular structure of biological macromolecules, especially proteins and nucleic acids, how they acquire the structures they have, and how alterations in their structures affect their function.
Techniques in Structural Biology
X-ray Crystallography
Technique for determining atomic and molecular structure of crystals:
- X-ray Diffraction: Specific diffraction patterns
- Atomic Resolution: Visualization of individual atoms
- 3D Structure: Accurate three-dimensional models
- Limitations: Need for high-quality crystals
Nuclear Magnetic Resonance (NMR)
Spectroscopic technique that observes local magnetic fields:
- Solution Structure: Proteins in native environment
- Molecular Dynamics: Movement and flexibility
- Interactions: Ligand and drug binding
- Size: Limited to smaller proteins
Cryo-Electron Microscopy (Cryo-EM)
Method for high-resolution imaging of vitrified specimens:
- High Resolution: Near-atomic structures
- No Crystallization: Proteins in native state
- Large Complexes: Macromolecular assemblies
- Emerging Technology: Rapid advances in resolution
Relevance to Cancer
By determining the three-dimensional structure of oncogenic proteins, researchers can design drugs that bind to specific sites on the protein and inhibit its function.
Therapeutic Applications
- Drug Design: Specific ligands for active sites
- Targeted Therapies: Selective protein inhibition
- Drug Resistance: Understanding mutations
- New Targets: Identification of binding sites
Computational Applications
Protein Structure Analysis
python
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def analyze_protein_structure(pdb_file):
"""Analyzes protein structure from PDB file."""
# Simulate atom coordinates (in real case, use library like BioPython)
# Example: coordinates of a fictional protein
coordinates = np.random.rand(100, 3) * 20 # 100 atoms in 3D
# Calculate distances between atoms
distances = []
for i in range(len(coordinates)):
for j in range(i+1, len(coordinates)):
dist = np.linalg.norm(coordinates[i] - coordinates[j])
if dist < 5: # Close distances (bonds, interactions)
distances.append(dist)
# Structure analysis
structure_info = {
'total_atoms': len(coordinates),
'short_contacts': len(distances),
'avg_distance': np.mean(distances) if distances else 0,
'compactness': np.std(coordinates)
}
return coordinates, structure_info
def visualize_protein_3d(coordinates, title="Protein Structure"):
"""Visualizes protein structure in 3D."""
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
# Plot atoms
ax.scatter(coordinates[:, 0], coordinates[:, 1], coordinates[:, 2],
c='blue', alpha=0.6, s=20)
# Configure visualization
ax.set_xlabel('X (Å)')
ax.set_ylabel('Y (Å)')
ax.set_zlabel('Z (Å)')
ax.set_title(title)
# Add grid
ax.grid(True)
plt.show()
# Usage example
coordinates, info = analyze_protein_structure("protein.pdb")
print(f"Total atoms: {info['total_atoms']}")
print(f"Close contacts: {info['short_contacts']}")
print(f"Average distance: {info['avg_distance']:.2f} Å")
visualize_protein_3d(coordinates, "Oncogenic Protein")Binding Site Analysis
python
def find_binding_sites(coordinates, ligand_coords, cutoff=5.0):
"""Identifies potential binding sites."""
binding_sites = []
for i, atom_coord in enumerate(coordinates):
# Calculate distance to ligand
distances_to_ligand = [np.linalg.norm(atom_coord - lig_coord)
for lig_coord in ligand_coords]
min_distance = min(distances_to_ligand)
if min_distance < cutoff:
binding_sites.append({
'atom_index': i,
'coordinates': atom_coord,
'distance_to_ligand': min_distance,
'binding_strength': 1.0 / (1.0 + min_distance) # Simple score
})
# Sort by binding strength
binding_sites.sort(key=lambda x: x['binding_strength'], reverse=True)
return binding_sites
def analyze_protein_ligand_interaction(protein_coords, ligand_coords):
"""Analyzes protein-ligand interaction."""
# Find binding sites
binding_sites = find_binding_sites(protein_coords, ligand_coords)
# Calculate interaction energy (simplified)
total_energy = sum(site['binding_strength'] for site in binding_sites)
# Complementarity analysis
complementarity_score = len(binding_sites) / len(ligand_coords)
return {
'binding_sites': binding_sites,
'total_energy': total_energy,
'complementarity': complementarity_score,
'strongest_site': binding_sites[0] if binding_sites else None
}
# Analysis example
protein_coords = np.random.rand(200, 3) * 15
ligand_coords = np.random.rand(10, 3) * 10
interaction = analyze_protein_ligand_interaction(protein_coords, ligand_coords)
print(f"Binding sites found: {len(interaction['binding_sites'])}")
print(f"Total interaction energy: {interaction['total_energy']:.2f}")
print(f"Complementarity score: {interaction['complementarity']:.2f}")Advanced Techniques
- Electron Crystallography: Membrane protein structures
- Mass Spectrometry: Protein complex analysis
- Circular Dichroism: Protein secondary structure
- Fluorescence: Real-time protein dynamics
Learning Resources
- Books: NCBI Bookshelf: The Shape and Structure of Proteins
- Courses: Coursera: RNA Biology with Eterna, edX molecular biology courses
- Tools: PyMOL, UCSF ChimeraX, VMD
This is the principle behind many targeted cancer therapies.