` for cross-chain pairing.\n",
- "heavy_msa = MSA.from_a3m(path=\"antibody_heavy.a3m\", remove_insertions=True)\n",
- "light_msa = MSA.from_a3m(path=\"antibody_light.a3m\", remove_insertions=True)\n",
- "antigen_msa = MSA.from_a3m(path=\"antigen.a3m\", remove_insertions=True)\n",
+ "# One MSA per chain (headers carry key= for optional cross-chain pairing).\n",
+ "chainA_msa = MSA.from_a3m(path=\"g3l5_chainA.a3m\")\n",
+ "chainB_msa = MSA.from_a3m(path=\"g3l5_chainB.a3m\")\n",
"\n",
- "# Pass each chain as its own ProteinInput; pairing happens automatically.\n",
"fold_result = client.fold_all_atom(\n",
" StructurePredictionInput(\n",
" sequences=[\n",
- " ProteinInput(id=\"H\", sequence=heavy_seq, msa=heavy_msa),\n",
- " ProteinInput(id=\"L\", sequence=light_seq, msa=light_msa),\n",
- " ProteinInput(id=\"A\", sequence=antigen_seq, msa=antigen_msa),\n",
+ " ProteinInput(id=\"A\", sequence=chainA_seq, msa=chainA_msa),\n",
+ " ProteinInput(id=\"B\", sequence=chainB_seq, msa=chainB_msa),\n",
" ]\n",
- " )\n",
+ " ),\n",
+ " config=config,\n",
")\n",
"\n",
"print(f\"pTM: {fold_result.ptm:.3f}, ipTM: {fold_result.iptm:.3f}\")\n",
"print(f\"Average pLDDT: {fold_result.plddt.mean().item():.1f}\")\n",
"\n",
- "with open(\"antibody_antigen_paired_msa.cif\", \"w\") as f:\n",
+ "with open(\"g3l5_complex.cif\", \"w\") as f:\n",
" f.write(fold_result.complex.to_mmcif())"
]
}
diff --git a/cookbook/tutorials/g3l5_chainA.a3m b/cookbook/tutorials/g3l5_chainA.a3m
new file mode 100644
index 00000000..6f312fa9
--- /dev/null
+++ b/cookbook/tutorials/g3l5_chainA.a3m
@@ -0,0 +1,200 @@
+>key=0
+GPYYPTNKLQAAVMETDRENAIIRQRNDEIPTRTLDTAIFTDASTVASAQIHLYYNSNIGKIIMSLNGKKHTFNLYDDNDIRTLLPILLLSK
+>key=1
+--YYPTNKLQAAVMETDRENSIIRQRNDEIPTRTLDTAIFTDASTVASAQIHLYYNSNIGKIIMSLNGKKHTFNLYDDNDIRTLLPILLLSK
+>key=2
+--YYPTNKLQAAVMETDRENAIIRQRNEEIPTRTLDTAIFTDASTVSSAQIHLYYNSNIGKIIMSLNGKKHTFNLYDDNDIRTLLPILLLSK
+>key=3
+--YYPTNKLQAAVMETDRENAIIRQRNDEIPIRTLDTAIFTYASTVASAQIHLYYNSNIGKNIMSLNGKKHTFDLYDDNDIRTLLRILLLSK
+>key=4
+--YYPTNKLQAAVMETDRENAIIRQRNDEIPTRTLDTAIFTDASTVASAQIHLYYNSNIGKIIMSLNGKKHTFNLYDDNDIRTLLPILLLSK
+>key=5
+GPYYPTNKLQAAVMETDRENAIIRQRNDEIPTRTLDTAIFTDASTVASAQIHLYYNSNIGKIIMSLNGKKHTFNLYDDNDIRTLLPILLLSK
+>key=6
+--YYPTNKLQAAVMETDRENDIFRKRNEEIPTRSLDAKIFTDASTVVSAQIHLYYNSNIGKIIMSYNGKKYTFNLYDDNDIRTLLPILLLSK
+>key=7
+--FLPTNKMQLAVHEL-ADARAWRQRTDAQLDGISETVLFPRPDAPQSSAVIAGMDSRRARVTVAHGRKKSTFDLKRRGDVQTLLPILLLGK
+>key=8
+--YYPTNKLLMSVKQKNEENNVIKNINNTFPT-SLNSIIFSKPESLSLTKIDTYYDSLSGTVTAISNNKKYVFNLYFDEDIRTLLPILLLSK
+>key=9
+--YYfnkhPTNKLELSVDKLNRENKIIKQRDDAFP-AVLNTIVFTRPGAPVPTKVNTYYDSVTGVVTVVSNNKKRIFRLDFDEDVRTLLPILLLSK
+>key=10
+---YPTNKLELSVDKLNRENKIIKQRDDAFPV-VLNTTVFTRPETPVPTKVHTYYDSATGVVTMLSNNKKRIFRLDFDDDVRTLLPILLLSK
+>key=11
+--YYPTNKLQMSLKNLNTENIIIKQQNNNIPT-FLDTIIFTKPESAIPTRVNMYYDSALGIVTILENNKKRIFRLDFEEDVRTLLPILLLSK
+>key=12
+--YYPTNKLQAAVMETDRENDIFRKRNEEIPTRSLDAAIFTDASTVVNAQIHLYYNSNIGKIIMSYNGRKYTFNLYDDNDIRTLLPILLLSK
+>key=13
+--YYPTNKLLMSVNQKNEENNVIKNINNTFPT-SLNSMIFSKPESVALTKIDTYYDSLSGTVTVISNNKKYVFNLYFDEDIRTLLPILLLSK
+>key=14
+--YKPTNKLHILIDKINLYNEKIKKQNDILP-KTMNSIIFSN-GNPVNENINLYYDSLLETVTLLYgNNKKYTFNLRHDEDIATLLPILLLSK
+>key=15
+--YYPTNKLQIAVKNLNYEYQIYKQQDNDFPQK-LNTLFFLDKQKFVSEEVNAYYNSSIGIVTLLTKSKKLLFNINFSDDVSALLPILLLSK
+>key=16
+----PTNKMQLAVREL-ADDRLYRQRLDAQLDAVSESVLFQTPDAPRASAVLVSMDSRNERVTVAHGRDKSVFDLKRRGDVQTLIPILLLSK
+>key=17
+--YYPTNKLQIAVKNLNYEYQIYKQQDNEFPQK-LSTLFFLDKQKFVGEEVNAYYNSSIGIVTLLTKSKKILFNINFSDDVSALLPILLLSK
+>key=18
+--YYPTNKLQAAVMETDRENDIFRKRNEEIPTRSLDAAIFTDASTVVSAQIHLYYNSNIGKIIMSYNGRKYTFNLYDDNDIRTLLPILLLSK
+>key=19
+--YYPTNKLLMSVKQKNEENNVIKNINNAFPT-SLNSIIFSKPESLSLTKIDTYYDSLSGTVTAISNNKKYVFNLYFDEDIRTLLPILLLSK
+>key=20
+--YFPTTKMQFSVRELTDEKLRRQAVDEQL-DGISESVIFAESDRPQSSAVLVTMDSRNSIVTVAYGREKALFNLKRRRDVQTLLPILLLSK
+>key=21
+--YYPMNKMHMSLDRLRRATEARRAAAETVPERPRHAVVFPDPATPVPTTVRARLDPYSGDVTVSWPKNRRQFKLGEDEDVRTLLPILLLSK
+>key=22
+--YYPTNKLQMSLKNLNTENIIIKQQNNNIPT-FLDTIIFTKPESAIPTRVNVYYDSALGIVTILENNKKRIFRLDFEEDVRTLLPILLLSK
+>key=23
+--YYPTNKLQLSVTRLNLENKLLKKRDDVFP-ASLNTLIFLNNEKFIPSTVNTYYNSSSGTVTVVSDNKKRVFRLDFDEDVRTLLPILLLSK
+>key=24
+--YYPTNKLQLSVTRLNLENQLLKKRDDVFPS-SLNTLIFLNNEKFIPSTVNTYYNSSSGTVTVVSDNKKRVFRLDFDEDVRTLLPILLLSK
+>key=25
+----PMNKLQSSLKELNKEDILFKQFDNEIVIGN-TTTLFTDKDTITSSNLKAIFDSRNNKVTIITKLGKQIFNFNSSIDVRTLLPILLLSK
+>key=26
+--YYPTNKLQAAVMETDRENAIIIQRNDEIPTRTLDTAIFTDASTVASAQIYLYYNSNIGKIIMSLNGKKHTFNLYDDNDIRTLLPILLLSK
+>key=27
+--YYPTNKLQMAVKNLNYEYEVRKQQDTNFPQK-LNTIIFSDKEEFISDNVRAYYNASTGTVAVLTSSKKLLFNVNFDDDVSALLPILLLSK
+>key=28
+--YKPTNKLQIITDKINSCNKKIKKQNDILP-KTINSVIFSN-GNPVNENINLYYDSLSENVTILYGiNKKYTFNLRHDEDIATLLPILLLSK
+>key=29
+--YYPTNKLESSVREIDIENEIIKERNEEIPSRLLDAVIFTDSSTIDKSLIHLYYNSNMGNVIMSYKGSKYTFNLYDNNDIRTLLPILLLSK
+>key=30
+--YYPTNKLQLSVVELEKENKRFKEIDNTFP-ASFNTILFSKGNTYTKSNVNTYYNSQLKTITVNVNSKKQIFHLDNEDDVYTLLPILLLSK
+>key=31
+--YYPTNKLLMSVKQKNEENNVIKNINNTFPT-SLNSIIFSKPESLSLTKIDTYYDSLSGTVTAISNNKKYVFNLYFDEDIRTLLPILLLSK
+>key=32
+----PTNKMQLAVREL-TDARLHRQRVDSQLDAVSEAVLFVRPDAPQASAVIASLDSRRSLVTVAHGRDKSVFDLKRRGDVQTLLPILLLSK
+>key=33
+--FGSSNKMQLTIKNMNYWQNASQKIDNSLPS-ILDTVIFQDYNNPIYAKVNATYDSQNKKITIKFGKDTKTFNLDSSSDRQTVFPILLLSK
+>key=34
+--YYPTNKLQAAVRETDRENDIIKQRNDEIPSRLLNATIFTDESTVDKVQIHLYYNSNIGKVIMSYNGSKYTFNLYDNNDIRTLLPILLLSK
+>key=35
+--YYPTNKLQAAVMETDRENAIIRQRNEEIPTRTLDTAIFTDASTVSSAKIHLYYNSNIGKIMMSLNGKKYTFNLYNDNDIRTLLPILLLSK
+>key=36
+--YYPTNKLQLSIVELERENKQFKEIDNTFP-ASFNTILFSKGNEYTNSNINTYYNSQLKTITVNVNSKKQIFYLDNEDDVHTLLPILLLSK
+>key=37
+--YYPTNKLQAAVMETDRENDIIRQRNEEIPTRTLDAAIFTDASTVSSAKIHLYYNSNIGKIMMSLNGKKYTFNLYNDNDIRTLLPILLLSK
+>key=38
+----PTNKRALVLHEHQAQLArelAARERERQRP---LLTTLFLAQDDYVTDTVFVTASADARTVTVERRGQRYVYHTDQERERRMLLPLLLLSK
+>key=39
+--YKPTNKLQLLVNKINNENNIIKERNEKVP-KFIDTSIFLSSDKPTETKANLYYDSASGIFTLLSDSKKYIFRLDTDEDVRSLLPILLLSK
+>key=-1
+--YYPTNKLQAAVMETDRENAIIRQRNDEIPTRTLDTAIFTDASTVASAQIHLYYNSNIGKIIMSLNGKKHTFNLYDDNDIRTLLPILLLSK
+>key=-1
+--YYPTNKLQAAVMETDRENAIIRQRNEEIPTRTLDTAIFTDSSTVSSAKIHLYYNSNIGKIMMSLNGKKYTFNLYNDNDIRTLLPILLLSK
+>key=-1
+--YYPTNKLQAAVMETDRENDIFRKRNEEIPTRSLDAKIFTDASTVVSAQIHLYYNSNIGKIIMSYNGKKYTFNLYDDNDIRTLLPILLLSK
+>key=-1
+--YYPTNKLQAAVRETDRENDIIKQRNDEIPSRLLNATIFTDESTVDKAQIHLYYNSNIGKVIMSYNGSKYTFNLYDNNDIRTLLPILLLSK
+>key=-1
+--YYPTNKLQAAVMETDRENAIIRQRNDEIPIRTLDTAIFTYASTVASAQIHLYYNSNIGKNIMSLNGKKHTFDLYDDNDIRTLLRILLLSK
+>key=-1
+----PMNKLQSSLKELNKEDILFKQFDNEIVIGN-TTTLFTDKDTITSSNLKAIFDSRNNKVTIITKLGKQIFNFNSSIDVRTLLPILLLSK
+>key=-1
+----PVNKLDLALAAARARHSASAASESD---RYLSTTLFVAPGMVSRGTMRGRYSEEKRTFTVRYRGRDYVYHTDRESDMQKLLPLLLLSK
+>key=-1
+--YYPTNKLESSVREIDIENEIIKERNEEIPSRLLDAVIFTDSSTIDKSLIHLYYNSNMGNVIMSYKGSKYTFNLYDNNDIRTLLPILLLSK
+>key=-1
+---YPTNKLQLAINEINKIHSDQNNIDKSLP-NTLNTVIFQDFDKALYTIANVYVDSKKNQVTIKYSKTKKIFNIDSYIDMQTLLPILLLSK
+>key=-1
+--FGSSNKMQLTIKNMNYWQNASQKIDNSLPS-ILDTVIFQDYNNPIYAKVNATYDSQNKKITIKFGKDTKTFNLDSSSDRQTVFPILLLSK
+>key=-1
+---YPTNKLELSVDKLNRENKIIKQRDDAFPV-VLNTTVFTRPETPVPTKVHTYYDSATGVVTMLSNNKKRIFRLDFDDDVRTLLPILLLSK
+>key=-1
+--YYPTNKLQMSLKNLNTENIIIKQQNNNIPT-FLDTIIFTKPESAIPTRVNMYYDSALGIVTILENNKKRIFRLDFEEDVRTLLPILLLSK
+>key=-1
+--YYPTNKLLMSVKQKNEENNVIKNINNTFPT-SLNSMIFSKPESVALTKIDTYYDSLSGTVTVISNNKKYVFNLYFDEDIRTLLPILLLSK
+>key=-1
+--YYPTNKLQLSVVELEKENKRFKEIDNTFP-ASFNTILFSKGNTYTKSNVNTYYNSQLKTITVNVNSKKQIFHLDNEDDVYTLLPILLLSK
+>key=-1
+--YYfnkhPTNKLELSVDKLNRENKIIKQRDDAFP-AVLNTIVFTRPGAPVPTKVNTYYDSVTGVVTVVSNNKKRIFRLDFDEDVRTLLPILLLSK
+>key=-1
+--YYPTNKLQLSVTRLNLENQLLKKRDDVFPT-SLNTLIFLNNEKFIPSTVNTYYNSSSGTVTVVSDNKKRVFRLDFDEDVRTLLPILLLSK
+>key=-1
+--YYPTNKLQMAVKNLNYEYEVRKQQDTNFPQK-LNTIIFSDKEEFISDNVRAYYNASTGTVAVLTSSKKLLFNVNFDDDVSALLPILLLSK
+>key=-1
+--YYPTNKLQLSIVELERENKQFKEIDNTFP-ASFNTILFSKGNEYTNSNINTYYNSQLKTITVNVNSKKQIFYLDNEDDVHTLLPILLLSK
+>key=-1
+--YYPTNKLQIAVKNLNYEYQIYKQQDNDFPQK-LNTLFFLDKQKFVSEEVNAYYNSSIGIVTLLTKSKKLLFNINFSDDVSALLPILLLSK
+>key=-1
+----PTNKRALVLHEHQAQLArelAARERERQRP---LLTTLFLAQDDYVTDTVFVTASADARTVTVERRGQRYVYHTDQERERRMLLPLLLLSK
+>key=-1
+--YKPTNKLQLLVNKINNENNIIKERNEKVP-KFIDTSIFLSSDKPTETKANLYYDSASGIFTLLSDSKKYIFRLDTDEDVRSLLPILLLSK
+>key=-1
+----PTNKHALVLRDAQARAAVQ-ARADEAP-RARRGTLLLARGDYVSDTLWLRYDARARAVRVARRESRWTLRADDERERRMLLPILLLSK
+>key=-1
+--YKPTNKLHILIDKINLYNEKIKKQNDILP-KTMNSIIFSN-GNPVNENINLYYDSLLETVTLLYgNNKKYTFNLRHDEDIATLLPILLLSK
+>key=-1
+--YYPMNKMHMSLDRLRRATEARRAAAETVPERPRHAVVFPDPATPVPTTVRARLDPYSGDVTVSWPKNRRQFKLGEDEDVRTLLPILLLSK
+>key=-1
+--YKPTNKLQIITDKINSCNKKIKKQNDILP-KTINSVIFSN-GNPVNENINLYYDSLSENVTILYGiNKKYTFNLRHDEDIATLLPILLLSK
+>key=-1
+--YFPTTKMQFSVRELTDEKLRRQAVDEQL-DGISESVIFAESDRPQSSAVLVTMDSRNSIVTVAYGREKALFNLKRRRDVQTLLPILLLSK
+>key=-1
+--FLPTNKMQLAVHEL-ADARAWRQRTDAQLDGISETVLFPRPDAPQSSAVIAGMDSRRARVTVAHGRKKSTFDLKRRGDVQTLLPILLLGK
+>key=-1
+--FLPTNKMQLAVREL-ADARAWRQRTDAQLDGISETVLFPRPDAPQGSAVIASIDARRARVTVAHGREKSTFDLKRRGDVQTLLPILLLSK
+>key=-1
+----PTNKMQLAVREL-ADDRLYRQRLDAQLDAVSESVLFQTPDAPRASAVLVSMDSRNERVTVAHGRDKSVFDLKRRGDVQTLIPILLLSK
+>key=-1
+----PTNKMQLAVREL-TDARLHRQRVDSQLDAVSEAVLFVRPDAPQASAVIASLDSRRSLVTVAHGRDKSVFDLKRRGDVQTLLPILLLSK
+>key=-1
+-----TNKMEIGINPIKK----IPWSDNEHV---FVSSLFTNKDKYLTGPMRLTYKPDSKTAVLNFKGTNYTYHLDNFDDVRKLLPTLLLSK
+>key=-1
+--------------------------------------LFTNKDKYLTGPMRLTYKPDSKTTVLNFKGTNYTYHLDNFDDVRKLLPTLLLSK
+>key=-1
+--------------------------------------IFQSRNNYTKVPMKLNYYPDKTTITLEYNNNKHSYNISSFTDIRKLIPILLLSK
+>key=-1
+-------------------------------------TLFHNNNKYVTGPMKLNYDPEKKGVVIEFKNTKYTYDLTDFSDARKLIPTLLLSK
+>key=-1
+-------------------------------------TLFQDKNTYVTGPMKLKYDPEKKSAVIDFKNTTYNYDINNFKDVRKLIPTLLLSK
+>key=-1
+-----TNKMEIGINPIKK----IPWSDNE---HIFVSSLFTNKDKYLTGPMRLTYRPDSKTAVLDFKGTNYTYYLDNFDDVRKLVPTLLLSK
+>key=-1
+-----TNKMDIGINPIKK----IPWSDKD---HIFVSTLFPKNNQYVTGPMRLTYDPVKKSVVIDFKNNKYVYDISNFTDARKLIPTLLLSK
+>key=-1
+--------------------------------------LFQADNKYVTGPMRLKYDPIDKKAVITFRGTNYSYRLEELDDTRKLIPILLLAK
+>key=-1
+GPYYPTNKLQAAVMETDRENAIIRQRNDEIPTRTLDTAIFTDASTVASAQIHLYYNSNIGKIIMSLNGKKHTFNLYDDNDIRTLLPILLLSK
+>key=-1
+--YYPTNKLQAAVMETDRENDIFRKRNEEIPTRSLDAAIFTDASTVVSAQIHLYYNSNIGKIIMSYNGRKYTFNLYDDNDIRTLLPILLLSK
+>key=-1
+----PTNKRALVLHEHQAQLARelaARERERQRP---LLTTLFLAQDDYVTDTVFVTASADARTVTVERRGQRYVYHTDQERERRMLLPLLLLSK
+>key=-1
+--YYPTNKLQLSVVELEKENKRFKEIDNTFPA-SFNTILFSKGNTYTKSNVNTYYNSQLKTITVNVNSKKQIFHLDNEDDVYTLLPILLLSK
+>key=-1
+-----TNKMEMGISPIHK----VPWDDNE---HVFVSYIFQSRNNYTKVPMKLNYYPDKTTITLEYNNNKHSYNISSFTDIRKLIPILLLSK
+>key=-1
+-----TNKMEMGISPIHK----VPWDDNE---HVFVSYIFQSRNNYTKVPMKLNYYPDKTTITLEYNNNKHSYNISSFTDIRKLIPILLLSK
+>key=-1
+--YYfnkhPTNKLELSVDKLNRENKIIKQRDDAFPS-VLNTTVFTRPATPVPTKVNTYYDSATGVVTVVSNNKKRIFRLDFDEDVRTLLPILLLSK
+>key=-1
+--FLPTNKMQLAVRELADAHAWRQRTDAQLDGIS-ESVLFPRPDAPQSSAVIAGMDSRRARVTVAHGREKSTFDLKRRGDVQTLLPILLLGK
+>key=-1
+--YYPTNKLLMSVKQKNEENNVIKNINNTFPT-SLNSIIFSKPESLSLTKIDTYYDSLSGTVTAISNNKKYVFNLYFDEDIRTLLPILLLSK
+>key=-1
+--FLPTNKMQLAVRELTDARAWRQRTDAQLDGLS-ESVLFPRPDAPQGSAVIAELDSRRARVTVAHGREKSTFDLKRRGDVQTLLPILLLGK
+>key=-1
+--YFPTTKMQFSVRELTDEKLRRQAVDEQLDGIS-ESVIFAESDRPQSSAVLVTMDSRNSIVTVAYGREKALFNLKRRRDVQTLLPILLLSK
+>key=-1
+---LPTNKMQLAVRELTDARLHRQRVDSQLDAVS-EAVLFVRPDAPQASAVIASLDSRRSLVTVAHGRDKSVFDLKRRGDVQTLLPILLLSK
+>key=-1
+---LPTNKMQLAVRELADDRLYRQRLDAQLDAVS-ESVLFQTPDAPRASAVLVSMDSRNERVTVAHGRDKSVFDLKRRGDVQTLIPILLLSK
+>key=-1
+-----TNKMEIGINPIKK----IPWSDNE---HIFVSSLFTNKDKYLTGPMRLTYRPDSKTAVLDFKGTNYTYYLDNFDDVRKLVPTLLLSK
+>key=-1
+-----TNKMDIGINPIKK----TPWSGND---HLFVSTLFHNNNKYVTGPMKLNYDPEKKGVVIEFKNTKYTYDLTDFADARKLIPTLLLSK
+>key=-1
+--YYPTNKLQMAVKNLNYEYEVRKQQDTNFPQK-LNTIIFSDKEEFISDNVRAYYNASTGTVAVLTSSKKLLFNVNFDDDVSALLPILLLSK
+>key=-1
+-----TNKMDIGINPITK----IPWTGND---HIFVSTLFQDKNTYVTGPMKLKYDPEKKSAVIDFKNTTYNYDINNFKDVRKLIPTLLLSK
+>key=-1
+--YYPTNKLQIAVKNLNYEYQIYKQQDNDFPQK-LNTLFFLDKQKFVSEEVNAYYNSSIGIVTLLTKSKKLLFNINFSDDVSALLPILLLSK
+>key=-1
+--YKPTNKLHILIDKINLYNEKIKKQNDILP-KTMNSIIFSN-GNPVNENINLYYDSLLETVTLLYgNNKKYTFNLRHDEDIATLLPILLLSK
+>key=-1
+----PTNKRALVLRDAQARAAVQARADEAPRARR--GTLLLARGDYVSDTLWLRYDARARAVRVARRERRWTLRADDERERRMLLPILLLSK
+>key=-1
+--YYPMNKMHMSLDRLRRATEARRAAAETVPERPRHAVVFPDPATPVPTTVRARLDPYSGDVTVSWPKNRRQFKLGEDEDVRTLLPILLLSK
+>key=-1
+------NKMQLTIKNMNYWQNASQKIDNSLPS-ILDTVIFQDYNNPIYAKVNATYDSQNKKITIKFGKDTKTFNLDSSSDRQTVFPILLLSK
diff --git a/cookbook/tutorials/g3l5_chainB.a3m b/cookbook/tutorials/g3l5_chainB.a3m
new file mode 100644
index 00000000..9e971b2f
--- /dev/null
+++ b/cookbook/tutorials/g3l5_chainB.a3m
@@ -0,0 +1,194 @@
+>key=0
+GPNMFFMPKRKIPDPIDRLRRANLACEDDKLMIYGLPWMTTQTSALSINSKPIVYKDCAKLLRSINGSQPVSLNDVLRR
+>key=1
+--NMFFMPKRKIPDPIDRLRRANLACEDDKLMIYGLPWMTTQTSALSINSKPIVYKDCAKLLRSINGSQPVSLNDVLRR
+>key=2
+--NMFFMPKRKIPDPIDRLRRANLACEDDKLMIYGLPWITTQTSALSINSKPIVYKDCAKLLRSINGSQPVSLNDVLRR
+>key=3
+--NMFFMPKRKIPDPIDRLRRANLSCEDDKLMIYGLPWMTTQTSALSINSKPIVYKDCAKLLRSINGSQPVSLNDVLRR
+>key=4
+--NMFFMPKRKIPDPIDRLRRANLACEDDKLMIYGLPWMTTQTSALSINSKPIVYKDCAKLLRSINGSQPVSLNDVLRR
+>key=5
+GPNMFFMPKRKIPDPIDRLRRANLACEDDKLMIYGLPWMTTQTSALSINSKPIVYKDCAKLLRSINGSQPVSLNDVLRR
+>key=6
+--NMFFMPKRKIPNPIDRLRRATLSCEDNKLMIYGLPWITTQSSALSINSKPIVYKDCAKLLRSINGSQPVSVDDVLRR
+>key=7
+-----FRRAPRAPSPLDAYLQASLVCEGDALLI-ELP--EGRVPALALDGRPVAFPGCESLLYRINGPRKVRLVDVL--
+>key=8
+---LFNFKQQKVISPIDKFSKTTLYCKENKLFISGLPNTMYSKEALSLNRQPITYKYCNDLLQSINGSQQVSINDILRK
+>key=9
+-------------DPIKQFTSTSLVCKGNALFIKHMPNLTELKTALAINRKQIVHENCEALLQSINGSRKVSLNDILKR
+>key=10
+-------------DPIKQFTSTSLTCKGNALFIKHMPNSTELKPALAINRKQIVHENCVALLQSINGSRKVSLNDILER
+>key=11
+---MLISYKDDIPiNPIDNFSKSWLSCDGNKLVINNLPNTNGTKTALAINRQDITYKDCNFLLQSINGSSKISLNDVLRR
+>key=12
+---MFFMPKREIPNPMDRLRRATLACEDNKLMIYGLPWMTTQSSALSINSKPIVYKDCTKLLRSINGSQPVSIDDVLSR
+>key=13
+--NMLFnFKQRKVISPIDKFSKTTLYCKENKLFISGLPNTMYSKEALSLNRQPITYKYCNDLLQSINGSQQVSINDILRK
+>key=14
+---MLFLKDDKNDTIFNTLMKTSLSCNGNNLVISGLPNKS-NVNALYIdNKKPIIYDKCNEVLMSINGSHKIHLNDILRK
+>key=15
+-------------NPIDKFKDTFLFCKENKMMIGGLPN-NNVTEALTTDKIPIVVDNCEDILKSINGSHKVSLNDILRR
+>key=16
+------RGRQRPPSPLDAYGEASLACDGDALMI-ELP--GGRLPALALDGRPVAFPGCDGVLRRINGTRKVRLVDVLGR
+>key=17
+-------------NPIDKFKDTFLFCKENKMMIGGLPN-NNVTEALTTDKIPIVVDNCEDILKSINGSHKVSLNDILRR
+>key=18
+--NMFFMPKRKIPNPMDRLRRATLACEDNKLMIYGLPWITTQSSALSINSKPIVYKDCAKLLRSINGSQPVSVNDVLSR
+>key=19
+--NMLFnFKQRKVISPIDKFSKTTLYCKENKLFISGLPNTMYSKEALSLNRQPITYKYCNDLLQSINGSQQVSINDILRK
+>key=20
+-----FARARKTPSPLEPYAQAALACTGNAL-VLELP--EGRVPALALNGQPVVFAGCDSVLRRINGPRKVHLVDVLGR
+>key=21
+------------PDPLERFRKARLECaADGGLMIAGL--GARPRPALAGDGRPIRPADCAAVLRSVnNGPLAVSLDDVLR-
+>key=22
+-------------NPIDNFSKSWLSCDGNKLVINNLPNTNGTKTALAINRQDITYKDCNFLLQSINGSSKISLNDVLRR
+>key=23
+-----------VKDPLEKFLKTSLSCNGDKLIINKLPNSSSNVNALAINRTPITNKNCKALLQSINGSQQVSLNDILRR
+>key=24
+-----------VKDPLEKFLKTSLSCNGDKLIINKLPNSSSNVNALAINRTPITNKNCKDLLQSINGSQQVSLNDILRR
+>key=25
+----FFTPGMTVSNPLNVVKQSKLLCKNNDLYIK-LPN-YKIVSAISLNGQPISYNKCEELISSLnNGSQ----------
+>key=26
+--NMFFMHKRKIPDPIDRLRRANLACEDDKLMIYGLPWITTQTSALSINSKPIVYKDCAKLLRSINGSQPVSLNDVLRR
+>key=27
+---MSFDKVQSINNPIDKLKNTFLFCKENKMMIGGLPN-NITTEALSVNKLPIVIDNCEDILMSINGSHKVSLDDIFRR
+>key=28
+---MLFFNDYINDSMFKTLMKTSLSCNGNNLVISGLPNKN-NVNALYIdNKKPIIYDKCNEVLMSINGSHKIYLNDILRK
+>key=29
+----FLKYREFLPNPLDRLRAATLSCEGNNLNIHGVPILGTEKSAISLNSKPIVYKDCLKLLQTINGSRTISFNDVLRR
+>key=30
+---MLLRPKKyKSENYINKLKSATLICDGNVLKITGLANAKIL-PALALNKEPISINECKELLYSINGSRQVSLNDVLRK
+>key=31
+--NMLFnFKQRKVISPIDKFSKTTLYCKENKLFISGLPNTMYSKEALSLNRQPITYKYCDDLLQSINGSQQVSINDILRK
+>key=32
+---------RRDPSPLDAYANAELGCDGDRLML-ALP--EGRVPALALDGRPVALADCAGLLRRINGPRAVRLVDVLGR
+>key=33
+-----------PINELDKYKDTYLTCYGNKLYII---SDNKQLPALSLNFKQIEFEGCSTILRNINGSRTVRISDVLNR
+>key=34
+----FFKSRDDIPNPVDKLRTATLVCEGNKLMINGLTRLGTERSALSLNSKPIVYKDCLKLLQTINGSRSISFNDVLRR
+>key=35
+--NMFFMPKRKIPDPIDRLRRANLACEDDKLMIYGLPWMTTQTSALSINSKPIVYKDCVKLLRSINGSHPVSLDDVLR-
+>key=36
+---MIFRlKKHETENYLNKVKSASLICDGKTLKITGLANAKIL-PALALNKEPIIINECKELLHSINGSRQVSLNDVLYR
+>key=37
+---MFFMTKQKIPDPIDRLRRANLACNDDKLMIYGLPWMTTQTSALSINSKPIVYKDCAKLLRSINGSRSVSLDDVLRR
+>key=38
+----FARPPPPPPSPLHALTAGlRLACRGDELLIHGLP--GGTAPALNRDGSPVRLRGCEALLRSVNG------------
+>key=39
+-------------DKLDKYKNAKLLCNGKNLYITGI--GKESVSALDINKNPIIYDDCLNLLKSINGSRKVSLDNILRK
+>key=-1
+GPNMFFMPKRKIPDPIDRLRRANLACEDDKLMIYGLPWMTTQTSALSINSKPIVYKDCAKLLRSINGSQPVSLNDVLRR
+>key=-1
+--NMFFMPKRKIPDPIDRLRRTNLACEDDKLMIYGLPWMTTQTSALSINSKPIVYKDCAKLLRSINGSQPVSLNDVLRR
+>key=-1
+--NMFFMPKRKIPDPIDRLRCANLACEDDKLMIYGLPWMTTQTSALSINSKPIVYKDCAKLLRSINGSQPVSLNDVLRR
+>key=-1
+--NMFFMHKRKIPDPIDRLRRANLACEDDKLMIYGLPWITTQTSALSINSKPIVYKDCAKLLRSINGSQPVSLNDVLRR
+>key=-1
+--NMFFMPKRKIPNPIDRLRRATLSCEDNKLMIYGLPWITTQSSALSINSKPIVYKDCAKLLRSINGSQPVSVDDVLRR
+>key=-1
+---MFFMPKREIPNPMDRLRRATLACEDNKLMIYGLPWMTTQSSALSINSKPIVYKDCTKLLRSINGSQPVSIDDVLSR
+>key=-1
+---MFFMTKQKIPDPIDRLRRANLACNDDKLMIYGLPWMTTQTSALSINSKPIVYKDCAKLLRSINGSRSVSLDDVLRR
+>key=-1
+-------------DPIKQFTSTSLTCKGNALFIKHMPNSTELKPALAINRKQIVHENCAALLQSINGSRKVSLNDILER
+>key=-1
+-------------DPIKQFTSTSLTCKGNALFIKHMPNSTELKPALAINRKQIVHENCVALLQSINGSRKVSLNDILER
+>key=-1
+---LFNFKQQKVISPIDKFSKTTLYCKENKLFISGLPNTMYSKEALSLNRQPITYKYCNDLLQSINGSQQVSINDILRK
+>key=-1
+-------------DPIKQFTSTSLVCKGNALFIKHMPNLTELKTALAINRKQIVHENCEALLQSINGSRKVSLNDILKR
+>key=-1
+--NMLFnFKQRKVISLIDKFSKTTLYCKENKLFISGLPNTMYSKEALSLNRQPITYKYCDDLLQSINGSQQVSINDILRK
+>key=-1
+---MFFMPKRKIPDPMDRLLRANPACEDDKFMFYELPWMTTQTSALSINSKPIVY------------------------
+>key=-1
+----FFKSRDDIPNPVDKLRTATLVCEGNKLMINGLTRLGTERSALSLNSKPIVYKDCLKLLQTINGSRSISFNDVLRR
+>key=-1
+----FLKYREFLPNPLDRLRAATLSCEGNNLNIHGVPILGTEKSAISLNSKPIVYKDCLKLLQTINGSRTISFNDVLRR
+>key=-1
+---MLISYKDDIPiNPIDNFSKSWLSCDGNKLVINNLPNTNGTKTALAINRQDITYKDCNFLLQSINGSSKISLNDVLRR
+>key=-1
+-----------VKDPLEKFLKTSLSCNGDKLIINKLPNSSSNVNALAINRTPITNKNCKALLQSINGSQQVSLNDILRR
+>key=-1
+-------------------------CKENKLFISGLPNTMYSKEALSLNRQPITYKYCNDLLQSINGSQQLSIN-----
+>key=-1
+---MSFDKVQSINNPIDKLKNTFLFCKENKMMIGGLPN-NITTEALSVNKLPIVIDNCEDILMSINGSHKVSLDDIFRR
+>key=-1
+-------------NPIDKFKDTFLFCKENKMMIGGLPN-NNVTEALTTDKIPIVVDNCEDILKSINGSHKVSLNDILRR
+>key=-1
+-------------NPIDKFKDTFLFCKENKMMIGGLHN-NNVTEALTTDKIPIVVDNCEDILKSINGSHKVSLNDILRR
+>key=-1
+---MLLRPKKyKSENYINKLKSATLICDGNVLKITGLANAKIL-PALALNKEPISINECKELLYSINGSRQVSLNDVLRK
+>key=-1
+---MLFLKDDKNDTIFNTLMKTSLSCNGNNLVISGLPNKS-NVNALYIdNKKPIIYDKCNEVLMSINGSHKIHLNDILRK
+>key=-1
+---MLFFNDYINDSMFKTLMKTSLSCNGNNLVISGLPNKN-NVNALYIdNKKPIIYDKCNEVLMSINGSHKIYLNDILRK
+>key=-1
+---MIFRlKKHETENYLNKVKSASLICDGKTLKITGLANAKIL-PALALNKEPIIINECKELLHSINGSRQVSLNDVLYR
+>key=-1
+-----FRRAPRAPSPLDAYLQASLVCEGDALML-ELP--EGRLPALALDGRPIAFPGCAGLLHRINGPRKVRLVDVL--
+>key=-1
+-----FRRAPRAPSPLDAYLQASLVCEGDALLI-ELP--EGRVPALALDGRPVAFPGCESLLYRINGPRKVRLVDVL--
+>key=-1
+------RGRQRPPSPLDAYGEASLACDGDALMI-ELP--GGRLPALALDGRPVAFPGCDGVLRRINGTRKVRLVDVLGR
+>key=-1
+------RGRRRVPAPLDAYGEASLACDGDALMI-ELP--GGRLPALALDGRPVAFPGCDGVLRRINGTRKVRLVDVLGR
+>key=-1
+-----FRRAPRAPSPLDAYLQASLVCDGDALLI-ELP--EGRVPALALDGRPVAFPGCESLLYRINGPRKVRLVDVL--
+>key=-1
+-----FARARKTPSPLEPYAQAALACTGNAL-VLELP--EGRVPALALNGQPVVFAGCDSVLRRINGPRKVHLVDVLGR
+>key=-1
+-------------DKLDKYKNAKLLCNGKNLYITGI--GKESVSALDINKNPIIYDDCLNLLKSINGSRKVSLDNILRK
+>key=-1
+-----------PINELDKYKDTYLTCYGNKLYII---SDNKQLPALSLNFKQIEFEGCSTILRNINGSRTVRISDVLNR
+>key=-1
+---------RRDPSPLDAYANAELGCDGDRLML-ALP--EGRVPALALDGRPVALADCAGLLRRINGPRAVRLVDVLGR
+>key=-1
+------------PDPLERFRKARLECaADGGLMIAGL--GARPRPALAGDGRPIRPADCAAVLRSVnNGPLAVSLDDVLR-
+>key=-1
+----FARPPPPPPSPLHALTAGlRLACRGDELLIHGLP--GGTAPALNRDGSPVRLRGCEALLRSVNG------------
+>key=-1
+----FFTPGMTVSNPLNVVKQSKLLCKNNDLYIK-LPN-YKIVSAISLNGQPISYNKCEELISSLnNGSQ----------
+>key=-1
+-------------NPLIKYKDNYLTCFKNKLYVVD--NGAY-VPALSLNGKHIVTNNCENILHNLNESQPVRVFDVFSR
+>key=-1
+-----FIPVPVPKNAItNLLNKTTLSCEENGTMMIH--RESGKYPALNLDGSPIIIDDCSLVLSSLNG------------
+>key=-1
+-----FFPLAKPPkNSINgLLDRTMLKCEEDGSLMISRPSGIY--SALSLDGSPIRIPDCGLLLSSING------------
+>key=-1
+-----FLPLQKPPkNSINSLLdKTFLKCEENGSLMIVRPSGTY--PALNLEGNPIQISDCSLLLSSLNG------------
+>key=-1
+-----FFPLAKPsKNSINSLLdRTMLKCEEDGSLMISRPSGIY--SALSLDGSPVRISDCSLLLSSING------------
+>key=-1
+-----FLPLQKtPKNSINSLLdKTFLKCEDDGSLMIVRPSGTY--PALNLDDTPVQFSDCSLLLSSLNG------------
+>key=-1
+-----FLPLRKPPkNSINSLLdKTFLKCEDNGTLMIVRPSGTFT--ALNLDGSPVQIPECSLLLSSLNG------------
+>key=-1
+GPNMFFMPKRKIPDPIDRLRRANLACEDDKLMIYGLPWMTTQTSALSINSKPIVYKDCAKLLRSINGSQPVSLNDVLRR
+>key=-1
+---MLLRPKKyKSENYINKLKSATLICDGNVLKITGLANAKIL-PALALNKEPISINECKELLYSINGSRQVSLNDVLRK
+>key=-1
+---MLLRPKKyKSENYINKLKSATLICDGNVLKITGLANAKIL-PALALNKEPISINECKELLYSINGSRQVSLNDVLRK
+>key=-1
+----FFKSRDDIPNPVDKLRTATLVCEGNKLMINGLTRLGTERSALSLNSKPIVYKDCLKLLQTINGSRSISFNDVLRR
+>key=-1
+--NMFFMHKRKIPDPIDRLRRANLACEDDKLMIYGLPWMTTQTSALSINSKPIVYKDCAKL------------------
+>key=-1
+---MLLNYKNDmVKDPLEKFLKTSLSCNGDKLIINKLPNSSSNVNALAINRTPITNKNCKDLLQSINGSQQVSLNDILRR
+>key=-1
+-----FNKTKVVNNPIDKFKDTFLFCKENKMMIGGLPN-NNVTEALTTDKIPIVVDNCEDILKSINGSHKVSLNDILRR
+>key=-1
+----LFRRAPRAPSPLDAYLQASLVCDGDALLIE-LPEGRV--PALALDGRPVAFPGCESLLYRINGPRKVRLVDVL--
+>key=-1
+----LFARARKTPSPLEPYAQAALACTGNALVLE-LPEGRV--PALALNGQPVVFAGCDSVLRRINGPRKVHLVDVLGR
+>key=-1
+-----------PINELDKYKDTYLTCYGNKLYI---ISDNKQLPALSLNFKQIEFEGCSTILRNINGSRTVRISDVLNR
+>key=-1
+------------PDPLERFRKARLECaADGGLMIAGL--GARPRPALAGDGRPIRPADCAAVLRSVnNGPLAVSLDDVLR-
+>key=-1
+-----FFPLAKPPkNSINGLLDRTmLKCEEDgSLMIS---RPSGIYSALSLDGSPIRIPDCGLLLSSINGaSSSTSPYSVFNR
+>key=-1
+-----FLPLQKTPkNSINSLLDKTfLKCEDDgSLMIV---RPSGTYPALNLDDTPVQFSDCSLLLSSLNG------------
diff --git a/esm/sdk/base_forge_client.py b/esm/sdk/base_forge_client.py
index 94500e63..c7b3f4da 100644
--- a/esm/sdk/base_forge_client.py
+++ b/esm/sdk/base_forge_client.py
@@ -109,6 +109,7 @@ async def _async_post(
params: dict[str, Any] = {},
headers: dict[str, str] = {},
return_bytes: bool = False,
+ timeout: int | None = None,
):
try:
request, headers = self.prepare_request(
@@ -119,7 +120,7 @@ async def _async_post(
json=request,
params=params,
headers=headers,
- timeout=self.request_timeout,
+ timeout=timeout if timeout is not None else self.request_timeout,
)
data = self.prepare_data(response, endpoint)
return data
@@ -139,6 +140,7 @@ def _post(
params: dict[str, Any] = {},
headers: dict[str, str] = {},
return_bytes: bool = False,
+ timeout: int | None = None,
):
try:
request, headers = self.prepare_request(
@@ -149,7 +151,7 @@ def _post(
json=request,
params=params,
headers=headers,
- timeout=self.request_timeout,
+ timeout=timeout if timeout is not None else self.request_timeout,
)
data = self.prepare_data(response, endpoint)
return data
diff --git a/esm/sdk/forge.py b/esm/sdk/forge.py
index dda3f10e..11c4739c 100644
--- a/esm/sdk/forge.py
+++ b/esm/sdk/forge.py
@@ -36,7 +36,7 @@
ESMFOLD2_FAST,
ESMFOLD2_MAX_MSA_SEQS,
)
-from esm.utils.misc import deserialize_tensors, maybe_list, maybe_tensor
+from esm.utils.misc import deserialize_tensors, maybe_list, maybe_tensor, to_float32
from esm.utils.msa import MSA
from esm.utils.structure.input_builder import (
ProteinInput,
@@ -105,7 +105,7 @@ def __init__(
url: str = "https://biohub.ai",
model: str | None = None,
token: str = "",
- request_timeout: int | None = None,
+ request_timeout: int | None = 120,
min_retry_wait: int = 1,
max_retry_wait: int = 10,
max_retry_attempts: int = 5,
@@ -117,7 +117,7 @@ def __init__(
url: URL of the Forge/Biohub Platform server.
model: Name of the model to be used for folding / inv folding.
token: API token.
- request_timeout: Override the system default request timeout, in seconds.
+ request_timeout: Override the system default request timeout (120s), in seconds.
"""
super().__init__(
model=model or "",
@@ -500,7 +500,7 @@ def __init__(
model: str,
url: str = "https://biohub.ai",
token: str = "",
- request_timeout: int | None = None,
+ request_timeout: int | None = 120,
min_retry_wait: int = 1,
max_retry_wait: int = 10,
max_retry_attempts: int = 5,
@@ -1151,7 +1151,7 @@ def __init__(
model: str,
url: str = "https://biohub.ai",
token: str = "",
- request_timeout: int | None = None,
+ request_timeout: int | None = 60,
min_retry_wait: int = 1,
max_retry_wait: int = 10,
max_retry_attempts: int = 5,
@@ -1222,11 +1222,13 @@ def _b64_decode(obj):
)
sae_outputs = cast(dict[str, torch.Tensor] | None, sae_outputs)
output = LogitsOutput(
- logits=ForwardTrackData(sequence=_maybe_logits(data, "sequence")),
- embeddings=maybe_tensor(data["embeddings"]),
- mean_embedding=data["mean_embedding"],
- hidden_states=maybe_tensor(data["hidden_states"]),
- mean_hidden_state=maybe_tensor(data["mean_hidden_state"]),
+ logits=ForwardTrackData(
+ sequence=to_float32(_maybe_logits(data, "sequence"))
+ ),
+ embeddings=to_float32(maybe_tensor(data["embeddings"])),
+ mean_embedding=to_float32(data["mean_embedding"]),
+ hidden_states=to_float32(maybe_tensor(data["hidden_states"])),
+ mean_hidden_state=to_float32(maybe_tensor(data["mean_hidden_state"])),
sae_outputs=sae_outputs,
)
return output
diff --git a/esm/sdk/retry.py b/esm/sdk/retry.py
index 302d6cf0..aa2fe287 100644
--- a/esm/sdk/retry.py
+++ b/esm/sdk/retry.py
@@ -7,7 +7,7 @@
retry_if_exception,
retry_if_result,
stop_after_attempt,
- wait_incrementing,
+ wait_random_exponential,
)
from esm.sdk.api import ESMProteinError
@@ -20,11 +20,11 @@ def retry_if_specific_error(exception):
We only retry on specific errors.
"""
return isinstance(exception, ESMProteinError) and exception.error_code in {
- 429,
- 500,
- 502,
- 504,
- 500,
+ 429, # Too Many Requests
+ 500, # Internal Server Error
+ 502, # Bad Gateway
+ 503, # Service Unavailable
+ 504, # Gateway Timeout
}
@@ -56,8 +56,9 @@ async def async_wrapper(instance, *args, **kwargs):
retry_error_callback=return_last_value,
retry=retry_if_result(retry_if_specific_error)
| retry_if_exception(retry_if_specific_error),
- wait=wait_incrementing(
- increment=1, start=instance.min_retry_wait, max=instance.max_retry_wait
+ # Full-jitter exponential backoff
+ wait=wait_random_exponential(
+ multiplier=instance.min_retry_wait, max=instance.max_retry_wait
),
stop=stop_after_attempt(instance.max_retry_attempts),
before_sleep=log_retry_attempt,
@@ -73,8 +74,9 @@ def wrapper(instance, *args, **kwargs):
retry_error_callback=return_last_value,
retry=retry_if_result(retry_if_specific_error)
| retry_if_exception(retry_if_specific_error),
- wait=wait_incrementing(
- increment=1, start=instance.min_retry_wait, max=instance.max_retry_wait
+ # Full-jitter exponential backoff
+ wait=wait_random_exponential(
+ multiplier=instance.min_retry_wait, max=instance.max_retry_wait
),
stop=stop_after_attempt(instance.max_retry_attempts),
before_sleep=log_retry_attempt,
diff --git a/esm/utils/function/lsh.py b/esm/utils/function/lsh.py
index fd2c7e9b..0c082e7f 100644
--- a/esm/utils/function/lsh.py
+++ b/esm/utils/function/lsh.py
@@ -65,7 +65,7 @@ def write_hyperplanes(self, filepath: PathLike):
hyperplanes: dict[str, np.ndarray] = {
str(i): table.hyperplanes for i, table in enumerate(self.tables)
}
- np.savez(filepath, **hyperplanes)
+ np.savez(filepath, **hyperplanes) # ty: ignore[invalid-argument-type]
def __call__(self, array):
tokens = np.stack([table(array) for table in self.tables], 1)
diff --git a/esm/utils/misc.py b/esm/utils/misc.py
index cc874ff5..24705ce0 100644
--- a/esm/utils/misc.py
+++ b/esm/utils/misc.py
@@ -364,6 +364,13 @@ def maybe_tensor(x, convert_none_to_nan: bool = False) -> torch.Tensor | None:
return torch.tensor(x)
+def to_float32(x):
+ """Upcast reduced-precision activations to float32"""
+ if isinstance(x, torch.Tensor) and x.is_floating_point():
+ return x.to(torch.float32)
+ return x
+
+
def maybe_list(x, convert_nan_to_none: bool = False) -> list | None:
if x is None:
return None
diff --git a/esm/utils/structure/molecular_complex.py b/esm/utils/structure/molecular_complex.py
index 2e856b33..6b3a0b25 100644
--- a/esm/utils/structure/molecular_complex.py
+++ b/esm/utils/structure/molecular_complex.py
@@ -697,6 +697,96 @@ def from_mmcif(cls, inp: str, id: str | None = None) -> "MolecularComplex":
atom_hetero=atom_hetero,
)
+ @classmethod
+ def from_atomarray(
+ cls, atom_arr: bs.AtomArray, id: str = "complex"
+ ) -> "MolecularComplex":
+ """Build a MolecularComplex from a biotite AtomArray, keeping ALL atoms.
+
+ This is the inverse of :meth:`to_mmcif` (which expands the flat
+ token/atom arrays into an ``AtomArray``): it groups the AtomArray's atoms
+ into tokens by ``(chain_id, res_id)`` in array order and rebuilds the flat
+ ``atom_positions`` / ``atom_elements`` / ``atom_names`` / ``atom_hetero``
+ arrays plus the token-level ``token_to_atoms`` / ``chain_id`` /
+ ``sequence`` / ``plddt`` arrays. Unlike ``ProteinChain.from_atomarray``
+ it retains every atom (e.g. the phosphate atoms of a phosphorylated
+ residue), not just the atom37 protein set.
+
+ Args:
+ atom_arr: biotite AtomArray. Atoms of a residue are assumed contiguous
+ (as produced by ``evolutionaryscale.structure.utils.to_atom_array``).
+ id: identifier to assign to the complex.
+
+ Returns:
+ MolecularComplex with flat atom arrays and token-based indexing.
+ """
+ n_atoms = len(atom_arr)
+ coords = np.asarray(atom_arr.coord, dtype=np.float32)
+ chain_labels = np.asarray(atom_arr.chain_id, dtype=object)
+ res_ids = np.asarray(atom_arr.res_id)
+ res_names = np.asarray(atom_arr.res_name, dtype=object)
+ atom_names = np.asarray(atom_arr.atom_name, dtype=object)
+ elements = np.asarray(atom_arr.element, dtype=object)
+
+ annotations = atom_arr.get_annotation_categories()
+ hetero = (
+ np.asarray(atom_arr.hetero, dtype=bool)
+ if "hetero" in annotations
+ else np.zeros(n_atoms, dtype=bool)
+ )
+ b_factor = (
+ np.asarray(atom_arr.b_factor, dtype=np.float32)
+ if "b_factor" in annotations
+ else np.zeros(n_atoms, dtype=np.float32)
+ )
+
+ # Numeric chain ids assigned in order of first appearance so that
+ # metadata.chain_lookup round-trips through to_mmcif.
+ chain_label_to_numeric: dict[str, int] = {}
+ for lbl in chain_labels:
+ if lbl not in chain_label_to_numeric:
+ chain_label_to_numeric[lbl] = len(chain_label_to_numeric)
+
+ sequence: list[str] = []
+ token_to_atoms: list[list[int]] = []
+ token_chain_ids: list[int] = []
+ token_plddt: list[float] = []
+
+ def _close_token(start: int, end: int) -> None:
+ token_to_atoms.append([start, end])
+ sequence.append(str(res_names[start]))
+ token_chain_ids.append(chain_label_to_numeric[chain_labels[start]])
+ token_plddt.append(float(b_factor[start:end].mean()) / PLDDT_B_FACTOR_SCALE)
+
+ token_start = 0
+ prev_key: tuple[Any, int] | None = None
+ for i in range(n_atoms):
+ key = (chain_labels[i], int(res_ids[i]))
+ if i > 0 and key != prev_key:
+ _close_token(token_start, i)
+ token_start = i
+ prev_key = key
+ if n_atoms > 0:
+ _close_token(token_start, n_atoms)
+
+ chain_lookup = {num: lbl for lbl, num in chain_label_to_numeric.items()}
+ metadata = MolecularComplexMetadata(
+ entity_lookup={}, chain_lookup=chain_lookup, assembly_composition=None
+ )
+
+ return cls(
+ id=id,
+ sequence=sequence,
+ atom_positions=coords,
+ atom_elements=elements,
+ token_to_atoms=np.array(token_to_atoms, dtype=np.int32).reshape(-1, 2),
+ chain_id=np.array(token_chain_ids, dtype=np.int64),
+ plddt=np.array(token_plddt, dtype=np.float32),
+ metadata=metadata,
+ atom_names=atom_names,
+ atom_hetero=hetero,
+ )
+
def _get_entity_mapping(
self,
) -> tuple[dict[str, list[str]], dict[str, int], dict[int, tuple[str, ...]]]:
diff --git a/esm/utils/structure/protein_chain.py b/esm/utils/structure/protein_chain.py
index 4e433bd4..a5023a01 100644
--- a/esm/utils/structure/protein_chain.py
+++ b/esm/utils/structure/protein_chain.py
@@ -574,6 +574,7 @@ def globularity(self) -> float:
# https://www.mdpi.com/2073-4352/11/12/1539
# NOTE(@zeming): due to the approximation we make here, that atoms never overlap, you might get >1 globularity
mask = self.atom37_mask.any(-1)
+ assert isinstance(mask, np.ndarray)
points = self.atom37_positions[self.atom37_mask]
sequence = [aa for aa, m in zip(self.sequence, mask) if m]
A, _ = self._mvee(points, tol=1e-3)
diff --git a/esm/utils/structure/protein_complex.py b/esm/utils/structure/protein_complex.py
index eaea2911..78a42789 100644
--- a/esm/utils/structure/protein_complex.py
+++ b/esm/utils/structure/protein_complex.py
@@ -122,6 +122,18 @@ class ProteinComplexMetadata:
assembly_composition: dict[str, list[str]] | None = None
+def _dockq_f1(f1: float, interface_rms: float, ligand_rms: float) -> float:
+ """DockQ's DockQ_F1: the DockQ formula with F1 substituted for fnat.
+
+ DockQ v2.1.2 dropped the DockQ_F1 output, so recompute it with the upstream
+ ``dockq_formula``. Imported lazily because DockQ is an optional dependency,
+ only needed when scoring.
+ """
+ from DockQ.DockQ import dockq_formula
+
+ return dockq_formula(f1, interface_rms, ligand_rms)
+
+
@dataclass
class DockQSingleScore:
native_chains: tuple[str, str]
@@ -893,16 +905,19 @@ def sanity_check_chain_ids(pc: ProteinComplex):
interfaces.append(current_interface)
def parse_dict(d: dict[str, Any]) -> DockQSingleScore:
+ interface_rms = float(d["iRMSD"])
+ ligand_rms = float(d["LRMSD"])
+ f1 = float(d["F1"])
return DockQSingleScore(
native_chains=tuple(d["Native chains"]),
DockQ=float(d["DockQ"]),
- interface_rms=float(d["irms"]),
- ligand_rms=float(d["Lrms"]), # Note the capitalization difference
+ interface_rms=interface_rms,
+ ligand_rms=ligand_rms,
fnat=float(d["fnat"]),
fnonnat=float(d["fnonnat"]),
clashes=float(d["clashes"]),
- F1=float(d["F1"]),
- DockQ_F1=float(d["DockQ_F1"]),
+ F1=f1,
+ DockQ_F1=_dockq_f1(f1, interface_rms, ligand_rms),
)
inv_mapping = {
diff --git a/esm/widgets/views/login.py b/esm/widgets/views/login.py
index acdc91e0..aa3f3456 100644
--- a/esm/widgets/views/login.py
+++ b/esm/widgets/views/login.py
@@ -52,7 +52,7 @@ def create_login_ui(client_container: ClientInitContainer):
# If not logged in, show login form
forge_info = widgets.HTML(
- value="Copy a token from your Forge console page and paste it below:
"
+ value="Copy a token from your Biohub developer console and paste it below:
"
)
forge_token_input = widgets.Text(
description="Token:",
@@ -96,7 +96,7 @@ def create_login_ui(client_container: ClientInitContainer):
)
forge_model_selection_info = widgets.HTML(
- value="Enter the model name from the Forge console page that you would like to use:
"
+ value="Enter the model name from the Biohub developer console that you would like to use:
"
)
model_selection_header = widgets.HTML(value="Select a Model
")
diff --git a/pixi.lock b/pixi.lock
index baab98d9..36399393 100644
--- a/pixi.lock
+++ b/pixi.lock
@@ -74,7 +74,7 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.5-py312he3d6523_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.2.21-py39h77e2912_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.5-py312h33ff503_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h55fea9a_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.1-py312hf79963d_0.conda
@@ -102,6 +102,7 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.1.31-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.1-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.9-py312hd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda
@@ -147,6 +148,7 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda
- pypi: .
- pypi: git+https://github.com/Biohub/transformers.git?rev=main#3a8956fb4d4ea16b0ec8e71deef2c2909b6a5cbf
+ - pypi: git+https://github.com/nrontsis/DockQ.git?rev=ba4df5adaad7c77fd60851d0b7b05f2b77061ba2#ba4df5adaad7c77fd60851d0b7b05f2b77061ba2
- pypi: https://files.pythonhosted.org/packages/00/78/9cbcc1c073b9d4918e925af1a059762265dc65004e020511b2a06fbfd020/pydssp-0.9.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/02/e9/367e81e114deb92a6e0d5740f0bff4548af710be318af65265b9aad72237/botocore-1.40.9-py3-none-any.whl
@@ -183,6 +185,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/7e/46/02ac5e262d4af18054b3e922b2baedbb2a03289ee792162de60a865defc5/accelerate-1.13.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/80/cd/c607b6337ddcf55cc0249527819b727ef28481d7c56ace54cca69400c2b9/biotraj-1.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/81/b6/100d5811cb60bfc13626910cb48872b8ca53f1dcaf2127aac71185575a7f/parallelbar-2.5-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/87/20/199b8713428322a2f22b722c62b8cc278cc53dffa9705d744484b5035ee9/nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/87/62/9773de14fe6c45c23649e98b83231fffd7b9892b6cf863251dc2afa73643/einops-0.8.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/8a/6d/44ad094874c6f1b9c654f8ed939590bdc408349f137f9b98a3a23ccec411/nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl
@@ -229,6 +232,7 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.8.3-hbd8a1cb_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.8.3-pyhd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.12.11-py312hd8ed1ab_0.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_1.conda
- conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22-pyhd8ed1ab_0.conda
@@ -324,7 +328,7 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.5-py312h05635fa_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.3.0-py39h24c5d98_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.5-py312he281c53_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h889cd5d_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.1-py312h98f7732_0.conda
@@ -347,6 +351,7 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda
- pypi: .
- pypi: git+https://github.com/Biohub/transformers.git?rev=main#3a8956fb4d4ea16b0ec8e71deef2c2909b6a5cbf
+ - pypi: git+https://github.com/nrontsis/DockQ.git?rev=ba4df5adaad7c77fd60851d0b7b05f2b77061ba2#ba4df5adaad7c77fd60851d0b7b05f2b77061ba2
- pypi: https://files.pythonhosted.org/packages/00/78/9cbcc1c073b9d4918e925af1a059762265dc65004e020511b2a06fbfd020/pydssp-0.9.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/02/e9/367e81e114deb92a6e0d5740f0bff4548af710be318af65265b9aad72237/botocore-1.40.9-py3-none-any.whl
@@ -383,6 +388,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/7e/46/02ac5e262d4af18054b3e922b2baedbb2a03289ee792162de60a865defc5/accelerate-1.13.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/81/b6/100d5811cb60bfc13626910cb48872b8ca53f1dcaf2127aac71185575a7f/parallelbar-2.5-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/87/62/9773de14fe6c45c23649e98b83231fffd7b9892b6cf863251dc2afa73643/einops-0.8.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/8c/c9/bb114c158540ee17907ec470d01980957fdaf87b4aa07914c24eba87b9c6/safetensors-0.6.2-cp38-abi3-macosx_11_0_arm64.whl
- pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl
@@ -507,7 +513,7 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-9.0.1-he0572af_6.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.2.21-py39h77e2912_1.conda
- - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.5-py312h33ff503_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h55fea9a_1.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.9-he970967_0.conda
- conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.4.1-h7b32b05_0.conda
@@ -635,6 +641,7 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.21.0-pyhd8ed1ab_1.conda
- pypi: .
- pypi: git+https://github.com/Biohub/transformers.git?rev=main#3a8956fb4d4ea16b0ec8e71deef2c2909b6a5cbf
+ - pypi: git+https://github.com/nrontsis/DockQ.git?rev=ba4df5adaad7c77fd60851d0b7b05f2b77061ba2#ba4df5adaad7c77fd60851d0b7b05f2b77061ba2
- pypi: https://files.pythonhosted.org/packages/00/78/9cbcc1c073b9d4918e925af1a059762265dc65004e020511b2a06fbfd020/pydssp-0.9.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/02/e9/367e81e114deb92a6e0d5740f0bff4548af710be318af65265b9aad72237/botocore-1.40.9-py3-none-any.whl
@@ -671,6 +678,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/7e/46/02ac5e262d4af18054b3e922b2baedbb2a03289ee792162de60a865defc5/accelerate-1.13.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/80/cd/c607b6337ddcf55cc0249527819b727ef28481d7c56ace54cca69400c2b9/biotraj-1.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
+ - pypi: https://files.pythonhosted.org/packages/81/b6/100d5811cb60bfc13626910cb48872b8ca53f1dcaf2127aac71185575a7f/parallelbar-2.5-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/87/20/199b8713428322a2f22b722c62b8cc278cc53dffa9705d744484b5035ee9/nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl
- pypi: https://files.pythonhosted.org/packages/87/62/9773de14fe6c45c23649e98b83231fffd7b9892b6cf863251dc2afa73643/einops-0.8.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/8a/6d/44ad094874c6f1b9c654f8ed939590bdc408349f137f9b98a3a23ccec411/nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl
@@ -834,7 +842,7 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.5-py312h05635fa_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.3.0-py39h24c5d98_0.conda
- - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda
+ - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.5-py312he281c53_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h889cd5d_1.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.5.2-he92f556_0.conda
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.1-py312h98f7732_0.conda
@@ -861,6 +869,7 @@ environments:
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-h6491c7d_2.conda
- pypi: .
- pypi: git+https://github.com/Biohub/transformers.git?rev=main#3a8956fb4d4ea16b0ec8e71deef2c2909b6a5cbf
+ - pypi: git+https://github.com/nrontsis/DockQ.git?rev=ba4df5adaad7c77fd60851d0b7b05f2b77061ba2#ba4df5adaad7c77fd60851d0b7b05f2b77061ba2
- pypi: https://files.pythonhosted.org/packages/00/78/9cbcc1c073b9d4918e925af1a059762265dc65004e020511b2a06fbfd020/pydssp-0.9.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/02/e9/367e81e114deb92a6e0d5740f0bff4548af710be318af65265b9aad72237/botocore-1.40.9-py3-none-any.whl
@@ -897,6 +906,7 @@ environments:
- pypi: https://files.pythonhosted.org/packages/7e/46/02ac5e262d4af18054b3e922b2baedbb2a03289ee792162de60a865defc5/accelerate-1.13.0-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl
+ - pypi: https://files.pythonhosted.org/packages/81/b6/100d5811cb60bfc13626910cb48872b8ca53f1dcaf2127aac71185575a7f/parallelbar-2.5-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/87/62/9773de14fe6c45c23649e98b83231fffd7b9892b6cf863251dc2afa73643/einops-0.8.1-py3-none-any.whl
- pypi: https://files.pythonhosted.org/packages/8c/c9/bb114c158540ee17907ec470d01980957fdaf87b4aa07914c24eba87b9c6/safetensors-0.6.2-cp38-abi3-macosx_11_0_arm64.whl
- pypi: https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl
@@ -2139,17 +2149,18 @@ packages:
- pkg:pypi/nh3?source=hash-mapping
size: 621078
timestamp: 1741652643562
-- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda
- sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8
- md5: d8285bea2a350f63fab23bf460221f3f
+- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.5-py312h33ff503_1.conda
+ sha256: 76ad6a6f4761084b074a587fe1512956891f04b5250cec0fd39aca0f39ad122b
+ md5: 03baecffb72fa96fe234fd505908065f
depends:
+ - python
+ - __glibc >=2.17,<3.0.a0
+ - libstdcxx >=14
+ - libgcc >=14
- libblas >=3.9.0,<4.0a0
- - libcblas >=3.9.0,<4.0a0
- - libgcc-ng >=12
- liblapack >=3.9.0,<4.0a0
- - libstdcxx-ng >=12
- - python >=3.12,<3.13.0a0
- python_abi 3.12.* *_cp312
+ - libcblas >=3.9.0,<4.0a0
constrains:
- numpy-base <0a0
license: BSD-3-Clause
@@ -2158,9 +2169,9 @@ packages:
- pkg:pypi/numpy?source=hash-mapping
run_exports:
weak:
- - numpy >=1.26.4,<2.0a0
- size: 7484186
- timestamp: 1707225809722
+ - numpy >=1.23,<3
+ size: 8820597
+ timestamp: 1766383409220
- conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.3-h55fea9a_1.conda
sha256: 0b7396dacf988f0b859798711b26b6bc9c6161dca21bacfd778473da58730afa
md5: 01243c4aaf71bde0297966125aea4706
@@ -4856,16 +4867,17 @@ packages:
- pkg:pypi/nh3?source=hash-mapping
size: 624089
timestamp: 1752853325963
-- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-1.26.4-py312h8442bc7_0.conda
- sha256: c8841d6d6f61fd70ca80682efbab6bdb8606dc77c68d8acabfbd7c222054f518
- md5: d83fc83d589e2625a3451c9a7e21047c
+- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.5-py312he281c53_1.conda
+ sha256: 0377c031951fc7ac3023f4b832c4a075e0e562015060e6f87bd751b45a1ef5ab
+ md5: 5a064b1a93c26d2960bbc49fa1de524b
depends:
+ - python
+ - libcxx >=19
+ - __osx >=11.0
+ - python 3.12.* *_cpython
+ - liblapack >=3.9.0,<4.0a0
- libblas >=3.9.0,<4.0a0
- libcblas >=3.9.0,<4.0a0
- - libcxx >=16
- - liblapack >=3.9.0,<4.0a0
- - python >=3.12,<3.13.0a0
- - python >=3.12,<3.13.0a0 *_cpython
- python_abi 3.12.* *_cp312
constrains:
- numpy-base <0a0
@@ -4875,9 +4887,9 @@ packages:
- pkg:pypi/numpy?source=hash-mapping
run_exports:
weak:
- - numpy >=1.26.4,<2.0a0
- size: 6073136
- timestamp: 1707226249608
+ - numpy >=1.23,<3
+ size: 6706018
+ timestamp: 1766383302517
- conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h889cd5d_1.conda
sha256: 6013916893fcd9bc97c479279cfe4616de7735ec566bad0ee41bc729e14d31b2
md5: ab581998c77c512d455a13befcddaac3
@@ -5278,6 +5290,7 @@ packages:
- pygtrie
- dna-features-viewer
- accelerate
+ - dockq @ git+https://github.com/nrontsis/DockQ.git@ba4df5adaad7c77fd60851d0b7b05f2b77061ba2
requires_python: '>=3.12,<3.13'
- pypi: git+https://github.com/Biohub/transformers.git?rev=main#3a8956fb4d4ea16b0ec8e71deef2c2909b6a5cbf
name: transformers
@@ -5741,6 +5754,15 @@ packages:
- opentelemetry-exporter-otlp ; extra == 'open-telemetry'
- opentelemetry-sdk ; extra == 'open-telemetry'
requires_python: '>=3.9.0'
+- pypi: git+https://github.com/nrontsis/DockQ.git?rev=ba4df5adaad7c77fd60851d0b7b05f2b77061ba2#ba4df5adaad7c77fd60851d0b7b05f2b77061ba2
+ name: dockq
+ version: 2.1.3
+ requires_dist:
+ - numpy>=2.0
+ - biopython>=1.79
+ - networkx
+ - parallelbar
+ requires_python: '>=3.10'
- pypi: https://files.pythonhosted.org/packages/00/78/9cbcc1c073b9d4918e925af1a059762265dc65004e020511b2a06fbfd020/pydssp-0.9.1-py3-none-any.whl
name: pydssp
version: 0.9.1
@@ -6838,6 +6860,14 @@ packages:
- psutil ; extra == 'test'
- netcdf4>=1.7.1 ; extra == 'test'
requires_python: '>=3.10'
+- pypi: https://files.pythonhosted.org/packages/81/b6/100d5811cb60bfc13626910cb48872b8ca53f1dcaf2127aac71185575a7f/parallelbar-2.5-py3-none-any.whl
+ name: parallelbar
+ version: '2.5'
+ sha256: 2aba5064e313cdd2fe49350db512ed0d4bc779f43e370e51c44d2bac347af43e
+ requires_dist:
+ - tqdm
+ - colorama
+ - dill ; extra == 'dill'
- pypi: https://files.pythonhosted.org/packages/87/20/199b8713428322a2f22b722c62b8cc278cc53dffa9705d744484b5035ee9/nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl
name: nvidia-nvtx-cu12
version: 12.4.127
diff --git a/pyproject.toml b/pyproject.toml
index e2c64e1c..c4d32c19 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -44,6 +44,10 @@ dependencies = [
"pygtrie",
"dna_features_viewer",
"accelerate",
+ # Fork adding numpy-2 support on top of upstream v2.1.2. That upstream release
+ # renamed the RMSD keys (iRMSD/LRMSD) and dropped the DockQ_F1 output, which
+ # protein_complex.py recomputes from F1.
+ "dockq @ git+https://github.com/nrontsis/DockQ.git@ba4df5adaad7c77fd60851d0b7b05f2b77061ba2",
]
# Pytest
[tool.pytest.ini_options]
@@ -86,9 +90,7 @@ upload-wheel = "python -m twine upload --repository pypi"
[tool.pixi.feature.dev.dependencies]
matplotlib = "*"
-# Pin the lint/test env to numpy<2: the numpy 2.x type stubs trip ty false positives
-# (savez/zip) that don't reflect runtime behavior. Runtime deps stay numpy-unconstrained.
-numpy = ">=1.26.0,<2.0.0"
+numpy = ">=2.0.0,<2.4"
pre-commit = "*"
pytest = "*"
pytest-cov = "*"