Boltz-2によるADCの構造予測
例:https://www.sciencedirect.com/science/article/pii/S0045206824004097
linker 2, DM1, cystein
https://scrapbox.io/files/69169478047379fcd4bc9f12.png
1. linker+payloadのsmilesを作成
https://scrapbox.io/files/691694812053cd25c34acd97.png
システインに共有結合としてつけるパターン(うまくできるかわからない)
https://scrapbox.io/files/6916947fdedaa9f67ee4b5a8.png
linker_payloadだけADCD1という名前でccd化
まずBoltz-2のCCDを直接書き換えてしまうのを防ぐためバックアップする
code:bash
cp ~/.boltz/ccd.pkl ~/.boltz/ccd.pkl.bak
https://github.com/YumizSui/boltz-generalized-covalent-modification
code:;
python boltz-generalized-covalent-modification/add_ccd_entry.py \
"COc1cc2cc(c1Cl)N(C)C(=O)CC@H(OC(=O)C@H(C)N(C)C(=O)CCSC1CC(=O)N(CCCN3C(=O)CCC3=O)C1=O)C@1(C)OC@H1C@H(C)C@@H1CC@@(O)(NC(=O)O1)C@H(OC)/C=C/C=C(\C)C2" \
"ADCD1" --force
code:yaml
version: 1
sequences:
- protein:
id: A,B
sequence: DIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC
msa: boltz_output/boltz_results_TRX/msa/TRX_0.csv
- protein:
id: C,D
sequence: EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTHTCPPCPAPELLGGPSVFLFPPKPKDTLMISRTPEVTCVVVDVSHEDPEVKFNWYVDGVEVHNAKTKPREEQYNSTYRVVSVLTVLHQDWLNGKEYKCKVSNKALPAPIEKTISKAKGQPREPQVYTLPPSREEMTKNQVSLTCLVKGFYPSDIAVEWESNGQPENNYKTTPPVLDSDGSFFLYSKLTVDKSRWQQGNVFSCSVMHEALHNHYTQKSLSLSPGK
msa: boltz_output/boltz_results_TRX/msa/TRX_1.csv
- ligand:
id: E
ccd: ADCD1
constraints:
- bond:
atom1: C, 229, SG
atom2: E, 1, C38
templates:
- cif: /home/6/uc02086/workspace-kf/playground/ADC/boltz_output/boltz_results_TRX/predictions/TRX/TRX_model_0.cif
以下失敗例
kfurui.iconBoltz-2の性能の問題(多分)で失敗しているが手順としてはこのように実行する
こちらはシステイン自体を既にリンカーと結合させたcys_linker_payloadを特殊なアミノ酸として扱う方法
https://scrapbox.io/files/6916947b737423e9f7165207.png
リンカーとペイロードをつけることには成功したが構造が破綻してる。(use_potentialsもむなしく。)
https://boltz-community.slack.com/archives/C080ZHBSFK8/p1754052358738429
失敗原因についてそれっぽいことがboltz communityのslackで書いてあった
おそらくトークン単位で処理している都合上修飾残基の結合情報をうまく取り扱えていない。修飾の範囲を大きく超える場合は共有結合を使った方が良さそう。
例:https://www.sciencedirect.com/science/article/pii/S0045206824004097
linker 2, DM1, cystein
1. cys+linker+payloadのsmilesを作成
https://scrapbox.io/files/69169478047379fcd4bc9f12.png
code:リンカーとペイロードの結合.py
from rdkit import Chem
from rdkit.Chem import AllChem
linker2_smi_link = "C(CN1C(=O)C(*:1)CC1=O)CN2C(=O)C(*:2)CC2=O"
linker2_mol_link = Chem.MolFromSmiles(linker2_smi_link)
dm1_smi_link = "CC@@H1C@@H2CC@(C@@H(/C=C/C=C(/CC3=CC(=C(C(=C3)OC)Cl)N(C(=O)CC@@H(C@4(C@H1O4)C)OC(=O)C@H(C)N(C)C(=O)CCS:3)C)\C)OC)(NC(=O)O2)O"
dm1_mol_link = Chem.MolFromSmiles(dm1_smi_link)
cys = Chem.MolFromSmiles('NC@@H(CS:4)C(=O)O')
linker = linker2_mol_link
payload = dm1_mol_link
rxn1 = AllChem.ReactionFromSmarts("#0:1-*:4.S:3>>*:4-S:3")
rxn1.Initialize()
prod1 = rxn1.RunReactants((linker, payload))
linker_payload = prod100
rxn2 = AllChem.ReactionFromSmarts("#0:2-*:5.S:4>>*:5-S:4")
rxn2.Initialize()
prod2 = rxn2.RunReactants((linker_payload, cys))
cys_linker_payload = prod200
Chem.SanitizeMol(cys_linker_payload)
print(Chem.MolToSmiles(cys_linker_payload))
COc1cc2cc(c1Cl)N(C)C(=O)C[C@H](OC(=O)[C@H](C)N(C)C(=O)CCSC1CC(=O)N(CCCN3C(=O)CC(SC[C@H](N)C(=O)O)C3=O)C1=O)[C@]1(C)O[C@H]1[C@H](C)[C@@H]1C[C@@](O)(NC(=O)O1)[C@H](OC)/C=C/C=C(\C)C2
2. cys+linker+payloadをCCDに登録
まずBoltz-2のCCDを直接書き換えてしまうのを防ぐためバックアップする
code:bash
cp ~/.boltz/ccd.pkl ~/.boltz/ccd.pkl.bak
https://github.com/YumizSui/AJACS-PSP-2025 のcovalent_inference.pyによってCCDに3次元ポーズを生成してCCDにCYSD1というkeyで登録(名前自体は被らなければ何でも良い)
(https://github.com/benf549/boltz-generalized-covalent-modification を参考に実装、こっちはBoltz-1にしか対応してない)
code:bash
python src/covalent_inference.py \
"COc1cc2cc(c1Cl)N(C)C(=O)CC@H(OC(=O)C@H(C)N(C)C(=O)CCSC1CC(=O)N(CCCN3C(=O)CC(SCC@H(N)C(=O)O)C3=O)C1=O)C@1(C)OC@H1C@H(C)C@@H1CC@@(O)(NC(=O)O1)C@H(OC)/C=C/C=C(\C)C2" \
"CYS" \
"CYSD1"
https://scrapbox.io/files/691694748b789de87e0f5452.png
3. Boltz-2の実行
code:TRX_adc.yaml
version: 1
sequences:
- protein:
id: A,B
sequence: DIQMTQSPSSLSASVGDRVTITCRASQDVNTAVAWYQQKPGKAPKLLIYSASFLYSGVPSRFSGSRSGTDFTLTISSLQPEDFATYYCQQHYTTPPTFGQGTKVEIKRTVAAPSVFIFPPSDEQLKSGTASVVCLLNNFYPREAKVQWKVDNALQSGNSQESVTEQDSKDSTYSLSSTLTLSKADYEKHKVYACEVTHQGLSSPVTKSFNRGEC
msa: boltz_output/boltz_results_TRX/msa/TRX_0.csv
- protein:
id: C
sequence: EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTHTCPPCPAPELLGGPSVFLFPPKPKDTLMISRTPEVTCVVVDVSHEDPEVKFNWYVDGVEVHNAKTKPREEQYNSTYRVVSVLTVLHQDWLNGKEYKCKVSNKALPAPIEKTISKAKGQPREPQVYTLPPSREEMTKNQVSLTCLVKGFYPSDIAVEWESNGQPENNYKTTPPVLDSDGSFFLYSKLTVDKSRWQQGNVFSCSVMHEALHNHYTQKSLSLSPGK
msa: boltz_output/boltz_results_TRX/msa/TRX_1.csv
modifications:
- position: 229
ccd: CYSD1
- protein:
id: D
sequence: EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSSASTKGPSVFPLAPSSKSTSGGTAALGCLVKDYFPEPVTVSWNSGALTSGVHTFPAVLQSSGLYSLSSVVTVPSSSLGTQTYICNVNHKPSNTKVDKKVEPKSCDKTHTCPPCPAPELLGGPSVFLFPPKPKDTLMISRTPEVTCVVVDVSHEDPEVKFNWYVDGVEVHNAKTKPREEQYNSTYRVVSVLTVLHQDWLNGKEYKCKVSNKALPAPIEKTISKAKGQPREPQVYTLPPSREEMTKNQVSLTCLVKGFYPSDIAVEWESNGQPENNYKTTPPVLDSDGSFFLYSKLTVDKSRWQQGNVFSCSVMHEALHNHYTQKSLSLSPGK
msa: boltz_output/boltz_results_TRX/msa/TRX_1.csv
templates:
- cif: /home/6/uc02086/workspace-kf/playground/ADC/boltz_output/boltz_results_TRX/predictions/TRX/TRX_model_0.cif
Cの一箇所だけCYSD1にする例
boltz predict boltz_input/TRX_adc.yaml --out_dir boltz_output --no_kernels --use_potentials --recycling_steps 10
https://scrapbox.io/files/69169470f0beb39fcff7c27d.png
CYSD1だけならうまく予測できるのでアミノ酸とつなげることによって悪さをしていそう