Skip to content

Commit d6c07df

Browse files
authored
test(rf3): add MSA input tests (#364)
* test(rf3): add MSA a3m format-contract unit tests Checkpoint-free tests pinning the ColabFold-style a3m format rf3 expects at inference, parsed via atomworks parse_a3m. A self-documenting minimal a3m fixture exercises the query row, lowercase insertion stripping, gap columns, and TaxID header parsing (the key that drives multimer MSA pairing). Doubles as executable documentation of a valid rf3 MSA input. * test(rf3): add end-to-end MSA fold integration tests Feed pre-computed MSAs through rf3 fold across chain counts (monomer, homodimer, heteromer) and both input modes (JSON msa_path and CIF _msa_paths_by_chain_id). Inputs are short synthetic sequences with hand-built a3m files so the suite folds quickly on CPU; the heteromer uses a distinct a3m per chain with a shared TaxID to form a genuine paired MSA. Multi-chain cases assert iptm > 0. Two tests pin the raise_if_missing_msa_for_protein_of_length_n guard: it errors when a long protein lacks an MSA and stays quiet when present. Adds msa_fold_dir and msa_present_flag_dir fixtures and an assert_valid_plddt helper to the integration conftest. * test(rf3): remove duplicate assert_valid_plddt after production merge The production merge left a byte-identical duplicate of assert_valid_plddt in integration/conftest.py (F811). Remove the redundant definition and apply ruff formatting.
1 parent 019bd26 commit d6c07df

11 files changed

Lines changed: 617 additions & 0 deletions
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
[
2+
{
3+
"name": "heteromer_paired_msa",
4+
"components": [
5+
{
6+
"seq": "GLKEIWQYVRND",
7+
"chain_id": "A",
8+
"msa_path": "models/rf3/tests/data/msas/heteromer_A.a3m"
9+
},
10+
{
11+
"seq": "MRHDTFKNPGSA",
12+
"chain_id": "B",
13+
"msa_path": "models/rf3/tests/data/msas/heteromer_B.a3m"
14+
}
15+
]
16+
}
17+
]
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
[
2+
{
3+
"name": "homodimer_msa",
4+
"components": [
5+
{
6+
"seq": "WFKDLEQNGYRA",
7+
"chain_id": "A",
8+
"msa_path": "models/rf3/tests/data/msas/homodimer_A.a3m"
9+
},
10+
{
11+
"seq": "WFKDLEQNGYRA",
12+
"chain_id": "B",
13+
"msa_path": "models/rf3/tests/data/msas/homodimer_A.a3m"
14+
}
15+
]
16+
}
17+
]
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[
2+
{
3+
"name": "monomer_msa",
4+
"components": [
5+
{
6+
"seq": "SKADEIYLNRQV",
7+
"chain_id": "A",
8+
"msa_path": "models/rf3/tests/data/msas/monomer_A.a3m"
9+
}
10+
]
11+
}
12+
]
Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
data_monomer_msa_model
2+
#
3+
_entry.id monomer_msa_model
4+
_entry.author root
5+
_entry.date 2026-07-10
6+
_entry.time 21:58:48
7+
#
8+
_msa_paths_by_chain_id.A models/rf3/tests/data/msas/monomer_A.a3m
9+
#
10+
loop_
11+
_chem_comp_bond.pdbx_ordinal
12+
_chem_comp_bond.comp_id
13+
_chem_comp_bond.atom_id_1
14+
_chem_comp_bond.atom_id_2
15+
_chem_comp_bond.value_order
16+
_chem_comp_bond.pdbx_aromatic_flag
17+
_chem_comp_bond.pdbx_stereo_config
18+
1 SER N CA SING N ?
19+
2 SER CA C SING N ?
20+
3 SER CA CB SING N ?
21+
4 SER C O DOUB N ?
22+
5 SER CB OG SING N ?
23+
6 LYS N CA SING N ?
24+
7 LYS CA C SING N ?
25+
8 LYS CA CB SING N ?
26+
9 LYS C O DOUB N ?
27+
10 LYS CB CG SING N ?
28+
11 LYS CG CD SING N ?
29+
12 LYS CD CE SING N ?
30+
13 LYS CE NZ SING N ?
31+
14 ALA N CA SING N ?
32+
15 ALA CA C SING N ?
33+
16 ALA CA CB SING N ?
34+
17 ALA C O DOUB N ?
35+
18 ASP N CA SING N ?
36+
19 ASP CA C SING N ?
37+
20 ASP CA CB SING N ?
38+
21 ASP C O DOUB N ?
39+
22 ASP CB CG SING N ?
40+
23 ASP CG OD1 DOUB N ?
41+
24 ASP CG OD2 SING N ?
42+
25 GLU N CA SING N ?
43+
26 GLU CA C SING N ?
44+
27 GLU CA CB SING N ?
45+
28 GLU C O DOUB N ?
46+
29 GLU CB CG SING N ?
47+
30 GLU CG CD SING N ?
48+
31 GLU CD OE1 DOUB N ?
49+
32 GLU CD OE2 SING N ?
50+
33 ILE N CA SING N ?
51+
34 ILE CA C SING N ?
52+
35 ILE CA CB SING N ?
53+
36 ILE C O DOUB N ?
54+
37 ILE CB CG1 SING N ?
55+
38 ILE CB CG2 SING N ?
56+
39 ILE CG1 CD1 SING N ?
57+
40 TYR N CA SING N ?
58+
41 TYR CA C SING N ?
59+
42 TYR CA CB SING N ?
60+
43 TYR C O DOUB N ?
61+
44 TYR CB CG SING N ?
62+
45 TYR CG CD1 DOUB Y ?
63+
46 TYR CG CD2 SING Y ?
64+
47 TYR CD1 CE1 SING Y ?
65+
48 TYR CD2 CE2 DOUB Y ?
66+
49 TYR CE1 CZ DOUB Y ?
67+
50 TYR CE2 CZ SING Y ?
68+
51 TYR CZ OH SING N ?
69+
52 LEU N CA SING N ?
70+
53 LEU CA C SING N ?
71+
54 LEU CA CB SING N ?
72+
55 LEU C O DOUB N ?
73+
56 LEU CB CG SING N ?
74+
57 LEU CG CD1 SING N ?
75+
58 LEU CG CD2 SING N ?
76+
59 ASN N CA SING N ?
77+
60 ASN CA C SING N ?
78+
61 ASN CA CB SING N ?
79+
62 ASN C O DOUB N ?
80+
63 ASN CB CG SING N ?
81+
64 ASN CG OD1 DOUB N ?
82+
65 ASN CG ND2 SING N ?
83+
66 ARG N CA SING N ?
84+
67 ARG CA C SING N ?
85+
68 ARG CA CB SING N ?
86+
69 ARG C O DOUB N ?
87+
70 ARG CB CG SING N ?
88+
71 ARG CG CD SING N ?
89+
72 ARG CD NE SING N ?
90+
73 ARG NE CZ SING N ?
91+
74 ARG CZ NH1 SING N ?
92+
75 ARG CZ NH2 DOUB N ?
93+
76 GLN N CA SING N ?
94+
77 GLN CA C SING N ?
95+
78 GLN CA CB SING N ?
96+
79 GLN C O DOUB N ?
97+
80 GLN CB CG SING N ?
98+
81 GLN CG CD SING N ?
99+
82 GLN CD OE1 DOUB N ?
100+
83 GLN CD NE2 SING N ?
101+
84 VAL N CA SING N ?
102+
85 VAL CA C SING N ?
103+
86 VAL CA CB SING N ?
104+
87 VAL C O DOUB N ?
105+
88 VAL CB CG1 SING N ?
106+
89 VAL CB CG2 SING N ?
107+
#
108+
loop_
109+
_atom_site.group_PDB
110+
_atom_site.type_symbol
111+
_atom_site.label_atom_id
112+
_atom_site.label_alt_id
113+
_atom_site.label_comp_id
114+
_atom_site.label_asym_id
115+
_atom_site.label_entity_id
116+
_atom_site.label_seq_id
117+
_atom_site.pdbx_PDB_ins_code
118+
_atom_site.auth_seq_id
119+
_atom_site.auth_comp_id
120+
_atom_site.auth_asym_id
121+
_atom_site.auth_atom_id
122+
_atom_site.id
123+
_atom_site.B_iso_or_equiv
124+
_atom_site.occupancy
125+
_atom_site.pdbx_formal_charge
126+
_atom_site.Cartn_x
127+
_atom_site.Cartn_y
128+
_atom_site.Cartn_z
129+
_atom_site.pdbx_PDB_model_num
130+
ATOM N N . SER A 0 1 . 1 SER A N 0 0.7597811222076416 1.0 ? 2.309653 4.346503 -6.8098145 1
131+
ATOM C CA . SER A 0 1 . 1 SER A CA 1 0.7747170925140381 1.0 ? 1.5952196 3.4084847 -7.6140294 1
132+
ATOM C C . SER A 0 1 . 1 SER A C 2 0.7792373895645142 1.0 ? 0.5410079 2.7222881 -6.768473 1
133+
ATOM O O . SER A 0 1 . 1 SER A O 3 0.7590668201446533 1.0 ? 0.5639106 2.7475595 -5.5792923 1
134+
ATOM C CB . SER A 0 1 . 1 SER A CB 4 0.7614238262176514 1.0 ? 2.5551536 2.37565 -8.1900835 1
135+
ATOM O OG . SER A 0 1 . 1 SER A OG 5 0.7217631936073303 1.0 ? 3.0026708 1.4926984 -7.1864996 1
136+
ATOM N N . LYS A 0 2 . 2 LYS A N 6 0.7845911979675293 1.0 ? -0.60017633 2.4366565 -7.3194776 1
137+
ATOM C CA . LYS A 0 2 . 2 LYS A CA 7 0.794689953327179 1.0 ? -1.6933756 1.7240248 -6.6888776 1
138+
ATOM C C . LYS A 0 2 . 2 LYS A C 8 0.7967252135276794 1.0 ? -1.1495255 0.53655934 -5.903229 1
139+
ATOM O O . LYS A 0 2 . 2 LYS A O 9 0.7835640907287598 1.0 ? -1.6298678 0.2536976 -4.7652435 1
140+
ATOM C CB . LYS A 0 2 . 2 LYS A CB 10 0.788178563117981 1.0 ? -2.6967757 1.2122041 -7.7248325 1
141+
ATOM C CG . LYS A 0 2 . 2 LYS A CG 11 0.7491574287414551 1.0 ? -3.9844382 0.6963192 -7.1110635 1
142+
ATOM C CD . LYS A 0 2 . 2 LYS A CD 12 0.7541790008544922 1.0 ? -5.026118 0.4393914 -8.189464 1
143+
ATOM C CE . LYS A 0 2 . 2 LYS A CE 13 0.7080507278442383 1.0 ? -6.3351746 -0.07818332 -7.5284724 1
144+
ATOM N NZ . LYS A 0 2 . 2 LYS A NZ 14 0.7041823267936707 1.0 +1 -7.379929 -0.28953993 -8.539561 1
145+
ATOM N N . ALA A 0 3 . 3 ALA A N 15 0.7693952918052673 1.0 ? -0.13316485 -0.12451631 -6.327893 1
146+
ATOM C CA . ALA A 0 3 . 3 ALA A CA 16 0.7812573909759521 1.0 ? 0.4587286 -1.2927967 -5.6271596 1
147+
ATOM C C . ALA A 0 3 . 3 ALA A C 17 0.7830636501312256 1.0 ? 1.0794021 -0.8194612 -4.329121 1
148+
ATOM O O . ALA A 0 3 . 3 ALA A O 18 0.7672949433326721 1.0 ? 0.9268148 -1.4868672 -3.2731848 1
149+
ATOM C CB . ALA A 0 3 . 3 ALA A CB 19 0.7701584100723267 1.0 ? 1.5359726 -1.9344364 -6.529995 1
150+
ATOM N N . ASP A 0 4 . 4 ASP A N 20 0.7716728448867798 1.0 ? 1.7151057 0.33624634 -4.284695 1
151+
ATOM C CA . ASP A 0 4 . 4 ASP A CA 21 0.7826799154281616 1.0 ? 2.3117702 0.8895122 -3.1065936 1
152+
ATOM C C . ASP A 0 4 . 4 ASP A C 22 0.7856752872467041 1.0 ? 1.2534308 1.2667197 -2.084093 1
153+
ATOM O O . ASP A 0 4 . 4 ASP A O 23 0.7725765705108643 1.0 ? 1.4302502 1.0267594 -0.8811972 1
154+
ATOM C CB . ASP A 0 4 . 4 ASP A CB 24 0.7729076743125916 1.0 ? 3.1746964 2.1058693 -3.4818585 1
155+
ATOM C CG . ASP A 0 4 . 4 ASP A CG 25 0.7473865747451782 1.0 ? 4.469804 1.7103183 -4.1667695 1
156+
ATOM O OD1 . ASP A 0 4 . 4 ASP A OD1 26 0.7464264631271362 1.0 ? 4.9031687 0.5782217 -4.089451 1
157+
ATOM O OD2 . ASP A 0 4 . 4 ASP A OD2 27 0.7172075510025024 1.0 ? 5.019159 2.5907228 -4.7960567 1
158+
ATOM N N . GLU A 0 5 . 5 GLU A N 28 0.773800253868103 1.0 ? 0.17901799 1.8148676 -2.5499768 1
159+
ATOM C CA . GLU A 0 5 . 5 GLU A CA 29 0.7867516279220581 1.0 ? -0.9078238 2.201828 -1.6801797 1
160+
ATOM C C . GLU A 0 5 . 5 GLU A C 30 0.7887336611747742 1.0 ? -1.4791108 0.9617208 -0.9773601 1
161+
ATOM O O . GLU A 0 5 . 5 GLU A O 31 0.775587797164917 1.0 ? -1.7443175 0.9856307 0.23747475 1
162+
ATOM C CB . GLU A 0 5 . 5 GLU A CB 32 0.7807356119155884 1.0 ? -2.0112798 2.8885217 -2.4568079 1
163+
ATOM C CG . GLU A 0 5 . 5 GLU A CG 33 0.736676037311554 1.0 ? -3.111037 3.4757347 -1.5930517 1
164+
ATOM C CD . GLU A 0 5 . 5 GLU A CD 34 0.7444273829460144 1.0 ? -4.165759 4.194281 -2.3682153 1
165+
ATOM O OE1 . GLU A 0 5 . 5 GLU A OE1 35 0.7022221088409424 1.0 ? -5.2431927 4.562948 -1.8289248 1
166+
ATOM O OE2 . GLU A 0 5 . 5 GLU A OE2 36 0.7074484825134277 1.0 ? -3.9557672 4.439243 -3.602061 1
167+
ATOM N N . ILE A 0 6 . 6 ILE A N 37 0.7719179391860962 1.0 ? -1.6881322 -0.061866105 -1.7119114 1
168+
ATOM C CA . ILE A 0 6 . 6 ILE A CA 38 0.7804320454597473 1.0 ? -2.2435465 -1.3207657 -1.1580456 1
169+
ATOM C C . ILE A 0 6 . 6 ILE A C 39 0.7836021184921265 1.0 ? -1.2876949 -1.8895895 -0.124119766 1
170+
ATOM O O . ILE A 0 6 . 6 ILE A O 40 0.7699597477912903 1.0 ? -1.6953881 -2.3128297 0.9226782 1
171+
ATOM C CB . ILE A 0 6 . 6 ILE A CB 41 0.7782161831855774 1.0 ? -2.4945009 -2.3475485 -2.2944849 1
172+
ATOM C CG1 . ILE A 0 6 . 6 ILE A CG1 42 0.7505770921707153 1.0 ? -3.6181316 -1.8723133 -3.1782901 1
173+
ATOM C CG2 . ILE A 0 6 . 6 ILE A CG2 43 0.7623980045318604 1.0 ? -2.8209093 -3.7398515 -1.6827602 1
174+
ATOM C CD1 . ILE A 0 6 . 6 ILE A CD1 44 0.7236289381980896 1.0 ? -3.7948747 -2.7063303 -4.421796 1
175+
ATOM N N . TYR A 0 7 . 7 TYR A N 45 0.7706277370452881 1.0 ? -0.024296373 -1.8081644 -0.4300695 1
176+
ATOM C CA . TYR A 0 7 . 7 TYR A CA 46 0.7842973470687866 1.0 ? 0.9974928 -2.301356 0.4830144 1
177+
ATOM C C . TYR A 0 7 . 7 TYR A C 47 0.782068133354187 1.0 ? 0.97525597 -1.5350037 1.7703102 1
178+
ATOM O O . TYR A 0 7 . 7 TYR A O 48 0.7710134983062744 1.0 ? 1.0059953 -2.157076 2.8767743 1
179+
ATOM C CB . TYR A 0 7 . 7 TYR A CB 49 0.7796225547790527 1.0 ? 2.3722534 -2.22432 -0.14680468 1
180+
ATOM C CG . TYR A 0 7 . 7 TYR A CG 50 0.7609051465988159 1.0 ? 3.517988 -2.6337943 0.74415314 1
181+
ATOM C CD1 . TYR A 0 7 . 7 TYR A CD1 51 0.7544105052947998 1.0 ? 4.2526345 -1.6985004 1.4285161 1
182+
ATOM C CD2 . TYR A 0 7 . 7 TYR A CD2 52 0.7358810305595398 1.0 ? 3.794659 -3.996552 0.91882527 1
183+
ATOM C CE1 . TYR A 0 7 . 7 TYR A CE1 53 0.7264401316642761 1.0 ? 5.2983246 -2.1204884 2.2542787 1
184+
ATOM C CE2 . TYR A 0 7 . 7 TYR A CE2 54 0.7343485355377197 1.0 ? 4.8357677 -4.4390607 1.7580782 1
185+
ATOM C CZ . TYR A 0 7 . 7 TYR A CZ 55 0.7174309492111206 1.0 ? 5.5928187 -3.453949 2.3995397 1
186+
ATOM O OH . TYR A 0 7 . 7 TYR A OH 56 0.7072480916976929 1.0 ? 6.6070666 -3.8361042 3.2241151 1
187+
ATOM N N . LEU A 0 8 . 8 LEU A N 57 0.7751610279083252 1.0 ? 0.8950186 -0.24625869 1.7252918 1
188+
ATOM C CA . LEU A 0 8 . 8 LEU A CA 58 0.7831794023513794 1.0 ? 0.92186654 0.5950382 2.9348447 1
189+
ATOM C C . LEU A 0 8 . 8 LEU A C 59 0.7851115465164185 1.0 ? -0.36601645 0.38458857 3.7357783 1
190+
ATOM O O . LEU A 0 8 . 8 LEU A O 60 0.771104097366333 1.0 ? -0.30935648 0.35214657 4.972234 1
191+
ATOM C CB . LEU A 0 8 . 8 LEU A CB 61 0.7788889408111572 1.0 ? 0.99943286 2.080196 2.4901617 1
192+
ATOM C CG . LEU A 0 8 . 8 LEU A CG 62 0.7530165314674377 1.0 ? 2.381733 2.5215595 2.0203135 1
193+
ATOM C CD1 . LEU A 0 8 . 8 LEU A CD1 63 0.7565724849700928 1.0 ? 2.2780967 3.932794 1.4310852 1
194+
ATOM C CD2 . LEU A 0 8 . 8 LEU A CD2 64 0.728302001953125 1.0 ? 3.3945289 2.4537594 3.1068707 1
195+
ATOM N N . ASN A 0 9 . 9 ASN A N 65 0.7688947916030884 1.0 ? -1.4837711 0.16623825 3.106392 1
196+
ATOM C CA . ASN A 0 9 . 9 ASN A CA 66 0.7799356579780579 1.0 ? -2.71745 -0.07334927 3.7910635 1
197+
ATOM C C . ASN A 0 9 . 9 ASN A C 67 0.7812645435333252 1.0 ? -2.6953118 -1.3581984 4.561347 1
198+
ATOM O O . ASN A 0 9 . 9 ASN A O 68 0.7650246024131775 1.0 ? -3.275126 -1.4682705 5.643921 1
199+
ATOM C CB . ASN A 0 9 . 9 ASN A CB 69 0.7729542255401611 1.0 ? -3.8979027 -0.06377983 2.7970839 1
200+
ATOM C CG . ASN A 0 9 . 9 ASN A CG 70 0.7393827438354492 1.0 ? -4.2919917 1.3342344 2.3782454 1
201+
ATOM O OD1 . ASN A 0 9 . 9 ASN A OD1 71 0.7374281287193298 1.0 ? -4.006444 2.314228 3.0919642 1
202+
ATOM N ND2 . ASN A 0 9 . 9 ASN A ND2 72 0.7107030153274536 1.0 ? -4.996924 1.4360392 1.2195501 1
203+
ATOM N N . ARG A 0 10 . 10 ARG A N 73 0.7723439931869507 1.0 ? -1.97303 -2.2899606 4.106832 1
204+
ATOM C CA . ARG A 0 10 . 10 ARG A CA 74 0.7848830223083496 1.0 ? -1.8414929 -3.5901992 4.7649374 1
205+
ATOM C C . ARG A 0 10 . 10 ARG A C 75 0.7864736318588257 1.0 ? -0.94960606 -3.5548851 5.97169 1
206+
ATOM O O . ARG A 0 10 . 10 ARG A O 76 0.7683652639389038 1.0 ? -1.107336 -4.305557 6.934695 1
207+
ATOM C CB . ARG A 0 10 . 10 ARG A CB 77 0.7793251276016235 1.0 ? -1.3124063 -4.6674447 3.7986648 1
208+
ATOM C CG . ARG A 0 10 . 10 ARG A CG 78 0.7430319786071777 1.0 ? -2.3258343 -5.123152 2.7672126 1
209+
ATOM C CD . ARG A 0 10 . 10 ARG A CD 79 0.7439877390861511 1.0 ? -1.8090663 -6.2628603 1.8910145 1
210+
ATOM N NE . ARG A 0 10 . 10 ARG A NE 80 0.7006455659866333 1.0 ? -2.7882288 -6.7124114 0.9429688 1
211+
ATOM C CZ . ARG A 0 10 . 10 ARG A CZ 81 0.6990828514099121 1.0 ? -2.6019075 -7.682688 0.08546497 1
212+
ATOM N NH1 . ARG A 0 10 . 10 ARG A NH1 82 0.6913332939147949 1.0 ? -1.4432316 -8.398713 0.069322616 1
213+
ATOM N NH2 . ARG A 0 10 . 10 ARG A NH2 83 0.6737651228904724 1.0 +1 -3.5375562 -8.009772 -0.80228454 1
214+
ATOM N N . GLN A 0 11 . 11 GLN A N 84 0.7548701167106628 1.0 ? -0.060811147 -2.6024199 5.97336 1
215+
ATOM C CA . GLN A 0 11 . 11 GLN A CA 85 0.7698816657066345 1.0 ? 0.8867407 -2.4652247 7.066012 1
216+
ATOM C C . GLN A 0 11 . 11 GLN A C 86 0.7707775831222534 1.0 ? 0.25654674 -1.7326291 8.2596655 1
217+
ATOM O O . GLN A 0 11 . 11 GLN A O 87 0.7530555725097656 1.0 ? 0.6865432 -1.895247 9.390681 1
218+
ATOM C CB . GLN A 0 11 . 11 GLN A CB 88 0.7613891959190369 1.0 ? 2.1597488 -1.7525951 6.6245866 1
219+
ATOM C CG . GLN A 0 11 . 11 GLN A CG 89 0.7309518456459045 1.0 ? 2.9935796 -2.5368361 5.626869 1
220+
ATOM C CD . GLN A 0 11 . 11 GLN A CD 90 0.734555721282959 1.0 ? 3.6616673 -3.7417436 6.2952075 1
221+
ATOM O OE1 . GLN A 0 11 . 11 GLN A OE1 91 0.6896756291389465 1.0 ? 3.984301 -3.7361376 7.4587526 1
222+
ATOM N NE2 . GLN A 0 11 . 11 GLN A NE2 92 0.6910330057144165 1.0 ? 3.86381 -4.779255 5.480038 1
223+
ATOM N N . VAL A 0 12 . 12 VAL A N 93 0.7406917810440063 1.0 ? -0.7796666 -0.94167507 7.991129 1
224+
ATOM C CA . VAL A 0 12 . 12 VAL A CA 94 0.7545331716537476 1.0 ? -1.4559813 -0.23985589 9.058524 1
225+
ATOM C C . VAL A 0 12 . 12 VAL A C 95 0.7580227851867676 1.0 ? -2.529628 -1.0691322 9.726537 1
226+
ATOM O O . VAL A 0 12 . 12 VAL A O 96 0.738012433052063 1.0 ? -2.6530886 -1.0986481 10.913265 1
227+
ATOM C CB . VAL A 0 12 . 12 VAL A CB 97 0.7437045574188232 1.0 ? -2.0897198 1.1251792 8.508933 1
228+
ATOM C CG1 . VAL A 0 12 . 12 VAL A CG1 98 0.7219036221504211 1.0 ? -2.8818119 1.8073634 9.641264 1
229+
ATOM C CG2 . VAL A 0 12 . 12 VAL A CG2 99 0.7339154481887817 1.0 ? -0.9726316 2.021139 8.022165 1
230+
#
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
>query
2+
GLKEIWQYVRND
3+
>UniRef100_HETA1 Synthetic homolog TaxID=1001 RepID=HETA1_TEST
4+
GLKEIWQYVRND
5+
>UniRef100_HETA2 Synthetic homolog TaxID=2002 RepID=HETA2_TEST
6+
GLKEVWQYLRND
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
>query
2+
MRHDTFKNPGSA
3+
>UniRef100_HETB1 Synthetic homolog TaxID=1001 RepID=HETB1_TEST
4+
MRHDTFKNPGSA
5+
>UniRef100_HETB2 Synthetic homolog TaxID=3003 RepID=HETB2_TEST
6+
MRHETFKNPGSA
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
>query
2+
WFKDLEQNGYRA
3+
>UniRef100_HOM1 Synthetic homolog TaxID=6001 RepID=HOM1_TEST
4+
WFKDLEQNGYRA
5+
>UniRef100_HOM2 Synthetic homolog TaxID=6002 RepID=HOM2_TEST
6+
WFKELEQNGYRA
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
>query
2+
SKADEIYLNRQV
3+
>UniRef100_MON1 Synthetic homolog TaxID=5001 RepID=MON1_TEST
4+
SKADEIYLNRQV
5+
>UniRef100_MON2 Synthetic homolog TaxID=5002 RepID=MON2_TEST
6+
SKAEEIYLNRQV

models/rf3/tests/integration/conftest.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,3 +400,65 @@ def skip_existing_dirs(require_ckpt, tmp_path_factory):
400400
mtime_after_second = model_cif.stat().st_mtime if model_cif.exists() else None
401401

402402
return out_dir, mtime_after_first, mtime_after_second
403+
404+
405+
@pytest.fixture(scope="session")
406+
def msa_fold_dir(require_ckpt, tmp_path_factory):
407+
"""Single ``rf3 fold`` call covering MSA inputs across chain counts and modes.
408+
409+
Batching amortises the model-loading overhead across four folds that each
410+
supply pre-computed MSAs. The set spans both chain count (monomer /
411+
homodimer / heteromer) and both ways rf3 accepts an MSA path (JSON
412+
per-component ``msa_path`` vs CIF ``_msa_paths_by_chain_id`` header)::
413+
414+
monomer_msa.json — monomer; JSON ``msa_path`` (1 chain)
415+
monomer_msa_from_cif.cif — monomer; CIF ``_msa_paths_by_chain_id``
416+
(same sequence, MSA declared in the CIF)
417+
homodimer_msa.json — homodimer; two identical chains sharing one
418+
a3m via JSON ``msa_path``
419+
heteromer_paired_msa.json — heteromer; two distinct chains, each with its
420+
own a3m (a shared TaxID makes it a genuine
421+
paired MSA)
422+
423+
All inputs use short synthetic sequences (~12 residues) with hand-built a3m
424+
files so the whole fixture folds quickly on CPU — these tests exercise MSA
425+
format/plumbing, not structure quality, so a real complex (much slower on
426+
CPU) is unnecessary. The MSA paths inside the inputs are written relative to
427+
the repo root, so (as documented for the integration suite) ``rf3 fold``
428+
must be launched from the repo root for them to resolve.
429+
430+
NOTE: the batched examples share a single seeded RNG stream, so each
431+
example's stochastic outputs depend on what was folded *before* it. The
432+
assertions in ``test_msa_fold.py`` (chain count, ``iptm > 0``, pLDDT range)
433+
are order-insensitive; if you add order-sensitive checks, re-run after any
434+
reordering.
435+
"""
436+
out_dir = tmp_path_factory.mktemp("rf3_msa")
437+
out_dir, _ = run_rf3_fold(
438+
inputs=[
439+
DATA_DIR / "monomer_msa.json",
440+
DATA_DIR / "monomer_msa_from_cif.cif",
441+
DATA_DIR / "homodimer_msa.json",
442+
DATA_DIR / "heteromer_paired_msa.json",
443+
],
444+
out_dir=out_dir,
445+
)
446+
return out_dir
447+
448+
449+
@pytest.fixture(scope="session")
450+
def msa_present_flag_dir(require_ckpt, tmp_path_factory):
451+
"""Fold an input that *has* MSAs with ``raise_if_missing_msa_...`` enabled.
452+
453+
``monomer_msa.json`` is a 12-residue protein (above the length-10 threshold)
454+
with an MSA supplied, so the missing-MSA guard must not trip and the fold
455+
should complete normally. This is the success counterpart to
456+
``test_raise_if_missing_msa_errors_when_absent``.
457+
"""
458+
out_dir = tmp_path_factory.mktemp("rf3_msa_flag")
459+
out_dir, _ = run_rf3_fold(
460+
DATA_DIR / "monomer_msa.json",
461+
out_dir,
462+
extra_flags=["raise_if_missing_msa_for_protein_of_length_n=10"],
463+
)
464+
return out_dir

0 commit comments

Comments
 (0)