omics.co.in

13: Advanced Topics in Python for Biology

🐍 Downloadable Lesson Python Script 2.7 KB

ch13_hpc_parallel_genomics.py

Multi-core parallel computing using multiprocessing.Pool, and Wright-Fisher population genetics simulation of neutral genetic drift.

$ python ch13_hpc_parallel_genomics.py

Chapter 13: Advanced Topics in Python for Biology

The final chapter explores advanced computational paradigms essential for production bioinformatics: multi-core parallel computing, high-throughput microscopy image analysis, biological simulation, and web scraping of public repositories.

1. High-Performance Computing (HPC) & Parallel Processing

Standard Python runs on a single CPU thread due to the Global Interpreter Lock (GIL). We leverage multiprocessing to parallelize intensive tasks across CPU cores:

from multiprocessing import Pool
import time

def process_fasta_chunk(chunk_id):
    """Simulates aligning or processing a 100,000 read chunk."""
    time.sleep(0.5)  # Processing simulation
    return f"Chunk {chunk_id}: 100,000 reads aligned successfully."

if __name__ == "__main__":
    chunks = list(range(1, 9))
    # Parallelize across 8 CPU worker cores
    with Pool(processes=8) as pool:
        results = pool.map(process_fasta_chunk, chunks)
        
    for r in results:
        print(r)

2. Microscopy Image Processing & Analysis

Automating fluorescent cell segmentation, counting nuclei, and quantifying signal intensity with scikit-image:

from skimage import filters, measure, morphology
import numpy as np

# Synthetic DAPI-stained microscopy channel
microscopy_image = np.random.normal(loc=10, scale=2, size=(512, 512))
# Add simulated fluorescent nuclei
microscopy_image[100:150, 100:150] += 50
microscopy_image[300:340, 200:240] += 60

# Otsu thresholding for automated cell segmentation
thresh = filters.threshold_otsu(microscopy_image)
binary_mask = microscopy_image > thresh
cleaned_mask = morphology.remove_small_objects(binary_mask, min_size=50)

# Label and count individual nuclei
labeled_cells, num_cells = measure.label(cleaned_mask, return_num=True)
print(f"Automated Cell Count: {num_cells} nuclei detected.")

3. Simulation & Modeling in Biology

Simulating Wright-Fisher genetic drift models and tracking allele frequency evolution across generations:

import numpy as np

def simulate_genetic_drift(pop_size=1000, initial_allele_freq=0.5, generations=200):
    """Simulates Wright-Fisher genetic drift in diploid population."""
    freqs = [initial_allele_freq]
    current_p = initial_allele_freq
    
    for _ in range(generations):
        # Binomial sampling of 2N alleles
        num_alleles = np.random.binomial(2 * pop_size, current_p)
        current_p = num_alleles / (2 * pop_size)
        freqs.append(current_p)
        if current_p == 0.0 or current_p == 1.0:
            break # Allele fixed or lost
            
    return freqs

trajectory = simulate_genetic_drift()
print(f"Final Frequency after drift: {trajectory[-1]:.3f} (Generations: {len(trajectory)})")

4. Web Scraping for Biological Repositories

Extracting data from un-API’d scientific databases using requests and BeautifulSoup:

import requests
from bs4 import BeautifulSoup

def scrape_nih_trials(search_term):
    url = f"https://clinicaltrials.gov/search?term={search_term}"
    headers = {"User-Agent": "AcademicResearchBot/1.0"}
    response = requests.get(url, headers=headers)
    
    if response.status_code == 200:
        soup = BeautifulSoup(response.text, "html.parser")
        titles = [h.get_text(strip=True) for h in soup.find_all("a", class_="trial-title")[:5]]
        return titles
    return []
← Return to Home Hub Scroll to Top ↑