Как построены модели комплекса человеческого XPD/ERCC2 + дуплекс ДНК с платиновым аддуктом + кластер [4Fe-4S], показанные в сравнительном 3D-вьювере.
XPD (helicase-субъединица TFIIH) в ходе эксцизионной репарации нуклеотидов (NER) «верифицирует» повреждение: повреждённая одиночная нить ДНК продевается сквозь центральную пору XPD, в сужении между доменами FeS и Arch, и повреждение застревает у контрольной точки His135. Оксалиплатин образует 1,2-внутринитевой сшив d(GpG) — два ковалентных Pt–N7(гуанин) в плоскоквадратном Pt(II). Задача — получить трёхмерный комплекс XPD + Y-вилка дцДНК + Pt-аддукт + [4Fe-4S] в этой «верификационной» конформации, а затем сравнить, как разные Pt-аддукты меняют комплекс и, в частности, расстояние Pt → [4Fe-4S].
Итог во вьювере: 9 «запечатанных» структур сравнительной миссии (замороженный якорь + улучшенная
база + 7 вариантов) плюс 1 ad-hoc follow-on (monoflip) — итого 10 CIF в одном селекторе 3Dmol.js.
Все построены на одном фиксированном каркасе XPD/9PCP; между структурами меняется только Pt-аддукт.
| Пакет | Версия | Роль | Где |
|---|---|---|---|
| Boltz-2 | 2.2.1 (веса MIT) | ко-фолдинг протеин+ДНК+лиганды+металл | GPU (Vast.ai) |
| PyTorch | 2.12.0 +cu126 | backend Boltz (дефолтный PyPI тянет cu130 → «driver too old») | GPU |
| cuequivariance-torch / -ops-cu12 | 0.10.0 | Boltz | GPU |
| numpy | 1.26.4 | Boltz <2.0 / numba <2.2 | везде |
| Python | 3.10–3.12 | — | везде |
| MMseqs2 | публичный сервер | MSA для протеина (--use_msa_server) | облако |
| OpenMM | 8.5.1 | ограниченная минимизация (forcefield amber14 + неявный сольвент) | CPU (hive3070T06) |
| PDBFixer | — | добивка H / термини ДНК | CPU |
| gemmi | — | mmCIF, геометрия, гейты, идеализация куба | CPU |
| RDKit | cp312 wheel | только органический скелет каррьера (кольцо DACP), не Pt-сфера | CPU |
| Open Babel | 3.1.1 CLI | конвертация форматов / H | CPU |
| 3Dmol.js / Caddy | CDN / — | 3D-рендер / статический хостинг | браузер / hermes |
Железо: GPU-часть (Boltz) — арендованные ноды Vast.ai (RTX 6000 Ada / A6000, ≈$0.14 за прогон);
CPU-часть (все минимизации/измерения) — hive3070T06 (56 vCPU / 125 GB). Пины окружения Boltz заморожены в
setup_boltz_env.sh + boltz-env.lock.txt.
Правило приоритета координат: экспериментальные PDB → идеальные CCD → построение de-novo. Геометрия Pt — всегда из PDB/CCD, никогда из SMILES (RDKit/openbabel плохо с плоскоквадратным d⁸).
| ID | Что | Роль |
|---|---|---|
| UniProt P18074 | ERCC2_HUMAN, 760 aa — последовательность человеческого XPD | вход протеина Boltz; задаёт нумерацию остатков |
| PDB 9PCP | cryo-EM человеческого pre-incision NER (chain B = XPD, 100% id к P18074, нативный [4Fe-4S], His135, продетая повр. нить) | финальный анкерный каркас всех моделей |
| PDB 9A88 | Yu et al. 2024, человеческий pre-incision complex | ранний каркас; вытеснен 9PCP |
| PDB 8REV / EMD-19109 | ctXPD на сшитой Y-вилке | шаблон продевания ДНК (Route B) + позитивный контроль |
| 6RO4, 6NMI, 5OF4, 4A15 | TFIIH/XPD (человек и археи) | референс фолда; 6RO4 — источник координирующих Cys |
| ID | Что | Роль |
|---|---|---|
| CCD SF4 | лиганд-код [4Fe-4S] (FE1–FE4, S1–S4) | кодирование кластера (Boltz + chain S комплекса) |
| PDB 2FDN | ферредоксин Clostridium, чистый куб [4Fe-4S] | референс идеального куба + калибровка FeS-гейта |
| Cys116/134/155/190 | координирующие цистеины XPD (P18074) | 1:1 Fe→Sγ; в ctXPD/8REV = 115/133/154/189 |
| ID | Что | Роль |
|---|---|---|
| PDB 1IHH | оксалиплатин 1,2-d(GpG) сшив, X-ray 2.4 Å (Spingler/Whittington/Lippard 2001); PT + DNH + 2×DG | источник прививки платинированного динуклеотида |
| CCD 1PT | слитый оксалиплатин Pt(R,R-DACH), C₆H₁₄N₂Pt | лиганд-код для Boltz (предпочтителен над split PT+DNH) |
| 1PG9 / 1PGC | ЯМР оксалиплатин-GG, изгиб ~30–31° | валидационный референс |
| 3LPV / 1AIO / 1A84 | цисплатин-GG аналоги | только валидация |
| Вариант | Источник Pt-сферы | Топология |
|---|---|---|
| S,S-оксалиплатин (энантиомер) | de-novo: зеркалирование R,R→S,S от 1IHH/1PT | бифункц. |
| Монофункц. R,R / S,S оксалиплатин | de-novo от 1IHH/1PT (−2-й Pt–N7, +aqua); топология-шаблон пириплатин PDB 3M3Y/3M4O, CCD C7P | монофункц. |
| Фенантриплатин | PDB 4Q8E (1.55 Å)/4Q8F, CCD P9G — извлечён напрямую | монофункц. |
| Пикоплатин | CCD A1H58 (Pt·NH₃·Cl·2-пиколин), несётся в PDB 9EO8 (RNase A, 1.76 Å) | монофункц. |
| R,R / S,S-DACP (кольцо-контракция) | de-novo: циклогексан→циклопентан (RDKit) + эксп. Pt-центр | бифункц. |
De-novo варианты (S,S-окса, оба монофункц. оксалиплатина, оба DACP) не имеют PDB/CCD-подтверждения — повышенная неопределённость (зафиксировано).
Конвейер как он реально исполнялся. Исторические тупики (Route A/B) оставлены намеренно — они объясняют, почему финальный каркас именно такой.
Не задача для ESM (только белок). Нужен all-atom ко-фолдинг. Выбран Boltz-2: MIT-веса (коммерчески чисто) + чистый путь связи «CCD-лиганд ↔ канонический остаток» для Pt–N7. (Утверждение «AF3 запрещает лиганд-полимерные связи» опровергнуто — запрещены только полимер↔полимер.)
Кодирование входа (build_input.py → boltz_input.yaml): 1 protein = P18074
+ MSA; 2 dna (Y-вилка, не тупой дуплекс); сшитые гуанины — обычные DG, сшив через
bonds; лиганды CCD 1PT и CCD SF4; сшив = 2 bond [L,1,PT]→[нить,i|i+1,N7];
FeS = 4 bond 1:1 Fe→Cys.SG. Запуск:
boltz predict … --use_msa_server --diffusion_samples 5 (≥5 семплов). Раннер run_cofold.sh.
Находка №1: Boltz точно ставит белок и [4Fe-4S] (Fe→Cys 1.9–2.1 Å, каждый Fe 4-координатный), но роняет Pt–DNA-сшив (0/2 Pt–N7 во всех 5 моделях). pLDDT/PAE ≠ геометрия. Починка — прививка (Этап 5).
Находка №2: поражение «плавает» в 42–60 Å от поры; мягкий contact не протаскивает нить сквозь
пору (топологический ход). Находка №3: по Yu et al. 2024 (9A88) нить продета через сужение FeS↔Arch,
поражение у His135.
Route A (Boltz-шаблон 8REV + His135-контакты + прививка): химия проходит гейты, но направленность нити НЕВЕРНА (3′-конец не выходит к XPG; гейты не тестируют полярность). Route B (трансплант продетой ДНК 8REV): направленность идеальна (5′→3′ dot +1.00), но поражение ~17 Å от Boltz-кармана. Вывод: на гибриде — либо направленность, либо поражение-в-кармане.
Дилемма решена переносом на 9PCP — напрямую определённый человеческий экспериментальный каркас, где сразу и
белок, и продетая нить, и His135-регистр поражения в одном фрейме. Сборка (build_9pcp_complex.py, gemmi):
chain B 9PCP → A (XPD); SF4 → S; повр. нить L → B; комплемент M → C;
placeholder 1PT → L. Финальная одиночная модель — results_threaded/c9pcp_min.cif
(честные 5/5 гейтов; она же — якорь frozen_base и модель на главной странице).
graft_routeB.py: жёстко-телесная трансплантация целого платинированного d(GpG) из 1IHH на два
гуанина модели (суперпозиция по сахарофосфатному остову DG62/DG63). Прививка только Pt не работает. Итог: Pt–N7
~1.94/1.98 Å, N7–Pt–N7 ~90°, CN=4. Регистр: B DG62(5′)/DG63(3′), фланги DT/DC (контекст «TGGC»).
Единый билдер build_adduct.py (спеки JSON в specs/). Два режима:
guanine_transplant (референс уже несёт платинированный гуанин: 1IHH или 4Q8E P9G —
суперпозиция и перенос всей платинированной единицы; сфера верна по построению) и fragment_swap (изолированный
Pt-фрагмент, напр. пикоплатин A1H58 из 9EO8, садится на донор-роли монофункц. шаблона по
donor_map). RDKit — только органический скелет (кольцо DACP). CCD-координаты:
curl files.rcsb.org/ligands/download/<CCD>.cif.
minimize_adduct*.py на OpenMM 8.5.1 (amber14 + неявный сольвент), на hive3070T06. Pt-аддукт и
SF4 вынесены как частицы исключённого объёма (нет в amber-FF). Гибридный каррьер
(--carrier-mode hybrid): жёсткая плоскоквадратная Pt-сфера удерживается рестрейнтом k≈1e5, органический
скелет подвижен; для S,S — --lock-carrier-chirality (+ --k-ring 1e6). Термини ДНК amber14:
+OXT, снять 5′-фосфат, удалить осиротевший OP1, резать на разрывах нумерации. Cys→Fe рестрейнится «наружу», чтобы
все 4 Sγ сели, не слившись.
c9pcp_min.cif) vs «улучшенный» подвижный
(base_improved_min.cif) дают сдвиг Pt–nearest-Fe всего −0.007 Å — он вынесен отдельно и не входит
в дельты вариантов, чтобы дельта отражала химию аддукта, а не смену метода.Единый измеритель measure_complex.py: Pt–nearest-Fe, Pt–Fe-centroid, Pt–His135-NE2, координация,
GpG-destack, пакеровка Кремера–Попла (Q), наклон ароматики, клэши. Независимая перепроверка —
verify_pt_fes_independent.py. Конверт воспроизводимости: база переминимизирована идентичным
протоколом из возмущённых (гаусс σ=0.05 Å на подвижные тяжёлые атомы; куб [4Fe-4S] не возмущается) и
контрольных стартов → perturbed-2σ ≈ 0.039 Å, полный конверт ≈ 0.088 Å. Вердикт:
|Δ|>конверт → REAL; ≤2σ → шум.
validate_geometry.py (gemmi): (1) оба Pt–N7 ~1.95–2.05 Å, N7–Pt–N7 ~90° (проверено на 1IHH);
(2) Pt 4-координатный плоскоквадрат; (3) куб [4Fe-4S] — каждый Fe CN=4, 1:1 Fe:Cys (проверено на 2FDN);
(5) размещение в поре (soft WARN). Слепое пятно: полярность 5′→3′ не тестируется (урок Route A). Плюс
адверсариальные проверки Zenith-миссии: обе линии 7/7; 15 VAL-* + 6 гейтов запечатаны.
build_variants_manifest.py читает PT_FES_TABLE.json + per-variant
*_measure.json, копирует 10 CIF в data/variants/ и пишет manifest.json.
variants.html = селектор 3Dmol.js по семействам. Публикация: bash deploy.sh → Caddy.
«Локализация» кластера прошла через несколько механизмов по мере эволюции каркаса; в финальной модели — комбинация нативного размещения из эксперимента + идеализации геометрии + жёсткого гейта.
Координирующие остатки. В человеческом XPD кластер координируют Cys116, Cys134, Cys155, Cys190 (полноразмерная каноническая нумерация P18074; эксп. свидетельство — PDB 6RO4). Рядом стоит His135 — контрольный остаток верификации (Cys134 и His135 — соседи). В ctXPD (8REV) эти цистеины = 115/133/154/189.
Fe→Cys.SG в бижекции 1:1. Критично: каждый Fe связывает ровно один Sγ (+3 мостиковых S). Boltz ставит
кластер корректно сам (Fe→Cys 1.9–2.1 Å, каждый Fe 4-координатный). Индекс-гейт: утвердить, что остаток на каждом
индексе — действительно CYS.build_9pcp_complex.py) остаток SF4 копируется в отдельную chain S — отдельная
локализация не нужна, только сохранение.idealize_cluster.py, gemmi). Нативный куб 9PCP имеет верные
позиции Fe (Sγ–Fe ~2.25 Å), но искажённый внутренний куб (одна Fe–S растянута до 3.88 Å — артефакт cryo-EM).
Процедура: (1) найти куб в модели и в референсе 2FDN (4 Fe + 4 S); (2) спарить Fe модели↔референса ближайшим
соседом в центроидном фрейме (вершины взаимозаменяемы → жадное сопоставление); (3) суперпозиция Кабша
(gemmi.superpose_positions) чистого куба 2FDN на 4 Fe модели; (4) заменить chain S трансформированным
чистым кубом. Итог: позиции Fe почти не двигаются (координация Sγ–Fe сохранена, 2.13–2.42 Å по 4/4 Cys), но
внутренние Fe–S/S–S становятся физиологичными (~2.2–2.4 Å).validate_geometry.py). Для каждого Fe в пределах
FE_COORD_CUTOFF = 2.7 Å: исключить металл-металл (Fe–Fe ~2.7 Å); считать координацию по сере (3
мостиковых S + 1 Cys.SG); требовать CN=4 и ровно один Cys.SG. Откалибровано на 2FDN.SF4 держится как фиксированный объём
исключения, Cys→Fe рестрейнится «наружу». В сравнении весь куб (chain S) заморожен как фиксированная опора
измерения Pt-расстояния — не возмущается даже в noise-envelope, поэтому Pt→[4Fe-4S] дельты отражают только химию
аддукта. Ближайший Fe во всех структурах — S:FE3.Компаратор — улучшенная база оксалиплатина R,R (Δ≡0). Вердикт по Pt–nearest-Fe:
|Δ|>0.088 Å = REAL; ≤0.039 Å = шум.
| Структура | Топол. | Каррьер | Pt–nearest-Fe, Å | Δ, Å | Вердикт |
|---|---|---|---|---|---|
| Frozen base (окса R,R) — якорь | би | R,R-DACH | 12.362 | (метод −0.007) | метод-эффект |
| Improved base (окса R,R) — компаратор | би | R,R-DACH | 12.355 | 0 | — |
| S,S-оксалиплатин (энантиомер) | би | S,S-DACH | 12.351 | −0.004 | шум |
| Монофункц. R,R-оксалиплатин | моно | R,R-DACH + aqua | 12.378 | +0.023 | шум |
| Монофункц. S,S-оксалиплатин | моно | S,S-DACH + aqua | 12.398 | +0.043 | borderline |
| Фенантриплатин | моно | фенантридин + 2 NH₃ | 12.132 | −0.223 | REAL |
| Пикоплатин | моно | 2-пиколин + NH₃ + Cl | 12.137 | −0.218 | REAL |
| R,R-DACP (кольцо-контракция) | би | R,R-диаминоциклопентан | 12.321 | −0.034 | шум |
| S,S-DACP (кольцо-контракция) | би | S,S-диаминоциклопентан | 12.300 | −0.055 | borderline |
| monoflip — монофункц. R,R на изолир. НЕ-стэкающемся G (ATG*T) | моно | R,R-DACH + aqua | 13.053 | +0.698 | REAL (follow-on) |
Главный вывод: только два объёмных монофункциональных аддукта — фенантриплатин (Δ−0.223 Å) и
пикоплатин (Δ−0.218 Å) — реально придвигают Pt к кластеру [4Fe-4S] (за пределами конверта шума). Все стерео
(R,R↔S,S), моно-vs-би и контракция DACH→DACP — в пределах шума. Отдельно: сделать гуанин не-стэкающимся
(follow-on monoflip, ATG*T, глициозидный флип −35°) — первое одиночно-гуаниновое изменение, двигающее
Pt–[4Fe-4S] на реальную величину (+0.698 Å, т.е. дальше от кластера).
Биология XPD / верификация / His135 / продевание
Химия оксалиплатин-d(GpG) и энантио/секвенс-зависимость
Варианты аддуктов
Кластер [4Fe-4S] и движки
github.com/jwohlwend/boltz (версия 2.2.1). MSA — сервер
MMseqs2. Минимизация — OpenMM 8.5.1 (amber14).xpd-oxaliplatin-cofold, ни biometal-xpd-viewer не являются
git-репозиториями — это on-disk источники истины на хосте hermes. Внешние структуры — из RCSB.Основной пайплайн — /root/xpd-oxaliplatin-cofold/
RECIPE.md, MISSION_MEMORY.md, VARIANT_SOURCES.md,
decisions/variant-*.md, specs/README.md, REPRODUCIBILITY.md (полная версия этой страницы).setup_boltz_env.sh, boltz-env.lock.txt, run_cofold.sh,
вариантные run_*_hybrid.sh.build_input.py, boltz_input*.yaml, build_9pcp_complex.py,
build_routeB.py, build_adduct.py (+ specs/*.json),
ccd_to_cif.py, pico_fragment_from_9eo8.py, mutate_base.py,
flip_lesion.py.graft_lesion.py, graft_routeB.py,
idealize_cluster.py.minimize_adduct*.py, minimize_9pcp.py, declash_protein.py.validate_geometry.py, measure_complex.py,
measure_pt_metal.py, hbond_analysis.py.ref_9PCP.cif, ref_9A88.cif, ref_8REV.cif,
ref_1IHH.cif, ref_2FDN.cif, ref_variants/{4Q8E,9EO8,3M3Y,A1H58,C7P,P9G}.cif.results_threaded/c9pcp_min.cif и results_variants/
(SYNTHESIS.md, PT_FES_TABLE.{md,csv,json}, noise_envelope/,
per-variant */*_min.cif + *_measure.json).Вьювер — /root/biometal-xpd-viewer/: variants.html, index.html,
hbonds.html, methods.html; build_variants_manifest.py;
data/variants/; deploy.sh.
# 1) Окружение Boltz на GPU-боксе (Vast.ai; NOT hermes — здесь нет GPU) cd /root/xpd-oxaliplatin-cofold bash setup_boltz_env.sh # пины из boltz-env.lock.txt # 2) Ко-фолдинг (P18074 + Y-вилка ДНК + CCD 1PT + CCD SF4 + bond-констрейнты) python build_input.py # -> boltz_input.yaml bash run_cofold.sh # boltz predict --use_msa_server --diffusion_samples 5 -> гейт # 3) Финальный каркас из 9PCP + прививка оксалиплатина из 1IHH + идеализация куба python build_9pcp_complex.py # -> results_threaded/c9pcp_assembled.cif python graft_routeB.py # ставит Pt-d(GpG) на B62/63 python idealize_cluster.py results_threaded/c9pcp_grafted.cif results_threaded/c9pcp_ideal.cif --ref ref_2FDN.cif # минимизация на hive3070T06 -> results_threaded/c9pcp_min.cif (frozen base) # 4) Варианты: единый билдер по спеку + гибридная минимизация (пример — фенантриплатин) python build_adduct.py specs/phen.json # guanine_transplant из 4Q8E/P9G bash run_phen_hybrid.sh # minimize_adduct.py --topology monofunctional --carrier-mode hybrid # 5) Измерение + таблица + конверт шума + вердикты cd results_variants && ../.venv/bin/python build_pt_fes_table.py python verify_pt_fes_independent.py bash noise_envelope/run_noise.sh # 6) Гейты cd /root/xpd-oxaliplatin-cofold ./.venv/bin/python validate_geometry.py results_variants/phen/phen_min.cif --pore 158,161,192,193,196 --protein-chain A # 7) Публикация вьювера cd /root/biometal-xpd-viewer python build_variants_manifest.py bash deploy.sh # -> Caddy /var/www/xpd-cofold