From 4f917935d512e9626b08e4b971554396e2f0e2e1 Mon Sep 17 00:00:00 2001 From: DEGIACOMI Date: Tue, 12 Sep 2023 14:52:29 +0100 Subject: [PATCH] update doc --- README.md | 2 + docs/build/.buildinfo | 2 +- docs/build/.doctrees/analysis.doctree | Bin 109947 -> 112832 bytes docs/build/.doctrees/data.doctree | Bin 40323 -> 41407 bytes docs/build/.doctrees/environment.pickle | Bin 189412 -> 861286 bytes docs/build/.doctrees/faq.doctree | Bin 9292 -> 10043 bytes docs/build/.doctrees/index.doctree | Bin 6897 -> 6959 bytes docs/build/.doctrees/loss_functions.doctree | Bin 72719 -> 73275 bytes docs/build/.doctrees/models.doctree | Bin 18832 -> 19244 bytes docs/build/.doctrees/scoring.doctree | Bin 40248 -> 40762 bytes docs/build/.doctrees/trainers.doctree | Bin 188167 -> 191217 bytes docs/build/_modules/index.html | 19 +- docs/build/_modules/molearn/analysis/GUI.html | 94 +++----- .../_modules/molearn/analysis/analyser.html | 212 ++++++++++++------ .../build/_modules/molearn/analysis/path.html | 44 ++-- .../build/_modules/molearn/data/pdb_data.html | 90 +++++--- .../molearn/loss_functions/openmm_thread.html | 147 +++++++----- .../molearn/models/CNN_autoencoder.html | 44 ++-- .../_modules/molearn/models/foldingnet.html | 62 ++--- .../_modules/molearn/scoring/dope_score.html | 101 ++++++--- .../molearn/scoring/ramachandran_score.html | 80 ++++--- .../trainers/openmm_physics_trainer.html | 58 +++-- .../trainers/torch_physics_trainer.html | 56 +++-- .../_modules/molearn/trainers/trainer.html | 153 ++++++++----- docs/build/_sources/faq.rst.txt | 44 ++-- docs/build/_static/basic.css | 55 +++-- docs/build/_static/doctools.js | 132 +---------- docs/build/_static/documentation_options.js | 5 +- docs/build/_static/language_data.js | 2 +- docs/build/_static/pygments.css | 1 + docs/build/_static/searchtools.js | 109 ++++++--- docs/build/_static/sphinx_highlight.js | 154 +++++++++++++ docs/build/_static/sphinxdoc.css | 8 +- docs/build/analysis.html | 114 ++++++---- docs/build/data.html | 64 ++++-- docs/build/faq.html | 68 +++--- docs/build/genindex.html | 19 +- docs/build/index.html | 77 +++++-- docs/build/loss_functions.html | 77 ++++--- docs/build/models.html | 44 ++-- docs/build/py-modindex.html | 19 +- docs/build/scoring.html | 67 ++++-- docs/build/search.html | 19 +- docs/build/searchindex.js | 2 +- docs/build/trainers.html | 122 ++++++---- docs/source/FAQ.rst | 44 ++-- 46 files changed, 1464 insertions(+), 946 deletions(-) create mode 100644 docs/build/_static/sphinx_highlight.js diff --git a/README.md b/README.md index 7963f7d..46b4e3e 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,8 @@ sys.path.insert(0, 'path/to/molearn/src') import molearn ``` +> **Note** +> in case of installation issues, please consult our FAQ [molearn.readthedocs.io](https://molearn.readthedocs.io/en/latest/FAQ.html) ## Usage ## diff --git a/docs/build/.buildinfo b/docs/build/.buildinfo index 257c332..0e86985 100644 --- a/docs/build/.buildinfo +++ b/docs/build/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 3a4be983efd1ad1578e3aba1f56753bc +config: fd34726b2b2ff5441545b10d48d8c981 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/build/.doctrees/analysis.doctree b/docs/build/.doctrees/analysis.doctree index 93e364cc1643624f690d3161b41e5d2c2487533c..8e88fe4803e5d443f88b5bf4822e0d0b5eb41a44 100644 GIT binary patch literal 112832 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 literal 109947 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 DW;1mb diff --git a/docs/build/.doctrees/data.doctree b/docs/build/.doctrees/data.doctree index 0e78a2e5078d874bb28bebd99c353a5183ad6e85..cb3babe68e5d026b489c8fbd436422d1c9d47caa 100644 GIT binary patch literal 41407 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 literal 40323 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

  • UjHWvW3K=Z5o`YKJY_ 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 delta 944 zcmbVKOH30{6y>!Y3QhTxq?FIJ9aIdzvJeQG5SzL%BBp3eFf5P^FrC}6onku^tVY0< zG#OWSj6s9HjS0j=>B9I48+XJ7eilX-Za`fq2@8#%#Q0u;+65~Y@8-RG?m6e)_ukX+ zizD1LcQv%E^voh9la4DozMj_DG5nkRimmbL{%*zh-zAh zrc%1pCWx9Q#m6;VFA3m^z1U*>54D@jvF1Gu13;lW^Sgw2A|{DR)!Z6C zkKkcPm1QA6Xw43THZtw(ykm)wXUvRi$t7+(j}fwrU(4Q-H#EH$zm#9*UQuWn&sD7Q zYwWH*8jhqCk&==+DvgM9J{tyKn7-0$yjMF*yp-2NR&lZ}=A`xtE2H2i{9d={3a|rf1imqM#f^{a zj}kZ9_>&~W44o8Jf=ro#SNJm&{KDu)Y0!;QRg6nodR$_^ yze!=_3@Di#F9RDhIaVgen9-qu)#S9DAVYu($6*~lZ>q8plunMt_Uu~Y0Qn1!88|Zl diff --git a/docs/build/.doctrees/index.doctree b/docs/build/.doctrees/index.doctree index c8e13b2fd8b22b21d8ee361b2e676a82326f5e37..cffc05558b84e52722b9d7271a39b782fc09781f 100644 GIT binary patch delta 94 zcmexpy55Ynfpw~i^hVYOVUr$_lA^@C;+({i%>2Cgf};HNqSWHzDYa8HdRR;HOA>RY rcr)~H!PKOt0J)`;TZO~9df4(yOA1O$ruc2XBRrdtanI%o(MnbTp#CHA delta 30 mcmZ2)_R*BJfpzLLsg0}+!jpFjhi{e=na#+!ee*WaN>%{52@6{Q diff --git a/docs/build/.doctrees/loss_functions.doctree b/docs/build/.doctrees/loss_functions.doctree index b550835ec225d16c36c6c65ca70b3c5f15c45215..acdcf932243a32e38b6873a1e1fa79f119f70efd 100644 GIT binary patch literal 73275 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 b*IU&_w}z@}0hgPJ8m_TyIYQH~J6HbyhiT^P diff --git a/docs/build/.doctrees/models.doctree b/docs/build/.doctrees/models.doctree index ce5c2ee83b701a4359d22dd24f7c19e749692b32..395a7955a4579d306385176ca0b9582a415f3bf6 100644 GIT binary patch delta 3752 zcma)9du*Fm74LOy$IiP+oR|ICvE9UW^XT$gUM)-3t%{T^Ybjd=qRX7*OFmzvcJPC; zjgmx=P&2o*Js*`&yGKx4!2m%MKoeyOrHJrf+f9RwXoYqlfhJHZ27-Yo=iJX<<~FVB zKfZJCx%b@PIlucj_kPEKeeWbQ&6>X99z1WFHyH*Qyl6U&#j@Xg*wC7)K9HD-heoDC zVR>Xa7!4kf<8l<$SX@melm_J$#jePTL&;GjC8aoV_%AJI7=w^?PDUTik*8HT&(Gb zZx%d*rvEDVykQ@MMX87Fh3^)=NRf9I4X`i{Z)Y5?7x~y(IA7%RD7W=U`CbAO!E#x{ zWr}iJKqbpDyjo~7`33{-LLw2Iaaw1g{;)=R}~+Af&D74 z#+FnyJegBHqjEbc%5m->Qet#k!c|1H88JDAKDt96hJs6CRt6x>Qi@I$Y z-OcGve?X;q9#f?CkTJ5|Xih{hdN)=BbLt`0ub31w442HaGZ|B80n_FMwg{=s2ibB) zdu}0LA`oqA7nl1>PZ`)MyjQ-@^%k|~BDIQ?`H9GQVoFx$Rn3E)|CZ)lf@z!I@;2Go z`Bj{27p&OwN@@C1)~Gx&9yt&Ug;jn7)@<9^X{f3QI4+a5q&qd^z*THXjG~vraJ4j< z|FMr%ocET3ba-TWNw~PuW30HS`COzzTSzj4;tr3U*J^$G++@rc?5?VWpH{kNN(>lb zZe*0lpPQCdzL`|ZxEveH)WeacPa*Rbeg3tA(r)(k`S!NJ&U1oT~aU>w-PiEvy5+Ts_5h!OiLeY#3XbOr1F8 zyWm*OHthR(&5sNn2KaZuR(REZmK}s$jutk9W==Tis6hQ#jq60Q#T3FZF?iQ;gbw1Q z)WuY^k>CxBR!7QkM9uq_Wop%B#)_!#M+7bJw%iVXn5For7{$JNva5KH=)J z{EEid`8nOwSya9SZ@Tud8|whqG=Q4~V7Z0^@L;UM8?|2cKe%4&WN)2tH|Rju?gScf z4}j6*0*r%|!Fz5WjC-8$a&4uhEGLcA@A0xWxK*#=SknQO<-qY8Cvn#zdf)R2HiT9Z zyyC260|M%XSA!bRp)PoROxXZ6a2Hf?%Xau^ix$%%0rZ(V4d{>#)LG|cFKqxibQjRO zb)SN-)oVaY0_bMF2DGFDt=0$Fn;U?Z?gA34Y|PB1_gK|*E)BU(;tHh9A`y(K{I0AT zGr(+5Re*=lD2ue}gqCLKP&%!ewX{n3T3X#?#2Tp!S`HO;Jz?s*4L8g*n$RAkgbDp6 z((<4DMrJS>;e)_ytQfAg1z=@s*jk8iXpQX;H~gfw7B#vK+*qdakd7Rc!(;NeI>T`9Z|U8_#xEG)c;xOfNn(gy$74 zt!FgLMI!{ew?eqZ^%&iQ;x>o}qmy!6<=;k=R6b5)Y+4=*O@zkO!~7luX~xB6VdqJ> z+G1l#SZw#A%x`_fkR&b-u?5)O=Pmw<=5r1UocDS7LF+zt6mr{I*zYr=U!&;j*2wsd z=rKNhg%mSgc>F9}?)9+`GYQ=yLJjN!9O;&NH&FT~g7Os<4`Q+=n5+pVYsf@`KetxF zN9}orHI30b_hICK`3@hl`hG_PYky+ zfzn-rX*Mw`D=vDMyYVe8ejhI2(3A=0Y-LYz@ra`a?GcwCqT&%JYFRzv(2w}F(VvbT z5bJ-TJyjl$2E(zbU_2BFk4#4+lTkSqqaTEnDISRjr_@2b&2$^O%{C?AZ~go7Qszh^ zKAniG!^@99dWx~{EMMRG$DEl~bi=oi_!7nV0*OY7JAfjQvWDrWkY2Oof|GSpSSE$l u;e_I*b^=fel+P-%_@5HLVj5NlLDOS^)00A=a<70coQOo?%a08VvHt^Rx<%3e delta 3452 zcma)cEQrEeK}4Xh4Ah5=SLRBY_y(2X^K*sdvm=pF*|Ad$89Y2&AlFDd;b6LD<6HeHl z^eT5U*lsU|^~uZl{S0@b?_WGmoO@{8!h(!~>?90Z?fgr9Q?6Ny z%wLe9O`OolpYcyiBczbIQ)y`qZfIz2*Ti?AWXxlG;kAsS^y6gi5Mg;E&K!pCGY0rD zgZY(yOU%eeq?wogfxbdNJ@m~y1ixn%rrY)Y2pR!ne+JZM71o+K`j8lG6q}yxP&8qt zrm0!!Y8ul{Y!9}!H!DwQ+i1h;r8Wits=|!B3R87?b)CMZ8iLE2>8PCuYqG7bWE2!R zRHRU0qrwucrNU75JG_`v#2Hl!LV96;P8+B>sgP-_=L^Ckx8q0^9Cf?kL!M+zAv+EO zNq0hyy_0$2CHp9Ag?dMTZG;_;3alS>dkw83y1G6MJ!$5~jgL_e%Cvbm}Ng zW#?oYC!0pm7=!5pIFsvveYs99K7|9Gl8DG?SmepPCEOezc~zJJHs*WbSe|siWQY%I ztnqkw0a@9{$r#|YhkW_hQ_E{_$W%+2x%s+GbwuWC)ZUvv-j(XG##06Jc-IY$pwxJ; zK-UOHG*%XRU}oWXjbK>gO5p?i^&1+4QsW-4t}z(VIO{EfLGO5t!LSCNp-c`ppH?_I zw7U9mb3;b?1~qA7T#8UQ{AbDbtwWnB~if|OJEo)tZ-ZP9$HLHOXC(i&czKp_zC6W>CG-(w1AmO|*L zbiss)r2_W(%d8hrN&Jbch>KJsI`JEP?=NG=A*F147CF$}sAhziU+dNMB_)EMa2BKU znCU1>UWtdxWxaeY@y@cWp#hs%O%I3Yg`x6ad5;__e?}kLj1Q^I-M%r>)IE;)@4#}t zN6t0v(&xS`vFhg}!NJ>H4^ax2IdfA(=Xzz6Ci>ATG#$6Jt3zpOZE0=N`osjF^y!c( z)h43Ou%fZPfP1!wZHDV}9MCX34{NoR0rog9?y+?1o^;{^kL584++l}=in(knET{-IH@;fU^^0xj&nf`{Y!)qmIRJAJMswKz{9Fjt$~|^VZxKYJEC)w%5<&jFjIZ zLH^Ig;M6@iI375+O1Vgsrx_=U@=W6tqde+a4EaBjoa5unf+Bhl`ZbAej%GAC=5|7A zR)VR65|mABpts-rsNPte5FLI{@3~(Nuhbj(6_{UHVin>0W#qF+-vADmGOf#f;xJl< z3{7nfU0qu2#avztX;{A)wh*hl7|L2Iew$)$n_f75*Hh55aMjS+h5H%XHMC{X`S`8* z^a;zQB1rSwsBn;G4i?=Zb9=)Eg)XvP^!XHIy-iwflU9A*YA*GYfSRN}tSW;3P{@BH dx|Wxu=>j3>5+YT_Oevk*5)5t{`f=%U_CIbj)N%j- diff --git a/docs/build/.doctrees/scoring.doctree b/docs/build/.doctrees/scoring.doctree index 831829c77e5028521da2886c2394990790855b6a..c025d9e2c9121d521fd66438284eac3d7dfdcbae 100644 GIT binary patch literal 40762 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 diff --git a/docs/build/.doctrees/trainers.doctree b/docs/build/.doctrees/trainers.doctree index 1dfd005b302a094d381d7687abbd1790a0185ae7..7abbbf7a7b29811e360cb8f2bfd7229e6aa84d16 100644 GIT binary patch literal 191217 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 Yo~Ub%$as*VtRQX*&>Uw3rmLU+Kf8!Ax&QzG literal 188167 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 z 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 diff --git a/docs/build/_modules/index.html b/docs/build/_modules/index.html index ffc1175..b495099 100644 --- a/docs/build/_modules/index.html +++ b/docs/build/_modules/index.html @@ -1,18 +1,15 @@ - - + Overview: module code — molearn 2.0.1 documentation - - - - - - - + + + + + @@ -84,8 +81,8 @@

    Navigation

    \ No newline at end of file diff --git a/docs/build/_modules/molearn/analysis/GUI.html b/docs/build/_modules/molearn/analysis/GUI.html index 16aead1..e51c40e 100644 --- a/docs/build/_modules/molearn/analysis/GUI.html +++ b/docs/build/_modules/molearn/analysis/GUI.html @@ -1,18 +1,15 @@ - - + molearn.analysis.GUI — molearn 2.0.1 documentation - - - - - - - + + + + + @@ -71,7 +68,9 @@

    Source code for molearn.analysis.GUI

     from ..utils import as_numpy
     
     
    -
    [docs]class MolearnGUI(object): +
    +[docs] +class MolearnGUI: ''' This class produces an interactive visualisation for data stored in a :func:`MolearnAnalysis <molearn.analysis.MolearnAnalysis>` object, @@ -88,11 +87,10 @@

    Source code for molearn.analysis.GUI

             else:
                 self.MA = MA
     
    -        self.waypoints = [] # collection of all saved waypoints
    -        self.samples = [] # collection of all calculated sampling points
    +        self.waypoints = []  # collection of all saved waypoints
    +        self.samples = []    # collection of all calculated sampling points
             
             self.run()
    -
          
         def update_trails(self):
             '''
    @@ -108,14 +106,14 @@ 

    Source code for molearn.analysis.GUI

     
             # update latent space plot
             if len(self.samples) == 0:
    -            self.latent.data[2].x = self.waypoints[:, 0]
    -            self.latent.data[2].y = self.waypoints[:, 1]
    +            if len(self.waypoints)>0:
    +                self.latent.data[2].x = self.waypoints[:, 0]
    +                self.latent.data[2].y = self.waypoints[:, 1]
             else:
                 self.latent.data[2].x = self.samples[:, 0]
                 self.latent.data[2].y = self.samples[:, 1]
             
             self.latent.update()
    -
         
         def on_click(self, trace, points, selector):
             '''
    @@ -136,14 +134,13 @@ 

    Source code for molearn.analysis.GUI

             # update textbox (triggering update of 3D representation)
             try:
                 pt = self.waypoints.flatten().round(decimals=4).astype(str)
    -            #pt = np.array([self.latent.data[3].x, self.latent.data[3].y]).T.flatten().round(decimals=4).astype(str)
    +            # pt = np.array([self.latent.data[3].x, self.latent.data[3].y]).T.flatten().round(decimals=4).astype(str)
                 self.mybox.value = " ".join(pt)
             except Exception:
                 return
     
             self.update_trails()    
             
    -
         def get_samples(self, mybox, samplebox, path):
             '''
             provide a trail of point between list of waypoints, either connected
    @@ -159,8 +156,8 @@ 

    Source code for molearn.analysis.GUI

                 crd = np.array(mybox.split()).astype(float)
                 crd = crd.reshape((int(len(crd)/2), 2))
             except Exception:
    -           raise Exception("Cannot define sampling points")
    -           return
    +            raise Exception("Cannot define sampling points")
    +            return
         
             if use_path:
                 # connect points via A*
    @@ -168,8 +165,8 @@ 

    Source code for molearn.analysis.GUI

                     landscape = self.latent.data[0].z
                     crd = get_path_aggregate(crd, landscape.T, self.MA.xvals, self.MA.yvals)
                 except Exception as e:
    -               raise Exception(f"Cannot define sampling points: path finding failed. {e})")
    -               return
    +                raise Exception(f"Cannot define sampling points: path finding failed. {e})")
    +                return
                                              
             else:
                 # connect points via straight line
    @@ -180,7 +177,6 @@ 

    Source code for molearn.analysis.GUI

                     return
     
             return crd
    -
             
         def interact_3D(self, mybox, samplebox, path):
             '''
    @@ -191,7 +187,7 @@ 

    Source code for molearn.analysis.GUI

                 crd = self.get_samples(mybox, samplebox, path)
                 self.samples = crd.copy()
                 crd = crd.reshape((1, len(crd), 2))
    -        except:
    +        except Exception:
                 self.button_pdb.disabled = True
                 return
     
    @@ -208,12 +204,11 @@ 

    Source code for molearn.analysis.GUI

             self.mymol.load_new(gen)
             view = nv.show_mdanalysis(self.mymol)
             view.add_representation("spacefill")
    -        #view.add_representation("cartoon")
    +        # view.add_representation("cartoon")
             display.display(view)
     
             self.button_pdb.disabled = False
     
    -
         def drop_background_event(self, change):
             '''
             control colouring style of latent space surface
    @@ -225,7 +220,7 @@ 

    Source code for molearn.analysis.GUI

                 mykey = change.new
        
             try:
    -           data = self.MA.surfaces[mykey]
    +            data = self.MA.surfaces[mykey]
             except Exception as e:
                 print(f"{e}")
                 return      
    @@ -243,7 +238,7 @@ 

    Source code for molearn.analysis.GUI

                 self.latent.data[0].zmax = np.max(data)
                 self.block0.children[1].min = np.min(data)
                 self.block0.children[1].max = np.max(data)
    -        except:
    +        except Exception:
                 self.latent.data[0].zmax = np.max(data)
                 self.latent.data[0].zmin = np.min(data)
                 self.block0.children[1].max = np.max(data)
    @@ -253,7 +248,6 @@ 

    Source code for molearn.analysis.GUI

             
             self.update_trails()
     
    -
         def drop_dataset_event(self, change):
             '''
             control which dataset is displayed
    @@ -265,7 +259,7 @@ 

    Source code for molearn.analysis.GUI

                 
             else:
                 try:
    -               data = as_numpy(self.MA.get_encoded(change.new).squeeze(2))
    +                data = as_numpy(self.MA.get_encoded(change.new).squeeze(2))
                 except Exception as e:
                     print(f"{e}")
                     return      
    @@ -277,7 +271,6 @@ 

    Source code for molearn.analysis.GUI

             
             self.latent.update()
     
    -
         def drop_path_event(self, change):
             '''
             control way paths are looked for
    @@ -290,7 +283,6 @@ 

    Source code for molearn.analysis.GUI

                 
             self.update_trails()
     
    -
         def range_slider_event(self, change):
             '''
             update surface colouring upon manipulation of range slider
    @@ -300,7 +292,6 @@ 

    Source code for molearn.analysis.GUI

             self.latent.data[0].zmax = change.new[1]
             self.latent.update()
     
    -
         def trail_update_event(self, change):
             '''
             update trails (waypoints and way they are connected)
    @@ -309,7 +300,7 @@ 

    Source code for molearn.analysis.GUI

             try:
                 crd = np.array(self.mybox.value.split()).astype(float)
                 crd = crd.reshape((int(len(crd)/2), 2))
    -        except:
    +        except Exception:
                 self.button_pdb.disabled = False
                 return
     
    @@ -317,7 +308,6 @@ 

    Source code for molearn.analysis.GUI

     
             self.update_trails()
     
    -
         def button_pdb_event(self, check):
             '''
             save PDB file corresponding to the interpolation shown in the 3D view
    @@ -346,7 +336,6 @@ 

    Source code for molearn.analysis.GUI

                 for ts in self.mymol.trajectory:
                     W.write(protein)
     
    -
         def button_save_state_event(self, check):
             '''
             save class state
    @@ -360,8 +349,7 @@ 

    Source code for molearn.analysis.GUI

             if fname == "":
                 return
     
    -        pickle.dump([self.MA, self.waypoints], open( fname, "wb" ) )
    -
    +        pickle.dump([self.MA, self.waypoints], open(fname, "wb"))
     
         def button_load_state_event(self, check):
             '''
    @@ -377,7 +365,7 @@ 

    Source code for molearn.analysis.GUI

                 return
     
             try:
    -            self.MA, self.waypoints = pickle.load( open( fname, "rb" ) )
    +            self.MA, self.waypoints = pickle.load(open(fname, "rb"))
                 self.run()
             except Exception as e:
                 raise Exception(f"Cannot load state file. {e}")
    @@ -388,7 +376,7 @@ 

    Source code for molearn.analysis.GUI

     
             # create an MDAnalysis instance of input protein (for viewing purposes)
             if hasattr(self.MA, "mol"):
    -            self.MA.mol.write_pdb("tmp.pdb", conformations=[0], split_struc = False)
    +            self.MA.mol.write_pdb("tmp.pdb", conformations=[0], split_struc=False)
                 self.mymol = mda.Universe('tmp.pdb')
             
             ### MENU ITEMS ###
    @@ -415,7 +403,6 @@ 

    Source code for molearn.analysis.GUI

             
             self.drop_background.observe(self.drop_background_event, names='value')
     
    -
             # dataset selector dropdown menu
             options2 = ["none"]
             if self.MA is not None:
    @@ -445,7 +432,6 @@ 

    Source code for molearn.analysis.GUI

     
             self.drop_path.observe(self.drop_path_event, names='value')
     
    -
             # text box holding current coordinates
             self.mybox = widgets.Textarea(placeholder='coordinates',
                                      description='crds:',
    @@ -460,7 +446,6 @@ 

    Source code for molearn.analysis.GUI

     
             self.samplebox.observe(self.trail_update_event, names='value')
     
    -
             # button to save PDB file
             self.button_pdb = widgets.Button(
                 description='Save PDB',
    @@ -468,23 +453,20 @@ 

    Source code for molearn.analysis.GUI

     
             self.button_pdb.on_click(self.button_pdb_event)
     
    -
             # button to save state file
             self.button_save_state = widgets.Button(
    -            description= 'Save state',
    +            description='Save state',
                 disabled=False, layout=Layout(flex='1 1 0%', width='auto'))
     
             self.button_save_state.on_click(self.button_save_state_event)
     
    -
             # button to load state file
             self.button_load_state = widgets.Button(
    -            description= 'Load state',
    +            description='Load state',
                 disabled=False, layout=Layout(flex='1 1 0%', width='auto'))
     
             self.button_load_state.on_click(self.button_load_state_event)
     
    -
             # latent space range slider
             self.range_slider = widgets.FloatRangeSlider(
                 description='cmap range:',
    @@ -502,8 +484,7 @@ 

    Source code for molearn.analysis.GUI

                 
             if self.waypoints == []:
                 self.button_pdb.disabled = True
    -
    -        
    +  
             ### LATENT SPACE REPRESENTATION ###
     
             # surface 
    @@ -541,7 +522,7 @@ 

    Source code for molearn.analysis.GUI

     
             # path
             plot3 = go.Scatter(x=np.array([]), y=np.array([]),
    -                   showlegend=False, opacity=0.9, mode = 'lines+markers',
    +                   showlegend=False, opacity=0.9, mode='lines+markers',
                        marker=dict(color='red', size=4))
     
             self.latent = go.FigureWidget([plot1, plot2, plot3])
    @@ -560,7 +541,7 @@ 

    Source code for molearn.analysis.GUI

                 try:
                     self.range_slider.min = scmin
                     self.range_slider.max = scmax
    -            except:
    +            except Exception:
                     self.range_slider.max = scmax
                     self.range_slider.min = scmin
     
    @@ -569,8 +550,7 @@ 

    Source code for molearn.analysis.GUI

     
             # 3D protein representation (triggered by update of textbox, sampling box, or pathfinding method)
             self.protein = widgets.interactive_output(self.interact_3D, {'mybox': self.mybox, 'samplebox': self.samplebox, 'path': self.drop_path})
    -
    -        
    +     
             ### WIDGETS ARRANGEMENT ###
             
             self.block0 = widgets.VBox([self.drop_dataset, self.range_slider,
    @@ -594,7 +574,7 @@ 

    Source code for molearn.analysis.GUI

     
             display.clear_output(wait=True)
             display.display(self.scene)
    - +
    @@ -632,8 +612,8 @@

    Navigation

    \ No newline at end of file diff --git a/docs/build/_modules/molearn/analysis/analyser.html b/docs/build/_modules/molearn/analysis/analyser.html index d8d6668..6236727 100644 --- a/docs/build/_modules/molearn/analysis/analyser.html +++ b/docs/build/_modules/molearn/analysis/analyser.html @@ -1,18 +1,15 @@ - - + molearn.analysis.analyser — molearn 2.0.1 documentation - - - - - - - + + + + + @@ -60,7 +57,16 @@

    Source code for molearn.analysis.analyser

         print('Error importing modeller: ')
         print(e)
         
    -from ..scoring import Parallel_DOPE_Score, Parallel_Ramachandran_Score
    +try:
    +    from ..scoring import Parallel_DOPE_Score
    +except ImportError as e:
    +    print('Import Error captured while trying to import Parallel_DOPE_Score, it is likely that you dont have Modeller installed')
    +    print(e)
    +try:
    +    from ..scoring import Parallel_Ramachandran_Score
    +except ImportError as e:
    +    print('Import Error captured while trying to import Parallel_Ramachandran_Score, it is likely that you dont have cctbx/iotbx installed')
    +    print(e)
     from ..data import PDBData
     
     from ..utils import as_numpy
    @@ -69,7 +75,9 @@ 

    Source code for molearn.analysis.analyser

     warnings.filterwarnings("ignore")
     
     
    -
    [docs]class MolearnAnalysis(object): +
    +[docs] +class MolearnAnalysis: ''' This class provides methods dedicated to the quality analysis of a trained model. @@ -83,7 +91,9 @@

    Source code for molearn.analysis.analyser

             self.batch_size = 1
             self.processes = 1
     
    -
    [docs] def set_network(self, network): +
    +[docs] + def set_network(self, network): ''' :param network: a trained neural network defined in :func:`molearn.models <molearn.models>` ''' @@ -91,13 +101,19 @@

    Source code for molearn.analysis.analyser

             self.network.eval()
             self.device = next(network.parameters()).device
    -
    [docs] def get_dataset(self, key): + +
    +[docs] + def get_dataset(self, key): ''' :param str key: key pointing to a dataset previously loaded with :func:`set_dataset <molearn.analysis.MolearnAnalysis.set_dataset>` ''' return self._datasets[key]
    -
    [docs] def set_dataset(self, key, data, atomselect="*"): + +
    +[docs] + def set_dataset(self, key, data, atomselect="*"): ''' :param data: :func:`PDBData <molearn.data.PDBData>` object containing atomic coordinates :param str key: label to be associated with data @@ -127,7 +143,10 @@

    Source code for molearn.analysis.analyser

             if not hasattr(self, 'shape'):
                 self.shape = (_data.dataset.shape[1], _data.dataset.shape[2])
    -
    [docs] def get_encoded(self, key): + +
    +[docs] + def get_encoded(self, key): ''' :param str key: key pointing to a dataset previously loaded with :func:`set_dataset <molearn.analysis.MolearnAnalysis.set_dataset>` :return: array containing the encoding in latent space of dataset associated with key @@ -148,13 +167,19 @@

    Source code for molearn.analysis.analyser

                     
             return self._encoded[key]
    -
    [docs] def set_encoded(self, key, coords): + +
    +[docs] + def set_encoded(self, key, coords): ''' :param str key: key pointing to a dataset previously loaded with :func:`set_dataset <molearn.analysis.MolearnAnalysis.set_dataset>` ''' self._encoded[key] = torch.tensor(coords).float()
    -
    [docs] def get_decoded(self, key): + +
    +[docs] + def get_decoded(self, key): ''' :param str key: key pointing to a dataset previously loaded with :func:`set_dataset <molearn.analysis.MolearnAnalysis.set_dataset>` ''' @@ -164,23 +189,32 @@

    Source code for molearn.analysis.analyser

                     encoded = self.get_encoded(key)
                     decoded = torch.empty(encoded.shape[0], *self.shape).float()
                     for i in tqdm(range(0, encoded.shape[0], batch_size), desc=f'Decoding {key}'):
    -                    decoded[i:i+batch_size] = self.network.decode(encoded[i:i+batch_size].to(self.device))[:,:,:self.shape[1]].cpu()
    +                    decoded[i:i+batch_size] = self.network.decode(encoded[i:i+batch_size].to(self.device))[:, :, :self.shape[1]].cpu()
                     self._decoded[key] = decoded
             return self._decoded[key]
    -
    [docs] def set_decoded(self, key, structures): + +
    +[docs] + def set_decoded(self, key, structures): ''' :param str key: key pointing to a dataset previously loaded with :func:`set_dataset <molearn.analysis.MolearnAnalysis.set_dataset>` ''' self._decoded[key] = structures
    -
    [docs] def num_trainable_params(self): + +
    +[docs] + def num_trainable_params(self): ''' :return: number of trainable parameters in the neural network previously loaded with :func:`set_dataset <molearn.analysis.MolearnAnalysis.set_network>` ''' return sum(p.numel() for p in self.network.parameters() if p.requires_grad)
    -
    [docs] def get_error(self, key, align=False): + +
    +[docs] + def get_error(self, key, align=True): ''' Calculate the reconstruction error of a dataset encoded and decoded by a trained neural network. @@ -196,21 +230,24 @@

    Source code for molearn.analysis.analyser

             m = deepcopy(self.mol)
             for i in range(dataset.shape[0]):
                 crd_ref = as_numpy(dataset[i].permute(1,0).unsqueeze(0))*self.stdval + self.meanval
    -            crd_mdl = as_numpy(decoded[i].permute(1,0).unsqueeze(0))[:, :dataset.shape[2]]*self.stdval + self.meanval #clip the padding of models  
    -            if align: # use Molecule Biobox class to calculate RMSD
    +            crd_mdl = as_numpy(decoded[i].permute(1,0).unsqueeze(0))[:, :dataset.shape[2]]*self.stdval + self.meanval  # clip the padding of models  
    +            # use Molecule Biobox class to calculate RMSD
    +            if align:
                     m.coordinates = deepcopy(crd_ref)
                     m.set_current(0)
                     m.add_xyz(crd_mdl[0])
                     rmsd = m.rmsd(0, 1)
                 else:
    -                rmsd = np.sqrt(np.sum((crd_ref.flatten()-crd_mdl.flatten())**2)/crd_mdl.shape[1]) # Cartesian L2 norm
    +                rmsd = np.sqrt(np.sum((crd_ref.flatten()-crd_mdl.flatten())**2)/crd_mdl.shape[1])  # Cartesian L2 norm
     
                 err.append(rmsd)
     
             return np.array(err)
    -
    [docs] def get_dope(self, key, refine=True, **kwargs): +
    +[docs] + def get_dope(self, key, refine=True, **kwargs): ''' :param str key: key pointing to a dataset previously loaded with :func:`set_dataset <molearn.analysis.MolearnAnalysis.set_dataset>` :param bool refine: if True, refine structures before calculating DOPE score @@ -219,13 +256,16 @@

    Source code for molearn.analysis.analyser

             dataset = self.get_dataset(key)
             decoded = self.get_decoded(key)
             
    -        dope_dataset = self.get_all_dope_score(dataset, refine=refine,**kwargs)
    -        dope_decoded = self.get_all_dope_score(decoded, refine=refine,**kwargs)
    +        dope_dataset = self.get_all_dope_score(dataset, refine=refine, **kwargs)
    +        dope_decoded = self.get_all_dope_score(decoded, refine=refine, **kwargs)
    +
    +        return dict(dataset_dope=dope_dataset, 
    +                    decoded_dope=dope_decoded)
    - return dict(dataset_dope = dope_dataset, - decoded_dope = dope_decoded)
    -
    [docs] def get_ramachandran(self, key): +
    +[docs] + def get_ramachandran(self, key): ''' :param str key: key pointing to a dataset previously loaded with :func:`set_dataset <molearn.analysis.MolearnAnalysis.set_dataset>` ''' @@ -237,7 +277,10 @@

    Source code for molearn.analysis.analyser

             ramachandran.update({f'decoded_{key}':value for key, value in self.get_all_ramachandran_score(decoded).items()})
             return ramachandran
    -
    [docs] def setup_grid(self, samples=64, bounds_from=None, bounds=None, padding=0.1): + +
    +[docs] + def setup_grid(self, samples=64, bounds_from=None, bounds=None, padding=0.1): ''' Define a NxN point grid regularly sampling the latent space. @@ -252,7 +295,7 @@

    Source code for molearn.analysis.analyser

                 if bounds_from is None:
                     bounds_from = "all"
                 
    -            bounds = self._get_bounds(bounds_from, exclude = key)
    +            bounds = self._get_bounds(bounds_from, exclude=key)
             
             bx = (bounds[1]-bounds[0])*padding
             by = (bounds[3]-bounds[2])*padding
    @@ -260,12 +303,13 @@ 

    Source code for molearn.analysis.analyser

             self.yvals = np.linspace(bounds[2]-by, bounds[3]+by, samples)
             self.n_samples = samples
             meshgrid = np.meshgrid(self.xvals, self.yvals)
    -        stack = np.stack(meshgrid, axis=2).reshape(-1,1,2)
    +        stack = np.stack(meshgrid, axis=2).reshape(-1, 1, 2)
             self.set_encoded(key, stack)
             
             return key
    - def _get_bounds(self, bounds_from, exclude = ['grid', 'grid_decoded']): + + def _get_bounds(self, bounds_from, exclude=['grid', 'grid_decoded']): ''' :param bounds_from: keys of datasets to be considered for identification of boundaries in latent space :param exclude: keys of dataset not to consider @@ -282,16 +326,18 @@

    Source code for molearn.analysis.analyser

             xmin, ymin, xmax, ymax = [], [], [], []
             for key in bounds_from:
                 z = self.get_encoded(key)
    -            xmin.append(z[:,0].min())
    -            ymin.append(z[:,1].min())
    -            xmax.append(z[:,0].max())
    -            ymax.append(z[:,1].max())
    +            xmin.append(z[:, 0].min())
    +            ymin.append(z[:, 1].min())
    +            xmax.append(z[:, 0].max())
    +            ymax.append(z[:, 1].max())
                 
             xmin, ymin = min(xmin), min(ymin)
             xmax, ymax = max(xmax), max(ymax)
             return xmin, xmax, ymin, ymax
     
    -
    [docs] def scan_error_from_target(self, key, index=None, align=False): +
    +[docs] + def scan_error_from_target(self, key, index=None, align=True): ''' Calculate landscape of RMSD vs single target structure. Target should be previously loaded datset containing a single conformation. @@ -315,19 +361,22 @@

    Source code for molearn.analysis.analyser

                 
                 decoded = self.get_decoded('grid')
                 if align:
    -                crd_ref = as_numpy(target.permute(0,2,1))*self.stdval
    -                crd_mdl = as_numpy(decoded.permute(0,2,1))*self.stdval
    +                crd_ref = as_numpy(target.permute(0, 2, 1))*self.stdval
    +                crd_mdl = as_numpy(decoded.permute(0, 2, 1))*self.stdval
                     m = deepcopy(self.mol)
                     m.coordinates = np.concatenate([crd_ref, crd_mdl])
                     m.set_current(0)
    -                rmsd = np.array([m.rmsd(0,i) for i in range(1, len(m.coordinates))])
    +                rmsd = np.array([m.rmsd(0, i) for i in range(1, len(m.coordinates))])
                 else:
                     rmsd = (((decoded-target)*self.stdval)**2).sum(axis=1).mean(axis=-1).sqrt()
    -            self.surfaces[s_key] = rmsd.reshape(self.n_samples, self.n_samples).numpy()
    +            self.surfaces[s_key] = as_numpy(rmsd.reshape(self.n_samples, self.n_samples))
                 
             return self.surfaces[s_key], self.xvals, self.yvals
    -
    [docs] def scan_error(self, s_key='Network_RMSD', z_key='Network_z_drift'): + +
    +[docs] + def scan_error(self, s_key='Network_RMSD', z_key='Network_z_drift'): ''' Calculate RMSD and z-drift on a grid sampling the latent space. Requires a grid system to be defined via a prior call to :func:`set_dataset <molearn.analysis.MolearnAnalysis.setup_grid>`. @@ -343,30 +392,32 @@

    Source code for molearn.analysis.analyser

             z_key = 'Network_z_drift'
             if s_key not in self.surfaces:
                 assert 'grid' in self._encoded, 'make sure to call MolearnAnalysis.setup_grid first'
    -            decoded = self.get_decoded('grid')           # decode grid 
    -            #self.set_dataset('grid_decoded', decoded)    # add back as dataset w. different name
    +            decoded = self.get_decoded('grid')            # decode grid 
    +            # self.set_dataset('grid_decoded', decoded)   # add back as dataset w. different name
                 self._datasets['grid_decoded'] = decoded
    -            decoded_2 = self.get_decoded('grid_decoded') # encode, and decode a second time
    -            grid = self.get_encoded('grid')              # retrieve original grid
    -            grid_2 = self.get_encoded('grid_decoded')    # retrieve decoded encoded grid
    +            decoded_2 = self.get_decoded('grid_decoded')  # encode, and decode a second time
    +            grid = self.get_encoded('grid')               # retrieve original grid
    +            grid_2 = self.get_encoded('grid_decoded')     # retrieve decoded encoded grid
     
                 rmsd = (((decoded-decoded_2)*self.stdval)**2).sum(axis=1).mean(axis=-1).sqrt()
                 z_drift = ((grid-grid_2)**2).mean(axis=2).mean(axis=1).sqrt()
     
                 self.surfaces[s_key] = rmsd.reshape(self.n_samples, self.n_samples).numpy()
                 self.surfaces[z_key] = z_drift.reshape(self.n_samples, self.n_samples).numpy()
    +            
             return self.surfaces[s_key], self.surfaces[z_key], self.xvals, self.yvals
    + def _ramachandran_score(self, frame): ''' returns multiprocessing AsyncResult AsyncResult.get() will return the result ''' if not hasattr(self, 'ramachandran_score_class'): - self.ramachandran_score_class = Parallel_Ramachandran_Score(self.mol, self.processes) #Parallel_Ramachandran_Score(self.mol) + self.ramachandran_score_class = Parallel_Ramachandran_Score(self.mol, self.processes) assert len(frame.shape) == 2, f'We wanted 2D data but got {len(frame.shape)} dimensions' if frame.shape[0] == 3: - f = frame.permute(1,0) + f = frame.permute(1, 0) else: assert frame.shape[1] == 3 f = frame @@ -374,9 +425,8 @@

    Source code for molearn.analysis.analyser

                 f = f.data.cpu().numpy()
             
             return self.ramachandran_score_class.get_score(f*self.stdval)
    -        #nf, na, no, nt = self.ramachandran_score_class.get_score(f*self.stdval)
    -        #return {'favored':nf, 'allowed':na, 'outliers':no, 'total':nt}
    -
    +        # nf, na, no, nt = self.ramachandran_score_class.get_score(f*self.stdval)
    +        # return {'favored':nf, 'allowed':na, 'outliers':no, 'total':nt}
     
         def _dope_score(self, frame, refine=True, **kwargs):
             '''
    @@ -388,16 +438,18 @@ 

    Source code for molearn.analysis.analyser

     
             assert len(frame.shape) == 2, f'We wanted 2D data but got {len(frame.shape)} dimensions'
             if frame.shape[0] == 3:
    -            f = frame.permute(1,0)
    +            f = frame.permute(1, 0)
             else:
    -            assert frame.shape[1] ==3
    +            assert frame.shape[1] == 3
                 f = frame
             if isinstance(f,torch.Tensor):
                 f = f.data.cpu().numpy()
     
             return self.dope_score_class.get_score(f*self.stdval, refine=refine, **kwargs)
     
    -
    [docs] def get_all_ramachandran_score(self, tensor): +
    +[docs] + def get_all_ramachandran_score(self, tensor): ''' Calculate Ramachandran score of an ensemble of atomic conrdinates. @@ -407,7 +459,7 @@

    Source code for molearn.analysis.analyser

             results = []
             for f in tensor:
                 results.append(self._ramachandran_score(f))
    -        for r in tqdm(results,desc=f'Calc rama'):
    +        for r in tqdm(results,desc='Calc rama'):
                 favored, allowed, outliers, total = r.get()
                 rama['favored'].append(favored)
                 rama['allowed'].append(allowed)
    @@ -415,7 +467,10 @@ 

    Source code for molearn.analysis.analyser

                 rama['total'].append(total)
             return {key:np.array(value) for key, value in rama.items()}       
    -
    [docs] def get_all_dope_score(self, tensor, refine=True): + +
    +[docs] + def get_all_dope_score(self, tensor, refine=True): ''' Calculate DOPE score of an ensemble of atom coordinates. @@ -425,16 +480,19 @@

    Source code for molearn.analysis.analyser

             results = []
             for f in tensor:
                 results.append(self._dope_score(f, refine=refine))
    -        results = np.array([r.get() for r in tqdm(results, desc=f'Calc Dope')])
    +        results = np.array([r.get() for r in tqdm(results, desc='Calc Dope')])
             return results
    -
    [docs] def reference_dope_score(self, frame): + +
    +[docs] + def reference_dope_score(self, frame): ''' :param numpy.array frame: array with shape [1, N, 3] with Cartesian coordinates of atoms :return: DOPE score ''' self.mol.coordinates = deepcopy(frame) - self.mol.write_pdb('tmp.pdb', split_struc = False) + self.mol.write_pdb('tmp.pdb', split_struc=False) env = Environ() env.libs.topology.read(file='$(LIB)/top_heav.lib') env.libs.parameters.read(file='$(LIB)/par.lib') @@ -443,7 +501,10 @@

    Source code for molearn.analysis.analyser

             score = atmsel.assess_dope()
             return score
    -
    [docs] def scan_dope(self, key=None, refine=True, **kwargs): + +
    +[docs] + def scan_dope(self, key=None, refine=True, **kwargs): ''' Calculate DOPE score on a grid sampling the latent space. Requires a grid system to be defined via a prior call to :func:`set_dataset <molearn.analysis.MolearnAnalysis.setup_grid>`. @@ -468,13 +529,16 @@

    Source code for molearn.analysis.analyser

                 decoded = self.get_decoded('grid')
                 result = self.get_all_dope_score(decoded, refine=refine, **kwargs)
                 if refine=='both':
    -                self.surfaces[key] = as_numpy(result.reshape(self.n_samples, self.n_samples,2))
    +                self.surfaces[key] = as_numpy(result.reshape(self.n_samples, self.n_samples, 2))
                 else:
                     self.surfaces[key] = as_numpy(result.reshape(self.n_samples, self.n_samples))
                 
             return self.surfaces[key], self.xvals, self.yvals
    -
    [docs] def scan_ramachandran(self): + +
    +[docs] + def scan_ramachandran(self): ''' Calculate Ramachandran scores on a grid sampling the latent space. Requires a grid system to be defined via a prior call to :func:`set_dataset <molearn.analysis.MolearnAnalysis.setup_grid>`. @@ -493,8 +557,11 @@

    Source code for molearn.analysis.analyser

                     self.surfaces[keys[key]] = value
     
             return self.surfaces['Ramachandran_favored'], self.xvals, self.yvals
    + -
    [docs] def scan_custom(self, fct, params, key): +
    +[docs] + def scan_custom(self, fct, params, key): ''' Generate a surface coloured as a function of a user-defined function. @@ -507,14 +574,17 @@

    Source code for molearn.analysis.analyser

             '''
             decoded = self.get_decoded('grid')
             results = []
    -        for i,j in enumerate(decoded):
    -            s = (j.view(1,3,-1).permute(0,2,1)*self.stdval).numpy()
    +        for i, j in enumerate(decoded):
    +            s = (j.view(1, 3, -1).permute(0, 2, 1)*self.stdval).numpy()
                 results.append(fct(s, *params))
             self.surfaces[key] = np.array(results).reshape(self.n_samples, self.n_samples)
             
             return self.surfaces[key], self.xvals, self.yvals
    -
    [docs] def generate(self, crd): + +
    +[docs] + def generate(self, crd): ''' Generate a collection of protein conformations, given coordinates in the latent space. @@ -569,8 +639,8 @@

    Navigation

    \ No newline at end of file diff --git a/docs/build/_modules/molearn/analysis/path.html b/docs/build/_modules/molearn/analysis/path.html index f1342c8..2516674 100644 --- a/docs/build/_modules/molearn/analysis/path.html +++ b/docs/build/_modules/molearn/analysis/path.html @@ -1,18 +1,15 @@ - - + molearn.analysis.path — molearn 2.0.1 documentation - - - - - - - + + + + + @@ -45,7 +42,8 @@

    Source code for molearn.analysis.path

        :synopsis: Tools for linking waypoints with paths in latent space
     """
     
    -class PriorityQueue(object):
    +
    +class PriorityQueue:
         '''
         Queue for shortest path algorithms.
         
    @@ -112,7 +110,7 @@ 

    Source code for molearn.analysis.path

                 idx = np.unravel_index(idx, gridshape)
             elif len(idx) != 2:
                 raise Exception("Expecting 2D coordinates")
    -    except:
    +    except Exception:
             raise Exception("idx should be either integer or an iterable")
     
         # generate neighbour list
    @@ -142,6 +140,7 @@ 

    Source code for molearn.analysis.path

         '''
         :return: scalar value, reporting on the cost of moving onto a grid cell
         '''
    +    
         # separate function for clarity, and in case in the future we want to alter this
         return graph[pt]
         
    @@ -192,7 +191,9 @@ 

    Source code for molearn.analysis.path

         return came_from, cost_so_far
     
     
    -
    [docs]def get_path(idx_start, idx_end, landscape, xvals, yvals, smooth=3): +
    +[docs] +def get_path(idx_start, idx_end, landscape, xvals, yvals, smooth=3): ''' Find shortest path between two points on a weighted grid @@ -216,7 +217,9 @@

    Source code for molearn.analysis.path

         coords = []
         score = []
         idx_flat = np.ravel_multi_index(idx_end, landscape.shape)
    -    while cnt<1000: #safeguad for (unlikely) unfinished paths
    +    
    +    # safeguard for (unlikely) unfinished paths
    +    while cnt<1000:
     
             if idx_flat == mypath[idx_flat]:
                 break
    @@ -258,7 +261,9 @@ 

    Source code for molearn.analysis.path

         return np.array([my_x, my_y])
     
     
    -
    [docs]def get_path_aggregate(crd, landscape, xvals, yvals, input_is_index=False): +
    +[docs] +def get_path_aggregate(crd, landscape, xvals, yvals, input_is_index=False): ''' Create a chain of shortest paths via give waypoints @@ -290,7 +295,10 @@

    Source code for molearn.analysis.path

         return crd
    -
    [docs]def oversample(crd, pts=10): + +
    +[docs] +def oversample(crd, pts=10): ''' Add extra equally spaced points between a list of points. @@ -298,6 +306,7 @@

    Source code for molearn.analysis.path

         :param int pts: number of extra points to add in each interval
         :return: Mx2 numpy array, with M>=N.
         ''' 
    +    
         pts += 1
         steps = np.linspace(1./pts, 1, pts)
         pts = [crd[0]]
    @@ -307,6 +316,7 @@ 

    Source code for molearn.analysis.path

                 pts.append(newpt)
     
         return np.array(pts)
    +
    @@ -344,8 +354,8 @@

    Navigation

    \ No newline at end of file diff --git a/docs/build/_modules/molearn/data/pdb_data.html b/docs/build/_modules/molearn/data/pdb_data.html index 248a579..1e1a70d 100644 --- a/docs/build/_modules/molearn/data/pdb_data.html +++ b/docs/build/_modules/molearn/data/pdb_data.html @@ -1,18 +1,15 @@ - - + molearn.data.pdb_data — molearn 2.0.1 documentation - - - - - - - + + + + + @@ -42,9 +39,12 @@

    Source code for molearn.data.pdb_data

     from copy import deepcopy
     import biobox as bb
     
    -
    [docs]class PDBData: + +
    +[docs] +class PDBData: - def __init__(self, filename = None, fix_terminal = False, atoms = None, ): + def __init__(self, filename=None, fix_terminal=False, atoms=None): ''' Create object enabling the manipulation of multi-PDB files into a dataset suitable for training. @@ -61,9 +61,11 @@

    Source code for molearn.data.pdb_data

             if fix_terminal:
                 self.fix_terminal()
             if atoms is not None:
    -            self.atomselect(atoms = atoms)
    +            self.atomselect(atoms=atoms)
     
    -
    [docs] def import_pdb(self, filename): +
    +[docs] + def import_pdb(self, filename): ''' Load multiPDB file. This command can be called multiple times to load many datasets, if these feature the same number of atoms @@ -77,7 +79,10 @@

    Source code for molearn.data.pdb_data

                 self.filename = []
             self.filename.append(filename)
    -
    [docs] def fix_terminal(self): + +
    +[docs] + def fix_terminal(self): ''' Rename OT1 N-terminal Oxygen to O if terminal oxygens are named OT1 and OT2 otherwise no oxygen will be selected during an atomselect using atoms = ['CA', 'C','N','O','CB']. No template will be found for terminal residue in openmm_loss. Alternative solution is to use atoms = ['CA', 'C', 'N', 'O', 'CB', 'OT1']. instead. ''' @@ -86,7 +91,10 @@

    Source code for molearn.data.pdb_data

             if len(ot1)!=0 and len(ot2)!=0:
                 self._mol.data.loc[ot1,'name']='O'
    -
    [docs] def atomselect(self, atoms, ignore_atoms=[]): + +
    +[docs] + def atomselect(self, atoms, ignore_atoms=[]): ''' From all imported PDBs, extract only atoms of interest. :func:`import_pdb <molearn.data.PDBData.import_pdb>` must have been called at least once, either at class instantiation or as a separate call. @@ -99,15 +107,19 @@

    Source code for molearn.data.pdb_data

                     if to_remove in _atoms:
                         _atoms.remove(to_remove)
             elif atoms == "no_hydrogen":
    -            _atoms = self.atoms #list(np.unique(self._mol.data["name"].values))    #all the atoms
    +            _atoms = self.atoms  # list(np.unique(self._mol.data["name"].values))    #all the atoms
                 _plain_atoms = []
                 for a in _atoms:
                     if a in self._mol.knowledge['atomtype']:
                         _plain_atoms.append(self._mol.knowledge['atomtype'][a])
                     elif a[:-1] in self._mol.knowledge['atomtype']:
                         _plain_atoms.append(self._mol.knowledge['atomtype'][a[:-1]])
    +                    print(f'Could not find {a}. I am assuing you meant {a[:-1]} instead.')
    +                elif a[:-2] in self._mol.knowledge['atomtype']:
    +                    _plain_atoms.append(self._mol.knowledge['atomtype'][a[:-2]])
    +                    print(f'Could not find {a}. I am assuming you meant {a[:-2]} instead.')
                     else:
    -                    _plain_atoms.append(self._mol.knowledge['atomtype'][a]) # if above failed just raise the keyerror
    +                    _plain_atoms.append(self._mol.knowledge['atomtype'][a])  # if above failed just raise the keyerror
                 _atoms = [atom for atom, element in zip(_atoms, _plain_atoms) if element != 'H']
             else:
                 _atoms = [_a for _a in atoms if _a not in ignore_atoms]
    @@ -115,7 +127,10 @@ 

    Source code for molearn.data.pdb_data

             _, self._idxs = self._mol.atomselect("*", "*", _atoms, get_index=True)
             self._mol = self._mol.get_subset(self._idxs)
    -
    [docs] def prepare_dataset(self): + +
    +[docs] + def prepare_dataset(self): ''' Once all datasets have been loaded, normalise data and convert into `torch.Tensor` (ready for training) ''' @@ -134,7 +149,10 @@

    Source code for molearn.data.pdb_data

             print(f'Dataset.shape: {self.dataset.shape}')
             print(f'mean: {str(self.mean)}, std: {str(self.std)}')
    -
    [docs] def get_atominfo(self): + +
    +[docs] + def get_atominfo(self): ''' generate list of all atoms in dataset, where every line contains [atom name, residue name, resid] ''' @@ -143,7 +161,10 @@

    Source code for molearn.data.pdb_data

                 self.atominfo = self._mol.get_data(columns=['name', 'resname', 'resid'])
             return self.atominfo
    -
    [docs] def frame(self): + +
    +[docs] + def frame(self): ''' return `biobox.Molecule` object with loaded data ''' @@ -156,7 +177,10 @@

    Source code for molearn.data.pdb_data

             M.properties['center'] = M.get_center()
             return deepcopy(M)
    -
    [docs] def get_dataloader(self, batch_size, validation_split=0.1, pin_memory=True, dataset_sample_size=-1, manual_seed=None, shuffle=True, sampler=None): + +
    +[docs] + def get_dataloader(self, batch_size, validation_split=0.1, pin_memory=True, dataset_sample_size=-1, manual_seed=None, shuffle=True, sampler=None): ''' :param batch_size: :param validation_split: @@ -182,8 +206,11 @@

    Source code for molearn.data.pdb_data

                 self.train_dataloader = torch.utils.data.DataLoader(self.train_dataset, batch_size=batch_size, pin_memory=pin_memory, shuffle=True)
             self.valid_dataloader = torch.utils.data.DataLoader(self.valid_dataset, batch_size=batch_size, pin_memory=pin_memory,shuffle=True)
             return self.train_dataloader, self.valid_dataloader
    + -
    [docs] def split(self, *args, **kwargs): +
    +[docs] + def split(self, *args, **kwargs): ''' Split :func:`PDBData <molearn.data.PDBData>` into two other :func:`PDBData <molearn.data.PDBData>` objects corresponding to train and valid sets. @@ -194,7 +221,7 @@

    Source code for molearn.data.pdb_data

             :return: :func:`PDBData <molearn.data.PDBData>` object corresponding to train set
             :return: :func:`PDBData <molearn.data.PDBData>` object corresponding to validation set
             '''
    -        #validation_split=0.1, valid_size=None, train_size=None, manual_seed = None):
    +        # validation_split=0.1, valid_size=None, train_size=None, manual_seed = None):
             train_dataset, valid_dataset = self.get_datasets(*args, **kwargs)
             train = PDBData()
             valid = PDBData()
    @@ -205,7 +232,10 @@ 

    Source code for molearn.data.pdb_data

             valid.dataset = valid_dataset
             return train, valid
    -
    [docs] def get_datasets(self, validation_split=0.1, valid_size=None, train_size=None, manual_seed = None): + +
    +[docs] + def get_datasets(self, validation_split=0.1, valid_size=None, train_size=None, manual_seed=None): ''' Create a training and validation set from the imported data @@ -229,7 +259,7 @@

    Source code for molearn.data.pdb_data

                     _valid_size = valid_size
             from torch import randperm
             if manual_seed is not None:
    -            indices = randperm(len(self.dataset), generator = torch.Generator().manual_seed(manual_seed))
    +            indices = randperm(len(self.dataset), generator=torch.Generator().manual_seed(manual_seed))
             else:
                 indices = randperm(len(self.dataset))
     
    @@ -238,16 +268,14 @@ 

    Source code for molearn.data.pdb_data

             valid_dataset = dataset[indices[_train_size:_train_size+_valid_size]]
             return train_dataset, valid_dataset
    + @property def atoms(self): - return list(np.unique(self._mol.data["name"].values)) #all the atoms + return list(np.unique(self._mol.data["name"].values)) # all the atoms @property def mol(self): return self.frame()
    - - -
    @@ -286,8 +314,8 @@

    Navigation

    \ No newline at end of file diff --git a/docs/build/_modules/molearn/loss_functions/openmm_thread.html b/docs/build/_modules/molearn/loss_functions/openmm_thread.html index ddff98f..ac7c462 100644 --- a/docs/build/_modules/molearn/loss_functions/openmm_thread.html +++ b/docs/build/_modules/molearn/loss_functions/openmm_thread.html @@ -1,18 +1,15 @@ - - + molearn.loss_functions.openmm_thread — molearn 2.0.1 documentation - - - - - - - + + + + + @@ -53,11 +50,14 @@

    Source code for molearn.loss_functions.openmm_thread

    import torch import numpy as np +from copy import deepcopy -
    [docs]class ModifiedForceField(ForceField): +
    +[docs] +class ModifiedForceField(ForceField): - def __init__(self, *args, alternative_residue_names = None, **kwargs): + def __init__(self, *args, alternative_residue_names=None, **kwargs): ''' Takes all `*args` and `**kwargs` of `openmm.app.ForceField`, plus an optional parameter described here. @@ -119,7 +119,7 @@

    Source code for molearn.loss_functions.openmm_thread

    matches = m return [template, matches] print(f'multiple for {t.name}') - # We found multiple matches. This is OK if and only if they assign identical types and parameters to all atoms. + # We found multiple matches. This is OK if and only if they assign identical types and parameters to all atoms. t1, m1 = allMatches[0] for t2, m2 in allMatches[1:]: @@ -129,15 +129,19 @@

    Source code for molearn.loss_functions.openmm_thread

    matches = allMatches[0][1] return [template, matches]
    -
    [docs]class OpenmmPluginScore(): + + +
    +[docs] +class OpenmmPluginScore(): ''' This will use the new OpenMM Plugin to calculate forces and energy. The intention is that this will be fast enough to be able to calculate forces and energy during training. N.B.: The current torchintegratorplugin only supports float on GPU and double on CPU. ''' - def __init__(self, mol=None, xml_file = ['amber14-all.xml'], platform = 'CUDA', remove_NB=False, - alternative_residue_names = dict(HIS='HIE', HSE='HIE'), atoms=['CA', 'C', 'N', 'CB','O'], - soft=False): + def __init__(self, mol=None, xml_file=['amber14-all.xml'], platform='CUDA', remove_NB=False, + alternative_residue_names=dict(HIS='HIE', HSE='HIE'), atoms=['CA', 'C', 'N', 'CB','O'], + soft=False): ''' :param `biobox.Molecule` mol: if pldataloader is not given, then a biobox object will be taken from this parameter. If neither are given then an error will be thrown. :param str xml_file: xml parameter file @@ -149,12 +153,12 @@

    Source code for molearn.loss_functions.openmm_thread

    ''' self.mol = mol for key, value in alternative_residue_names.items(): - #self.mol.data.loc[:,'resname'][self.mol.data['resname']==key]=value + # self.mol.data.loc[:,'resname'][self.mol.data['resname']==key]=value self.mol.data.loc[self.mol.data['resname']==key,'resname']=value - #self.mol.data.loc[lambda df: df['resname']==key, key]=value + # self.mol.data.loc[lambda df: df['resname']==key, key]=value tmp_file = f'tmp{np.random.randint(1e10)}.pdb' self.atoms = atoms - self.mol.write_pdb(tmp_file, split_struc = False) + self.mol.write_pdb(tmp_file, split_struc=False) self.pdb = PDBFile(tmp_file) if soft: print('attempting soft forcefield') @@ -164,9 +168,9 @@

    Source code for molearn.loss_functions.openmm_thread

    self.system = self.forcefield.createSystem(self.pdb.topology) else: if isinstance(xml_file,str): - self.forcefield = ModifiedForceField(xml_file, alternative_residue_names = alternative_residue_names) + self.forcefield = ModifiedForceField(xml_file, alternative_residue_names=alternative_residue_names) elif len(xml_file)>0: - self.forcefield = ModifiedForceField(*xml_file, alternative_residue_names = alternative_residue_names) + self.forcefield = ModifiedForceField(*xml_file, alternative_residue_names=alternative_residue_names) else: raise ValueError(f'xml_file: {xml_file} needs to be a str or a list of str') @@ -174,14 +178,14 @@

    Source code for molearn.loss_functions.openmm_thread

    self.ignore_hydrogen() else: self.atomselect(atoms) - #save pdb and reload in modeller + # save pdb and reload in modeller templates, unique_unmatched_residues = self.forcefield.generateTemplatesForUnmatchedResidues(self.pdb.topology) self.system = self.forcefield.createSystem(self.pdb.topology) if remove_NB: forces = self.system.getForces() for idx in reversed(range(len(forces))): force = forces[idx] - if isinstance(force, (#openmm.PeriodicTorsionForce, + if isinstance(force, ( # openmm.PeriodicTorsionForce, openmm.CustomGBForce, openmm.NonbondedForce, openmm.CMMotionRemover)): @@ -193,7 +197,6 @@

    Source code for molearn.loss_functions.openmm_thread

    if isinstance(force, openmm.CustomGBForce): self.system.removeForce(idx) - self.integrator = TorchExposedIntegrator() self.platform = Platform.getPlatformByName(platform) self.simulation = Simulation(self.pdb.topology, self.system, self.integrator, self.platform) @@ -206,7 +209,7 @@

    Source code for molearn.loss_functions.openmm_thread

    os.remove(tmp_file) def ignore_hydrogen(self): - #ignore = ['ASH', 'LYN', 'GLH', 'HID', 'HIP', 'CYM', ] + # ignore = ['ASH', 'LYN', 'GLH', 'HID', 'HIP', 'CYM', ] ignore = [] for name, template in self.forcefield._templates.items(): if name in ignore: @@ -232,6 +235,12 @@

    Source code for molearn.loss_functions.openmm_thread

    self.forcefield.registerPatch(patchData) def atomselect(self, atoms): + atoms = deepcopy(atoms) + if 'OT2' in atoms: + atoms.append('OXT') + if 'OT1' in atoms: + atoms.append('OXT') + for name, template in self.forcefield._templates.items(): patchData = ForceField._PatchData(name+'_leave_only_'+'_'.join(atoms), 1) @@ -254,8 +263,9 @@

    Source code for molearn.loss_functions.openmm_thread

    self.forcefield.registerTemplatePatch(name, name+'_leave_only_'+'_'.join(atoms), 0) self.forcefield.registerPatch(patchData) - -
    [docs] def get_energy(self, pos_ptr, force_ptr, energy_ptr, n_particles, batch_size): +
    +[docs] + def get_energy(self, pos_ptr, force_ptr, energy_ptr, n_particles, batch_size): ''' :param pos_ptr: tensor.data_ptr() :param force_ptr: tensor.data_ptr() @@ -268,17 +278,25 @@

    Source code for molearn.loss_functions.openmm_thread

    self.integrator.torchMultiStructureE(pos_ptr, force_ptr, energy_ptr, n_particles, batch_size) return True
    -
    [docs] def execute(self, x): + +
    +[docs] + def execute(self, x): ''' :param `torch.Tensor` x: shape [b, N, 3]. dtype=float. device = gpu ''' force = torch.zeros_like(x) - energy = torch.zeros(x.shape[0], device = torch.device('cpu'), dtype=torch.double) + energy = torch.zeros(x.shape[0], device=torch.device('cpu'), dtype=torch.double) self.get_energy(x.data_ptr(), force.data_ptr(), energy.data_ptr(), x.shape[1], x.shape[0]) - return force, energy
    + return force, energy
    +
    + -
    [docs]class OpenmmTorchEnergyMinimizer(OpenmmPluginScore): +
    +[docs] +class OpenmmTorchEnergyMinimizer(OpenmmPluginScore): + def minimize(self, x, maxIterations=10, threshold=10000): minimized_x = torch.empty_like(x) for i,s in enumerate(x.unsqueeze(1)): @@ -301,12 +319,15 @@

    Source code for molearn.loss_functions.openmm_thread

    [docs]class OpenMMPluginScoreSoftForceField(OpenmmPluginScore): +
    +[docs] +class OpenMMPluginScoreSoftForceField(OpenmmPluginScore): + def __init__(self, mol=None, platform='CUDA', atoms=['CA','C','N','CB','O']): self.mol = mol tmp_file = 'tmp.pdb' self.atoms = atoms - self.mol.write_pdb(tmp_file, split_struc = False) + self.mol.write_pdb(tmp_file, split_struc=False) self.pdb = PDBFile(tmp_file) from pdbfixer import PDBFixer f = PDBFixer(tmp_file) @@ -323,9 +344,14 @@

    Source code for molearn.loss_functions.openmm_thread

    print(self.simulation.context.getState(getEnergy=True).getPotentialEnergy()._value)
    -
    [docs]class openmm_energy_function(torch.autograd.Function): -
    [docs] @staticmethod +
    +[docs] +class openmm_energy_function(torch.autograd.Function): + +
    +[docs] + @staticmethod def forward(ctx, plugin, x): ''' :param plugin: OpenmmPluginScore instance @@ -343,22 +369,32 @@

    Source code for molearn.loss_functions.openmm_thread

    force = torch.tensor(force).float() energy = torch.tensor(energy).float() else: - #torch.cuda.synchronize(x.device) + # torch.cuda.synchronize(x.device) force, energy = plugin.execute(x) - #torch.cuda.synchronize(x.device) + # torch.cuda.synchronize(x.device) ctx.save_for_backward(force) energy = energy.float().to(x.device) return energy
    -
    [docs] @staticmethod + +
    +[docs] + @staticmethod def backward(ctx, grad_output): - force = ctx.saved_tensors[0] # force shape [B, N, 3] - #embed(header='23 openmm_loss_function') - return None, -force*grad_output.view(-1,1,1)
    + force = ctx.saved_tensors[0] # force shape [B, N, 3] + # embed(header='23 openmm_loss_function') + return None, -force*grad_output.view(-1,1,1)
    +
    + + -
    [docs]class openmm_clamped_energy_function(torch.autograd.Function): +
    +[docs] +class openmm_clamped_energy_function(torch.autograd.Function): -
    [docs] @staticmethod +
    +[docs] + @staticmethod def forward(ctx, plugin, x, clamp): ''' :param plugin: OpenmmPluginScore instance @@ -383,13 +419,22 @@

    Source code for molearn.loss_functions.openmm_thread

    energy = energy.float().to(x.device) return energy
    -
    [docs] @staticmethod + +
    +[docs] + @staticmethod def backward(ctx, grad_output): force = ctx.saved_tensors[0] - return None, -force*grad_output.view(-1,1,1), None
    + return None, -force*grad_output.view(-1, 1, 1), None
    +
    + -
    [docs]class openmm_energy(torch.nn.Module): - def __init__(self, mol, std, clamp = None, **kwargs): + +
    +[docs] +class openmm_energy(torch.nn.Module): + + def __init__(self, mol, std, clamp=None, **kwargs): super().__init__() self.openmmplugin = OpenmmPluginScore(mol, **kwargs) self.std = std/10 @@ -404,7 +449,7 @@

    Source code for molearn.loss_functions.openmm_thread

    :param `torch.Tensor` x: dtype=torch.float, device=CUDA, shape B, 3, N :returns: torch energy tensor dtype should be float and on same device as x ''' - _x = (x*self.std).permute(0,2,1).contiguous() + _x = (x*self.std).permute(0, 2, 1).contiguous() energy = openmm_energy_function.apply(self.openmmplugin, _x) return energy @@ -413,7 +458,7 @@

    Source code for molearn.loss_functions.openmm_thread

    :param `torch.Tensor` x: dtype=torch.float, device=CUDA, shape B, 3, N :returns: torch energy tensor dtype should be float and on same device as x ''' - _x = (x*self.std).permute(0,2,1).contiguous() + _x = (x*self.std).permute(0, 2, 1).contiguous() energy = openmm_clamped_energy_function.apply(self.openmmplugin, _x, self.clamp) return energy
    @@ -454,8 +499,8 @@

    Navigation

    \ No newline at end of file diff --git a/docs/build/_modules/molearn/models/CNN_autoencoder.html b/docs/build/_modules/molearn/models/CNN_autoencoder.html index d182e00..bd8b707 100644 --- a/docs/build/_modules/molearn/models/CNN_autoencoder.html +++ b/docs/build/_modules/molearn/models/CNN_autoencoder.html @@ -1,18 +1,15 @@ - - + molearn.models.CNN_autoencoder — molearn 2.0.1 documentation - - - - - - - + + + + + @@ -55,27 +52,31 @@

    Source code for molearn.models.CNN_autoencoder

    def __init__(self, f): super(ResidualBlock, self).__init__() - conv_block = [ nn.Conv1d(f,f, 3, stride=1, padding=1, bias=False), - nn.BatchNorm1d(f), - nn.ReLU(inplace=True), - nn.Conv1d(f,f, 3, stride=1, padding=1, bias=False), - nn.BatchNorm1d(f) ] + conv_block = [nn.Conv1d(f, f, 3, stride=1, padding=1, bias=False), + nn.BatchNorm1d(f), + nn.ReLU(inplace=True), + nn.Conv1d(f, f, 3, stride=1, padding=1, bias=False), + nn.BatchNorm1d(f)] self.conv_block = nn.Sequential(*conv_block) def forward(self, x): return x + self.conv_block(x) - #return torch.relu(x + self.conv_block(x)) #earlier runs were with 'return x + self.conv_block(x)' but not an issue (really?) + # return torch.relu(x + self.conv_block(x)) #earlier runs were with 'return x + self.conv_block(x)' but not an issue (really?) + class To2D(nn.Module): + def __init__(self): super(To2D, self).__init__() pass + def forward(self, x): - z = torch.nn.functional.adaptive_avg_pool2d(x, output_size=(2,1)) + z = torch.nn.functional.adaptive_avg_pool2d(x, output_size=(2, 1)) z = torch.sigmoid(z) return z + class From2D(nn.Module): def __init__(self): super(From2D, self).__init__() @@ -88,9 +89,9 @@

    Source code for molearn.models.CNN_autoencoder

    return x - - -

    [docs]class Autoencoder(nn.Module): +
    +[docs] +class Autoencoder(nn.Module): ''' This is the autoencoder used in our `Ramaswamy 2021 paper <https://journals.aps.org/prx/abstract/10.1103/PhysRevX.11.011052>`_. It is largely superseded by :func:`molearn.models.foldingnet.AutoEncoder`. @@ -152,6 +153,7 @@

    Source code for molearn.models.CNN_autoencoder

    for m in self.decoder: x = m(x) return x

    +
    @@ -189,8 +191,8 @@

    Navigation

    \ No newline at end of file diff --git a/docs/build/_modules/molearn/models/foldingnet.html b/docs/build/_modules/molearn/models/foldingnet.html index 10ce2f5..9a380a6 100644 --- a/docs/build/_modules/molearn/models/foldingnet.html +++ b/docs/build/_modules/molearn/models/foldingnet.html @@ -1,18 +1,15 @@ - - + molearn.models.foldingnet — molearn 2.0.1 documentation - - - - - - - + + + + + @@ -38,10 +35,10 @@

    Navigation

    Source code for molearn.models.foldingnet

     import torch
    -import biobox as bb
     from torch import nn
     import torch.nn.functional as F
     
    +
     def index_points(point_clouds, index):
         '''
         Given a batch of tensor and index, select sub-tensor.
    @@ -73,7 +70,7 @@ 

    Source code for molearn.models.foldingnet

         xx = torch.sum(x ** 2, dim=1, keepdim=True)  # (B, 1, N)
         pairwise_distance = -xx - inner - xx.transpose(2, 1)  # (B, 1, N), (B, N, N), (B, N, 1) -> (B, N, N)
     
    -    idx = pairwise_distance.topk(k=k, dim=-1)[1]   # (B, N, k)
    +    idx = pairwise_distance.topk(k=k, dim=-1)[1]  # (B, N, k)
         return idx
     
     
    @@ -109,7 +106,7 @@ 

    Source code for molearn.models.foldingnet

         '''
         Graph based encoder
         '''
    -    def __init__(self, latent_dimension = 2,**kwargs):
    +    def __init__(self, latent_dimension=2, **kwargs):
             super(Encoder, self).__init__()
             self.latent_dimension = latent_dimension
             self.conv1 = nn.Conv1d(12, 64, 1)
    @@ -143,7 +140,6 @@ 

    Source code for molearn.models.foldingnet

             x = F.relu(self.bn2(self.conv2(x)))
             x = F.relu(self.bn3(self.conv3(x)))
     
    -
             # two consecutive graph layers
             x = self.graph_layer1(x)
             x = self.graph_layer2(x)
    @@ -181,9 +177,9 @@ 

    Source code for molearn.models.foldingnet

             :param grids: reshaped 2D grids or intermediam reconstructed point clouds
             """
             # concatenate
    -        #try:
    +        # try:
             #    x = torch.cat([*args], dim=1)
    -        #except:
    +        # except:
             #    for arg in args:
             #        print(arg.shape)
             #    raise
    @@ -193,6 +189,7 @@ 

    Source code for molearn.models.foldingnet

     
             return x
     
    +
     class Decoder_Layer(nn.Module):
         '''
         Decoder Module of FoldingNet
    @@ -202,14 +199,14 @@ 

    Source code for molearn.models.foldingnet

             super(Decoder_Layer, self).__init__()
     
             # Sample the grids in 2D space
    -        #xx = np.linspace(-0.3, 0.3, 45, dtype=np.float32)
    -        #yy = np.linspace(-0.3, 0.3, 45, dtype=np.float32)
    -        #self.grid = np.meshgrid(xx, yy)   # (2, 45, 45)
    +        # xx = np.linspace(-0.3, 0.3, 45, dtype=np.float32)
    +        # yy = np.linspace(-0.3, 0.3, 45, dtype=np.float32)
    +        # self.grid = np.meshgrid(xx, yy)   # (2, 45, 45)
             self.out_points = out_points
             self.grid = torch.linspace(-0.5, 0.5, out_points).view(1,-1)
             # reshape
    -        #self.grid = torch.Tensor(self.grid).view(2, -1)  # (2, 45, 45) -> (2, 45 * 45)
    -        assert out_points%in_points==0
    +        # self.grid = torch.Tensor(self.grid).view(2, -1)  # (2, 45, 45) -> (2, 45 * 45)
    +        assert out_points % in_points == 0
             self.m = out_points//in_points
     
             self.fold1 = FoldingLayer(in_channel + 1, [512, 512, out_channel])
    @@ -234,6 +231,7 @@ 

    Source code for molearn.models.foldingnet

     
             return recon2
     
    +
     class Decoder(nn.Module):
         '''
         Decoder Module of FoldingNet
    @@ -244,14 +242,12 @@ 

    Source code for molearn.models.foldingnet

             self.latent_dimension = latent_dimension
     
             # Sample the grids in 2D space
    -        #xx = np.linspace(-0.3, 0.3, 45, dtype=np.float32)
    -        #yy = np.linspace(-0.3, 0.3, 45, dtype=np.float32)
    -        #self.grid = np.meshgrid(xx, yy)   # (2, 45, 45)
    +        # xx = np.linspace(-0.3, 0.3, 45, dtype=np.float32)
    +        # yy = np.linspace(-0.3, 0.3, 45, dtype=np.float32)
    +        # self.grid = np.meshgrid(xx, yy)   # (2, 45, 45)
     
    -        
             start_out = (out_points//128) +1
     
    -
             self.out_points = out_points
     
             self.layer1 = Decoder_Layer(1,           start_out,    latent_dimension,3*128)
    @@ -272,7 +268,9 @@ 

    Source code for molearn.models.foldingnet

             return x
     
     
    -
    [docs]class AutoEncoder(nn.Module): +
    +[docs] +class AutoEncoder(nn.Module): ''' Autoencoder architecture derived from FoldingNet. ''' @@ -289,10 +287,14 @@

    Source code for molearn.models.foldingnet

         def decode(self, x):
             return self.decoder(x)
     
    -
    [docs] def forward(self, x): +
    +[docs] + def forward(self, x): x = self.encoder(x) x = self.decoder(x) - return x
    + return x
    +
    + if __name__=='__main__': @@ -334,8 +336,8 @@

    Navigation

    \ No newline at end of file diff --git a/docs/build/_modules/molearn/scoring/dope_score.html b/docs/build/_modules/molearn/scoring/dope_score.html index 0725482..7c51821 100644 --- a/docs/build/_modules/molearn/scoring/dope_score.html +++ b/docs/build/_modules/molearn/scoring/dope_score.html @@ -1,18 +1,15 @@ - - + molearn.scoring.dope_score — molearn 2.0.1 documentation - - - - - - - + + + + + @@ -40,7 +37,7 @@

    Source code for molearn.scoring.dope_score

     import numpy as np
     from copy import deepcopy
     
    -from ..utils import ShutUp, cpu_count, random_string
    +from ..utils import ShutUp, random_string
     try:
         import modeller
         from modeller import *
    @@ -49,22 +46,25 @@ 

    Source code for molearn.scoring.dope_score

     except Exception as e:
         print('Error importing modeller: ')
         print(e)
    -    
     
    -from multiprocessing import Pool, Event, get_context
    +from multiprocessing import get_context
     import os
         
    -
    [docs]class DOPE_Score: + +
    +[docs] +class DOPE_Score: ''' This class contains methods to calculate dope without saving to save and load PDB files for every structure. Atoms in a biobox coordinate tensor are mapped to the coordinates in the modeller model directly. ''' + atom_map = {('ILE', 'CD1'):('ILE', 'CD')} def __init__(self, mol): ''' :param biobox.Molecule mol: One example frame to gain access to the topology. Mol will also be used to save a temporary pdb file that will be reloaded in modeller to create the initial modeller Model. ''' - #set residues names with protonated histidines back to generic HIS name (needed by DOPE score function) + # set residues names with protonated histidines back to generic HIS name (needed by DOPE score function) testH = mol.data["resname"].values testH[testH == "HIE"] = "HIS" testH[testH == "HID"] = "HIS" @@ -73,10 +73,9 @@

    Source code for molearn.scoring.dope_score

     
             alternate_residue_names = dict(CSS=('CYX',))
             atoms = ' '.join(list(_mol.data['name'].unique()))
    -        #tmp_file = f'tmp{np.random.randint(1e10)}.pdb'
             tmp_file = f'tmp{random_string()}.pdb'
    -        _mol.write_pdb(tmp_file, conformations=[0], split_struc = False)
    -        log.level(0,0,0,0,0)
    +        _mol.write_pdb(tmp_file, conformations=[0], split_struc=False)
    +        log.level(0, 0, 0, 0, 0)
             env = environ()
             env.libs.topology.read(file='$(LIB)/top_heav.lib')
             env.libs.parameters.read(file='$(LIB)/par.lib')
    @@ -86,7 +85,7 @@ 

    Source code for molearn.scoring.dope_score

             atom_residue = _mol.get_data(columns=['name', 'resname', 'resid'])
             atom_order = []
             first_index = next(iter(self.fast_ss)).residue.index
    -        offset = atom_residue[0,2]-first_index
    +        offset = atom_residue[0, 2]-first_index
             for i, j in enumerate(self.fast_ss):
                 if i < len(atom_residue):
                     for j_residue_name in alternate_residue_names.get(j.residue.name, (j.residue.name,)):
    @@ -95,16 +94,26 @@ 

    Source code for molearn.scoring.dope_score

                         else:
                             where_arg = (atom_residue==(np.array([j.name, j_residue_name, j.residue.index+offset], dtype=object))).all(axis=1)
                             where = np.where(where_arg)[0]
    +                        if len(where)==0:
    +                            if (j_residue_name, j.name) in self.atom_map:
    +                                alt_residue_name, alt_name = self.atom_map[(j_residue_name, j.name)]
    +                                where_arg = (atom_residue==(np.array([alt_name, alt_residue_name, j.residue.index+offset], dtype=object))).all(axis=1)
    +                                where = np.where(where_arg)[0]
    +                            else:
    +                                print(f'Cant find {j.name} in the atoms {atom_residue[atom_residue[:,2]==j.residue.index+offset]} try adding a mapping to DOPE_Score.atom_map')
                             atom_order.append(int(where))
             self.fast_atom_order = atom_order
             # check fast dope atoms
    -        for i,j in enumerate(self.fast_ss):
    +        reverse_map = {value:key for key, value in self.atom_map.items()}
    +        for i, j in enumerate(self.fast_ss):
                 if i<len(atom_residue):
    -                assert _mol.data['name'][atom_order[i]]==j.name
    +                assert _mol.data['name'][atom_order[i]]==j.name or reverse_map[(_mol.data['resname'][atom_order[i]], _mol.data['name'][atom_order[i]])][1]==j.name
             self.cg = ConjugateGradients()
             os.remove(tmp_file)
     
    -
    [docs] def get_dope(self, frame, refine=False): +
    +[docs] + def get_dope(self, frame, refine=False): ''' Get the dope score. Injects coordinates into modeller and uses `mdl.build(build_method='INTERNAL_COORDINATES', initialize_xyz=False)` to reconstruct missing atoms. If a error is thrown by modeller or at any stage, we just return a fixed large value of 1e10. @@ -114,6 +123,7 @@

    Source code for molearn.scoring.dope_score

             :returns: Dope score as calculated by modeller. If error is thrown we just simply return 1e10.
             :rtype: float
             '''
    +        
             # expect coords to be shape [N, 3] use .cpu().numpy().copy() before passing here and make sure it is scaled correctly
             try:
                 frame = frame.astype(float)
    @@ -135,10 +145,13 @@ 

    Source code for molearn.scoring.dope_score

                     dope_score = self.fast_fs.assess_dope()
     
                 return dope_score
    -        except:
    +        except Exception:
                 return 1e10
    + -
    [docs] def get_all_dope(self, coords, refine=False): +
    +[docs] + def get_all_dope(self, coords, refine=False): ''' Expect a array of frames. return array of DOPE score value. @@ -147,6 +160,7 @@

    Source code for molearn.scoring.dope_score

             :returns: float array shape [B]
             :rtype: np.ndarray
             '''
    +        
             # expect coords to be shape [B, N, 3] use .cpu().numpy().copy() before passing here and make sure it is scaled correctly
             dope_scores = []
             for frame in coords:
    @@ -162,23 +176,32 @@ 

    Source code for molearn.scoring.dope_score

                     
                 dope_scores.append(self.fast_fs.assess_dope())
                 
    -        return np.array(dope_scores)
    + return np.array(dope_scores)
    +
    + + def set_global_score(score, kwargs): ''' Make score a global variable. This is used when initializing a multiprocessing process. ''' + global worker_dope_score - worker_dope_score = score(**kwargs)#mol = mol, data_dir=data_dir, **kwargs) + worker_dope_score = score(**kwargs) # mol = mol, data_dir=data_dir, **kwargs) + def process_dope(coords, kwargs): ''' Worker function for multiprocessing class ''' + return worker_dope_score.get_dope(coords,**kwargs) -
    [docs]class Parallel_DOPE_Score(): + +
    +[docs] +class Parallel_DOPE_Score: ''' a multiprocessing class to get modeller DOPE scores. A typical use case would looke like:: @@ -190,9 +213,9 @@

    Source code for molearn.scoring.dope_score

           .... # DOPE will be calculated asynchronously in background
           #to retrieve the results
           results = np.array([r.get() for r in results])
    -
         '''
    -    def __init__(self, mol, processes=-1, context = 'spawn', **kwargs):
    +    
    +    def __init__(self, mol, processes=-1, context='spawn', **kwargs):
             '''
             :param biobox.Molecule mol: biobox molecule containing one example frame of the protein to be analysed. This will be passed to DOPE_Score class instances in each thread.
             :param int processes: (default: -1) Number of processes argument to pass to multiprocessing.pool. This controls the number of threads created.
    @@ -201,28 +224,32 @@ 

    Source code for molearn.scoring.dope_score

             
             # set a number of processes as user desires, capped on number of CPUs
             if processes > 0:
    -            processes = min(processes, cpu_count())
    +            processes = min(processes, os.cpu_count())
             else:
    -            processes = cpu_count()
    +            processes = os.cpu_count()
             self.processes = processes
             self.mol = deepcopy(mol)
             score = DOPE_Score
             ctx = get_context(context)
             self.pool = ctx.Pool(processes=processes, initializer=set_global_score,
                              initargs=(score, dict(mol=mol)),
    -                         **kwargs,
    -                         )
    +                         **kwargs)
             self.process_function = process_dope
     
         def __reduce__(self):
             return (self.__class__, (self.mol, self.processes))
     
    -
    [docs] def get_score(self, coords, **kwargs): +
    +[docs] + def get_score(self, coords, **kwargs): ''' :param np.array coords: # shape (N, 3) numpy array ''' - #is copy necessary? - return self.pool.apply_async(self.process_function, (coords.copy(), kwargs))
    + + # is copy necessary? + return self.pool.apply_async(self.process_function, (coords.copy(), kwargs))
    +
    +
    @@ -260,8 +287,8 @@

    Navigation

    \ No newline at end of file diff --git a/docs/build/_modules/molearn/scoring/ramachandran_score.html b/docs/build/_modules/molearn/scoring/ramachandran_score.html index b480e8b..7271dff 100644 --- a/docs/build/_modules/molearn/scoring/ramachandran_score.html +++ b/docs/build/_modules/molearn/scoring/ramachandran_score.html @@ -1,18 +1,15 @@ - - + molearn.scoring.ramachandran_score — molearn 2.0.1 documentation - - - - - - - + + + + + @@ -39,36 +36,41 @@

    Navigation

    Source code for molearn.scoring.ramachandran_score

     import numpy as np
     from copy import deepcopy
    -from multiprocessing import Pool, Event, get_context
    +from multiprocessing import get_context
     from scipy.spatial.distance import cdist
     
     from iotbx.data_manager import DataManager
     from mmtbx.validation.ramalyze import ramalyze
     from scitbx.array_family import flex
     
    -from ..utils import cpu_count, random_string
    +from ..utils import random_string
     import os
     
    -
    [docs]class Ramachandran_Score(): + +
    +[docs] +class Ramachandran_Score: ''' This class contains methods that use iotbx/mmtbx to calulate the quality of phi and psi values in a protein. ''' + def __init__(self, mol, threshold=1e-3): ''' :param biobox.Molecule mol: One example frame to gain access to the topology. Mol will also be used to save a temporary pdb file that will be reloaded to create the initial iotbx Model. :param float threshold: (default: 1e-3) Threshold used to determine similarity between biobox.molecule coordinates and iotbx model coordinates. Determine that iotbx model was created successfully. ''' + tmp_file = f'rama_tmp{random_string()}.pdb' - mol.write_pdb(tmp_file, split_struc = False)#'rama_tmp.pdb') - filename = tmp_file#'rama_tmp.pdb' + mol.write_pdb(tmp_file, split_struc=False) + filename = tmp_file self.mol = mol - self.dm = DataManager(datatypes = ['model']) + self.dm = DataManager(datatypes=['model']) self.dm.process_model_file(filename) self.model = self.dm.get_model(filename) - self.score = ramalyze(self.model.get_hierarchy()) # get score to see if this works + self.score = ramalyze(self.model.get_hierarchy()) # get score to see if this works self.shape = self.model.get_sites_cart().as_numpy_array().shape - #tests + # tests x = self.mol.coordinates[0] m = self.model.get_sites_cart().as_numpy_array() assert m.shape == x.shape @@ -77,15 +79,17 @@

    Source code for molearn.scoring.ramachandran_score

    assert not np.any(((m-x[self.idxs])>threshold)) os.remove(tmp_file) -
    [docs] def get_score(self, coords, as_ratio = False): +
    +[docs] + def get_score(self, coords, as_ratio=False): ''' Given coords (corresponding to self.mol) will calculate Ramachandran scores using cctbux ramalyze module Returns the counts of number of torsion angles that fall within favored, allowed, and outlier regions and finally the total number of torsion angles analysed. :param numpy.ndarray coords: shape (N, 3) :returns: (favored, allowed, outliers, total) :rtype: tuple of ints - ''' + assert coords.shape == self.shape self.model.set_sites_cart(flex.vec3_double(coords[self.idxs].astype(np.double))) self.score = ramalyze(self.model.get_hierarchy()) @@ -96,7 +100,8 @@

    Source code for molearn.scoring.ramachandran_score

    if as_ratio: return nf/nt, na/nt, no/nt else: - return nf, na, no, nt
    + return nf, na, no, nt
    +
    @@ -105,17 +110,23 @@

    Source code for molearn.scoring.ramachandran_score

    make score a global variable This is used when initializing a multiprocessing process ''' + global worker_ramachandran_score - worker_ramachandran_score = score(**kwargs)#mol = mol, data_dir=data_dir, **kwargs) + worker_ramachandran_score = score(**kwargs) # mol = mol, data_dir=data_dir, **kwargs) + def process_ramachandran(coords, kwargs): ''' ramachandran worker Worker function for multiprocessing class ''' - return worker_ramachandran_score.get_score(coords,**kwargs) + + return worker_ramachandran_score.get_score(coords, **kwargs) -
    [docs]class Parallel_Ramachandran_Score(): + +
    +[docs] +class Parallel_Ramachandran_Score: ''' A multiprocessing class to get Ramachandran scores. A typical use case would looke like:: @@ -143,31 +154,30 @@

    Source code for molearn.scoring.ramachandran_score

    # set a number of processes as user desires, capped on number of CPUs if processes > 0: - processes = min(processes, cpu_count()) + processes = min(processes, os.cpu_count()) else: - processes = cpu_count() + processes = os.cpu_count() self.mol = deepcopy(mol) score = Ramachandran_Score ctx = get_context('spawn') self.pool = ctx.Pool(processes=processes, initializer=set_global_score, - initargs=(score, dict(mol=mol)), - ) + initargs=(score, dict(mol=mol))) self.process_function = process_ramachandran def __reduce__(self): return (self.__class__, (self.mol,)) - -
    [docs] def get_score(self, coords,**kwargs): +
    +[docs] + def get_score(self, coords, **kwargs): ''' :param coords: # shape (N, 3) numpy array ''' - #is copy necessary? - return self.pool.apply_async(self.process_function, (coords.copy(), kwargs))
    - - + # is copy necessary? + return self.pool.apply_async(self.process_function, (coords.copy(), kwargs))
    +
    @@ -206,8 +216,8 @@

    Navigation

    \ No newline at end of file diff --git a/docs/build/_modules/molearn/trainers/openmm_physics_trainer.html b/docs/build/_modules/molearn/trainers/openmm_physics_trainer.html index b81d016..288c404 100644 --- a/docs/build/_modules/molearn/trainers/openmm_physics_trainer.html +++ b/docs/build/_modules/molearn/trainers/openmm_physics_trainer.html @@ -1,18 +1,15 @@ - - + molearn.trainers.openmm_physics_trainer — molearn 2.0.1 documentation - - - - - - - + + + + + @@ -42,7 +39,9 @@

    Source code for molearn.trainers.openmm_physics_trainer

    from .trainer import Trainer -
    [docs]class OpenMM_Physics_Trainer(Trainer): +
    +[docs] +class OpenMM_Physics_Trainer(Trainer): ''' OpenMM_Physics_Trainer subclasses Trainer and replaces the valid_step and train_step. An extra 'physics_loss' is calculated using OpenMM and the forces are inserted into backwards pass. @@ -52,7 +51,9 @@

    Source code for molearn.trainers.openmm_physics_trainer

    def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) -
    [docs] def prepare_physics(self, physics_scaling_factor=0.1, clamp_threshold = 1e8, clamp=False, start_physics_at=0, **kwargs): +
    +[docs] + def prepare_physics(self, physics_scaling_factor=0.1, clamp_threshold=1e8, clamp=False, start_physics_at=0, **kwargs): ''' Create ``self.physics_loss`` object from :func:`loss_functions.openmm_energy <molearn.loss_functions.openmm_energy>` Needs ``self.mol``, ``self.std``, and ``self._data.atoms`` to have been set with :func:`Trainer.set_data<molearn.trainer.Trainer.set_data>` @@ -67,13 +68,15 @@

    Source code for molearn.trainers.openmm_physics_trainer

    self.start_physics_at = start_physics_at self.psf = physics_scaling_factor if clamp: - clamp_kwargs = dict(max=clamp_threshold, min = -clamp_threshold) + clamp_kwargs = dict(max=clamp_threshold, min=-clamp_threshold) else: clamp_kwargs = None - self.physics_loss = openmm_energy(self.mol, self.std, clamp=clamp_kwargs, platform = 'CUDA' if self.device == torch.device('cuda') else 'Reference', atoms = self._data.atoms, **kwargs)
    + self.physics_loss = openmm_energy(self.mol, self.std, clamp=clamp_kwargs, platform='CUDA' if self.device == torch.device('cuda') else 'Reference', atoms=self._data.atoms, **kwargs)
    -
    [docs] def common_physics_step(self, batch, latent): +
    +[docs] + def common_physics_step(self, batch, latent): ''' Called from both :func:`train_step <molearn.trainers.OpenMM_Physics_Trainer.train_step>` and :func:`valid_step <molearn.trainers.OpenMM_Physics_Trainer.valid_step>`. Takes random interpolations between adjacent samples latent vectors. These are decoded (decoded structures saved as ``self._internal['generated'] = generated if needed elsewhere) and the energy terms calculated with ``self.physics_loss``. @@ -84,16 +87,19 @@

    Source code for molearn.trainers.openmm_physics_trainer

    alpha = torch.rand(int(len(batch)//2), 1, 1).type_as(latent) latent_interpolated = (1-alpha)*latent[:-1:2] + alpha*latent[1::2] - generated = self.autoencoder.decode(latent_interpolated)[:,:,:batch.size(2)] + generated = self.autoencoder.decode(latent_interpolated)[:, :, :batch.size(2)] self._internal['generated'] = generated energy = self.physics_loss(generated) - energy[energy.isinf()]=1e35 + energy[energy.isinf()] = 1e35 energy = torch.clamp(energy, max=1e34) energy = energy.nanmean() - return {'physics_loss':energy}#a if not energy.isinf() else torch.tensor(0.0)}
    + return {'physics_loss':energy} # a if not energy.isinf() else torch.tensor(0.0)}
    + -
    [docs] def train_step(self, batch): +
    +[docs] + def train_step(self, batch): ''' This method overrides :func:`Trainer.train_step <molearn.trainers.Trainer.train_step>` and adds an additional 'Physics_loss' term. @@ -115,7 +121,10 @@

    Source code for molearn.trainers.openmm_physics_trainer

    results['loss'] = final_loss return results
    -
    [docs] def valid_step(self, batch): + +
    +[docs] + def valid_step(self, batch): ''' This method overrides :func:`Trainer.valid_step <molearn.trainers.Trainer.valid_step>` and adds an additional 'Physics_loss' term. @@ -131,10 +140,13 @@

    Source code for molearn.trainers.openmm_physics_trainer

    results = self.common_step(batch) results.update(self.common_physics_step(batch, self._internal['encoded'])) - #scale = (self.psf*results['mse_loss'])/(results['physics_loss'] +1e-5) + # scale = (self.psf*results['mse_loss'])/(results['physics_loss'] +1e-5) final_loss = torch.log(results['mse_loss'])+self.psf*torch.log(results['physics_loss']) results['loss'] = final_loss - return results
    + return results
    +
    + + if __name__=='__main__': pass @@ -175,8 +187,8 @@

    Navigation

    \ No newline at end of file diff --git a/docs/build/_modules/molearn/trainers/torch_physics_trainer.html b/docs/build/_modules/molearn/trainers/torch_physics_trainer.html index 7082761..6a30ff5 100644 --- a/docs/build/_modules/molearn/trainers/torch_physics_trainer.html +++ b/docs/build/_modules/molearn/trainers/torch_physics_trainer.html @@ -1,18 +1,15 @@ - - + molearn.trainers.torch_physics_trainer — molearn 2.0.1 documentation - - - - - - - + + + + + @@ -41,7 +38,10 @@

    Source code for molearn.trainers.torch_physics_trainer

    from molearn.loss_functions import TorchProteinEnergy from .trainer import Trainer -
    [docs]class Torch_Physics_Trainer(Trainer): + +
    +[docs] +class Torch_Physics_Trainer(Trainer): ''' Torch_Physics_Trainer subclasses Trainer and replaces the valid_step and train_step. An extra 'physics_loss' (bonds, angles, and torsions) is calculated using pytorch. @@ -50,16 +50,21 @@

    Source code for molearn.trainers.torch_physics_trainer

    def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) -
    [docs] def prepare_physics(self, physics_scaling_factor=0.1): +
    +[docs] + def prepare_physics(self, physics_scaling_factor=0.1): ''' Create ``self.physics_loss`` object from :func:`loss_functions.TorchProteinEnergy <molearn.loss_functions.TorchProteinEnergy>` Needs ``self.std``, ``self._data`` to have been set with :func:`Trainer.set_data <molearn.trainer.Trainer.set_data>` :param float physics_scaling_factor: (default: 0.1) scaling factor saved to ``self.psf`` that is used in :func: `train_step <molearn.trainers.Torch_Physics_Trainer.train_step>` It will control the relative importance of mse_loss and physics_loss in training. ''' self.psf = physics_scaling_factor - self.physics_loss = TorchProteinEnergy(self._data.dataset[0]*self.std, pdb_atom_names = self._data.get_atominfo(), device = self.device, method = 'roll')
    + self.physics_loss = TorchProteinEnergy(self._data.dataset[0]*self.std, pdb_atom_names=self._data.get_atominfo(), device=self.device, method='roll')
    -
    [docs] def common_physics_step(self, batch, latent): + +
    +[docs] + def common_physics_step(self, batch, latent): ''' Called from both :func:`train_step <molearn.trainers.Torch_Physics_Trainer.train_step>` and :func:`valid_step <molearn.trainers.Torch_Physics_Trainer.valid_step>`. Takes random interpolations between adjacent samples latent vectors. These are decoded (decoded structures saved as ``self._internal['generated'] = generated if needed elsewhere) and the energy terms calculated with ``self.physics_loss``. @@ -69,8 +74,8 @@

    Source code for molearn.trainers.torch_physics_trainer

    ''' alpha = torch.rand(int(len(batch)//2), 1, 1).type_as(latent) latent_interpolated = (1-alpha)*latent[:-1:2] + alpha*latent[1::2] - generated = self.autoencoder.decode(latent_interpolated)[:,:,:batch.size(2)] - bond, angle, torsion = self.physics_loss._roll_bond_angle_torsion_loss(generated*self.std) + generated = self.autoencoder.decode(latent_interpolated)[:, :, :batch.size(2)] + bond, angle, torsion = self.physics_loss._roll_bond_angle_torsion_loss(generated*self.std) n = len(generated) bond/=n angle/=n @@ -78,12 +83,14 @@

    Source code for molearn.trainers.torch_physics_trainer

    _all = torch.tensor([bond, angle, torsion]) _all[_all.isinf()]=1e35 total_physics = _all.nansum() - #total_physics = torch.nansum(torch.tensor([bond ,angle ,torsion])) + # total_physics = torch.nansum(torch.tensor([bond ,angle ,torsion])) return {'physics_loss':total_physics, 'bond_energy':bond, 'angle_energy':angle, 'torsion_energy':torsion}
    -
    [docs] def train_step(self, batch): +
    +[docs] + def train_step(self, batch): ''' This method overrides :func:`Trainer.train_step <molearn.trainers.Trainer.train_step>` and adds an additional 'Physics_loss' term. @@ -104,7 +111,10 @@

    Source code for molearn.trainers.torch_physics_trainer

    results['loss'] = final_loss return results
    -
    [docs] def valid_step(self, batch): + +
    +[docs] + def valid_step(self, batch): ''' This method overrides :func:`Trainer.valid_step <molearn.trainers.Trainer.valid_step>` and adds an additional 'Physics_loss' term. @@ -119,10 +129,12 @@

    Source code for molearn.trainers.torch_physics_trainer

    ''' results = self.common_step(batch) results.update(self.common_physics_step(batch, self._internal['encoded'])) - #scale = self.psf*results['mse_loss']/(results['physics_loss']+1e-5) + # scale = self.psf*results['mse_loss']/(results['physics_loss']+1e-5) final_loss = torch.log(results['mse_loss'])+self.psf*torch.log(results['physics_loss']) results['loss'] = final_loss - return results
    + return results
    +
    + if __name__=='__main__': @@ -164,8 +176,8 @@

    Navigation

    \ No newline at end of file diff --git a/docs/build/_modules/molearn/trainers/trainer.html b/docs/build/_modules/molearn/trainers/trainer.html index 062b4bf..54ac44a 100644 --- a/docs/build/_modules/molearn/trainers/trainer.html +++ b/docs/build/_modules/molearn/trainers/trainer.html @@ -1,18 +1,15 @@ - - + molearn.trainers.trainer — molearn 2.0.1 documentation - - - - - - - + + + + + @@ -44,14 +41,16 @@

    Source code for molearn.trainers.trainer

     import time
     import torch
     from molearn.data import PDBData
    -import warnings
    -from decimal import Decimal
     import json
     
    +
     class TrainingFailure(Exception):
         pass
     
    -
    [docs]class Trainer(): + +
    +[docs] +class Trainer: ''' Trainer class that defines a number of useful methods for training an autoencoder. @@ -70,9 +69,7 @@

    Source code for molearn.trainers.trainer

     
         '''
         
    -
    -
    -    def __init__(self, device = None, log_filename = 'log_file.dat'):
    +    def __init__(self, device=None, log_filename='log_file.dat'):
             '''
             :param torch.Device device: if not given will be determinined automatically based on torch.cuda.is_available()
             :param str log_filename: (default: 'default_log_filename.json') file used to log outputs to
    @@ -90,7 +87,9 @@ 

    Source code for molearn.trainers.trainer

             self.log_filename = 'default_log_filename.json'
             self.scheduler_key = None
     
    -
    [docs] def get_network_summary(self,): +
    +[docs] + def get_network_summary(self): ''' returns a dictionary containing information about the size of the autoencoder. ''' @@ -98,15 +97,17 @@

    Source code for molearn.trainers.trainer

                 return sum(p.numel() for p in model.parameters() if (p.requires_grad and trainable_only))
     
             return dict(
    -            encoder_trainable = get_parameters(True, self.autoencoder.encoder),
    -            encoder_total = get_parameters(False, self.autoencoder.encoder),
    -            decoder_trainable = get_parameters(True, self.autoencoder.decoder),
    -            decoder_total = get_parameters(False, self.autoencoder.decoder),
    -            autoencoder_trainable = get_parameters(True, self.autoencoder),
    -            autoencoder_total = get_parameters(False, self.autoencoder),
    -                      )
    - -
    [docs] def set_autoencoder(self, autoencoder, **kwargs): + encoder_trainable=get_parameters(True, self.autoencoder.encoder), + encoder_total=get_parameters(False, self.autoencoder.encoder), + decoder_trainable=get_parameters(True, self.autoencoder.decoder), + decoder_total=get_parameters(False, self.autoencoder.decoder), + autoencoder_trainable=get_parameters(True, self.autoencoder), + autoencoder_total=get_parameters(False, self.autoencoder))
    + + +
    +[docs] + def set_autoencoder(self, autoencoder, **kwargs): ''' :param autoencoder: (:func:`autoencoder <molearn.models>`,) torch network class that implements ``autoencoder.encode``, and ``autoencoder.decode``. Please pass the class not the instance :param \*\*kwargs: any other kwargs given to this method will be used to initialise the network ``self.autoencoder = autoencoder(**kwargs)`` @@ -117,7 +118,10 @@

    Source code for molearn.trainers.trainer

                 self.autoencoder = autoencoder.to(self.device)
             self._autoencoder_kwargs = kwargs
    -
    [docs] def set_dataloader(self, train_dataloader=None, valid_dataloader=None): + +
    +[docs] + def set_dataloader(self, train_dataloader=None, valid_dataloader=None): ''' :param torch.DataLoader train_dataloader: Alternatively set using ``trainer.train_dataloader = dataloader`` :param torch.DataLoader valid_dataloader: Alternatively set using ``trainer.valid_dataloader = dataloader`` @@ -127,7 +131,10 @@

    Source code for molearn.trainers.trainer

             if valid_dataloader is not None:
                 self.valid_dataloader = valid_dataloader
    -
    [docs] def set_data(self, data, **kwargs): + +
    +[docs] + def set_data(self, data, **kwargs): ''' Sets up internal variables and gives trainer access to dataloaders. ``self.train_dataloader``, ``self.valid_dataloader``, ``self.std``, ``self.mean``, ``self.mol`` will all be obtained from this object. @@ -146,7 +153,9 @@

    Source code for molearn.trainers.trainer

             self._data = data
    -
    [docs] def prepare_optimiser(self, lr = 1e-3, weight_decay = 0.0001, **optimiser_kwargs): +
    +[docs] + def prepare_optimiser(self, lr=1e-3, weight_decay=0.0001, **optimiser_kwargs): ''' The Default optimiser is ``AdamW`` and is saved in ``self.optimiser``. With no optional arguments this function is the same as doing: @@ -156,9 +165,12 @@

    Source code for molearn.trainers.trainer

             :param float weight_decay: (default: 0.0001) optimiser weight_decay
             :param \*\*optimiser_kwargs: other kwargs that are passed onto AdamW
             '''
    -        self.optimiser = torch.optim.AdamW(self.autoencoder.parameters(), lr=lr, weight_decay = weight_decay, **optimiser_kwargs)
    + self.optimiser = torch.optim.AdamW(self.autoencoder.parameters(), lr=lr, weight_decay=weight_decay, **optimiser_kwargs)
    -
    [docs] def log(self, log_dict, verbose=None): + +
    +[docs] + def log(self, log_dict, verbose=None): ''' Then contents of log_dict are dumped using ``json.dumps(log_dict)`` and printed and/or appended to ``self.log_filename`` This function is called from :func:`self.run <molearn.trainers.Trainer.run>` @@ -173,7 +185,10 @@

    Source code for molearn.trainers.trainer

             with open(self.log_filename, 'a') as f:
                 f.write(dump+'\n')
    -
    [docs] def scheduler_step(self, logs): + +
    +[docs] + def scheduler_step(self, logs): ''' This function does nothing. It is called after :func:`self.valid_epoch <molearn.trainers.Trainer.valid_epoch>` in :func:`Trainer.run() <molearn.trainers.Trainer.run>` and before :func:`checkpointing <molearn.trainers.Trainer.checkpoint>`. It is designed to be overridden if you wish to use a scheduler. @@ -181,7 +196,10 @@

    Source code for molearn.trainers.trainer

             '''
             pass
    -
    [docs] def run(self, max_epochs=100, log_filename = None, log_folder=None, checkpoint_frequency=1, checkpoint_folder='checkpoint_folder', allow_n_failures=10, verbose=None): + +
    +[docs] + def run(self, max_epochs=100, log_filename=None, log_folder=None, checkpoint_frequency=1, checkpoint_folder='checkpoint_folder', allow_n_failures=10, verbose=None): ''' Calls the following in a loop: @@ -222,20 +240,20 @@

    Source code for molearn.trainers.trainer

                         self.scheduler_step(logs)
                         if self.best is None or self.best > logs['valid_loss']:
                             self.checkpoint(epoch, logs, checkpoint_folder)
    -                    elif epoch%checkpoint_frequency==0:
    +                    elif epoch % checkpoint_frequency == 0:
                             self.checkpoint(epoch, logs, checkpoint_folder)
                         time4 = time.time()
    -                    logs.update(epoch = epoch,
    +                    logs.update(epoch=epoch,
                                 train_seconds=time2-time1,
                                 valid_seconds=time3-time2,
    -                            checkpoint_seconds= time4-time3,
    +                            checkpoint_seconds=time4-time3,
                                 total_seconds=time4-time1)
                         self.log(logs)
                         if np.isnan(logs['valid_loss']) or np.isnan(logs['train_loss']):
                             raise TrainingFailure('nan received, failing')
                         self.epoch+= 1
                 except TrainingFailure:
    -                if attempt==(allow_n_failures-1):
    +                if attempt == (allow_n_failures-1):
                         failure_message = f'Training Failure due to Nan in attempt {attempt}, end now/n'
                         self.log({'Failure':failure_message})
                         raise TrainingFailure('nan received, failing')
    @@ -247,7 +265,9 @@ 

    Source code for molearn.trainers.trainer

                     break
    -
    [docs] def train_epoch(self,epoch): +
    +[docs] + def train_epoch(self,epoch): ''' Train one epoch. Called once an epoch from :func:`trainer.run <molearn.trainers.Trainer.run>` This method performs the following functions: @@ -282,7 +302,10 @@

    Source code for molearn.trainers.trainer

                 N+=len(batch)
             return {f'train_{key}': results[key]/N for key in results.keys()}
    -
    [docs] def train_step(self, batch): + +
    +[docs] + def train_step(self, batch): ''' Called from :func:`Trainer.train_epoch <molearn.trainers.Trainer.train_epoch>`. @@ -294,7 +317,10 @@

    Source code for molearn.trainers.trainer

             results['loss'] = results['mse_loss']
             return results
    -
    [docs] def common_step(self, batch): + +
    +[docs] + def common_step(self, batch): ''' Called from both train_step and valid_step. Calculates the mean squared error loss for self.autoencoder. @@ -309,10 +335,12 @@

    Source code for molearn.trainers.trainer

             self._internal['encoded'] = encoded
             decoded = self.autoencoder.decode(encoded)[:,:,:batch.size(2)]
             self._internal['decoded'] = decoded
    -        return dict(mse_loss = ((batch-decoded)**2).mean())
    + return dict(mse_loss=((batch-decoded)**2).mean())
    -
    [docs] def valid_epoch(self,epoch): +
    +[docs] + def valid_epoch(self, epoch): ''' Called once an epoch from :func:`trainer.run <molearn.trainers.Trainer.run>` within a no_grad context. This method performs the following functions: @@ -340,7 +368,10 @@

    Source code for molearn.trainers.trainer

                 N+=len(batch)
             return {f'valid_{key}': results[key]/N for key in results.keys()}
    -
    [docs] def valid_step(self, batch): + +
    +[docs] + def valid_step(self, batch): ''' Called from :func:`Trainer.valid_epoch<molearn.trainer.Trainer.valid_epoch>` on every mini-batch. @@ -352,7 +383,10 @@

    Source code for molearn.trainers.trainer

             results['loss'] = results['mse_loss']
             return results
    -
    [docs] def learning_rate_sweep(self, max_lr=100, min_lr=1e-5, number_of_iterations=1000, checkpoint_folder='checkpoint_sweep',train_on='mse_loss', save=['loss', 'mse_loss']): + +
    +[docs] + def learning_rate_sweep(self, max_lr=100, min_lr=1e-5, number_of_iterations=1000, checkpoint_folder='checkpoint_sweep', train_on='mse_loss', save=['loss', 'mse_loss']): ''' Deprecated method. Performs a sweep of learning rate between ``max_lr`` and ``min_lr`` over ``number_of_iterations``. @@ -367,10 +401,12 @@

    Source code for molearn.trainers.trainer

             :rtype: numpy.ndarray
             '''
             self.autoencoder.train()
    +        
             def cycle(iterable):
                 while True:
                     for i in iterable:
                         yield i
    +                    
             init_loss = 0.0
             values = []
             data = iter(cycle(self.train_dataloader))
    @@ -381,20 +417,22 @@ 

    Source code for molearn.trainers.trainer

     
                 self.optimiser.zero_grad()
                 result = self.train_step(batch)
    -            #result['loss']/=len(batch)
    +            # result['loss']/=len(batch)
                 result[train_on].backward()
                 self.optimiser.step()
                 values.append((lr,)+tuple((result[name].item() for name in save)))
    -            #print(i,lr, result['loss'].item())
                 if i==0:
                     init_loss = result[train_on].item()
    -            #if result[train_on].item()>1e6*init_loss:
    +            # if result[train_on].item()>1e6*init_loss:
                 #    break
             values = np.array(values)
             print('min value ', values[np.nanargmin(values[:,1])])
             return values
    -
    [docs] def update_optimiser_hyperparameters(self, **kwargs): + +
    +[docs] + def update_optimiser_hyperparameters(self, **kwargs): ''' Update optimeser hyperparameter e.g. ``trainer.update_optimiser_hyperparameters(lr = 1e3)`` @@ -404,7 +442,10 @@

    Source code for molearn.trainers.trainer

                 for key, value in kwargs.items():
                     g[key] = value
    -
    [docs] def checkpoint(self, epoch, valid_logs, checkpoint_folder, loss_key='valid_loss'): + +
    +[docs] + def checkpoint(self, epoch, valid_logs, checkpoint_folder, loss_key='valid_loss'): ''' Checkpoint the current network. The checkpoint will be saved as ``'last.ckpt'``. If valid_logs[loss_key] is better than self.best then this checkpoint will replace self.best and ``'last.ckpt'`` will be renamed to ``f'{checkpoint_folder}/checkpoint_epoch{epoch}_loss{valid_loss}.ckpt'`` and the former best (filename saved as ``self.best_name``) will be deleted @@ -436,7 +477,10 @@

    Source code for molearn.trainers.trainer

                 self.best_epoch = epoch
                 self.best = valid_loss
    -
    [docs] def load_checkpoint(self, checkpoint_name ='best', checkpoint_folder = '', load_optimiser=True): + +
    +[docs] + def load_checkpoint(self, checkpoint_name='best', checkpoint_folder='', load_optimiser=True): ''' Load checkpoint. @@ -456,7 +500,7 @@

    Source code for molearn.trainers.trainer

                 _name = f'{checkpoint_folder}/last.ckpt'
             else:
                 _name = f'{checkpoint_folder}/{checkpoint_name}'
    -        checkpoint = torch.load(_name, map_location = self.device)
    +        checkpoint = torch.load(_name, map_location=self.device)
             if not hasattr(self, 'autoencoder'):
                 raise NotImplementedError('self.autoencoder does not exist, I have no way of knowing what network you want to load checkoint weights into yet, please set the network first')
     
    @@ -466,7 +510,10 @@ 

    Source code for molearn.trainers.trainer

                     raise NotImplementedError('self.optimiser does not exist, I have no way of knowing what optimiser you previously used, please set it first.')
                 self.optimiser.load_state_dict(checkpoint['optimizer_state_dict'])
             epoch = checkpoint['epoch']
    -        self.epoch = epoch+1
    + self.epoch = epoch+1
    +
    + + if __name__=='__main__': pass @@ -507,8 +554,8 @@

    Navigation

    \ No newline at end of file diff --git a/docs/build/_sources/faq.rst.txt b/docs/build/_sources/faq.rst.txt index 8ee24b0..d302b0a 100644 --- a/docs/build/_sources/faq.rst.txt +++ b/docs/build/_sources/faq.rst.txt @@ -3,41 +3,32 @@ Frequently Asked Questions ########################## -I get an IndexError when I try loading a multiPDB -------------------------------------------------- - -This is likely an error thrown by MDAnalysis. Typically this happens when -attempting to load a multiPDB file saved with software like VMD, which uses a -different syntax to indicate the end of a conformer in the file. A way to get -around this, is to re-save the file in a format MDAnalysis can parse, e.g., by -loading and re-saving the file via biobox. - -.. code-block:: - - import biobox as bb - M = bb.Molecule(filename) - M.write_pdb(newfilename) - - I cannot install openmmtorchplugin ---------------------------------- openmmtorchplugin depends on conda-forge builds of pyTorch and OpenMM. Due to this dependency, Windows cannot be supported. + Installation can be carried out via terminal with conda-forge: .. code:: conda install -c conda-forge openmmtorchplugin + The following Python versions are supported: 3.8, 3.9, 3.10, 3.11. -If you are running into any issue, attempt a fresh install in a new conda + +If you run into any issue, either at installation or runtime, ensure you have a +plugin version >=1.1.3, as previous ones have known compatibility with OpenMM. +The easiest way to ensure the most up to date version of molearn and the +openmmtorchplugin are installed, is to run a fresh install in a new conda environment: .. code:: conda create --name test_env python=3.10 - conda install -c conda-forge openmmtorchplugin molearn + conda install -n test_env -c conda-forge openmmtorchplugin molearn + openmmtorchplugin is built with cuda_compiler_version=11.2 in conda-forge CI tools. This has been successfully tested on Ubuntu machines running with the driver @@ -47,6 +38,23 @@ The Nvidia website tabulates minimum driver versions required and version compat `NVIDIA CUDA Toolkit Minimum driver versions `_ +I get an IndexError when I try loading a multiPDB +------------------------------------------------- + +This is likely an error thrown by MDAnalysis. Typically this happens when +attempting to load a multiPDB file saved with software like VMD, which uses a +different syntax to indicate the end of a conformer in the file. A way to get +around this, is to re-save the file in a format MDAnalysis can parse, e.g., by +loading and re-saving the file via biobox. + +.. code-block:: + + import biobox as bb + M = bb.Molecule(filename) + M.write_pdb(newfilename) + + + The GUI freezes when I use it/does not work as expected ------------------------------------------------------- diff --git a/docs/build/_static/basic.css b/docs/build/_static/basic.css index 0889677..30fee9d 100644 --- a/docs/build/_static/basic.css +++ b/docs/build/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -237,6 +237,10 @@ a.headerlink { visibility: hidden; } +a:visited { + color: #551A8B; +} + h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, @@ -324,17 +328,17 @@ aside.sidebar { p.sidebar-title { font-weight: bold; } + nav.contents, aside.topic, - div.admonition, div.topic, blockquote { clear: left; } /* -- topics ---------------------------------------------------------------- */ + nav.contents, aside.topic, - div.topic { border: 1px solid #ccc; padding: 7px; @@ -375,7 +379,6 @@ div.sidebar > :last-child, aside.sidebar > :last-child, nav.contents > :last-child, aside.topic > :last-child, - div.topic > :last-child, div.admonition > :last-child { margin-bottom: 0; @@ -385,7 +388,6 @@ div.sidebar::after, aside.sidebar::after, nav.contents::after, aside.topic::after, - div.topic::after, div.admonition::after, blockquote::after { @@ -611,25 +613,6 @@ ul.simple p { margin-bottom: 0; } -/* Docutils 0.17 and older (footnotes & citations) */ -dl.footnote > dt, -dl.citation > dt { - float: left; - margin-right: 0.5em; -} - -dl.footnote > dd, -dl.citation > dd { - margin-bottom: 0em; -} - -dl.footnote > dd:after, -dl.citation > dd:after { - content: ""; - clear: both; -} - -/* Docutils 0.18+ (footnotes & citations) */ aside.footnote > span, div.citation > span { float: left; @@ -654,8 +637,6 @@ div.citation > p:last-of-type:after { clear: both; } -/* Footnotes & citations ends */ - dl.field-list { display: grid; grid-template-columns: fit-content(30%) auto; @@ -668,10 +649,6 @@ dl.field-list > dt { padding-right: 5px; } -dl.field-list > dt:after { - content: ":"; -} - dl.field-list > dd { padding-left: 0.5em; margin-top: 0em; @@ -697,6 +674,16 @@ dd { margin-left: 30px; } +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + dl > dd:last-child, dl > dd:last-child > :last-child { margin-bottom: 0; @@ -765,6 +752,14 @@ abbr, acronym { cursor: help; } +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + /* -- code displays --------------------------------------------------------- */ pre { diff --git a/docs/build/_static/doctools.js b/docs/build/_static/doctools.js index c3db08d..d06a71d 100644 --- a/docs/build/_static/doctools.js +++ b/docs/build/_static/doctools.js @@ -4,12 +4,19 @@ * * Base JavaScript utilities for all Sphinx HTML documentation. * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ "use strict"; +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + const _ready = (callback) => { if (document.readyState !== "loading") { callback(); @@ -18,73 +25,11 @@ const _ready = (callback) => { } }; -/** - * highlight a given string on a node by wrapping it in - * span elements with the given class name. - */ -const _highlight = (node, addItems, text, className) => { - if (node.nodeType === Node.TEXT_NODE) { - const val = node.nodeValue; - const parent = node.parentNode; - const pos = val.toLowerCase().indexOf(text); - if ( - pos >= 0 && - !parent.classList.contains(className) && - !parent.classList.contains("nohighlight") - ) { - let span; - - const closestNode = parent.closest("body, svg, foreignObject"); - const isInSVG = closestNode && closestNode.matches("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.classList.add(className); - } - - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - parent.insertBefore( - span, - parent.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling - ) - ); - node.nodeValue = val.substr(0, pos); - - if (isInSVG) { - const rect = document.createElementNS( - "http://www.w3.org/2000/svg", - "rect" - ); - const bbox = parent.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute("class", className); - addItems.push({ parent: parent, target: rect }); - } - } - } else if (node.matches && !node.matches("button, select, textarea")) { - node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); - } -}; -const _highlightText = (thisNode, text, className) => { - let addItems = []; - _highlight(thisNode, addItems, text, className); - addItems.forEach((obj) => - obj.parent.insertAdjacentElement("beforebegin", obj.target) - ); -}; - /** * Small JavaScript module for the documentation. */ const Documentation = { init: () => { - Documentation.highlightSearchWords(); Documentation.initDomainIndexTable(); Documentation.initOnKeyListeners(); }, @@ -126,51 +71,6 @@ const Documentation = { Documentation.LOCALE = catalog.locale; }, - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords: () => { - const highlight = - new URLSearchParams(window.location.search).get("highlight") || ""; - const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); - if (terms.length === 0) return; // nothing to do - - // There should never be more than one element matching "div.body" - const divBody = document.querySelectorAll("div.body"); - const body = divBody.length ? divBody[0] : document.querySelector("body"); - window.setTimeout(() => { - terms.forEach((term) => _highlightText(body, term, "highlighted")); - }, 10); - - const searchBox = document.getElementById("searchbox"); - if (searchBox === null) return; - searchBox.appendChild( - document - .createRange() - .createContextualFragment( - '" - ) - ); - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords: () => { - document - .querySelectorAll("#searchbox .highlight-link") - .forEach((el) => el.remove()); - document - .querySelectorAll("span.highlighted") - .forEach((el) => el.classList.remove("highlighted")); - const url = new URL(window.location); - url.searchParams.delete("highlight"); - window.history.replaceState({}, "", url); - }, - /** * helper function to focus on search bar */ @@ -210,15 +110,11 @@ const Documentation = { ) return; - const blacklistedElements = new Set([ - "TEXTAREA", - "INPUT", - "SELECT", - "BUTTON", - ]); document.addEventListener("keydown", (event) => { - if (blacklistedElements.has(document.activeElement.tagName)) return; // bail for input elements - if (event.altKey || event.ctrlKey || event.metaKey) return; // bail with special keys + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; if (!event.shiftKey) { switch (event.key) { @@ -240,10 +136,6 @@ const Documentation = { event.preventDefault(); } break; - case "Escape": - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; - Documentation.hideSearchWords(); - event.preventDefault(); } } diff --git a/docs/build/_static/documentation_options.js b/docs/build/_static/documentation_options.js index a99dba8..15dd1bd 100644 --- a/docs/build/_static/documentation_options.js +++ b/docs/build/_static/documentation_options.js @@ -1,5 +1,4 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), +const DOCUMENTATION_OPTIONS = { VERSION: '2.0.1', LANGUAGE: 'en', COLLAPSE_INDEX: false, @@ -10,5 +9,5 @@ var DOCUMENTATION_OPTIONS = { SOURCELINK_SUFFIX: '.txt', NAVIGATION_WITH_KEYS: false, SHOW_SEARCH_SUMMARY: true, - ENABLE_SEARCH_SHORTCUTS: false, + ENABLE_SEARCH_SHORTCUTS: true, }; \ No newline at end of file diff --git a/docs/build/_static/language_data.js b/docs/build/_static/language_data.js index 2e22b06..250f566 100644 --- a/docs/build/_static/language_data.js +++ b/docs/build/_static/language_data.js @@ -5,7 +5,7 @@ * This script contains the language-specific data used by searchtools.js, * namely the list of stopwords, stemmer, scorer and splitter. * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/docs/build/_static/pygments.css b/docs/build/_static/pygments.css index 691aeb8..0d49244 100644 --- a/docs/build/_static/pygments.css +++ b/docs/build/_static/pygments.css @@ -17,6 +17,7 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: .highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #A00000 } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ .highlight .gr { color: #FF0000 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gi { color: #00A000 } /* Generic.Inserted */ diff --git a/docs/build/_static/searchtools.js b/docs/build/_static/searchtools.js index ac4d586..7918c3f 100644 --- a/docs/build/_static/searchtools.js +++ b/docs/build/_static/searchtools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for the full-text search. * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -57,14 +57,14 @@ const _removeChildren = (element) => { const _escapeRegExp = (string) => string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string -const _displayItem = (item, highlightTerms, searchTerms) => { +const _displayItem = (item, searchTerms, highlightTerms) => { const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; - const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; - const [docName, title, anchor, descr] = item; + const [docName, title, anchor, descr, score, _filename] = item; let listItem = document.createElement("li"); let requestUrl; @@ -75,29 +75,35 @@ const _displayItem = (item, highlightTerms, searchTerms) => { if (dirname.match(/\/index\/$/)) dirname = dirname.substring(0, dirname.length - 6); else if (dirname === "index/") dirname = ""; - requestUrl = docUrlRoot + dirname; + requestUrl = contentRoot + dirname; linkUrl = requestUrl; } else { // normal html builders - requestUrl = docUrlRoot + docName + docFileSuffix; + requestUrl = contentRoot + docName + docFileSuffix; linkUrl = docName + docLinkSuffix; } - const params = new URLSearchParams(); - params.set("highlight", [...highlightTerms].join(" ")); let linkEl = listItem.appendChild(document.createElement("a")); - linkEl.href = linkUrl + "?" + params.toString() + anchor; + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; linkEl.innerHTML = title; - if (descr) - listItem.appendChild(document.createElement("span")).innerText = + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } else if (showSearchSummary) fetch(requestUrl) .then((responseData) => responseData.text()) .then((data) => { if (data) listItem.appendChild( - Search.makeSearchSummary(data, searchTerms, highlightTerms) + Search.makeSearchSummary(data, searchTerms) ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); }); Search.output.appendChild(listItem); }; @@ -116,15 +122,15 @@ const _finishSearch = (resultCount) => { const _displayNextItem = ( results, resultCount, + searchTerms, highlightTerms, - searchTerms ) => { // results left, load the summary and display it // this is intended to be dynamic (don't sub resultsCount) if (results.length) { - _displayItem(results.pop(), highlightTerms, searchTerms); + _displayItem(results.pop(), searchTerms, highlightTerms); setTimeout( - () => _displayNextItem(results, resultCount, highlightTerms, searchTerms), + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), 5 ); } @@ -155,10 +161,8 @@ const Search = { _pulse_status: -1, htmlToText: (htmlString) => { - const htmlElement = document - .createRange() - .createContextualFragment(htmlString); - _removeChildren(htmlElement.querySelectorAll(".headerlink")); + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); const docContent = htmlElement.querySelector('[role="main"]'); if (docContent !== undefined) return docContent.textContent; console.warn( @@ -239,6 +243,12 @@ const Search = { * execute search (requires search index to be loaded) */ query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + // stem the search terms and add them to the correct list const stemmer = new Stemmer(); const searchTerms = new Set(); @@ -266,6 +276,10 @@ const Search = { } }); + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + // console.debug("SEARCH: searching for:"); // console.info("required: ", [...searchTerms]); // console.info("excluded: ", [...excludedTerms]); @@ -274,6 +288,40 @@ const Search = { let results = []; _removeChildren(document.getElementById("search-progress")); + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + // lookup as object objectTerms.forEach((term) => results.push(...Search.performObjectSearch(term, objectTerms)) @@ -320,7 +368,7 @@ const Search = { // console.info("search results:", Search.lastresults); // print the results - _displayNextItem(results, results.length, highlightTerms, searchTerms); + _displayNextItem(results, results.length, searchTerms, highlightTerms); }, /** @@ -401,8 +449,8 @@ const Search = { // prepare search const terms = Search._index.terms; const titleTerms = Search._index.titleterms; - const docNames = Search._index.docnames; const filenames = Search._index.filenames; + const docNames = Search._index.docnames; const titles = Search._index.titles; const scoreMap = new Map(); @@ -499,16 +547,15 @@ const Search = { /** * helper function to return a node containing the * search summary for a given text. keywords is a list - * of stemmed words, highlightWords is the list of normal, unstemmed - * words. the first one is used to find the occurrence, the - * latter for highlighting it. + * of stemmed words. */ - makeSearchSummary: (htmlText, keywords, highlightWords) => { - const text = Search.htmlToText(htmlText).toLowerCase(); + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); if (text === "") return null; + const textLower = text.toLowerCase(); const actualStartPosition = [...keywords] - .map((k) => text.indexOf(k.toLowerCase())) + .map((k) => textLower.indexOf(k.toLowerCase())) .filter((i) => i > -1) .slice(-1)[0]; const startWithContext = Math.max(actualStartPosition - 120, 0); @@ -516,13 +563,9 @@ const Search = { const top = startWithContext === 0 ? "" : "..."; const tail = startWithContext + 240 < text.length ? "..." : ""; - let summary = document.createElement("div"); + let summary = document.createElement("p"); summary.classList.add("context"); - summary.innerText = top + text.substr(startWithContext, 240).trim() + tail; - - highlightWords.forEach((highlightWord) => - _highlightText(summary, highlightWord, "highlighted") - ); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; return summary; }, diff --git a/docs/build/_static/sphinx_highlight.js b/docs/build/_static/sphinx_highlight.js new file mode 100644 index 0000000..8a96c69 --- /dev/null +++ b/docs/build/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/docs/build/_static/sphinxdoc.css b/docs/build/_static/sphinxdoc.css index f922226..1e9ffe0 100644 --- a/docs/build/_static/sphinxdoc.css +++ b/docs/build/_static/sphinxdoc.css @@ -5,7 +5,7 @@ * Sphinx stylesheet -- sphinxdoc theme. Originally created by * Armin Ronacher for Werkzeug. * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -151,6 +151,10 @@ a:hover { color: #2491CF; } +a:visited { + color: #551A8B; +} + div.body a { text-decoration: underline; } @@ -265,9 +269,9 @@ div.quotebar { padding: 2px 7px; border: 1px solid #ccc; } + nav.contents, aside.topic, - div.topic { background-color: #f8f8f8; } diff --git a/docs/build/analysis.html b/docs/build/analysis.html index d0a145d..5e6941c 100644 --- a/docs/build/analysis.html +++ b/docs/build/analysis.html @@ -1,19 +1,16 @@ - - + - + Analysis — molearn 2.0.1 documentation - - - - - - - + + + + + @@ -45,15 +42,15 @@

    Navigation

    -

    Analysis

    +

    Analysis

    -class MolearnAnalysis[source]
    +class MolearnAnalysis[source]

    This class provides methods dedicated to the quality analysis of a trained model.

    -generate(crd)[source]
    +generate(crd)[source]

    Generate a collection of protein conformations, given coordinates in the latent space.

    Parameters:
    @@ -67,7 +64,7 @@

    Analysis
    -get_all_dope_score(tensor, refine=True)[source]
    +get_all_dope_score(tensor, refine=True)[source]

    Calculate DOPE score of an ensemble of atom coordinates.

    Parameters:
    @@ -81,7 +78,7 @@

    Analysis
    -get_all_ramachandran_score(tensor)[source]
    +get_all_ramachandran_score(tensor)[source]

    Calculate Ramachandran score of an ensemble of atomic conrdinates.

    Parameters:
    @@ -92,7 +89,7 @@

    Analysis
    -get_dataset(key)[source]
    +get_dataset(key)[source]
    Parameters:

    key (str) – key pointing to a dataset previously loaded with set_dataset

    @@ -102,7 +99,7 @@

    Analysis
    -get_decoded(key)[source]
    +get_decoded(key)[source]
    Parameters:

    key (str) – key pointing to a dataset previously loaded with set_dataset

    @@ -112,7 +109,7 @@

    Analysis
    -get_dope(key, refine=True, **kwargs)[source]
    +get_dope(key, refine=True, **kwargs)[source]
    Parameters:

    \ No newline at end of file diff --git a/docs/build/data.html b/docs/build/data.html index 0a9055c..3b84ef1 100644 --- a/docs/build/data.html +++ b/docs/build/data.html @@ -1,19 +1,16 @@ - - + - + Data Loading — molearn 2.0.1 documentation - - - - - - - + + + + + @@ -45,10 +42,10 @@

    Navigation

    -

    Data Loading

    +

    Data Loading

    -class PDBData(filename=None, fix_terminal=False, atoms=None)[source]
    +class PDBData(filename=None, fix_terminal=False, atoms=None)[source]

    Create object enabling the manipulation of multi-PDB files into a dataset suitable for training.

    Parameters:
    @@ -61,7 +58,7 @@

    Data Loading
    -atomselect(atoms, ignore_atoms=[])[source]
    +atomselect(atoms, ignore_atoms=[])[source]

    From all imported PDBs, extract only atoms of interest. import_pdb must have been called at least once, either at class instantiation or as a separate call.

    @@ -73,25 +70,25 @@

    Data Loading
    -fix_terminal()[source]
    +fix_terminal()[source]

    Rename OT1 N-terminal Oxygen to O if terminal oxygens are named OT1 and OT2 otherwise no oxygen will be selected during an atomselect using atoms = [‘CA’, ‘C’,’N’,’O’,’CB’]. No template will be found for terminal residue in openmm_loss. Alternative solution is to use atoms = [‘CA’, ‘C’, ‘N’, ‘O’, ‘CB’, ‘OT1’]. instead.

    -frame()[source]
    +frame()[source]

    return biobox.Molecule object with loaded data

    -get_atominfo()[source]
    +get_atominfo()[source]

    generate list of all atoms in dataset, where every line contains [atom name, residue name, resid]

    -get_dataloader(batch_size, validation_split=0.1, pin_memory=True, dataset_sample_size=- 1, manual_seed=None, shuffle=True, sampler=None)[source]
    +get_dataloader(batch_size, validation_split=0.1, pin_memory=True, dataset_sample_size=-1, manual_seed=None, shuffle=True, sampler=None)[source]
    Parameters:

    \ No newline at end of file diff --git a/docs/build/faq.html b/docs/build/faq.html index 987b10d..4d28ec4 100644 --- a/docs/build/faq.html +++ b/docs/build/faq.html @@ -1,19 +1,16 @@ - - + - + Frequently Asked Questions — molearn 2.0.1 documentation - - - - - - - + + + + + @@ -41,33 +38,23 @@

    Navigation

    -

    Frequently Asked Questions

    -
    -

    I get an IndexError when I try loading a multiPDB

    -

    This is likely an error thrown by MDAnalysis. Typically this happens when -attempting to load a multiPDB file saved with software like VMD, which uses a -different syntax to indicate the end of a conformer in the file. A way to get -around this, is to re-save the file in a format MDAnalysis can parse, e.g., by -loading and re-saving the file via biobox.

    -
    import biobox as bb
    -M = bb.Molecule(filename)
    -M.write_pdb(newfilename)
    -
    -
    -
    +

    Frequently Asked Questions

    -

    I cannot install openmmtorchplugin

    +

    I cannot install openmmtorchplugin

    openmmtorchplugin depends on conda-forge builds of pyTorch and OpenMM. -Due to this dependency, Windows cannot be supported. -Installation can be carried out via terminal with conda-forge:

    +Due to this dependency, Windows cannot be supported.

    +

    Installation can be carried out via terminal with conda-forge:

    conda install -c conda-forge openmmtorchplugin
     
    -

    The following Python versions are supported: 3.8, 3.9, 3.10, 3.11. -If you are running into any issue, attempt a fresh install in a new conda +

    The following Python versions are supported: 3.8, 3.9, 3.10, 3.11.

    +

    If you run into any issue, either at installation or runtime, ensure you have a +plugin version >=1.1.3, as previous ones have known compatibility with OpenMM. +The easiest way to ensure the most up to date version of molearn and the +openmmtorchplugin are installed, is to run a fresh install in a new conda environment:

    conda create --name test_env python=3.10
    -conda install -c conda-forge openmmtorchplugin molearn
    +conda install -n test_env -c conda-forge openmmtorchplugin molearn
     

    openmmtorchplugin is built with cuda_compiler_version=11.2 in conda-forge CI tools. @@ -76,8 +63,21 @@

    I cannot install openmmtorchpluginNVIDIA CUDA Toolkit Minimum driver versions

    +
    +

    I get an IndexError when I try loading a multiPDB

    +

    This is likely an error thrown by MDAnalysis. Typically this happens when +attempting to load a multiPDB file saved with software like VMD, which uses a +different syntax to indicate the end of a conformer in the file. A way to get +around this, is to re-save the file in a format MDAnalysis can parse, e.g., by +loading and re-saving the file via biobox.

    +
    import biobox as bb
    +M = bb.Molecule(filename)
    +M.write_pdb(newfilename)
    +
    +
    +
    -

    The GUI freezes when I use it/does not work as expected

    +

    The GUI freezes when I use it/does not work as expected

    This is usually caused by an issue with packages handling communications between the GUI and Jupyter, see here. Currently, a workaround is to use older versions of tornado. In Python 3.10, the following packages have been observed to yield correct behaviour:

    @@ -100,8 +100,8 @@

    The GUI freezes when I use it/does not work as expectedTable of Contents

    \ No newline at end of file diff --git a/docs/build/genindex.html b/docs/build/genindex.html index 547fb83..5116c17 100644 --- a/docs/build/genindex.html +++ b/docs/build/genindex.html @@ -1,18 +1,15 @@ - - + Index — molearn 2.0.1 documentation - - - - - - - + + + + + @@ -451,8 +448,8 @@

    Navigation

    \ No newline at end of file diff --git a/docs/build/index.html b/docs/build/index.html index fef38e3..55a26aa 100644 --- a/docs/build/index.html +++ b/docs/build/index.html @@ -1,19 +1,16 @@ - - + - + Welcome to molearn’s documentation! — molearn 2.0.1 documentation - - - - - - - + + + + + @@ -41,7 +38,7 @@

    Navigation

    -

    Welcome to molearn’s documentation!

    +

    Welcome to molearn’s documentation!

    molearn is a Python package streamlining the implementation of machine learning models dedicated to the generation of protein conformations from example data obtained via experiment or molecular simulation.

    @@ -51,16 +48,52 @@

    Welcome to molearn’s documentation!

    Contents:

    \ No newline at end of file diff --git a/docs/build/loss_functions.html b/docs/build/loss_functions.html index c9e8f02..72c7bd3 100644 --- a/docs/build/loss_functions.html +++ b/docs/build/loss_functions.html @@ -1,19 +1,16 @@ - - + - + Loss Functions — molearn 2.0.1 documentation - - - - - - - + + + + + @@ -45,10 +42,10 @@

    Navigation

    -

    Loss Functions

    +

    Loss Functions

    -class ModifiedForceField(*args, alternative_residue_names=None, **kwargs)[source]
    +class ModifiedForceField(*args, alternative_residue_names=None, **kwargs)[source]

    Takes all *args and **kwargs of openmm.app.ForceField, plus an optional parameter described here.

    Parameters:
    @@ -59,7 +56,7 @@

    Navigation

    -class OpenMMPluginScoreSoftForceField(mol=None, platform='CUDA', atoms=['CA', 'C', 'N', 'CB', 'O'])[source]
    +class OpenMMPluginScoreSoftForceField(mol=None, platform='CUDA', atoms=['CA', 'C', 'N', 'CB', 'O'])[source]
    Parameters:
      @@ -77,7 +74,7 @@

      Navigation

      -class OpenmmPluginScore(mol=None, xml_file=['amber14-all.xml'], platform='CUDA', remove_NB=False, alternative_residue_names={'HIS': 'HIE', 'HSE': 'HIE'}, atoms=['CA', 'C', 'N', 'CB', 'O'], soft=False)[source]
      +class OpenmmPluginScore(mol=None, xml_file=['amber14-all.xml'], platform='CUDA', remove_NB=False, alternative_residue_names={'HIS': 'HIE', 'HSE': 'HIE'}, atoms=['CA', 'C', 'N', 'CB', 'O'], soft=False)[source]

      This will use the new OpenMM Plugin to calculate forces and energy. The intention is that this will be fast enough to be able to calculate forces and energy during training. N.B.: The current torchintegratorplugin only supports float on GPU and double on CPU.

      @@ -95,7 +92,7 @@

      Navigation

      -execute(x)[source]
      +execute(x)[source]
      Parameters:

      x (torch.Tensor) – shape [b, N, 3]. dtype=float. device = gpu

      @@ -105,7 +102,7 @@

      Navigation

      -get_energy(pos_ptr, force_ptr, energy_ptr, n_particles, batch_size)[source]
      +get_energy(pos_ptr, force_ptr, energy_ptr, n_particles, batch_size)[source]
      Parameters:
        @@ -123,7 +120,7 @@

        Navigation

        -class OpenmmTorchEnergyMinimizer(mol=None, xml_file=['amber14-all.xml'], platform='CUDA', remove_NB=False, alternative_residue_names={'HIS': 'HIE', 'HSE': 'HIE'}, atoms=['CA', 'C', 'N', 'CB', 'O'], soft=False)[source]
        +class OpenmmTorchEnergyMinimizer(mol=None, xml_file=['amber14-all.xml'], platform='CUDA', remove_NB=False, alternative_residue_names={'HIS': 'HIE', 'HSE': 'HIE'}, atoms=['CA', 'C', 'N', 'CB', 'O'], soft=False)[source]
        Parameters:
          @@ -141,10 +138,10 @@

          Navigation

          -class openmm_clamped_energy_function(*args, **kwargs)[source]
          +class openmm_clamped_energy_function(*args, **kwargs)[source]
          -static backward(ctx, grad_output)[source]
          +static backward(ctx, grad_output)[source]

          Defines a formula for differentiating the operation with backward mode automatic differentiation (alias to the vjp function).

          This function is to be overridden by all subclasses.

          @@ -166,7 +163,7 @@

          Navigation

          -static forward(ctx, plugin, x, clamp)[source]
          +static forward(ctx, plugin, x, clamp)[source]
          Parameters:
            @@ -184,16 +181,16 @@

            Navigation

            -class openmm_energy(mol, std, clamp=None, **kwargs)[source]
            +class openmm_energy(mol, std, clamp=None, **kwargs)[source]

            Initializes internal Module state, shared by both nn.Module and ScriptModule.

            -class openmm_energy_function(*args, **kwargs)[source]
            +class openmm_energy_function(*args, **kwargs)[source]
            -static backward(ctx, grad_output)[source]
            +static backward(ctx, grad_output)[source]

            Defines a formula for differentiating the operation with backward mode automatic differentiation (alias to the vjp function).

            This function is to be overridden by all subclasses.

            @@ -215,7 +212,7 @@

            Navigation

            -static forward(ctx, plugin, x)[source]
            +static forward(ctx, plugin, x)[source]
            Parameters:
              @@ -240,6 +237,34 @@

              Navigation