From 0c15580eb86f7a6c19df634e9c71b51709f210d8 Mon Sep 17 00:00:00 2001 From: Samee Ullah Date: Wed, 11 Dec 2024 16:58:38 -0500 Subject: [PATCH 1/2] Add files via upload added small molecule prediction vis smile and ccd code --- pymolfold_v0.1.0.zip | Bin 4280 -> 4858 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pymolfold_v0.1.0.zip b/pymolfold_v0.1.0.zip index 3200e2c1ead3c2670bd92bac8618e5254dfb7479..3fdd0372a9c5ce2e55875cf4c0386b64a7d5cb9a 100644 GIT binary patch literal 4858 zcmb7|WmKHWm&O|l+PD+k5*z}7;E>?%?hxqE5Tpri0fGkz5WI1RMuNKp8VMfUB@kSK z>p#qFW@dM1=gii7ZdJWsez)p=cuw6%RRIZ^5O6=@+{5*L+x*vr2cQ8sxZAx3zkCh0 zGG_3}JjKs()f-f9j7R|TI%VwdE50cJd%)HSy+t|r|N!0(A z5)oZ;{9^GZu`K2=Lfmst)EXY7N)6a&T-*1DI6q3{F!-P~ttXfPTzF0Jv#>POgx zuY$rxI>oDx_)HfILMjf%UQyDft@+jBP!nY8Q#qhi>gwP-20jbZlFuZR#Cconp$Kie zeyFv^pb~tclRY8{&5%r{raH>!8>@LZqu3ZzSf)reLN!0L7Q~LgdN3lu7sLKtKq}iJ z$F}{B;G}c)HGF?9o;cPr^%2)d7%FKHK9ziArn(xKTv}W+F(OK&9g8#IFoPEC%p}C` zLM=>NF*@J*0{u)vy~FI2_0Wt#D3NhwGPmzS#FpmZB#}NxDW8leoEr-PDt2zMbAy#L zT(^ZnbDWtuWLW_XY&h3{)ZsIsrt}s3VvOBq4Jb*kJn@Gz+?rFPy-e*> ztf7?S22DbuCKnhZtou!dYiizkGF|HhOpVe_z_(b&{9x7R>bMg*7Tma)nNxvz^<==% z@f9{YVfn8jspWw{7diH&vEzsm>7EsU#1D;}dR{4cT}%({POkKGlECIL zPgL_a`cY(gRX(Ev&x-j)OFw&+@>#UcadcNRaN4D}RNFlem7DUU&DVW!FgUCyNn}Q& zz%SaGNns%|uF-t)j<^{&R)@^XEEd#KX~l9#aIVbm90wAY@i?Wmb_)tKK7rrPSpTrv zjSX0h&0ViYdFYneLw+mVwvy7KZk_C1>YD{`$hPu5h~U5KSp-h@vOalt=#3R6lv~0X zgxE2HOGV(FG_zVF2JX$UJHYi_18tb6m?ZFxa(V=v9q_AE8U zxYm<@%a?k7PGDn@-*uRxA)v)`PjGtWN@@RSf^6#4#tnos-{`+>xHvs|6%OBIjV);{ z5>7<7n|a&NGJ)-I2^pVE9iql>1f+_mHf=Cp%kyu=%>2x-*F z!szj=7Jnq};hjt?PdDj+kgsGnWw$R(#O;)G*{5{B_g^=#ajbfL^EC zD`HRc9JhGuH=idji!(4}GNBU#b_?Wg&t|*cE>^DC?k)2YC?JwtMb0luJ`)f~G_>RN z_346DRZ0@?umrU3)6tA?Mi|*;h1(p- zGi7nD#N9ZYY^_^50lb)5OPz?}#eLfPpSfe*3#+WWK$_Zmcw=XcJ@V|Bn8i}&xhzaR zT1jM|=s0!o`9_;$wL~qt5f43hYqtL~^b;VB2s1XgUS5irL^#;bnTq02CJ6hju;nc`2DoNB=;>c(AnL`N#ye;Z)Yg5ai|2@6`TUGBg1Va) z45>3BKL3rG7 zaD?T*=h^Ju3>US^tbxVUMw!+`Phx=y1#Ph47_Ew^2O~jHjU*0>q7K&`2B+FqTHvf( z>o8MS9&8}7*a^r$=rcO;uR5IH8 zPPk^J`$!-*2oME(>-(nZ(BQD}$F9OK!iC0i7iK8OU~JO+@^fy{k68DHRg@mfV2yhV}Ia|u8-_bJ5C-oSpz!@&&rY>Dxb zGZ=p7R|<}l0lqbIOkY-V?s(&iweSp*FpE~qS4HU`-iHsv9<)^s|`?p1YsVy`}Wc4g>!i`^}~ zYIlyG7K3-0hW4A`e6w@{&QS)IwtjwN5XMn3Z^D*Z(n()L;+lZz%aMlBDJ57EAf>^c zNg`g9G!k2SF_CqIDF9HG@W44hn(uV_+Vp`+7uxLY`oOKeoX;cM@CU1=<)G-5^eNeg z5qs32^;){`49zLTJ!ft&O;;lorSv<^?~w0Y5WgPo6g3VKV+v@?kyjyG5Vg7rir!&C z(k1w27HqzGrRfas+OF?l4IZU;>i+W*p@OSVGPIdGyhlDz)DmKoD$}#~ zMOf4yHw-P!Dc-qSH7aq+nyO9i`b=X_sQT<1$` zuOcC_!n@}it|*VnZV|f$Oxh8mW^TsFgd7ZTW)2{qEjnppLi?O$tJlfoJQn*Wq=WTd zKRZz6`OdjGEjI`4d@hCOH?_OP3=LsMUt?$8L7OR0l9KB5(?Iqrf#^$g<(vl$A zLY7xfl#uxYbQvuAEfcrXDOb#=`y?M7$Mb3?k}R~N3lME?K9>|=dO zlmlNzVp=GCMMc-+Yg@^_${Q%Uad{E= zU3KZIX?Hams%7felW$4k~s(RQq8<7^zkFt^1*p; ztbSSle^ELs zY!t-OfR#=26c3$7&*C|HLXKT6f2<{WdY*pgcD#}(tbzj%+PnA6ToreqctKf`dl{Ng65yks6uv?{VXD<{OL)YxaK^5PElC_MfXTb_+?f@je5M6wu#`V@rQ_nUEgpPxuC;0^s&H3 z6arb@EpBcw;tgkD%(kQr{L=?}xX!TV&MU8n^zR#7`uy3Va&cd``Bd^S_&j;7gegq` zwNii@(${M+w1wfDikGkm=RsOA0@I}Z+G6QYo*LHF%AIHR=i&)=UVV>!9vjfqxq5M! z-FY!a>*YvTL>RAO-aJ!vkOWGf)aQEI0=Uf7}{s;EKx*; zxTY-|-e;eE;%H2oWr}2p(a?Ep+P}hpes4<60xwW}0U#;JJEc^a+0tX0$}N@v=NoKQ z{V6h!gN`PZ{f~6B`4oP>Vi{Q|*%w46x9(A#r6(sL2gX%9J(~mRtMhvjy8!c%q=fl3 z$yUAbYvH&}f&3@|q2M!o8V-~2jV%jEzl;B5?;~p5kDWni)i6MUADTZ321^HUh(U3) zo{ex7-K)gv1(JX~P4;*Zs##OA9ipE`UCjeq@$aKNiKm5!e9|AzZoG@(eZZUfIRjph z*XyKg%#AYnf}x>isX6z^@y2#?jHl*ormk%S?4^Op{1N9YZjsX(XVeWM_+-x&uDOPj zpHeE*HcCd7p@s;#&7|SafRGx}vy=tD;C2j&+<6syn=a@gfnVg*$Ob3PaThjzsv<3yNM=Y#`5jOuSx+a863NPT$tQJ@z6FluSer9H5{F_$UZ)q1 zcv&Ow@B$v)VuvWVK44fDj8>b(=bSMFLfnQF3h}N>Cu3~QrYnDOZGW$Q5PxymI@GP@ zpv|@X&LO^zu65h#6v1;(TsA;WF~FAYEi*Sc6=RYj48?pg3!oG1r=wG`mzbf~u@A+$0@B5x#BgfwZtY b=hglnU685*%7c3@^3M;3002D2yZ`$S@!6bg literal 4280 zcmb7HXE+>Mw;n`|F3JSaf`}45N(j-7GFrkUGKg-pLG&^ay${hvuOY*zQKChSAfgT< zdI<*6`*)ms&-0ygpXWaJerrE_ueE=ycdz~HeP1w$;KnV$b!=NjnfzJ&_dy0=2e^1U zI>W4;VU`b!3@HG_qQfROVt?%G?BR72fOq2v4*>YHAN(f{34r7uIFrl(0Np=uJnbxP ztlWh>?EWvnWn-)xMv6Lc8=9LdmerKT6}tZl@?;H+U&DxeGPkzO$F)hgaUb+ifN>2P z$j{tEq$GTILY_qzqk?hXa$Y_?3+d_e1mh(xG#kp5CXtXlm(dy+1O>*(EY}wv#n>Fg z7iPSiFX|T4ua~BHqpEfv<<#Y1IhZC!pv`&OEPhOzz|C1gyvkiY!NTnU)nH3{`SCJU zY`*v8o%=l-AD|8c zG9%MO7;yeHz|qqU+*}L-8WfP#;5#;TXgo*Gjt zt5*zyAR)cm4^Z+)MM&9#p-v!O2`8pTqL>0QYEyN4O{V zVR$FotQXF^>cPLnnBNl7qY_yWx`YudP)AM!KKH4Dyu(4=Uhkw*46}RUmjL-})z)f5 z%nG6Sh#;4|p4Ex2?YIy>gsg-pOew*-=Kg7T_gl7Kva#o~x-xCSC&*_L{pwzCeF6n>}l zY;XdiD}r)ShzNn|g}9_j;HhXUNR&DM8n^cjH@ky%ivczy>?N;n=rTMcXQzqG*Yu_iuO^X-(bTcliSU7a7~ATvCgOL*Z9Tod z9wdsFhlmPA4<7sMR89P%e01#S6O}c z>n#HXI$mXsbV;{f>dztUuzS>%Zvu>B_xaOD*_M;j@T5LZn9t&vc{x?vMRBp$Wuu?hl`!TUv`OGZz|A0i zcc;rE9R6IfWlzh@kM(w*l&Fi2h5Dvco#MnU+-VO#8ayH_)LSSZD)iJ+Z1DWabOgti>tttA~eHwbyx+tI!Y z`F015?5A!VMVC;3X3msg?-n`$Mg^fDkzK>m)i0IkerZTSNw1|eF9xt@FWP5JiENnT zDJ{RypdBfT{HfV)T}+4nxQ6^H+X|TbM%a8bmPunEorW=@?bDrjWQ0#;Hw3b!X`-yt z?Bw4sy0l`3Ve9@)d2fC+a*(6Wpt6x6#`{D15Km%X3KVI?ky67RxvV9UAX*dQba$vX zvW(kQ1lgZwCds6{qC6gHnaKc`aJ^F38vYg$)d5zMf?xJTl5V&{90=sS75y2Ub+>O0 zT`gW-5QXE-GNv9jQD_ zE15Z>T>aRdoO%h-{Hnv3;RfR3XMrouWAye_9*kd=D%E^LmThz8&1ZER&u?`_gkd+N zduhK%K7_H)Ze%4+XbG!)uW;jodeHSa%>SSQri`v~;5 zno?9wCC;JL4)ah}CkSZoH-J+C+0auxfG3Ts5eK&ts}tDqn0p*XK)i&Ct}a52hT9JK}&jibocCx(*9bt!(k?r9?=UkL=d7(##X7;5qoQ z_%F(Pfv7Nmm1OGth7?Bg#9G$}!E6Z#HPX&o6@Dx-du)2rfth?;w7*66en>3aw&lhp zBt-nA=wbBHFsjpHA$wdoQZ;=b=rFl;M1gH+Nv#DWwTsI3&pmn5g^O&4sY!_-5 zdRskp$5~&mk_$J!&mDAU`O(wT=mQ_Cb(Epy-EOg3<|)pu!U&-30vy%Z0iIclkoQ_K)vjWqEJ zy4Q3dX)4dJQl9z}IeDa)Zk(>0G`JZ?+vU1%&{eUGv|5T7x{T&8+1LM+{%CNRQ0iTWMIFL=U^&FM+lpzcw*(kHx-+wW{B*25 zE{kudVt37THDDA;Y&NX_lkMtPdQJ*j_-aZmm>YQ|$zp7-HpI&Lh@9kd$%HlAcda6x z*PUmv+W)W^#TNL4G8KEZdm`T!LA3aAE?K6-<2%wGM5cyslVD+_xLf1XxmsCTeI;i< z=Ncd;Ge{7wimz=D&L_^PzlG={qh8qNi1?OuW3VbJc(&a{a60q19Kk0xl_f4|8RTsK z*`Ta$_d{DNkbNa1-t9Z{`mdZyDGU_W&Rl-_+8NOMtqGiQ^7K%xwmLf?^lDazJYh>Q zJgp|ut$12UR!aM*>S?ymZ0&0f)-T*Zj$E+pUBl{f$AB3;bWOm}_kzJ~+EdgWEm}53 zfSM_zD(?}o{x;W&-bC`cS-?F-z47+3hzzb+)5j8R4GFoFD<7*;ns?mp2hEr%JaV+y zB`e+`n-S^MJBRIBi+j~4nxvhO9}=9%HjBhFzgHxMq!2ft z&pDZVKA^%=-vR`_uA^sZX|fGn>js&Osfba3s?`x&nRuL+-t^kLX=Obf)=pR~uxCpe z)pmKa=!A@jjK6y2b(d83`OUjYA%$OX{>Xt9%f{Mn#K-l4;-dTJEqkKwzgK26D9y~$ z1(Jo~98D5;+sYW{LYesdGAx`0gt;(WVM>VU`z{NO4j#L!GEnfvXYQ#yV(zmg^^}~Q zwXWSLRBUYP7KJBkSb6FWIWI9VCvT_G&rns-92O86PaDfw!_~hR@NmVn5hKU*%79`t z`PkuXG>-aBIF`^>-u4LL{zLw$sabe~Lh9ODf;pR(6mw{e$^63E=laSy3@VhN_$gRm zK-Vk(N7@+wqEZ%)Kr0{$zisYy$@naQ{6w%+1hrubpSIes$)v;|mz9~&a%i-8upDL! zqQ`d+U%)#Ou;&5@kr8s=m_@RwEdQJ+h2~5BoEwqC^ym zMQ`hx*}8G2QheI2kK5L5Ik_Ef(WM{}u_zh#zTD0E)YI%?P;SJC&w5PYQ~6!K zP-~0xze$ZTWkAC+vyS(G7+%GSXzKjV1b?Rcy1$%YxMG86Br{l_q>tP>iMg#bxiZVb zn_mSD_}=FPo;G=wF!DR?XU=r-R==JNoN-R2aqP4vCR;t#rtnYeF1p)bXL=|C@P(Bk zdYqU)ui4qN$-8Qt{45wvV;`vV6Rq9xG#hEp9ZasNTUf8tRQ))~y{4JO@Tesi3o4`@ zt_%a8So>z$aY#(RI;dYiT&z5ULoe~KwU6;zedRO~0N`5TfI)cpw+Q}sAO4pw-%`A; z{u5XJU$}qy^1th?YhV6X6d=_9f&2e<>3w_scmO~s)%ERP$sp0= From c42c655f021fb0292092b7159379c7267978ab91 Mon Sep 17 00:00:00 2001 From: Colby Ford Date: Thu, 12 Dec 2024 17:38:43 -0500 Subject: [PATCH 2/2] Incorporated ligand settings (and added other models' settings into UI) --- pymolfold/__init__.py | 176 ++++++++++++---- pymolfold/widget.ui | 459 +++++++++++++++++++++++++++++++----------- 2 files changed, 475 insertions(+), 160 deletions(-) diff --git a/pymolfold/__init__.py b/pymolfold/__init__.py index 1afb0b0..689d2df 100644 --- a/pymolfold/__init__.py +++ b/pymolfold/__init__.py @@ -17,7 +17,7 @@ def __init_plugin__(app=None): addmenuitemqt('PyMOLfold', run_plugin_gui) -## global reference to avoid garbage collection of our dialog +## Global reference to avoid garbage collection of our dialog dialog = None @@ -34,7 +34,7 @@ def run_plugin_gui(): ## Folding Functions ## ESM Folding -def fold_esm(model_name, aa_sequence, token): +def fold_esm(model_name, aa_sequence, temperature=0.7, num_steps=8, token=""): """ Protein folding using ESM models """ @@ -52,8 +52,8 @@ def fold_esm(model_name, aa_sequence, token): ## Generate the protein structure structure_prediction_config = GenerationConfig( track="structure", - num_steps=8, - temperature=0.7, + num_steps=num_steps, + temperature=temperature, ) structure_prediction_prompt = ESMProtein(sequence=aa_sequence) @@ -75,7 +75,7 @@ def fold_esm(model_name, aa_sequence, token): return temp_pdb_path ## Chai Folding -def fold_chai(aa_sequence): +def fold_chai(aa_sequence, num_trunk_recycles=3, num_diffn_timesteps=200, seed=1337): """ Protein folding using Chai models """ @@ -103,9 +103,9 @@ def fold_chai(aa_sequence): candidates = run_inference( fasta_file=temp_fasta_path, output_dir=output_dir, - num_trunk_recycles=3, - num_diffn_timesteps=200, - seed=1337, + num_trunk_recycles=num_trunk_recycles, + num_diffn_timesteps=num_diffn_timesteps, + seed=seed, device=device, use_esm_embeddings=True ) @@ -114,78 +114,145 @@ def fold_chai(aa_sequence): return cif_paths[0] - ## Boltz Folding -def fold_boltz(aa_sequence): +def fold_boltz(aa_sequence, ligand=None, ligand_type=None, use_msa_server=False, recycling_steps=3, sampling_steps=200): """ Protein folding using Boltz-1 model """ try: import boltz + import torch + import subprocess + import sys except ModuleNotFoundError as e: - raise Exception(f"boltz module not found: {str(e)}") + raise Exception(f"Required module not found: {str(e)}") - fasta_line = f">A|protein|empty\n{aa_sequence}" + ## Start building FASTA content + fasta_content = f">A|protein|empty\n{aa_sequence}\n" + + ## Add ligand if provided + if ligand and ligand_type: + if ligand_type == "ccd": + fasta_content += f">B|ccd|\n{ligand}\n" + elif ligand_type == "smiles": + fasta_content += f">B|smiles|\n{ligand}\n" ## Create temp fasta file with tempfile.NamedTemporaryFile(delete=False, suffix=".fasta") as temp_fasta: - temp_fasta.write(fasta_line.encode()) + temp_fasta.write(fasta_content.encode()) temp_fasta_path = temp_fasta.name temp_fasta_filename = os.path.basename(temp_fasta_path).replace(".fasta", "") ## Create temp output directory output_dir = tempfile.mkdtemp() - - ## Run Inferencing - import torch - accelerator = torch.device("gpu" if torch.cuda.is_available() else "cpu") - boltz_run = os.system(f"boltz predict {temp_fasta_path} --out_dir {output_dir} --output_format pdb --use_msa_server --accelerator {accelerator}") - - if boltz_run != 0: - raise Exception("Error running Boltz model. Is `boltz` in your PATH?") + + ## Set device + device = "gpu" if torch.cuda.is_available() else "cpu" + + try: + ## Get the path to boltz executable + boltz_cmd = os.path.join(os.path.dirname(sys.executable), 'boltz') + + ## Run boltz command + cmd = [ + boltz_cmd, + "predict", + temp_fasta_path, + "--out_dir", output_dir, + "--accelerator", device, + "--output_format", "pdb", + "--use_msa_server" if use_msa_server else "", + "--recycling_steps", recycling_steps, + "--sampling_steps", sampling_steps + ] + + result = subprocess.run(cmd, capture_output=True, text=True) + + if result.returncode != 0: + raise Exception(f"Boltz prediction failed: {result.stderr}") + + except Exception as e: + raise Exception(f"Error during structure prediction: {str(e)}") ## Get the path to the folded PDB file folded_pdb_path = os.path.join(output_dir, f"boltz_results_{temp_fasta_filename}", "predictions", temp_fasta_filename, f"{temp_fasta_filename}_model_0.pdb") - + + if not os.path.exists(folded_pdb_path): + raise Exception(f"Expected output file not found: {folded_pdb_path}") + + ## Clean up temporary files + try: + os.remove(temp_fasta_path) + except: + pass + return folded_pdb_path +def apply_alphafold_colors(object_name): + """ + Apply AlphaFold-style coloring to the structure + Credit: Konstantin Korotkov + """ + from pymol import cmd + + ## Define AlphaFold colors + cmd.set_color("n0", [0.051, 0.341, 0.827]) # High confidence (dark blue) + cmd.set_color("n1", [0.416, 0.796, 0.945]) # Good confidence (light blue) + cmd.set_color("n2", [0.996, 0.851, 0.212]) # Medium confidence (yellow) + cmd.set_color("n3", [0.992, 0.490, 0.302]) # Low confidence (orange) + + ## Apply coloring based on B-factor ranges + cmd.color("n0", f"{object_name} and b < 100") + cmd.color("n1", f"{object_name} and b < 90") + cmd.color("n2", f"{object_name} and b < 70") + cmd.color("n3", f"{object_name} and b < 50") + + ## Main Dialog def make_dialog(): ## Entrypoint to the PyMOL API from pymol import cmd - # pymol.Qt provides the PyQt5 interface, but may support PyQt4 - # and/or PySide as well + ## Pymol.Qt provides the PyQt5 interface, but may support PyQt4 + ## and/or PySide as well from pymol.Qt import QtWidgets from pymol.Qt.utils import loadUi - ## create a new Window + ## Create a new Window dialog = QtWidgets.QDialog() # populate the Window from our *.ui file which was created with the Qt Designer uifile = os.path.join(os.path.dirname(__file__), 'widget.ui') form = loadUi(uifile, dialog) - ## callback for the "Fold" button + ## Callback for the "Fold" button def run(): - ## Supported Models - models = [ - "esm3-small-2024-08", - "esm3-open-2024-03", - "esm3-medium-2024-08", - "esm3-large-2024-03", - "esm3-medium-multimer-2024-09", - "boltz-1", - "chai-1" - ] - ## Get form data - # model_name = form.input_model_name.text() - model_name = models[form.input_list_models.currentRow()] + # model_name = models[form.input_list_models.currentRow()] + model_name = form.input_list_models.currentText() aa_sequence = form.input_aa_seq.toPlainText() - token = form.input_token.text() + + ## General Settings + af_coloring = form.input_af_coloring.isChecked() + + ## ESM Parameters + esm_token = form.input_esm_token.text() + esm_temp = float(form.input_esm_temp.text()) + esm_nsteps = int(form.input_esm_nsteps.text()) + + ## Boltz Parameters (ligand) + boltz_ligand = form.input_boltz_ligand.toPlainText().strip() + boltz_ligand_type = form.input_boltz_ligand_type.currentText() if boltz_ligand else None + boltz_recycling_steps = int(form.input_boltz_recycling_steps.text()) + boltz_sampling_steps = int(form.input_boltz_sampling_steps.text()) + boltz_use_msa_server = form.input_boltz_use_msa_server.isChecked() + + ## Chai Parameters + chai_recycling_steps = int(form.input_chai_recycling_steps.text()) + chai_diffusion_steps = int(form.input_chai_diffusion_steps.text()) + chai_seed = int(form.input_chai_seed.text()) if not aa_sequence: QtWidgets.QMessageBox.warning(form, "Error", "Please enter a valid amino acid sequence.") @@ -193,19 +260,40 @@ def run(): try: if model_name.startswith("esm3"): - folded_pdb_path = fold_esm(model_name, aa_sequence, token) + folded_pdb_path = fold_esm(model_name, + aa_sequence, + temperature=esm_temp, + num_steps=esm_nsteps, + token=esm_token) elif model_name == "chai-1": - folded_pdb_path = fold_chai(aa_sequence) + folded_pdb_path = fold_chai(aa_sequence, + num_trunk_recycles=chai_recycling_steps, + num_diffn_timesteps=chai_diffusion_steps, + seed=chai_seed) elif model_name == "boltz-1": - folded_pdb_path = fold_boltz(aa_sequence) + folded_pdb_path = fold_boltz(aa_sequence, + ligand=boltz_ligand, + ligand_type=boltz_ligand_type, + use_msa_server=boltz_use_msa_server, + recycling_steps=boltz_recycling_steps, + sampling_steps=boltz_sampling_steps) else: QtWidgets.QMessageBox.critical(form, "Error", f"Not a supported model name: {str(model_name)}") + return ## Load the folded structure into PyMOL if not folded_pdb_path: QtWidgets.QMessageBox.critical(form, "Error", "No folded structure was returned.") return - cmd.load(folded_pdb_path, f"folded_structure_{''.join(random.choices(string.ascii_lowercase + string.digits, k=3))}") + + ## Generate a unique object name + object_name = f"folded_structure_{''.join(random.choices(string.ascii_lowercase + string.digits, k=3))}" + cmd.load(folded_pdb_path, object_name) + + ## Apply AlphaFold-style coloring + if af_coloring: + apply_alphafold_colors(object_name) + QtWidgets.QMessageBox.information(form, "Success", "Structure folded and loaded into PyMOL!") except Exception as e: diff --git a/pymolfold/widget.ui b/pymolfold/widget.ui index e20368f..47c3b78 100644 --- a/pymolfold/widget.ui +++ b/pymolfold/widget.ui @@ -5,16 +5,19 @@ Qt::NonModal + + true + 0 0 - 450 - 350 + 490 + 676 - + 0 0 @@ -24,84 +27,334 @@ - - - - 0 - 0 - - - - - 150 - 50 - - - - false - + background-color: #000;color:white; padding: 10px - <html><head/><body><p align="center"><span style=" font-size:9pt; font-weight:600; color:#ffffff;">PyMOLfold Plugin</span></p><p align="center"><span style=" font-size:9pt; color:#ffffff;">Created by: Colby T. Ford, Ph.D.</span></p><p align="center"><span style=" font-size:9pt; color:#ffffff;">Contribute: </span><a href="https://github.com/colbyford"><span style=" text-decoration: underline; color:#ffffff;">https://github.com/colbyford</span></a></p></body></html> - - - Qt::RichText - - - false - - - Qt::AlignCenter - - - true - - - true + <html><head/><body><p align="center"><span style=" font-size:9pt; font-weight:600; color:#ffffff;">PyMOLfold Plugin</span></p><p align="center"><span style=" font-size:9pt; color:#ffffff;">Contribute: </span><a href="https://github.com/colbyford"><span style=" text-decoration: underline; color:#ffffff;">https://github.com/colbyford</span></a></p></body></html> - - - - - - 0 - 0 - - - - - 0 - 100 - - - - false - - - false - - - QAbstractScrollArea::AdjustToContentsOnFirstShow - - - 16 - - - false - - - QListView::Fixed + + + + + + 75 + true + - - QListView::ListMode + + Settings - - -1 + + + + + + + + + 75 + true + + + + ESM3 Settings + + + + + + + Foundry Token + + + + + + + + 0 + 0 + + + + QLineEdit::PasswordEchoOnEdit + + + + + + + Temperature + + + + + + + Decimal value bettween [0,1] + + + 9.99 + + + 0.70 + + + Decimal value bettween [0,1] + + + + + + + Number of Steps + + + + + + + false + + + 999 + + + 8 + + + + + + + Qt::Horizontal + + + + + + + + 75 + true + + + + Boltz Settings + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + false + + + false + + + + + + + Ligand (CCD/SMILES) + + + + + + + QAbstractScrollArea::AdjustToContentsOnFirstShow + + + Enter CCD code or SMILES string (optional) + + + + + + + Ligand Type + + + + + + + + ccd + + + + + smiles + + + + + + + + Recycling Steps + + + + + + + 999 + + + 3 + + + + + + + Sampling Steps + + + + + + + 99999 + + + 200 + + + + + + + Use MSA Server? + + + + + + + Qt::Horizontal + + + + + + + Recycling Steps + + + + + + + 999 + + + 3 + + + + + + + Diffusion Steps + + + + + + + 9999 + + + 200 + + + + + + + Qt::Horizontal + + + + + + + + 75 + true + + + + General + + + + + + + Coloring + + + + + + + AlphaFold Confidence Colors + + + + + + + https://api.colabfold.com + + + + + + + Seed + + + + + + + 99999999 + + + 1337 + + + + + + + + 75 + true + + + + Chai Settings + + + + + + + + + 100 @@ -140,27 +393,14 @@ - - - - - 0 - 0 - - - - QAbstractScrollArea::AdjustToContents - - - FVNQHLCGSHLVEALYLVCGERGFFYTPKTRREAEDLQGSLQPLALEGSLQKRGIVEQCCTSICSLYQLENYCN - - - false - - - - + + + + 75 + true + + Amino Acid Sequence @@ -168,28 +408,24 @@ - - Model Name + + + 75 + true + - - - - - Token (for ESM models) + Model Name - - - - 2JGcG8rXj1Ff2FKyQwf5mK - - - QLineEdit::PasswordEchoOnEdit + + + + QAbstractScrollArea::AdjustToContents - - true + + FVNQHLCGSHLVEALYLVCGERGFFYTPKTRREAEDLQGSLQPLALEGSLQKRGIVEQCCTSICSLYQLENYCN @@ -202,15 +438,6 @@ Fold - - false - - - false - - - false -