Spaces:
Build error
Build error
| """ | |
| HDT v3.0: Structural Bioinformatics Layer | |
| Automates protein structure acquisition from RCSB PDB and AlphaFold DB. | |
| """ | |
| import os | |
| import requests | |
| import pandas as pd | |
| from pathlib import Path | |
| BASE_DIR = Path(__file__).parent.parent | |
| STRUCTURE_DIR = BASE_DIR / 'data' / 'structures' | |
| STRUCTURE_DIR.mkdir(parents=True, exist_ok=True) | |
| # Recommended PDB IDs for top targets (manually curated for quality/human) | |
| TARGET_PDB_MAPPING = { | |
| 'MTOR': '4IPH', | |
| 'IL1B': '1ITB', | |
| 'IL6': '1ALU', | |
| 'TNF': '1TNF', | |
| 'IFNg': '1HIG', | |
| 'NLRP3': '7PZW' # Human NLRP3 decamer (Cryo-EM) | |
| } | |
| def download_pdb(pdb_id): | |
| """Download a PDB file from RCSB.""" | |
| print(f"Downloading PDB: {pdb_id}...") | |
| url = f"https://files.rcsb.org/download/{pdb_id}.pdb" | |
| output_path = STRUCTURE_DIR / f"{pdb_id}.pdb" | |
| try: | |
| response = requests.get(url) | |
| response.raise_for_status() | |
| with open(output_path, 'wb') as f: | |
| f.write(response.content) | |
| print(f"Saved to {output_path.name}") | |
| return output_path | |
| except Exception as e: | |
| print(f"Error downloading {pdb_id}: {e}") | |
| return None | |
| def download_alphafold(af_id): | |
| """Download an AlphaFold structure (PDB format).""" | |
| print(f"Downloading AlphaFold: {af_id}...") | |
| # URL format: https://alphafold.ebi.ac.uk/files/AF-Q96P20-F1-model_v4.pdb | |
| url = f"https://alphafold.ebi.ac.uk/files/{af_id}-model_v4.pdb" | |
| output_path = STRUCTURE_DIR / f"{af_id}.pdb" | |
| try: | |
| response = requests.get(url) | |
| response.raise_for_status() | |
| with open(output_path, 'wb') as f: | |
| f.write(response.content) | |
| print(f"Saved to {output_path.name}") | |
| return output_path | |
| except Exception as e: | |
| print(f"Error downloading {af_id}: {e}") | |
| return None | |
| def main(): | |
| print("="*50) | |
| print("PHASE 2: STRUCTURAL BIOINFORMATICS (STRUCTURE ACQUISITION)") | |
| print("="*50) | |
| # Load v3.0 ranked targets to identify top hits | |
| ranked_path = BASE_DIR / 'outputs' / 'tables' / 'targets_ranked_v3.csv' | |
| if not ranked_path.exists(): | |
| print("Ranked targets (v3.0) not found. Run run_pipeline_v3.py first.") | |
| return | |
| targets_df = pd.read_csv(ranked_path) | |
| top_targets = targets_df['Symbol'].head(6).tolist() | |
| log_data = [] | |
| for gene in top_targets: | |
| struct_id = TARGET_PDB_MAPPING.get(gene) | |
| if not struct_id: | |
| print(f"No predefined structure mapping for {gene}. Skipping...") | |
| continue | |
| if struct_id.startswith('AF-'): | |
| path = download_alphafold(struct_id) | |
| source = 'AlphaFold' | |
| else: | |
| path = download_pdb(struct_id) | |
| source = 'RCSB_PDB' | |
| if path: | |
| log_data.append({ | |
| 'Gene': gene, | |
| 'Structure_ID': struct_id, | |
| 'Source': source, | |
| 'File_Path': str(path.relative_to(BASE_DIR)) | |
| }) | |
| # Save acquisition log | |
| log_df = pd.DataFrame(log_data) | |
| log_path = STRUCTURE_DIR / 'structure_log.csv' | |
| log_df.to_csv(log_path, index=False) | |
| print("\n" + "="*50) | |
| print(f"Acquisition complete. {len(log_df)} structures saved to {STRUCTURE_DIR.name}/") | |
| print(f"Log saved to {log_path.name}") | |
| print("="*50) | |
| if __name__ == "__main__": | |
| main() | |