[08:42:52] Job 3aeb3b71 created for target: PRMT5
[08:42:52] Initializing workspace for PRMT5...
[08:42:52] Job 3aeb3b71 started: 2026-06-05 08:42:52
[08:42:52] 📦 Copying assets from pipeline_assets → jobs/3aeb3b71 ...
[08:42:52] 🧾 Wrote input.csv and Protein_Data.csv
[08:42:52] 🚀 Running 1_GRABBER.py...
[08:42:52] 🐍 Pipeline Python: /app/.heroku/python/bin/python
[08:42:52] [mem] before 1_GRABBER.py parent=98.1MB combined=98.1MB
[08:42:52] 🧵 Worker caps for 1_GRABBER.py: pipeline_max=1 WARHEAD_SQCHK_MAX_WORKERS=1 WARHEAD_PDBMKR_MAX_WORKERS=1 WARHEAD_SASA_MAX_WORKERS=3 WARHEAD_METADATA_MAX_WORKERS=3 WARHEAD_MCS_MAX_WORKERS=3
[08:42:52] ⏱ No-output watchdog for 1_GRABBER.py: 180s
[08:42:52] [mem] running 1_GRABBER.py parent=98.1MB child_tree=0.7MB combined=98.8MB
🤖 AUTOMATED MODE: Processing input.csv
=== Processing PRMT5 ===
    🔄 Switching to EBI Backup Search for 'Protein arginine N-methyltransferase 5 5'-DEOXY-5'-METHYLTHIOADENOSINE MTA [7-(1-methyl-1H-pyrazol-4-yl)-4-oxo-3,4-dihydrophthalazin-1-yl]methanaminium 84W bound inhibitor Homo sapiens'...
  → Found 1 candidates
  → Candidates=1 attempted=1 verified=1 failed=0
  → CIF output directory: /app/jobs/3aeb3b71/WAR/PRMT5
  → Sample verified CIFs: ['WAR/PRMT5/7s1q.cif']
=== DONE ===
✅ Wrote queries.csv with MW_min=250.0, MW_max=700.0, MinID=90.0
✅ CIF manifest rows=1 verified=1 failed=0 root=/app/jobs/3aeb3b71/WAR
✅ Sample manifest CIF paths: ['WAR/PRMT5/7s1q.cif']
[08:42:53] [mem] after 1_GRABBER.py parent=98.7MB delta=+0.6MB combined_peak=181.8MB child_peak=83.1MB
[08:42:53] 🚀 Running 2_SQchk.py...
[08:42:53] 🐍 Pipeline Python: /app/.heroku/python/bin/python
[08:42:53] [mem] before 2_SQchk.py parent=98.7MB combined=98.7MB
[08:42:53] 🧵 Worker caps for 2_SQchk.py: pipeline_max=1 WARHEAD_SQCHK_MAX_WORKERS=1 WARHEAD_PDBMKR_MAX_WORKERS=1 WARHEAD_SASA_MAX_WORKERS=3 WARHEAD_METADATA_MAX_WORKERS=3 WARHEAD_MCS_MAX_WORKERS=3
[08:42:53] ⏱ No-output watchdog for 2_SQchk.py: 180s
[08:42:53] [mem] running 2_SQchk.py parent=98.7MB child_tree=0.6MB combined=99.3MB
🚀 Running Sequence Identity Analysis...
   Proteins missing fasta/name rows skipped: 0
   MW_min=250.0  MW_max=700.0  (MW filters currently ignored for ligand debug)
   Total PDB jobs to process: 1
   Worker mode=threadpool max_workers=1
  0%|          | 0/1 [00:00<?, ?it/s]DEBUG: 7s1q Chain(s) ['A'] -> Match: 100.0%
DEBUG: 7s1q Chain(s) ['B'] -> Match: 48.0%
100%|██████████| 1/1 [00:00<00:00,  3.02it/s]
100%|██████████| 1/1 [00:00<00:00,  3.01it/s]
DONE
✅ PDBs processed OK: 1
❌ PDBs failed: 0
[08:42:54] [mem] after 2_SQchk.py parent=98.7MB delta=+0.0MB combined_peak=184.8MB child_peak=86.1MB
[08:42:54] 🚀 Running 3_PDBmkr.py...
[08:42:54] 🐍 Pipeline Python: /app/.heroku/python/bin/python
[08:42:54] [mem] before 3_PDBmkr.py parent=98.7MB combined=98.7MB
[08:42:54] 🧵 Worker caps for 3_PDBmkr.py: pipeline_max=1 WARHEAD_SQCHK_MAX_WORKERS=1 WARHEAD_PDBMKR_MAX_WORKERS=1 WARHEAD_SASA_MAX_WORKERS=3 WARHEAD_METADATA_MAX_WORKERS=3 WARHEAD_MCS_MAX_WORKERS=3
[08:42:54] ⏱ No-output watchdog for 3_PDBmkr.py: 180s
[08:42:54] [mem] running 3_PDBmkr.py parent=98.7MB child_tree=1.2MB combined=99.9MB
📁 Step 3 output root: /app/jobs/3aeb3b71/WAR_PDB
🧾 CIF sources: manifest_rows=1 verified_manifest=1 indexed_cifs=1
📊 Similarity Stats: Max found = 100.00% (Threshold: 90.0%)
⚠️ No 5-letter ligands detected. Renaming map not required.
🛑 Created Skip4.txt — Step 4 will be skipped.
🚀 BUILDING 2 PDB CHAINS...
🧾 Step 3 selected build rows=2 resolvable_cifs=2 missing_cifs=0
🧵 Worker mode=threadpool max_workers=1
🧾 Step 3 sample CIF resolutions: ['7s1q:manifest_path:WAR/PRMT5/7s1q.cif', '7s1q:manifest_path:WAR/PRMT5/7s1q.cif']
  0%|          | 0/2 [00:00<?, ?it/s]
100%|██████████| 2/2 [00:00<00:00, 117.83it/s]
📁 Step 3 output root resolved: /app/jobs/3aeb3b71/WAR_PDB
📊 Step 3 requested=2 built=2 on_disk=2
🧾 Step 3 sample PDBs: ['PRMT5/7s1q_A_84W.pdb', 'PRMT5/7s1q_A_MTA.pdb']
✅ All PDBs built successfully.
✅ Wrote 5CharMAP.csv as headers-only (no 5-letter ligands detected).
[08:42:55] [mem] after 3_PDBmkr.py parent=98.7MB delta=+0.0MB combined_peak=211.4MB child_peak=112.7MB
[08:42:55] 🚀 Running 4_PDBfxr.py...
[08:42:55] 🐍 Pipeline Python: /app/.heroku/python/bin/python
[08:42:55] [mem] before 4_PDBfxr.py parent=98.7MB combined=98.7MB
[08:42:55] 🧵 Worker caps for 4_PDBfxr.py: pipeline_max=1 WARHEAD_SQCHK_MAX_WORKERS=1 WARHEAD_PDBMKR_MAX_WORKERS=1 WARHEAD_SASA_MAX_WORKERS=3 WARHEAD_METADATA_MAX_WORKERS=3 WARHEAD_MCS_MAX_WORKERS=3
[08:42:55] ⏱ No-output watchdog for 4_PDBfxr.py: 180s
[08:42:55] [mem] running 4_PDBfxr.py parent=98.7MB child_tree=0.6MB combined=99.3MB
🛑 Skip4.txt detected — no ligand5→ligandX renaming required.
✅ Step 4 exiting safely.
[08:42:56] [mem] after 4_PDBfxr.py parent=98.7MB delta=+0.0MB combined_peak=99.3MB child_peak=0.6MB
[08:42:56] 🚀 Running 5_PDBcln.py...
[08:42:56] 🐍 Pipeline Python: /app/.heroku/python/bin/python
[08:42:56] [mem] before 5_PDBcln.py parent=98.7MB combined=98.7MB
[08:42:56] 🧵 Worker caps for 5_PDBcln.py: pipeline_max=1 WARHEAD_SQCHK_MAX_WORKERS=1 WARHEAD_PDBMKR_MAX_WORKERS=1 WARHEAD_SASA_MAX_WORKERS=3 WARHEAD_METADATA_MAX_WORKERS=3 WARHEAD_MCS_MAX_WORKERS=3
[08:42:56] ⏱ No-output watchdog for 5_PDBcln.py: 180s
[08:42:56] [mem] running 5_PDBcln.py parent=98.8MB child_tree=0.6MB combined=99.4MB
📁 ROOT DIRECTORY: WAR_PDB
📁 Step 5 input root resolved: /app/jobs/3aeb3b71/WAR_PDB
📊 Step 5 input PDB count before cleaning: 2
=============================
🔬 Processing Protein: PRMT5
📂 Folder: WAR_PDB/PRMT5
=============================
🧪 Cleaning 7s1q_A_MTA.pdb  | Keeping ligand: MTA
✔ Cleaned: 7s1q_A_MTA.pdb
🧪 Cleaning 7s1q_A_84W.pdb  | Keeping ligand: 84W
✔ Cleaned: 7s1q_A_84W.pdb
📊 Step 5 remaining PDB count after cleaning: 2
🎉 DONE — cleaned=2, dropped=0
[08:42:56] [mem] after 5_PDBcln.py parent=98.8MB delta=+0.1MB combined_peak=99.4MB child_peak=0.6MB
[08:42:56] 🚀 Running 6_SASA.py...
[08:42:56] 🐍 Pipeline Python: /app/.heroku/python/bin/python
[08:42:56] [mem] before 6_SASA.py parent=98.8MB combined=98.8MB
[08:42:56] 🧵 Worker caps for 6_SASA.py: pipeline_max=1 WARHEAD_SQCHK_MAX_WORKERS=1 WARHEAD_PDBMKR_MAX_WORKERS=1 WARHEAD_SASA_MAX_WORKERS=3 WARHEAD_METADATA_MAX_WORKERS=3 WARHEAD_MCS_MAX_WORKERS=3
[08:42:56] ⏱ No-output watchdog for 6_SASA.py: 180s
[08:42:56] [mem] running 6_SASA.py parent=98.8MB child_tree=1.7MB combined=100.5MB
📁 Scanning WARHEAD PDB ROOT: WAR_PDB
📁 Step 6 input root resolved: /app/jobs/3aeb3b71/WAR_PDB
🔎 Found 2 PDB files
🧾 Step 6 sample PDBs: ['PRMT5/7s1q_A_84W.pdb', 'PRMT5/7s1q_A_MTA.pdb']
🧠 Using max_workers=2 stream_output=True
✅ 7s1q_A_84W.pdb: 10/33 exposed (0.30)
✅ 7s1q_A_MTA.pdb: 4/20 exposed (0.20)
🎉 WARHEAD SASA COMPLETE
[08:42:59] [mem] after 6_SASA.py parent=98.8MB delta=+0.0MB combined_peak=191.0MB child_peak=92.2MB
[08:42:59] 🚀 Running 7_metadata.py...
[08:42:59] 🐍 Pipeline Python: /app/.heroku/python/bin/python
[08:42:59] [mem] before 7_metadata.py parent=98.8MB combined=98.8MB
[08:42:59] 🧵 Worker caps for 7_metadata.py: pipeline_max=1 WARHEAD_SQCHK_MAX_WORKERS=1 WARHEAD_PDBMKR_MAX_WORKERS=1 WARHEAD_SASA_MAX_WORKERS=3 WARHEAD_METADATA_MAX_WORKERS=3 WARHEAD_MCS_MAX_WORKERS=3
[08:42:59] ⏱ No-output watchdog for 7_metadata.py: 180s
[08:42:59] [mem] running 7_metadata.py parent=98.8MB child_tree=6.7MB combined=105.5MB
📂 Using SMILES file: components-smiles-stereo-oe.smi
🧬 Loaded 49558 SMILES entries.
🔎 Sample SMILES keys: ['000', '001', '002', '003', '004', '005', '006', '007', '008', '009', '00A', '00B', '00C', '00D', '00E']
🤖 AUTO MODE: Warhead_SASA_summary.csv
📥 Loaded SASA table.
📊 Step 7 input row count: 2
🧾 Step 7 input columns: ['Target', 'pdb_id', 'Warhead', 'Residue_ID', 'Variant', 'Total_atoms', 'Exposed_atoms', 'SASA_in_complex_A2', '%Exposed', '%Buried']
ℹ️ 5CharMAP.csv has no usable rows → alias mapping disabled.
🔗 WAR_PDB chain map built: 2 (pdb,ligX) groups
🔬 BEGIN RESOLUTION TRACE
--------------------------------------------------
Row 0
  PDB: 7s1q
  Warhead (input): 84W
  Warhead_5 (if mapped): (blank)
  SMILES lookup key: 84W
  SMILES found? YES
--------------------------------------------------
Row 1
  PDB: 7s1q
  Warhead (input): MTA
  Warhead_5 (if mapped): (blank)
  SMILES lookup key: MTA
  SMILES found? YES
🔬 END RESOLUTION TRACE
✅ Filtered SASA table: removed 0 ion-only rows; remaining 2 rows
💾 Saved Resolved_SASA_Summary.csv
💾 Saved Ligand_PDB_Index.csv
🚀 Launching metadata engine mode=threads max_workers=2
🧪 Computing descriptors:   0%|          | 0/2 [00:00<?, ?it/s]
🧪 Computing descriptors:  50%|█████     | 1/2 [00:00<00:00,  6.52it/s]
🧪 Computing descriptors: 100%|██████████| 2/2 [00:00<00:00, 11.23it/s]
📊 Ligand metadata rows: total=2 success=2 failures=0
🎉 COMPLETE → Ligand_Metadata.csv
===================================================================
[08:43:00] [mem] after 7_metadata.py parent=98.8MB delta=+0.0MB combined_peak=223.9MB child_peak=125.1MB
[08:43:00] 🚀 Running 8_scaffold.py...
[08:43:00] 🐍 Pipeline Python: /app/.heroku/python/bin/python
[08:43:00] [mem] before 8_scaffold.py parent=98.8MB combined=98.8MB
[08:43:00] 🧵 Worker caps for 8_scaffold.py: pipeline_max=1 WARHEAD_SQCHK_MAX_WORKERS=1 WARHEAD_PDBMKR_MAX_WORKERS=1 WARHEAD_SASA_MAX_WORKERS=3 WARHEAD_METADATA_MAX_WORKERS=3 WARHEAD_MCS_MAX_WORKERS=3
[08:43:00] ⏱ No-output watchdog for 8_scaffold.py: 180s
[08:43:00] [mem] running 8_scaffold.py parent=98.8MB child_tree=1.3MB combined=100.1MB
📥 Loaded 2 rows from Resolved_SASA_Summary.csv
🔬 Found 1 protein targets.
✅ Stage 1 complete — base scaffold mapping and diversity scores saved.
🎉 Stage 2 complete — advanced scaffold data saved.
📦 All tables written to Target_Table/
[08:43:00] [mem] after 8_scaffold.py parent=98.8MB delta=+0.0MB combined_peak=220.7MB child_peak=121.9MB
[08:43:00] 🚀 Running 9_2Dmapping.py...
[08:43:00] 🐍 Pipeline Python: /app/.heroku/python/bin/python
[08:43:00] [mem] before 9_2Dmapping.py parent=98.8MB combined=98.8MB
[08:43:00] 🧵 Worker caps for 9_2Dmapping.py: pipeline_max=1 WARHEAD_SQCHK_MAX_WORKERS=1 WARHEAD_PDBMKR_MAX_WORKERS=1 WARHEAD_SASA_MAX_WORKERS=3 WARHEAD_METADATA_MAX_WORKERS=3 WARHEAD_MCS_MAX_WORKERS=3
[08:43:00] ⏱ No-output watchdog for 9_2Dmapping.py: 180s
[08:43:00] [mem] running 9_2Dmapping.py parent=98.8MB child_tree=0.5MB combined=99.3MB
📥 Loading: Resolved_SASA_Summary.csv
✅ Using: Target=Target, Ligand=Warhead, SMILES=SMILES
🧬 Generating atom-level mapping...
🎉 SUCCESS: All maps saved to Target_Table
[08:43:01] [mem] after 9_2Dmapping.py parent=98.8MB delta=+0.0MB combined_peak=99.3MB child_peak=0.5MB
[08:43:01] 🚀 Running 10_2DmappingExtraction.py...
[08:43:01] 🐍 Pipeline Python: /app/.heroku/python/bin/python
[08:43:01] [mem] before 10_2DmappingExtraction.py parent=98.8MB combined=98.8MB
[08:43:01] 🧵 Worker caps for 10_2DmappingExtraction.py: pipeline_max=1 WARHEAD_SQCHK_MAX_WORKERS=1 WARHEAD_PDBMKR_MAX_WORKERS=1 WARHEAD_SASA_MAX_WORKERS=3 WARHEAD_METADATA_MAX_WORKERS=3 WARHEAD_MCS_MAX_WORKERS=3
[08:43:01] ⏱ No-output watchdog for 10_2DmappingExtraction.py: 180s
[08:43:01] [mem] running 10_2DmappingExtraction.py parent=98.8MB child_tree=0.7MB combined=99.5MB
✅ Extracted ligand atom coordinates for 53 atoms
💾 Saved → Ligand_3D_Atoms.csv
[08:43:01] [mem] after 10_2DmappingExtraction.py parent=98.8MB delta=+0.0MB combined_peak=99.5MB child_peak=0.7MB
[08:43:01] 🚀 Running 11_mcsMatcher.py...
[08:43:01] 🐍 Pipeline Python: /app/.heroku/python/bin/python
[08:43:01] [mem] before 11_mcsMatcher.py parent=98.8MB combined=98.8MB
[08:43:01] 🧵 Worker caps for 11_mcsMatcher.py: pipeline_max=1 WARHEAD_SQCHK_MAX_WORKERS=1 WARHEAD_PDBMKR_MAX_WORKERS=1 WARHEAD_SASA_MAX_WORKERS=3 WARHEAD_METADATA_MAX_WORKERS=3 WARHEAD_MCS_MAX_WORKERS=3
[08:43:01] ⏱ No-output watchdog for 11_mcsMatcher.py: 300s
[08:43:01] [mem] running 11_mcsMatcher.py parent=98.8MB child_tree=0.6MB combined=99.4MB
ℹ️ No ligand alias resolution required (all ligands resolved in SMILES map).
🚀 Running MCS on 2 ligand occurrences mode=isolated-sequential max_workers=1
⚙️ Using hard timeout (60s per ligand) via SIGALRM
⚙️ Step 11 heartbeat enabled=1 interval=20s progress_every=1
⚙️ Step 11 skip policy skip_bad_items=1 skip_stuck_items=1 item_isolation=1 max_item_failures=0
🔬 Step 11 item 1/2 start 7s1q_A_84W_702
⚠️ Step 11 item skipped: 1/2 7s1q_A_84W_702 stage=BUILD_ROWS reason=ITEM_FAILED
🖼️ Step 11 SVG ready 7s1q_A_84W_702
🔬 Step 11 item 1/2 done 7s1q_A_84W_702 sdf=written mapped=19 all_atoms=33 dt=0.1s
⏳ Step 11 progress: 1/2
🔬 Step 11 item 2/2 start 7s1q_A_MTA_701
🖼️ Step 11 SVG ready 7s1q_A_MTA_701
🔬 Step 11 item 2/2 done 7s1q_A_MTA_701 sdf=written mapped=20 all_atoms=20 dt=0.1s
⏳ Step 11 progress: 2/2
⏱ Step 11 heartbeat: processed=2/2 current=7s1q_A_MTA_701 stage=ITEM_DONE elapsed=0s item_elapsed=0s sdf_written=2 sdf_failed=0 svg_written=2 item_failures=1 last_done=7s1q_A_MTA_701
✅ MCS processing complete — outputs written
🧪 Step 11 summary: work_items=2 successful_items=1 item_failures=1 sdf_attempted=2 sdf_written=2 sdf_failed=0 sdf_skipped_existing=0 svg_written=2
🧪 SDF expected groups: 2
🧪 SDF files available: 2 → MCS_Output/MCS_SDF
🧪 SDF failure records: 0 → MCS_Output/Ligand_MCS_SDF_Failures.csv
🧪 Item failure records: 1 → MCS_Output/Ligand_MCS_Item_Failures.csv
🧪 SVG output path: MCS_Output/MCS_SVG
🧪 CSV output path: MCS_Output
🧪 SDF missing groups: 0
====================================================
🎉 COMPLETED MCS MAPPING + SASA ANNOTATION
📦 Map (MCS only)        → MCS_Output/Ligand_MCS_Map.csv
🧪 SASA (MCS only)       → MCS_Output/Ligand_MCS_SASA.csv
🧬 All atoms (debug)     → MCS_Output/Ligand_AllAtoms_Map.csv
🧪 SASA (ALL atoms)      → MCS_Output/Ligand_MCS_SASA_ALL_ATOMS.csv
⚠️ Failures              → MCS_Output/Ligand_MCS_Failures.csv
⚠️ SDF failures          → MCS_Output/Ligand_MCS_SDF_Failures.csv
⚠️ Item failures         → MCS_Output/Ligand_MCS_Item_Failures.csv
====================================================
🖼️  SVGs generated: 2 → MCS_Output/MCS_SVG
⚠️ MCS failures (first 10):
84W | 7s1q | Size mismatch: SMILES=19 vs 3D=33
[08:43:01] [mem] after 11_mcsMatcher.py parent=98.8MB delta=+0.0MB combined_peak=220.7MB child_peak=121.9MB
[08:43:01] ✅ SDF validation PASS after 11_mcsMatcher.py: MCS_Output/MCS_SDF files=2 expected=2 recorded_failures=0
[08:43:01] 🚀 Running 12_Results.py...
[08:43:01] 🐍 Pipeline Python: /app/.heroku/python/bin/python
[08:43:01] [mem] before 12_Results.py parent=99.8MB combined=99.8MB
[08:43:01] 🧵 Worker caps for 12_Results.py: pipeline_max=1 WARHEAD_SQCHK_MAX_WORKERS=1 WARHEAD_PDBMKR_MAX_WORKERS=1 WARHEAD_SASA_MAX_WORKERS=3 WARHEAD_METADATA_MAX_WORKERS=3 WARHEAD_MCS_MAX_WORKERS=3
[08:43:01] ⏱ No-output watchdog for 12_Results.py: 180s
[08:43:01] [mem] running 12_Results.py parent=99.8MB child_tree=0.5MB combined=100.3MB
✅ Integrated 3DSASAmapped.csv created with standard headers.
[08:43:02] [mem] after 12_Results.py parent=99.8MB delta=+0.0MB combined_peak=100.3MB child_peak=0.5MB
[08:43:02] ✅ SDF validation PASS after 12_Results.py: TARGET_RESULTS/MCS_Output/MCS_SDF files=2 expected=2 recorded_failures=0
[08:43:02] 🚀 Running 15_ResultsMerged.py...
[08:43:02] 🐍 Pipeline Python: /app/.heroku/python/bin/python
[08:43:02] [mem] before 15_ResultsMerged.py parent=99.8MB combined=99.8MB
[08:43:02] 🧵 Worker caps for 15_ResultsMerged.py: pipeline_max=1 WARHEAD_SQCHK_MAX_WORKERS=1 WARHEAD_PDBMKR_MAX_WORKERS=1 WARHEAD_SASA_MAX_WORKERS=3 WARHEAD_METADATA_MAX_WORKERS=3 WARHEAD_MCS_MAX_WORKERS=3
[08:43:02] ⏱ No-output watchdog for 15_ResultsMerged.py: 180s
[08:43:02] [mem] running 15_ResultsMerged.py parent=99.8MB child_tree=2.8MB combined=102.6MB
🧬 Using SASA file: Warhead_SASA_atoms.csv
✅ Wrote merged atom table: Ligand_3D_Atoms_with_SASA.csv
📊 Total atoms: 53
🎉 RESULTS MERGE COMPLETE
[08:43:02] [mem] after 15_ResultsMerged.py parent=99.8MB delta=+0.0MB combined_peak=102.6MB child_peak=2.8MB
[08:43:02] 🚀 Running 16_ResultsDisplay.py...
[08:43:02] 🐍 Pipeline Python: /app/.heroku/python/bin/python
[08:43:02] [mem] before 16_ResultsDisplay.py parent=99.8MB combined=99.8MB
[08:43:02] 🧵 Worker caps for 16_ResultsDisplay.py: pipeline_max=1 WARHEAD_SQCHK_MAX_WORKERS=1 WARHEAD_PDBMKR_MAX_WORKERS=1 WARHEAD_SASA_MAX_WORKERS=3 WARHEAD_METADATA_MAX_WORKERS=3 WARHEAD_MCS_MAX_WORKERS=3
[08:43:02] ⏱ No-output watchdog for 16_ResultsDisplay.py: 180s
[08:43:02] [mem] running 16_ResultsDisplay.py parent=99.8MB child_tree=0.5MB combined=100.3MB
📁 ResultsDisplay root: /app/jobs/3aeb3b71
📁 WAR_PDB root: /app/jobs/3aeb3b71/WAR_PDB
📁 SDF roots: ['/app/jobs/3aeb3b71/MCS_Output/MCS_SDF', '/app/jobs/3aeb3b71/TARGET_RESULTS/MCS_Output/MCS_SDF']
🧪 Indexed SDF exact keys: 2
🧪 Indexed SDF loose keys: 2
🧾 Residue lookup keys: 2
✅ Wrote /app/jobs/3aeb3b71/Results_Display.csv (2 SDF-backed entries)
📊 Input WAR_PDB rows skipped due to missing SDF: 0
[08:43:02] [mem] after 16_ResultsDisplay.py parent=99.8MB delta=+0.0MB combined_peak=100.3MB child_peak=0.5MB
[08:43:02] ✅ final SDF validation PASS: rows=2 matched=2 sdf_files=2 dir=jobs/3aeb3b71/TARGET_RESULTS/MCS_Output/MCS_SDF
