healdette / modules /run_simulations.py
Raiff1982's picture
Upload 55 files
6d3b444 verified
import numpy as np
import random
def evaluate_stability(seq):
hydrophobic_aas = set("AILMFWYV")
hydrophobic_ratio = sum(1 for aa in seq if aa in hydrophobic_aas) / len(seq)
aromaticity_score = seq.count('F') + seq.count('W') + seq.count('Y')
return round((hydrophobic_ratio * 0.6 + aromaticity_score * 0.1), 4)
def evaluate_affinity(seq):
entropy = len(set(seq)) / len(seq)
return round((1 - entropy) * 0.8 + random.uniform(0.1, 0.3), 4)
def run_simulations(binder_candidates, engines=['SimLite']):
scored_binders = []
rejections = []
for binder in binder_candidates.get("generated_binders", []):
sequence = binder["sequence"]
stability = evaluate_stability(sequence)
affinity = evaluate_affinity(sequence)
reasons = []
if stability < 0.3:
reasons.append("Low stability score")
if affinity < 0.3:
reasons.append("Low predicted affinity")
if reasons:
binder["rejection_reason"] = reasons
rejections.append(binder)
else:
binder["stability_score"] = stability
binder["predicted_affinity"] = affinity
binder["structure_engine"] = engines[0]
binder["simulation_trace"] = f"Hydrophobic: {round(stability, 3)}, Entropy-Based Affinity: {round(affinity, 3)}"
scored_binders.append(binder)
return {
"validated_binders": scored_binders,
"rejected_binders": rejections
}